diff --git a/src/palettes.py b/src/palettes.py index f406a70..8b53ea1 100644 --- a/src/palettes.py +++ b/src/palettes.py @@ -10,4 +10,6 @@ todays_outfit = ['#EC1616', '#F0DC9D', '#006CF8', '#000000', '#EC1616', '#F0DC9D # http://www.colourlovers.com/palette/2097539/Sea_Urchin_Spines sea_urchin_spines = ['#000E29', '#0071A7', '#24A854', '#057976', '#004444', '#000E29', '#0071A7', '#24A854'] -# https://color.adobe.com/index.cfm#themeID/937271 \ No newline at end of file +# https://color.adobe.com/index.cfm#themeID/937271 + +canva = ['#F15847', '#0C243B', '#C7E0E4', '#6FA2B6', '#42637C'] \ No newline at end of file diff --git a/src/pyDataVizDay.py b/src/pyDataVizDay.py index 2eede0c..fb65846 100644 --- a/src/pyDataVizDay.py +++ b/src/pyDataVizDay.py @@ -153,7 +153,7 @@ class top_movies(Resource): data = filter_with_args(args) df = (data.movie - .sort_values('imdb_score', ascending=False) + .sort_values('gross', ascending=False) .drop_duplicates(subset=['movie_title']) .set_index('movie_title') [['title_year', 'imdb_score', 'gross']] @@ -184,15 +184,9 @@ class score_timeseries(Resource): df['DATE'] = df.index df['DATE'] = df['DATE'].astype('str').fillna('1900-01-01') print(df.head()) - score_timeseries = {'columns':[['IMDB Score'] + df['IMDB Score'].values.tolist(), + score_timeseries = {'columns':[['IMDB Score (right)'] + df['IMDB Score'].values.tolist(), ['gross'] + df['gross'].values.tolist(), - ['x'] + df.DATE.astype(str).values.tolist()], - # ['x'] + df.index.values.tolist()], - 'colors':{ - 'IMDB Score': '#0071A7', - 'gross': '#4D9913', - 'x': '#08414C' - }} + ['x'] + df.DATE.astype(str).values.tolist()],} return jsonify(score_timeseries) @api.route('/download') @@ -213,8 +207,6 @@ class sentiment(Resource): keywords = TextBlob(' '.join(data.keyword.plot_keywords.values)) results = {'columns':[['polarity'] + [round(keywords.sentiment.polarity + .1, 3) * 250], ['subjectivity'] + [round(keywords.sentiment.subjectivity + .1, 3) * 150]], - 'colors':{'polarity':'grey', - 'subjectivity':'#afafaf'} } return jsonify(results) diff --git a/src/static/Python+for+Data+Science.png b/src/static/Python+for+Data+Science.png new file mode 100644 index 0000000..fa323fd Binary files /dev/null and b/src/static/Python+for+Data+Science.png differ diff --git a/src/static/bk.png b/src/static/bk.png new file mode 100644 index 0000000..57b2db6 Binary files /dev/null and b/src/static/bk.png differ diff --git a/src/static/bottom.pdn b/src/static/bottom.pdn new file mode 100644 index 0000000..662c1a7 Binary files /dev/null and b/src/static/bottom.pdn differ diff --git a/src/static/bottom.png b/src/static/bottom.png new file mode 100644 index 0000000..40870ac Binary files /dev/null and b/src/static/bottom.png differ diff --git a/src/static/css/custom.css b/src/static/css/custom.css index 8817db1..5bd5cc8 100644 --- a/src/static/css/custom.css +++ b/src/static/css/custom.css @@ -1,9 +1,69 @@ +html{ + --score-color:#0071A7; + --gross-color:#4D9913; + --dark-blue:#0C243B; + --light-blue:#384c65; + --score-color:#0C243B; + --axis-color: var(--score-color); +} + body{ font-family:Tahoma, Geneva, sans-serif; - background-color:white; + color:#C7E0E4; + background-color:#0C243B; + } + +#top-image{ + background-image: url("/static/top.png"); + background-repeat: repeat; +} + +#bottom-image{ + background-image: url("/static/bottom.png"); + background-repeat: repeat; +} + + +/*@keyframes fadein{ + 0% { opacity:0; } + 66% { opacity:0; } + 100% { opacity:1; } +} + +@-webkit-keyframes fadein{ + 0% { opacity:0; } + 66% { opacity:0; } + 100% { opacity:1; } +}*/ + +/*#timeseries-chart { + stroke: #fff !important; +}*/ + +.c3 .c3-axis-x path, .c3 .c3-axis-x line, +.c3 .c3-axis-y path, .c3 .c3-axis-y line, +.c3 .c3-axis-y2 path, .c3 .c3-axis-y2 line { + stroke: var(--axis-color); +} + +.c3 .c3-axis-x g, +.c3 .c3-axis-y g, +.c3 .c3-axis-y2 g, +.c3 .c3-legend-item-data text { + color: var(--axis-color); + fill: var(--axis-color); +} + +.container { + color: #C7E0E4; + box-shadow: 0px 30px 40px rgba(0,0,0,1); + }) + + .kpi { /* color: #B80000; */ + padding:5px 5px 5px 5px ; font-weight:4; font-size:16px; } @@ -11,7 +71,18 @@ body{ /* color: #B80000; */ font-weight:8; font-size:18px; - padding: 10px 20px 10px 0px; + /*padding: 10px 20px 10px 0px;*/ + height:25px; + /* height: 75px; */ +} + +#score{ + color: var(--score-color); + color: var(--light-blue); +} + +#gross{ + color: var(--gross-color); } .chosen{ @@ -54,12 +125,17 @@ body{ .title{ font-size:22px; - color:#0071A7; + color:var(--dark-blue); font: bold; } +.note{ + color:var(--dark-blue); + +} + .sentiment-chart-title{ - color:#0071A7; + color:var(--dark-blue); /*text-align: center;*/ } .word-cloud-title{ diff --git a/src/static/js/enthusiast.js b/src/static/js/enthusiast.js index bd4c7bc..9b1c932 100644 --- a/src/static/js/enthusiast.js +++ b/src/static/js/enthusiast.js @@ -3,6 +3,13 @@ var mil = d3.format('$.3s') var update_freq = 200 +// $(document).ready(function() { +var style = getComputedStyle(document.body); +score_color = style.getPropertyValue('--score-color'); +gross_color = style.getPropertyValue('--gross-color'); +// } + + var data = { 'size': { 'height': 300 @@ -10,7 +17,7 @@ var data = { 'data': { 'x': 'x', 'axes': { - 'IMDB Score': 'y2', + 'IMDB Score (right)': 'y2', 'gross': 'y', 'x': 'y' }, @@ -26,8 +33,8 @@ var data = { ] ], 'colors': { - 'IMDB Score': '#B80000', - 'gross': '#0071A7', + 'IMDB Score (right)': score_color, + 'gross': gross_color, 'x': '#08414C' } }, @@ -97,8 +104,8 @@ var sentiment_data = { bindto:'#sentiment-chart', data: { colors: { - polarity: "grey", - subjectivity: "#afafaf"}, + polarity: chroma(score_color).darken().hex(), + subjectivity: score_color, }, columns: [ ['polarity', 10], ['subjectivity', 10], @@ -108,7 +115,7 @@ var sentiment_data = { }, bar: { width: { - ratio: .7 // this makes bar width 50% of length between ticks + ratio: 100 // this makes bar width 50% of length between ticks }, // or // width: 100 // this makes bar width 100px @@ -119,8 +126,11 @@ var sentiment_data = { }, tooltip:{show:false}, grid: {y: {lines: [{value:10, text:'neutral'}, - {value:100, text:'max'}, - {value:0, text:'min'}]}} + {value:100, text:'positive'}, + {value:100, text:' subjective', position:'start'}, + {value:0, text:'negative'}, + {value:0, text:' objective', position:'start'}, + ]}} } @@ -138,7 +148,12 @@ word_coud_settings = { width: wc_width, height: wc_height, classPattern: null, - colors: ['#0071A7', '#000E29', '#24A854',],// '#ffeda0', '#ffffcc'], + colors: [score_color, + // gross_color, + chroma(score_color).darken().hex(), + // chroma(gross_color).darken().hex(), + chroma(score_color).darken().darken().hex(), + ],// '#ffeda0', '#ffffcc'], fontSize: { from: 0.1, to: 0.02 @@ -246,17 +261,6 @@ function update_words() }) } -poster_img = ''; -function poster(title){ - console.log(title) - var info = $.get('http://www.omdbapi.com/?t=' + title + '&apikey=90424a9e') - return info.done( function(){ - poster_img = '' - console.log(poster_img) - return poster_img - } - ) - } function update_top_movies(start_year, end_year) { @@ -278,8 +282,7 @@ function update_top_movies(start_year, end_year) window.promises = promises for (i in promises){ console.log() - h = promises[i].responseJSON['Title'] + '


' - $('#poster-' + i).html('') + $('#poster-' + i).html('') $('#title-' + i).html(promises[i].responseJSON['Title']) } @@ -329,3 +332,29 @@ function update_sentiment_year(year) } +$(document).ready(function() { +var movementStrength = 30; +var top_height = movementStrength / $(window).height(); +var top_width = movementStrength / $(window).width(); +$("#top-image").mousemove(function(e){ + var pageX = e.pageX - ($(window).width() / 2); + var pageY = e.pageY - ($(window).height() / 2); + var newvalueX = top_width * pageX * -1 - 25; + var newvalueY = top_height * pageY * -1 - 50; + $('#top-image').css("background-position", newvalueX+"px "+newvalueY+"px"); +}); + +var movementStrength = 10; +var height = movementStrength / $(window).height(); +var width = movementStrength / $(window).width(); +$("#bottom-image").mousemove(function(e){ + var pageX = e.pageX - ($(window).width() / 2); + var pageY = e.pageY - ($(window).height() / 2); + var newvalueX = width * pageX * -1 - 25; + var newvalueY = height * pageY * -1 - 50; + $('#bottom-image').css("background-position", newvalueX+"px "+newvalueY+"px"); +}); + + + +}); \ No newline at end of file diff --git a/src/static/node_modules/chroma-js/.npmignore b/src/static/node_modules/chroma-js/.npmignore new file mode 100644 index 0000000..e48be50 --- /dev/null +++ b/src/static/node_modules/chroma-js/.npmignore @@ -0,0 +1,10 @@ + +readme (Autosaved).md + +m.txt + +.DS_Store +license.coffee +node_modules + +yarn.lock diff --git a/src/static/node_modules/chroma-js/.travis.yml b/src/static/node_modules/chroma-js/.travis.yml new file mode 100644 index 0000000..b00d08a --- /dev/null +++ b/src/static/node_modules/chroma-js/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - 0.12 + - 0.11 +before_script: "npm install -g grunt-cli" +script: "npm run-script build && npm run-script test" \ No newline at end of file diff --git a/src/static/node_modules/chroma-js/CHANGELOG.md b/src/static/node_modules/chroma-js/CHANGELOG.md new file mode 100644 index 0000000..db021aa --- /dev/null +++ b/src/static/node_modules/chroma-js/CHANGELOG.md @@ -0,0 +1,45 @@ +# 1.3.3 + +* added [color.clipped](https://gka.github.io/chroma.js/#color-clipped) +* added [chroma.distance](https://gka.github.io/chroma.js/#chroma-distance) +* added [chroma.deltaE](https://gka.github.io/chroma.js/#chroma-deltae) +* [color.set](https://gka.github.io/chroma.js/#color-set) now returns a new chroma instance +* chroma.scale now allows [disabling of internal cache](https://gka.github.io/chroma.js/#scale-cache) +* [chroma.average](https://gka.github.io/chroma.js/#chroma-average) now works with any color mode +* added unit tests for color conversions +* use hex colors as default string representation +* RGB channels are now stored as floats internally for higher precision +* bugfix with cubehelix and constant lightness +* bugfix in chroma.limits quantiles +* bugfix when running scale.colors(1) +* bugfix in hsi2rgb color conversion + +# 1.2.2 + +* scale.colors() now returns the original colors instead of just min/max range + +# 1.2.0 + +* added chroma.average for averaging colors + +# 1.1.0 + +* refactored chroma.scale +* changed behaviour of scale.domain +* added scale.classes +* added scale.padding + +# 1.0.2 + +* standardized alpha channel construction +* chroma.bezier automatically returns chroma.scale + +# 1.0.1 + +* added simple color output to chroma.scale().colors() + +# 1.0.0 + +* numeric interpolation does what it should +* refactored and modularized code base +* changed argument order of Color::interpolate diff --git a/src/static/node_modules/chroma-js/Gruntfile.js b/src/static/node_modules/chroma-js/Gruntfile.js new file mode 100644 index 0000000..a8b07d4 --- /dev/null +++ b/src/static/node_modules/chroma-js/Gruntfile.js @@ -0,0 +1,84 @@ +"use strict"; + +var fs = require('fs'), + pkgInfo = JSON.parse(fs.readFileSync(__dirname + '/package.json')); + +module.exports = function(grunt) { + + grunt.initConfig({ + clean: { + pre: [ + 'chroma.js', + 'chroma.min.js', + 'license.coffee', + ], + post: ['chroma.coffee'] + }, + coffee: { + compile: { + options: { + join: true + }, + files: { + 'chroma.js': [ + 'license.coffee', + 'chroma.coffee' + ], + }, + } + }, + replace: { + dist: { + options: { patterns: [{ match: 'version', replacement: pkgInfo.version }] }, + files: [{expand: true, flatten: true, src: ['chroma.js'], dest: '.'}] + } + }, + uglify: { + options: { + banner: "/*\n" + fs.readFileSync("LICENSE", {encoding: "utf8"}) + "\n*/\n", + }, + my_target: { + files: { + 'chroma.min.js': ['chroma.js'] + }, + }, + }, + copy: { + main: { + files: [ + // copy build files into docs folder + {expand: true, src: ['chroma*.js'], dest: 'docs/libs/', filter: 'isFile'}, + ], + }, + }, + }); + + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-coffee'); + grunt.loadNpmTasks('grunt-replace'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-copy'); + + grunt.registerTask('license', function() { + var license = [ + "###*", + " * @license", + " *", + ].concat(fs.readFileSync('LICENSE', {encoding: "utf8"}).split("\n").map(function(line) { + return " * " + line; + })); + license.push("###\n"); + fs.writeFileSync('license.coffee', license.join("\n")); + }); + + grunt.registerTask('catty', function() { + require("catty")({ global: true }) + .coffee(true) + .addLibrary("src") + .cat("src/index.coffee", "./chroma.coffee"); + }); + + grunt.registerTask('default', ['clean:pre', 'license', 'catty', 'coffee', 'replace', + 'uglify', 'copy', 'clean:post']); +}; + diff --git a/src/static/node_modules/chroma-js/LICENSE b/src/static/node_modules/chroma-js/LICENSE new file mode 100644 index 0000000..0fd0f2e --- /dev/null +++ b/src/static/node_modules/chroma-js/LICENSE @@ -0,0 +1,28 @@ +chroma.js - JavaScript library for color conversions + +Copyright (c) 2011-2017, Gregor Aisch +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/static/node_modules/chroma-js/LICENSE-colors b/src/static/node_modules/chroma-js/LICENSE-colors new file mode 100644 index 0000000..7e431b6 --- /dev/null +++ b/src/static/node_modules/chroma-js/LICENSE-colors @@ -0,0 +1,22 @@ + +chroma.js includes colors from colorbrewer2.org, +which are released under the following license: + + +Copyright (c) 2002 Cynthia Brewer, Mark Harrower, +and The Pennsylvania State University. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the License for the specific +language governing permissions and limitations under the License. + + +Named colors are taken from X11 Color Names. +http://www.w3.org/TR/css3-color/#svg-color diff --git a/src/static/node_modules/chroma-js/bower.json b/src/static/node_modules/chroma-js/bower.json new file mode 100644 index 0000000..7dcab5d --- /dev/null +++ b/src/static/node_modules/chroma-js/bower.json @@ -0,0 +1,34 @@ +{ + "name": "chroma-js", + "description": "JavaScript library for color conversions", + "main": [ + "./chroma.js" + ], + "ignore": [ + "doc", + "src", + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "homepage": "https://github.com/gka/chroma.js", + "authors": [ + "Gregor Aisch " + ], + "keywords": [ + "color", + "scale", + "gradient", + "scheme", + "rgb", + "hsv", + "hsl", + "css", + "lch", + "lab", + "hcg" + ], + "license": "MIT" +} diff --git a/src/static/node_modules/chroma-js/chroma.js b/src/static/node_modules/chroma-js/chroma.js new file mode 100644 index 0000000..bbf7a92 --- /dev/null +++ b/src/static/node_modules/chroma-js/chroma.js @@ -0,0 +1,2707 @@ + +/** + * @license + * + * chroma.js - JavaScript library for color conversions + * + * Copyright (c) 2011-2017, Gregor Aisch + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name Gregor Aisch may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +(function() { + var Color, DEG2RAD, LAB_CONSTANTS, PI, PITHIRD, RAD2DEG, TWOPI, _guess_formats, _guess_formats_sorted, _input, _interpolators, abs, atan2, bezier, blend, blend_f, brewer, burn, chroma, clip_rgb, cmyk2rgb, colors, cos, css2rgb, darken, dodge, each, floor, hcg2rgb, hex2rgb, hsi2rgb, hsl2css, hsl2rgb, hsv2rgb, interpolate, interpolate_hsx, interpolate_lab, interpolate_num, interpolate_rgb, lab2lch, lab2rgb, lab_xyz, lch2lab, lch2rgb, lighten, limit, log, luminance_x, m, max, multiply, normal, num2rgb, overlay, pow, rgb2cmyk, rgb2css, rgb2hcg, rgb2hex, rgb2hsi, rgb2hsl, rgb2hsv, rgb2lab, rgb2lch, rgb2luminance, rgb2num, rgb2temperature, rgb2xyz, rgb_xyz, rnd, root, round, screen, sin, sqrt, temperature2rgb, type, unpack, w3cx11, xyz_lab, xyz_rgb, + slice = [].slice; + + type = (function() { + + /* + for browser-safe type checking+ + ported from jQuery's $.type + */ + var classToType, len, name, o, ref; + classToType = {}; + ref = "Boolean Number String Function Array Date RegExp Undefined Null".split(" "); + for (o = 0, len = ref.length; o < len; o++) { + name = ref[o]; + classToType["[object " + name + "]"] = name.toLowerCase(); + } + return function(obj) { + var strType; + strType = Object.prototype.toString.call(obj); + return classToType[strType] || "object"; + }; + })(); + + limit = function(x, min, max) { + if (min == null) { + min = 0; + } + if (max == null) { + max = 1; + } + if (x < min) { + x = min; + } + if (x > max) { + x = max; + } + return x; + }; + + unpack = function(args) { + if (args.length >= 3) { + return [].slice.call(args); + } else { + return args[0]; + } + }; + + clip_rgb = function(rgb) { + var i, o; + rgb._clipped = false; + rgb._unclipped = rgb.slice(0); + for (i = o = 0; o < 3; i = ++o) { + if (i < 3) { + if (rgb[i] < 0 || rgb[i] > 255) { + rgb._clipped = true; + } + if (rgb[i] < 0) { + rgb[i] = 0; + } + if (rgb[i] > 255) { + rgb[i] = 255; + } + } else if (i === 3) { + if (rgb[i] < 0) { + rgb[i] = 0; + } + if (rgb[i] > 1) { + rgb[i] = 1; + } + } + } + if (!rgb._clipped) { + delete rgb._unclipped; + } + return rgb; + }; + + PI = Math.PI, round = Math.round, cos = Math.cos, floor = Math.floor, pow = Math.pow, log = Math.log, sin = Math.sin, sqrt = Math.sqrt, atan2 = Math.atan2, max = Math.max, abs = Math.abs; + + TWOPI = PI * 2; + + PITHIRD = PI / 3; + + DEG2RAD = PI / 180; + + RAD2DEG = 180 / PI; + + chroma = function() { + if (arguments[0] instanceof Color) { + return arguments[0]; + } + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, arguments, function(){}); + }; + + _interpolators = []; + + if ((typeof module !== "undefined" && module !== null) && (module.exports != null)) { + module.exports = chroma; + } + + if (typeof define === 'function' && define.amd) { + define([], function() { + return chroma; + }); + } else { + root = typeof exports !== "undefined" && exports !== null ? exports : this; + root.chroma = chroma; + } + + chroma.version = '1.3.4'; + + _input = {}; + + _guess_formats = []; + + _guess_formats_sorted = false; + + Color = (function() { + function Color() { + var arg, args, chk, len, len1, me, mode, o, w; + me = this; + args = []; + for (o = 0, len = arguments.length; o < len; o++) { + arg = arguments[o]; + if (arg != null) { + args.push(arg); + } + } + mode = args[args.length - 1]; + if (_input[mode] != null) { + me._rgb = clip_rgb(_input[mode](unpack(args.slice(0, -1)))); + } else { + if (!_guess_formats_sorted) { + _guess_formats = _guess_formats.sort(function(a, b) { + return b.p - a.p; + }); + _guess_formats_sorted = true; + } + for (w = 0, len1 = _guess_formats.length; w < len1; w++) { + chk = _guess_formats[w]; + mode = chk.test.apply(chk, args); + if (mode) { + break; + } + } + if (mode) { + me._rgb = clip_rgb(_input[mode].apply(_input, args)); + } + } + if (me._rgb == null) { + console.warn('unknown format: ' + args); + } + if (me._rgb == null) { + me._rgb = [0, 0, 0]; + } + if (me._rgb.length === 3) { + me._rgb.push(1); + } + } + + Color.prototype.toString = function() { + return this.hex(); + }; + + Color.prototype.clone = function() { + return chroma(me._rgb); + }; + + return Color; + + })(); + + chroma._input = _input; + + + /** + ColorBrewer colors for chroma.js + + Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The + Pennsylvania State University. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed + under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. See the License for the + specific language governing permissions and limitations under the License. + + @preserve + */ + + chroma.brewer = brewer = { + OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'], + PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'], + BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'], + Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'], + BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'], + YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'], + YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'], + Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'], + RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'], + Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'], + YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'], + Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'], + GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'], + Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'], + YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'], + PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'], + Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'], + PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'], + Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'], + Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'], + RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'], + RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'], + PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'], + PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'], + RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'], + BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'], + RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'], + PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'], + Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'], + Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'], + Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'], + Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'], + Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'], + Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'], + Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'], + Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2'] + }; + + (function() { + var key, results; + results = []; + for (key in brewer) { + results.push(brewer[key.toLowerCase()] = brewer[key]); + } + return results; + })(); + + + /** + X11 color names + + http://www.w3.org/TR/css3-color/#svg-color + */ + + w3cx11 = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#00ffff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000000', + blanchedalmond: '#ffebcd', + blue: '#0000ff', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflower: '#6495ed', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#00ffff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgreen: '#006400', + darkgrey: '#a9a9a9', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkslategrey: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#ff00ff', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + green: '#008000', + greenyellow: '#adff2f', + grey: '#808080', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + laserlemon: '#ffff54', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrod: '#fafad2', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgreen: '#90ee90', + lightgrey: '#d3d3d3', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#00ff00', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#ff00ff', + maroon: '#800000', + maroon2: '#7f0000', + maroon3: '#b03060', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370db', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#db7093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + purple2: '#7f007f', + purple3: '#a020f0', + rebeccapurple: '#663399', + red: '#ff0000', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + slategrey: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#ffffff', + whitesmoke: '#f5f5f5', + yellow: '#ffff00', + yellowgreen: '#9acd32' + }; + + chroma.colors = colors = w3cx11; + + lab2rgb = function() { + var a, args, b, g, l, r, x, y, z; + args = unpack(arguments); + l = args[0], a = args[1], b = args[2]; + y = (l + 16) / 116; + x = isNaN(a) ? y : y + a / 500; + z = isNaN(b) ? y : y - b / 200; + y = LAB_CONSTANTS.Yn * lab_xyz(y); + x = LAB_CONSTANTS.Xn * lab_xyz(x); + z = LAB_CONSTANTS.Zn * lab_xyz(z); + r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); + g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z); + b = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z); + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + xyz_rgb = function(r) { + return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055); + }; + + lab_xyz = function(t) { + if (t > LAB_CONSTANTS.t1) { + return t * t * t; + } else { + return LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0); + } + }; + + LAB_CONSTANTS = { + Kn: 18, + Xn: 0.950470, + Yn: 1, + Zn: 1.088830, + t0: 0.137931034, + t1: 0.206896552, + t2: 0.12841855, + t3: 0.008856452 + }; + + rgb2lab = function() { + var b, g, r, ref, ref1, x, y, z; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + ref1 = rgb2xyz(r, g, b), x = ref1[0], y = ref1[1], z = ref1[2]; + return [116 * y - 16, 500 * (x - y), 200 * (y - z)]; + }; + + rgb_xyz = function(r) { + if ((r /= 255) <= 0.04045) { + return r / 12.92; + } else { + return pow((r + 0.055) / 1.055, 2.4); + } + }; + + xyz_lab = function(t) { + if (t > LAB_CONSTANTS.t3) { + return pow(t, 1 / 3); + } else { + return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0; + } + }; + + rgb2xyz = function() { + var b, g, r, ref, x, y, z; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = rgb_xyz(r); + g = rgb_xyz(g); + b = rgb_xyz(b); + x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn); + y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / LAB_CONSTANTS.Yn); + z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn); + return [x, y, z]; + }; + + chroma.lab = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['lab']), function(){}); + }; + + _input.lab = lab2rgb; + + Color.prototype.lab = function() { + return rgb2lab(this._rgb); + }; + + bezier = function(colors) { + var I, I0, I1, c, lab0, lab1, lab2, lab3, ref, ref1, ref2; + colors = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(chroma(c)); + } + return results; + })(); + if (colors.length === 2) { + ref = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref[0], lab1 = ref[1]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push(lab0[i] + t * (lab1[i] - lab0[i])); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 3) { + ref1 = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref1[0], lab1 = ref1[1], lab2 = ref1[2]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push((1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i]); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 4) { + ref2 = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref2[0], lab1 = ref2[1], lab2 = ref2[2], lab3 = ref2[3]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push((1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i]); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 5) { + I0 = bezier(colors.slice(0, 3)); + I1 = bezier(colors.slice(2, 5)); + I = function(t) { + if (t < 0.5) { + return I0(t * 2); + } else { + return I1((t - 0.5) * 2); + } + }; + } + return I; + }; + + chroma.bezier = function(colors) { + var f; + f = bezier(colors); + f.scale = function() { + return chroma.scale(f); + }; + return f; + }; + + + /* + chroma.js + + Copyright (c) 2011-2013, Gregor Aisch + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + @source: https://github.com/gka/chroma.js + */ + + chroma.cubehelix = function(start, rotations, hue, gamma, lightness) { + var dh, dl, f; + if (start == null) { + start = 300; + } + if (rotations == null) { + rotations = -1.5; + } + if (hue == null) { + hue = 1; + } + if (gamma == null) { + gamma = 1; + } + if (lightness == null) { + lightness = [0, 1]; + } + dh = 0; + if (type(lightness) === 'array') { + dl = lightness[1] - lightness[0]; + } else { + dl = 0; + lightness = [lightness, lightness]; + } + f = function(fract) { + var a, amp, b, cos_a, g, h, l, r, sin_a; + a = TWOPI * ((start + 120) / 360 + rotations * fract); + l = pow(lightness[0] + dl * fract, gamma); + h = dh !== 0 ? hue[0] + fract * dh : hue; + amp = h * l * (1 - l) / 2; + cos_a = cos(a); + sin_a = sin(a); + r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a); + g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a); + b = l + amp * (+1.97294 * cos_a); + return chroma(clip_rgb([r * 255, g * 255, b * 255])); + }; + f.start = function(s) { + if (s == null) { + return start; + } + start = s; + return f; + }; + f.rotations = function(r) { + if (r == null) { + return rotations; + } + rotations = r; + return f; + }; + f.gamma = function(g) { + if (g == null) { + return gamma; + } + gamma = g; + return f; + }; + f.hue = function(h) { + if (h == null) { + return hue; + } + hue = h; + if (type(hue) === 'array') { + dh = hue[1] - hue[0]; + if (dh === 0) { + hue = hue[1]; + } + } else { + dh = 0; + } + return f; + }; + f.lightness = function(h) { + if (h == null) { + return lightness; + } + if (type(h) === 'array') { + lightness = h; + dl = h[1] - h[0]; + } else { + lightness = [h, h]; + dl = 0; + } + return f; + }; + f.scale = function() { + return chroma.scale(f); + }; + f.hue(hue); + return f; + }; + + chroma.random = function() { + var code, digits, i, o; + digits = '0123456789abcdef'; + code = '#'; + for (i = o = 0; o < 6; i = ++o) { + code += digits.charAt(floor(Math.random() * 16)); + } + return new Color(code); + }; + + chroma.average = function(colors, mode) { + var A, alpha, c, cnt, dx, dy, first, i, l, len, o, xyz, xyz2; + if (mode == null) { + mode = 'rgb'; + } + l = colors.length; + colors = colors.map(function(c) { + return chroma(c); + }); + first = colors.splice(0, 1)[0]; + xyz = first.get(mode); + cnt = []; + dx = 0; + dy = 0; + for (i in xyz) { + xyz[i] = xyz[i] || 0; + cnt.push(!isNaN(xyz[i]) ? 1 : 0); + if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) { + A = xyz[i] / 180 * PI; + dx += cos(A); + dy += sin(A); + } + } + alpha = first.alpha(); + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + xyz2 = c.get(mode); + alpha += c.alpha(); + for (i in xyz) { + if (!isNaN(xyz2[i])) { + xyz[i] += xyz2[i]; + cnt[i] += 1; + if (mode.charAt(i) === 'h') { + A = xyz[i] / 180 * PI; + dx += cos(A); + dy += sin(A); + } + } + } + } + for (i in xyz) { + xyz[i] = xyz[i] / cnt[i]; + if (mode.charAt(i) === 'h') { + A = atan2(dy / cnt[i], dx / cnt[i]) / PI * 180; + while (A < 0) { + A += 360; + } + while (A >= 360) { + A -= 360; + } + xyz[i] = A; + } + } + return chroma(xyz, mode).alpha(alpha / l); + }; + + _input.rgb = function() { + var k, ref, results, v; + ref = unpack(arguments); + results = []; + for (k in ref) { + v = ref[k]; + results.push(v); + } + return results; + }; + + chroma.rgb = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['rgb']), function(){}); + }; + + Color.prototype.rgb = function(round) { + if (round == null) { + round = true; + } + if (round) { + return this._rgb.map(Math.round).slice(0, 3); + } else { + return this._rgb.slice(0, 3); + } + }; + + Color.prototype.rgba = function(round) { + if (round == null) { + round = true; + } + if (!round) { + return this._rgb.slice(0); + } + return [Math.round(this._rgb[0]), Math.round(this._rgb[1]), Math.round(this._rgb[2]), this._rgb[3]]; + }; + + _guess_formats.push({ + p: 3, + test: function(n) { + var a; + a = unpack(arguments); + if (type(a) === 'array' && a.length === 3) { + return 'rgb'; + } + if (a.length === 4 && type(a[3]) === "number" && a[3] >= 0 && a[3] <= 1) { + return 'rgb'; + } + } + }); + + hex2rgb = function(hex) { + var a, b, g, r, rgb, u; + if (hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)) { + if (hex.length === 4 || hex.length === 7) { + hex = hex.substr(1); + } + if (hex.length === 3) { + hex = hex.split(""); + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + u = parseInt(hex, 16); + r = u >> 16; + g = u >> 8 & 0xFF; + b = u & 0xFF; + return [r, g, b, 1]; + } + if (hex.match(/^#?([A-Fa-f0-9]{8})$/)) { + if (hex.length === 9) { + hex = hex.substr(1); + } + u = parseInt(hex, 16); + r = u >> 24 & 0xFF; + g = u >> 16 & 0xFF; + b = u >> 8 & 0xFF; + a = round((u & 0xFF) / 0xFF * 100) / 100; + return [r, g, b, a]; + } + if ((_input.css != null) && (rgb = _input.css(hex))) { + return rgb; + } + throw "unknown color: " + hex; + }; + + rgb2hex = function(channels, mode) { + var a, b, g, hxa, r, str, u; + if (mode == null) { + mode = 'rgb'; + } + r = channels[0], g = channels[1], b = channels[2], a = channels[3]; + r = Math.round(r); + g = Math.round(g); + b = Math.round(b); + u = r << 16 | g << 8 | b; + str = "000000" + u.toString(16); + str = str.substr(str.length - 6); + hxa = '0' + round(a * 255).toString(16); + hxa = hxa.substr(hxa.length - 2); + return "#" + (function() { + switch (mode.toLowerCase()) { + case 'rgba': + return str + hxa; + case 'argb': + return hxa + str; + default: + return str; + } + })(); + }; + + _input.hex = function(h) { + return hex2rgb(h); + }; + + chroma.hex = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hex']), function(){}); + }; + + Color.prototype.hex = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + return rgb2hex(this._rgb, mode); + }; + + _guess_formats.push({ + p: 4, + test: function(n) { + if (arguments.length === 1 && type(n) === "string") { + return 'hex'; + } + } + }); + + hsl2rgb = function() { + var args, b, c, g, h, i, l, o, r, ref, s, t1, t2, t3; + args = unpack(arguments); + h = args[0], s = args[1], l = args[2]; + if (s === 0) { + r = g = b = l * 255; + } else { + t3 = [0, 0, 0]; + c = [0, 0, 0]; + t2 = l < 0.5 ? l * (1 + s) : l + s - l * s; + t1 = 2 * l - t2; + h /= 360; + t3[0] = h + 1 / 3; + t3[1] = h; + t3[2] = h - 1 / 3; + for (i = o = 0; o <= 2; i = ++o) { + if (t3[i] < 0) { + t3[i] += 1; + } + if (t3[i] > 1) { + t3[i] -= 1; + } + if (6 * t3[i] < 1) { + c[i] = t1 + (t2 - t1) * 6 * t3[i]; + } else if (2 * t3[i] < 1) { + c[i] = t2; + } else if (3 * t3[i] < 2) { + c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6; + } else { + c[i] = t1; + } + } + ref = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)], r = ref[0], g = ref[1], b = ref[2]; + } + if (args.length > 3) { + return [r, g, b, args[3]]; + } else { + return [r, g, b]; + } + }; + + rgb2hsl = function(r, g, b) { + var h, l, min, ref, s; + if (r !== void 0 && r.length >= 3) { + ref = r, r = ref[0], g = ref[1], b = ref[2]; + } + r /= 255; + g /= 255; + b /= 255; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + l = (max + min) / 2; + if (max === min) { + s = 0; + h = Number.NaN; + } else { + s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min); + } + if (r === max) { + h = (g - b) / (max - min); + } else if (g === max) { + h = 2 + (b - r) / (max - min); + } else if (b === max) { + h = 4 + (r - g) / (max - min); + } + h *= 60; + if (h < 0) { + h += 360; + } + return [h, s, l]; + }; + + chroma.hsl = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsl']), function(){}); + }; + + _input.hsl = hsl2rgb; + + Color.prototype.hsl = function() { + return rgb2hsl(this._rgb); + }; + + hsv2rgb = function() { + var args, b, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, s, t, v; + args = unpack(arguments); + h = args[0], s = args[1], v = args[2]; + v *= 255; + if (s === 0) { + r = g = b = v; + } else { + if (h === 360) { + h = 0; + } + if (h > 360) { + h -= 360; + } + if (h < 0) { + h += 360; + } + h /= 60; + i = floor(h); + f = h - i; + p = v * (1 - s); + q = v * (1 - s * f); + t = v * (1 - s * (1 - f)); + switch (i) { + case 0: + ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2]; + break; + case 1: + ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2]; + break; + case 2: + ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2]; + break; + case 3: + ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2]; + break; + case 4: + ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2]; + break; + case 5: + ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2]; + } + } + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + rgb2hsv = function() { + var b, delta, g, h, min, r, ref, s, v; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + delta = max - min; + v = max / 255.0; + if (max === 0) { + h = Number.NaN; + s = 0; + } else { + s = delta / max; + if (r === max) { + h = (g - b) / delta; + } + if (g === max) { + h = 2 + (b - r) / delta; + } + if (b === max) { + h = 4 + (r - g) / delta; + } + h *= 60; + if (h < 0) { + h += 360; + } + } + return [h, s, v]; + }; + + chroma.hsv = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsv']), function(){}); + }; + + _input.hsv = hsv2rgb; + + Color.prototype.hsv = function() { + return rgb2hsv(this._rgb); + }; + + num2rgb = function(num) { + var b, g, r; + if (type(num) === "number" && num >= 0 && num <= 0xFFFFFF) { + r = num >> 16; + g = (num >> 8) & 0xFF; + b = num & 0xFF; + return [r, g, b, 1]; + } + console.warn("unknown num color: " + num); + return [0, 0, 0, 1]; + }; + + rgb2num = function() { + var b, g, r, ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + return (r << 16) + (g << 8) + b; + }; + + chroma.num = function(num) { + return new Color(num, 'num'); + }; + + Color.prototype.num = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + return rgb2num(this._rgb, mode); + }; + + _input.num = num2rgb; + + _guess_formats.push({ + p: 1, + test: function(n) { + if (arguments.length === 1 && type(n) === "number" && n >= 0 && n <= 0xFFFFFF) { + return 'num'; + } + } + }); + + hcg2rgb = function() { + var _c, _g, args, b, c, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, t, v; + args = unpack(arguments); + h = args[0], c = args[1], _g = args[2]; + c = c / 100; + g = g / 100 * 255; + _c = c * 255; + if (c === 0) { + r = g = b = _g; + } else { + if (h === 360) { + h = 0; + } + if (h > 360) { + h -= 360; + } + if (h < 0) { + h += 360; + } + h /= 60; + i = floor(h); + f = h - i; + p = _g * (1 - c); + q = p + _c * (1 - f); + t = p + _c * f; + v = p + _c; + switch (i) { + case 0: + ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2]; + break; + case 1: + ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2]; + break; + case 2: + ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2]; + break; + case 3: + ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2]; + break; + case 4: + ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2]; + break; + case 5: + ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2]; + } + } + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + rgb2hcg = function() { + var _g, b, c, delta, g, h, min, r, ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + delta = max - min; + c = delta * 100 / 255; + _g = min / (255 - delta) * 100; + if (delta === 0) { + h = Number.NaN; + } else { + if (r === max) { + h = (g - b) / delta; + } + if (g === max) { + h = 2 + (b - r) / delta; + } + if (b === max) { + h = 4 + (r - g) / delta; + } + h *= 60; + if (h < 0) { + h += 360; + } + } + return [h, c, _g]; + }; + + chroma.hcg = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hcg']), function(){}); + }; + + _input.hcg = hcg2rgb; + + Color.prototype.hcg = function() { + return rgb2hcg(this._rgb); + }; + + css2rgb = function(css) { + var aa, ab, hsl, i, m, o, rgb, w; + css = css.toLowerCase(); + if ((chroma.colors != null) && chroma.colors[css]) { + return hex2rgb(chroma.colors[css]); + } + if (m = css.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)) { + rgb = m.slice(1, 4); + for (i = o = 0; o <= 2; i = ++o) { + rgb[i] = +rgb[i]; + } + rgb[3] = 1; + } else if (m = css.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/)) { + rgb = m.slice(1, 5); + for (i = w = 0; w <= 3; i = ++w) { + rgb[i] = +rgb[i]; + } + } else if (m = css.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)) { + rgb = m.slice(1, 4); + for (i = aa = 0; aa <= 2; i = ++aa) { + rgb[i] = round(rgb[i] * 2.55); + } + rgb[3] = 1; + } else if (m = css.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)) { + rgb = m.slice(1, 5); + for (i = ab = 0; ab <= 2; i = ++ab) { + rgb[i] = round(rgb[i] * 2.55); + } + rgb[3] = +rgb[3]; + } else if (m = css.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)) { + hsl = m.slice(1, 4); + hsl[1] *= 0.01; + hsl[2] *= 0.01; + rgb = hsl2rgb(hsl); + rgb[3] = 1; + } else if (m = css.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)) { + hsl = m.slice(1, 4); + hsl[1] *= 0.01; + hsl[2] *= 0.01; + rgb = hsl2rgb(hsl); + rgb[3] = +m[4]; + } + return rgb; + }; + + rgb2css = function(rgba) { + var mode; + mode = rgba[3] < 1 ? 'rgba' : 'rgb'; + if (mode === 'rgb') { + return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ')'; + } else if (mode === 'rgba') { + return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ',' + rgba[3] + ')'; + } else { + + } + }; + + rnd = function(a) { + return round(a * 100) / 100; + }; + + hsl2css = function(hsl, alpha) { + var mode; + mode = alpha < 1 ? 'hsla' : 'hsl'; + hsl[0] = rnd(hsl[0] || 0); + hsl[1] = rnd(hsl[1] * 100) + '%'; + hsl[2] = rnd(hsl[2] * 100) + '%'; + if (mode === 'hsla') { + hsl[3] = alpha; + } + return mode + '(' + hsl.join(',') + ')'; + }; + + _input.css = function(h) { + return css2rgb(h); + }; + + chroma.css = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['css']), function(){}); + }; + + Color.prototype.css = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + if (mode.slice(0, 3) === 'rgb') { + return rgb2css(this._rgb); + } else if (mode.slice(0, 3) === 'hsl') { + return hsl2css(this.hsl(), this.alpha()); + } + }; + + _input.named = function(name) { + return hex2rgb(w3cx11[name]); + }; + + _guess_formats.push({ + p: 5, + test: function(n) { + if (arguments.length === 1 && (w3cx11[n] != null)) { + return 'named'; + } + } + }); + + Color.prototype.name = function(n) { + var h, k; + if (arguments.length) { + if (w3cx11[n]) { + this._rgb = hex2rgb(w3cx11[n]); + } + this._rgb[3] = 1; + this; + } + h = this.hex(); + for (k in w3cx11) { + if (h === w3cx11[k]) { + return k; + } + } + return h; + }; + + lch2lab = function() { + + /* + Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel. + These formulas were invented by David Dalrymple to obtain maximum contrast without going + out of gamut if the parameters are in the range 0-1. + + A saturation multiplier was added by Gregor Aisch + */ + var c, h, l, ref; + ref = unpack(arguments), l = ref[0], c = ref[1], h = ref[2]; + h = h * DEG2RAD; + return [l, cos(h) * c, sin(h) * c]; + }; + + lch2rgb = function() { + var L, a, args, b, c, g, h, l, r, ref, ref1; + args = unpack(arguments); + l = args[0], c = args[1], h = args[2]; + ref = lch2lab(l, c, h), L = ref[0], a = ref[1], b = ref[2]; + ref1 = lab2rgb(L, a, b), r = ref1[0], g = ref1[1], b = ref1[2]; + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + lab2lch = function() { + var a, b, c, h, l, ref; + ref = unpack(arguments), l = ref[0], a = ref[1], b = ref[2]; + c = sqrt(a * a + b * b); + h = (atan2(b, a) * RAD2DEG + 360) % 360; + if (round(c * 10000) === 0) { + h = Number.NaN; + } + return [l, c, h]; + }; + + rgb2lch = function() { + var a, b, g, l, r, ref, ref1; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + ref1 = rgb2lab(r, g, b), l = ref1[0], a = ref1[1], b = ref1[2]; + return lab2lch(l, a, b); + }; + + chroma.lch = function() { + var args; + args = unpack(arguments); + return new Color(args, 'lch'); + }; + + chroma.hcl = function() { + var args; + args = unpack(arguments); + return new Color(args, 'hcl'); + }; + + _input.lch = lch2rgb; + + _input.hcl = function() { + var c, h, l, ref; + ref = unpack(arguments), h = ref[0], c = ref[1], l = ref[2]; + return lch2rgb([l, c, h]); + }; + + Color.prototype.lch = function() { + return rgb2lch(this._rgb); + }; + + Color.prototype.hcl = function() { + return rgb2lch(this._rgb).reverse(); + }; + + rgb2cmyk = function(mode) { + var b, c, f, g, k, m, r, ref, y; + if (mode == null) { + mode = 'rgb'; + } + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = r / 255; + g = g / 255; + b = b / 255; + k = 1 - Math.max(r, Math.max(g, b)); + f = k < 1 ? 1 / (1 - k) : 0; + c = (1 - r - k) * f; + m = (1 - g - k) * f; + y = (1 - b - k) * f; + return [c, m, y, k]; + }; + + cmyk2rgb = function() { + var alpha, args, b, c, g, k, m, r, y; + args = unpack(arguments); + c = args[0], m = args[1], y = args[2], k = args[3]; + alpha = args.length > 4 ? args[4] : 1; + if (k === 1) { + return [0, 0, 0, alpha]; + } + r = c >= 1 ? 0 : 255 * (1 - c) * (1 - k); + g = m >= 1 ? 0 : 255 * (1 - m) * (1 - k); + b = y >= 1 ? 0 : 255 * (1 - y) * (1 - k); + return [r, g, b, alpha]; + }; + + _input.cmyk = function() { + return cmyk2rgb(unpack(arguments)); + }; + + chroma.cmyk = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['cmyk']), function(){}); + }; + + Color.prototype.cmyk = function() { + return rgb2cmyk(this._rgb); + }; + + _input.gl = function() { + var i, k, o, rgb, v; + rgb = (function() { + var ref, results; + ref = unpack(arguments); + results = []; + for (k in ref) { + v = ref[k]; + results.push(v); + } + return results; + }).apply(this, arguments); + for (i = o = 0; o <= 2; i = ++o) { + rgb[i] *= 255; + } + return rgb; + }; + + chroma.gl = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['gl']), function(){}); + }; + + Color.prototype.gl = function() { + var rgb; + rgb = this._rgb; + return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]]; + }; + + rgb2luminance = function(r, g, b) { + var ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = luminance_x(r); + g = luminance_x(g); + b = luminance_x(b); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }; + + luminance_x = function(x) { + x /= 255; + if (x <= 0.03928) { + return x / 12.92; + } else { + return pow((x + 0.055) / 1.055, 2.4); + } + }; + + _interpolators = []; + + interpolate = function(col1, col2, f, m) { + var interpol, len, o, res; + if (f == null) { + f = 0.5; + } + if (m == null) { + m = 'rgb'; + } + + /* + interpolates between colors + f = 0 --> me + f = 1 --> col + */ + if (type(col1) !== 'object') { + col1 = chroma(col1); + } + if (type(col2) !== 'object') { + col2 = chroma(col2); + } + for (o = 0, len = _interpolators.length; o < len; o++) { + interpol = _interpolators[o]; + if (m === interpol[0]) { + res = interpol[1](col1, col2, f, m); + break; + } + } + if (res == null) { + throw "color mode " + m + " is not supported"; + } + return res.alpha(col1.alpha() + f * (col2.alpha() - col1.alpha())); + }; + + chroma.interpolate = interpolate; + + Color.prototype.interpolate = function(col2, f, m) { + return interpolate(this, col2, f, m); + }; + + chroma.mix = interpolate; + + Color.prototype.mix = Color.prototype.interpolate; + + interpolate_rgb = function(col1, col2, f, m) { + var xyz0, xyz1; + xyz0 = col1._rgb; + xyz1 = col2._rgb; + return new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m); + }; + + _interpolators.push(['rgb', interpolate_rgb]); + + Color.prototype.luminance = function(lum, mode) { + var cur_lum, eps, max_iter, test; + if (mode == null) { + mode = 'rgb'; + } + if (!arguments.length) { + return rgb2luminance(this._rgb); + } + if (lum === 0) { + this._rgb = [0, 0, 0, this._rgb[3]]; + } else if (lum === 1) { + this._rgb = [255, 255, 255, this._rgb[3]]; + } else { + eps = 1e-7; + max_iter = 20; + test = function(l, h) { + var lm, m; + m = l.interpolate(h, 0.5, mode); + lm = m.luminance(); + if (Math.abs(lum - lm) < eps || !max_iter--) { + return m; + } + if (lm > lum) { + return test(l, m); + } + return test(m, h); + }; + cur_lum = rgb2luminance(this._rgb); + this._rgb = (cur_lum > lum ? test(chroma('black'), this) : test(this, chroma('white'))).rgba(); + } + return this; + }; + + temperature2rgb = function(kelvin) { + var b, g, r, temp; + temp = kelvin / 100; + if (temp < 66) { + r = 255; + g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g); + b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b); + } else { + r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r); + g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g); + b = 255; + } + return [r, g, b]; + }; + + rgb2temperature = function() { + var b, eps, g, maxTemp, minTemp, r, ref, rgb, temp; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + minTemp = 1000; + maxTemp = 40000; + eps = 0.4; + while (maxTemp - minTemp > eps) { + temp = (maxTemp + minTemp) * 0.5; + rgb = temperature2rgb(temp); + if ((rgb[2] / rgb[0]) >= (b / r)) { + maxTemp = temp; + } else { + minTemp = temp; + } + } + return round(temp); + }; + + chroma.temperature = chroma.kelvin = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['temperature']), function(){}); + }; + + _input.temperature = _input.kelvin = _input.K = temperature2rgb; + + Color.prototype.temperature = function() { + return rgb2temperature(this._rgb); + }; + + Color.prototype.kelvin = Color.prototype.temperature; + + chroma.contrast = function(a, b) { + var l1, l2, ref, ref1; + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + l1 = a.luminance(); + l2 = b.luminance(); + if (l1 > l2) { + return (l1 + 0.05) / (l2 + 0.05); + } else { + return (l2 + 0.05) / (l1 + 0.05); + } + }; + + chroma.distance = function(a, b, mode) { + var d, i, l1, l2, ref, ref1, sum_sq; + if (mode == null) { + mode = 'lab'; + } + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + l1 = a.get(mode); + l2 = b.get(mode); + sum_sq = 0; + for (i in l1) { + d = (l1[i] || 0) - (l2[i] || 0); + sum_sq += d * d; + } + return Math.sqrt(sum_sq); + }; + + chroma.deltaE = function(a, b, L, C) { + var L1, L2, a1, a2, b1, b2, c1, c2, c4, dH2, delA, delB, delC, delL, f, h1, ref, ref1, ref2, ref3, sc, sh, sl, t, v1, v2, v3; + if (L == null) { + L = 1; + } + if (C == null) { + C = 1; + } + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + ref2 = a.lab(), L1 = ref2[0], a1 = ref2[1], b1 = ref2[2]; + ref3 = b.lab(), L2 = ref3[0], a2 = ref3[1], b2 = ref3[2]; + c1 = sqrt(a1 * a1 + b1 * b1); + c2 = sqrt(a2 * a2 + b2 * b2); + sl = L1 < 16.0 ? 0.511 : (0.040975 * L1) / (1.0 + 0.01765 * L1); + sc = (0.0638 * c1) / (1.0 + 0.0131 * c1) + 0.638; + h1 = c1 < 0.000001 ? 0.0 : (atan2(b1, a1) * 180.0) / PI; + while (h1 < 0) { + h1 += 360; + } + while (h1 >= 360) { + h1 -= 360; + } + t = (h1 >= 164.0) && (h1 <= 345.0) ? 0.56 + abs(0.2 * cos((PI * (h1 + 168.0)) / 180.0)) : 0.36 + abs(0.4 * cos((PI * (h1 + 35.0)) / 180.0)); + c4 = c1 * c1 * c1 * c1; + f = sqrt(c4 / (c4 + 1900.0)); + sh = sc * (f * t + 1.0 - f); + delL = L1 - L2; + delC = c1 - c2; + delA = a1 - a2; + delB = b1 - b2; + dH2 = delA * delA + delB * delB - delC * delC; + v1 = delL / (L * sl); + v2 = delC / (C * sc); + v3 = sh; + return sqrt(v1 * v1 + v2 * v2 + (dH2 / (v3 * v3))); + }; + + Color.prototype.get = function(modechan) { + var channel, i, me, mode, ref, src; + me = this; + ref = modechan.split('.'), mode = ref[0], channel = ref[1]; + src = me[mode](); + if (channel) { + i = mode.indexOf(channel); + if (i > -1) { + return src[i]; + } else { + return console.warn('unknown channel ' + channel + ' in mode ' + mode); + } + } else { + return src; + } + }; + + Color.prototype.set = function(modechan, value) { + var channel, i, me, mode, ref, src; + me = this; + ref = modechan.split('.'), mode = ref[0], channel = ref[1]; + if (channel) { + src = me[mode](); + i = mode.indexOf(channel); + if (i > -1) { + if (type(value) === 'string') { + switch (value.charAt(0)) { + case '+': + src[i] += +value; + break; + case '-': + src[i] += +value; + break; + case '*': + src[i] *= +(value.substr(1)); + break; + case '/': + src[i] /= +(value.substr(1)); + break; + default: + src[i] = +value; + } + } else { + src[i] = value; + } + } else { + console.warn('unknown channel ' + channel + ' in mode ' + mode); + } + } else { + src = value; + } + return chroma(src, mode).alpha(me.alpha()); + }; + + Color.prototype.clipped = function() { + return this._rgb._clipped || false; + }; + + Color.prototype.alpha = function(a) { + if (arguments.length) { + return chroma.rgb([this._rgb[0], this._rgb[1], this._rgb[2], a]); + } + return this._rgb[3]; + }; + + Color.prototype.darken = function(amount) { + var lab, me; + if (amount == null) { + amount = 1; + } + me = this; + lab = me.lab(); + lab[0] -= LAB_CONSTANTS.Kn * amount; + return chroma.lab(lab).alpha(me.alpha()); + }; + + Color.prototype.brighten = function(amount) { + if (amount == null) { + amount = 1; + } + return this.darken(-amount); + }; + + Color.prototype.darker = Color.prototype.darken; + + Color.prototype.brighter = Color.prototype.brighten; + + Color.prototype.saturate = function(amount) { + var lch, me; + if (amount == null) { + amount = 1; + } + me = this; + lch = me.lch(); + lch[1] += amount * LAB_CONSTANTS.Kn; + if (lch[1] < 0) { + lch[1] = 0; + } + return chroma.lch(lch).alpha(me.alpha()); + }; + + Color.prototype.desaturate = function(amount) { + if (amount == null) { + amount = 1; + } + return this.saturate(-amount); + }; + + Color.prototype.premultiply = function() { + var a, rgb; + rgb = this.rgb(); + a = this.alpha(); + return chroma(rgb[0] * a, rgb[1] * a, rgb[2] * a, a); + }; + + blend = function(bottom, top, mode) { + if (!blend[mode]) { + throw 'unknown blend mode ' + mode; + } + return blend[mode](bottom, top); + }; + + blend_f = function(f) { + return function(bottom, top) { + var c0, c1; + c0 = chroma(top).rgb(); + c1 = chroma(bottom).rgb(); + return chroma(f(c0, c1), 'rgb'); + }; + }; + + each = function(f) { + return function(c0, c1) { + var i, o, out; + out = []; + for (i = o = 0; o <= 3; i = ++o) { + out[i] = f(c0[i], c1[i]); + } + return out; + }; + }; + + normal = function(a, b) { + return a; + }; + + multiply = function(a, b) { + return a * b / 255; + }; + + darken = function(a, b) { + if (a > b) { + return b; + } else { + return a; + } + }; + + lighten = function(a, b) { + if (a > b) { + return a; + } else { + return b; + } + }; + + screen = function(a, b) { + return 255 * (1 - (1 - a / 255) * (1 - b / 255)); + }; + + overlay = function(a, b) { + if (b < 128) { + return 2 * a * b / 255; + } else { + return 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255)); + } + }; + + burn = function(a, b) { + return 255 * (1 - (1 - b / 255) / (a / 255)); + }; + + dodge = function(a, b) { + if (a === 255) { + return 255; + } + a = 255 * (b / 255) / (1 - a / 255); + if (a > 255) { + return 255; + } else { + return a; + } + }; + + blend.normal = blend_f(each(normal)); + + blend.multiply = blend_f(each(multiply)); + + blend.screen = blend_f(each(screen)); + + blend.overlay = blend_f(each(overlay)); + + blend.darken = blend_f(each(darken)); + + blend.lighten = blend_f(each(lighten)); + + blend.dodge = blend_f(each(dodge)); + + blend.burn = blend_f(each(burn)); + + chroma.blend = blend; + + chroma.analyze = function(data) { + var len, o, r, val; + r = { + min: Number.MAX_VALUE, + max: Number.MAX_VALUE * -1, + sum: 0, + values: [], + count: 0 + }; + for (o = 0, len = data.length; o < len; o++) { + val = data[o]; + if ((val != null) && !isNaN(val)) { + r.values.push(val); + r.sum += val; + if (val < r.min) { + r.min = val; + } + if (val > r.max) { + r.max = val; + } + r.count += 1; + } + } + r.domain = [r.min, r.max]; + r.limits = function(mode, num) { + return chroma.limits(r, mode, num); + }; + return r; + }; + + chroma.scale = function(colors, positions) { + var _classes, _colorCache, _colors, _correctLightness, _domain, _fixed, _max, _min, _mode, _nacol, _out, _padding, _pos, _spread, _useCache, classifyValue, f, getClass, getColor, resetCache, setColors, tmap; + _mode = 'rgb'; + _nacol = chroma('#ccc'); + _spread = 0; + _fixed = false; + _domain = [0, 1]; + _pos = []; + _padding = [0, 0]; + _classes = false; + _colors = []; + _out = false; + _min = 0; + _max = 1; + _correctLightness = false; + _colorCache = {}; + _useCache = true; + setColors = function(colors) { + var c, col, o, ref, ref1, w; + if (colors == null) { + colors = ['#fff', '#000']; + } + if ((colors != null) && type(colors) === 'string' && (chroma.brewer != null)) { + colors = chroma.brewer[colors] || chroma.brewer[colors.toLowerCase()] || colors; + } + if (type(colors) === 'array') { + colors = colors.slice(0); + for (c = o = 0, ref = colors.length - 1; 0 <= ref ? o <= ref : o >= ref; c = 0 <= ref ? ++o : --o) { + col = colors[c]; + if (type(col) === "string") { + colors[c] = chroma(col); + } + } + _pos.length = 0; + for (c = w = 0, ref1 = colors.length - 1; 0 <= ref1 ? w <= ref1 : w >= ref1; c = 0 <= ref1 ? ++w : --w) { + _pos.push(c / (colors.length - 1)); + } + } + resetCache(); + return _colors = colors; + }; + getClass = function(value) { + var i, n; + if (_classes != null) { + n = _classes.length - 1; + i = 0; + while (i < n && value >= _classes[i]) { + i++; + } + return i - 1; + } + return 0; + }; + tmap = function(t) { + return t; + }; + classifyValue = function(value) { + var i, maxc, minc, n, val; + val = value; + if (_classes.length > 2) { + n = _classes.length - 1; + i = getClass(value); + minc = _classes[0] + (_classes[1] - _classes[0]) * (0 + _spread * 0.5); + maxc = _classes[n - 1] + (_classes[n] - _classes[n - 1]) * (1 - _spread * 0.5); + val = _min + ((_classes[i] + (_classes[i + 1] - _classes[i]) * 0.5 - minc) / (maxc - minc)) * (_max - _min); + } + return val; + }; + getColor = function(val, bypassMap) { + var c, col, i, k, o, p, ref, t; + if (bypassMap == null) { + bypassMap = false; + } + if (isNaN(val)) { + return _nacol; + } + if (!bypassMap) { + if (_classes && _classes.length > 2) { + c = getClass(val); + t = c / (_classes.length - 2); + t = _padding[0] + (t * (1 - _padding[0] - _padding[1])); + } else if (_max !== _min) { + t = (val - _min) / (_max - _min); + t = _padding[0] + (t * (1 - _padding[0] - _padding[1])); + t = Math.min(1, Math.max(0, t)); + } else { + t = 1; + } + } else { + t = val; + } + if (!bypassMap) { + t = tmap(t); + } + k = Math.floor(t * 10000); + if (_useCache && _colorCache[k]) { + col = _colorCache[k]; + } else { + if (type(_colors) === 'array') { + for (i = o = 0, ref = _pos.length - 1; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { + p = _pos[i]; + if (t <= p) { + col = _colors[i]; + break; + } + if (t >= p && i === _pos.length - 1) { + col = _colors[i]; + break; + } + if (t > p && t < _pos[i + 1]) { + t = (t - p) / (_pos[i + 1] - p); + col = chroma.interpolate(_colors[i], _colors[i + 1], t, _mode); + break; + } + } + } else if (type(_colors) === 'function') { + col = _colors(t); + } + if (_useCache) { + _colorCache[k] = col; + } + } + return col; + }; + resetCache = function() { + return _colorCache = {}; + }; + setColors(colors); + f = function(v) { + var c; + c = chroma(getColor(v)); + if (_out && c[_out]) { + return c[_out](); + } else { + return c; + } + }; + f.classes = function(classes) { + var d; + if (classes != null) { + if (type(classes) === 'array') { + _classes = classes; + _domain = [classes[0], classes[classes.length - 1]]; + } else { + d = chroma.analyze(_domain); + if (classes === 0) { + _classes = [d.min, d.max]; + } else { + _classes = chroma.limits(d, 'e', classes); + } + } + return f; + } + return _classes; + }; + f.domain = function(domain) { + var c, d, k, len, o, ref, w; + if (!arguments.length) { + return _domain; + } + _min = domain[0]; + _max = domain[domain.length - 1]; + _pos = []; + k = _colors.length; + if (domain.length === k && _min !== _max) { + for (o = 0, len = domain.length; o < len; o++) { + d = domain[o]; + _pos.push((d - _min) / (_max - _min)); + } + } else { + for (c = w = 0, ref = k - 1; 0 <= ref ? w <= ref : w >= ref; c = 0 <= ref ? ++w : --w) { + _pos.push(c / (k - 1)); + } + } + _domain = [_min, _max]; + return f; + }; + f.mode = function(_m) { + if (!arguments.length) { + return _mode; + } + _mode = _m; + resetCache(); + return f; + }; + f.range = function(colors, _pos) { + setColors(colors, _pos); + return f; + }; + f.out = function(_o) { + _out = _o; + return f; + }; + f.spread = function(val) { + if (!arguments.length) { + return _spread; + } + _spread = val; + return f; + }; + f.correctLightness = function(v) { + if (v == null) { + v = true; + } + _correctLightness = v; + resetCache(); + if (_correctLightness) { + tmap = function(t) { + var L0, L1, L_actual, L_diff, L_ideal, max_iter, pol, t0, t1; + L0 = getColor(0, true).lab()[0]; + L1 = getColor(1, true).lab()[0]; + pol = L0 > L1; + L_actual = getColor(t, true).lab()[0]; + L_ideal = L0 + (L1 - L0) * t; + L_diff = L_actual - L_ideal; + t0 = 0; + t1 = 1; + max_iter = 20; + while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) { + (function() { + if (pol) { + L_diff *= -1; + } + if (L_diff < 0) { + t0 = t; + t += (t1 - t) * 0.5; + } else { + t1 = t; + t += (t0 - t) * 0.5; + } + L_actual = getColor(t, true).lab()[0]; + return L_diff = L_actual - L_ideal; + })(); + } + return t; + }; + } else { + tmap = function(t) { + return t; + }; + } + return f; + }; + f.padding = function(p) { + if (p != null) { + if (type(p) === 'number') { + p = [p, p]; + } + _padding = p; + return f; + } else { + return _padding; + } + }; + f.colors = function(numColors, out) { + var dd, dm, i, o, ref, result, results, samples, w; + if (arguments.length < 2) { + out = 'hex'; + } + result = []; + if (arguments.length === 0) { + result = _colors.slice(0); + } else if (numColors === 1) { + result = [f(0.5)]; + } else if (numColors > 1) { + dm = _domain[0]; + dd = _domain[1] - dm; + result = (function() { + results = []; + for (var o = 0; 0 <= numColors ? o < numColors : o > numColors; 0 <= numColors ? o++ : o--){ results.push(o); } + return results; + }).apply(this).map(function(i) { + return f(dm + i / (numColors - 1) * dd); + }); + } else { + colors = []; + samples = []; + if (_classes && _classes.length > 2) { + for (i = w = 1, ref = _classes.length; 1 <= ref ? w < ref : w > ref; i = 1 <= ref ? ++w : --w) { + samples.push((_classes[i - 1] + _classes[i]) * 0.5); + } + } else { + samples = _domain; + } + result = samples.map(function(v) { + return f(v); + }); + } + if (chroma[out]) { + result = result.map(function(c) { + return c[out](); + }); + } + return result; + }; + f.cache = function(c) { + if (c != null) { + return _useCache = c; + } else { + return _useCache; + } + }; + return f; + }; + + if (chroma.scales == null) { + chroma.scales = {}; + } + + chroma.scales.cool = function() { + return chroma.scale([chroma.hsl(180, 1, .9), chroma.hsl(250, .7, .4)]); + }; + + chroma.scales.hot = function() { + return chroma.scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb'); + }; + + chroma.analyze = function(data, key, filter) { + var add, k, len, o, r, val, visit; + r = { + min: Number.MAX_VALUE, + max: Number.MAX_VALUE * -1, + sum: 0, + values: [], + count: 0 + }; + if (filter == null) { + filter = function() { + return true; + }; + } + add = function(val) { + if ((val != null) && !isNaN(val)) { + r.values.push(val); + r.sum += val; + if (val < r.min) { + r.min = val; + } + if (val > r.max) { + r.max = val; + } + r.count += 1; + } + }; + visit = function(val, k) { + if (filter(val, k)) { + if ((key != null) && type(key) === 'function') { + return add(key(val)); + } else if ((key != null) && type(key) === 'string' || type(key) === 'number') { + return add(val[key]); + } else { + return add(val); + } + } + }; + if (type(data) === 'array') { + for (o = 0, len = data.length; o < len; o++) { + val = data[o]; + visit(val); + } + } else { + for (k in data) { + val = data[k]; + visit(val, k); + } + } + r.domain = [r.min, r.max]; + r.limits = function(mode, num) { + return chroma.limits(r, mode, num); + }; + return r; + }; + + chroma.limits = function(data, mode, num) { + var aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, assignments, best, centroids, cluster, clusterSizes, dist, i, j, kClusters, limits, max_log, min, min_log, mindist, n, nb_iters, newCentroids, o, p, pb, pr, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, repeat, sum, tmpKMeansBreaks, v, value, values, w; + if (mode == null) { + mode = 'equal'; + } + if (num == null) { + num = 7; + } + if (type(data) === 'array') { + data = chroma.analyze(data); + } + min = data.min; + max = data.max; + sum = data.sum; + values = data.values.sort(function(a, b) { + return a - b; + }); + if (num === 1) { + return [min, max]; + } + limits = []; + if (mode.substr(0, 1) === 'c') { + limits.push(min); + limits.push(max); + } + if (mode.substr(0, 1) === 'e') { + limits.push(min); + for (i = o = 1, ref = num - 1; 1 <= ref ? o <= ref : o >= ref; i = 1 <= ref ? ++o : --o) { + limits.push(min + (i / num) * (max - min)); + } + limits.push(max); + } else if (mode.substr(0, 1) === 'l') { + if (min <= 0) { + throw 'Logarithmic scales are only possible for values > 0'; + } + min_log = Math.LOG10E * log(min); + max_log = Math.LOG10E * log(max); + limits.push(min); + for (i = w = 1, ref1 = num - 1; 1 <= ref1 ? w <= ref1 : w >= ref1; i = 1 <= ref1 ? ++w : --w) { + limits.push(pow(10, min_log + (i / num) * (max_log - min_log))); + } + limits.push(max); + } else if (mode.substr(0, 1) === 'q') { + limits.push(min); + for (i = aa = 1, ref2 = num - 1; 1 <= ref2 ? aa <= ref2 : aa >= ref2; i = 1 <= ref2 ? ++aa : --aa) { + p = (values.length - 1) * i / num; + pb = floor(p); + if (pb === p) { + limits.push(values[pb]); + } else { + pr = p - pb; + limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr); + } + } + limits.push(max); + } else if (mode.substr(0, 1) === 'k') { + + /* + implementation based on + http://code.google.com/p/figue/source/browse/trunk/figue.js#336 + simplified for 1-d input values + */ + n = values.length; + assignments = new Array(n); + clusterSizes = new Array(num); + repeat = true; + nb_iters = 0; + centroids = null; + centroids = []; + centroids.push(min); + for (i = ab = 1, ref3 = num - 1; 1 <= ref3 ? ab <= ref3 : ab >= ref3; i = 1 <= ref3 ? ++ab : --ab) { + centroids.push(min + (i / num) * (max - min)); + } + centroids.push(max); + while (repeat) { + for (j = ac = 0, ref4 = num - 1; 0 <= ref4 ? ac <= ref4 : ac >= ref4; j = 0 <= ref4 ? ++ac : --ac) { + clusterSizes[j] = 0; + } + for (i = ad = 0, ref5 = n - 1; 0 <= ref5 ? ad <= ref5 : ad >= ref5; i = 0 <= ref5 ? ++ad : --ad) { + value = values[i]; + mindist = Number.MAX_VALUE; + for (j = ae = 0, ref6 = num - 1; 0 <= ref6 ? ae <= ref6 : ae >= ref6; j = 0 <= ref6 ? ++ae : --ae) { + dist = abs(centroids[j] - value); + if (dist < mindist) { + mindist = dist; + best = j; + } + } + clusterSizes[best]++; + assignments[i] = best; + } + newCentroids = new Array(num); + for (j = af = 0, ref7 = num - 1; 0 <= ref7 ? af <= ref7 : af >= ref7; j = 0 <= ref7 ? ++af : --af) { + newCentroids[j] = null; + } + for (i = ag = 0, ref8 = n - 1; 0 <= ref8 ? ag <= ref8 : ag >= ref8; i = 0 <= ref8 ? ++ag : --ag) { + cluster = assignments[i]; + if (newCentroids[cluster] === null) { + newCentroids[cluster] = values[i]; + } else { + newCentroids[cluster] += values[i]; + } + } + for (j = ah = 0, ref9 = num - 1; 0 <= ref9 ? ah <= ref9 : ah >= ref9; j = 0 <= ref9 ? ++ah : --ah) { + newCentroids[j] *= 1 / clusterSizes[j]; + } + repeat = false; + for (j = ai = 0, ref10 = num - 1; 0 <= ref10 ? ai <= ref10 : ai >= ref10; j = 0 <= ref10 ? ++ai : --ai) { + if (newCentroids[j] !== centroids[i]) { + repeat = true; + break; + } + } + centroids = newCentroids; + nb_iters++; + if (nb_iters > 200) { + repeat = false; + } + } + kClusters = {}; + for (j = aj = 0, ref11 = num - 1; 0 <= ref11 ? aj <= ref11 : aj >= ref11; j = 0 <= ref11 ? ++aj : --aj) { + kClusters[j] = []; + } + for (i = ak = 0, ref12 = n - 1; 0 <= ref12 ? ak <= ref12 : ak >= ref12; i = 0 <= ref12 ? ++ak : --ak) { + cluster = assignments[i]; + kClusters[cluster].push(values[i]); + } + tmpKMeansBreaks = []; + for (j = al = 0, ref13 = num - 1; 0 <= ref13 ? al <= ref13 : al >= ref13; j = 0 <= ref13 ? ++al : --al) { + tmpKMeansBreaks.push(kClusters[j][0]); + tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]); + } + tmpKMeansBreaks = tmpKMeansBreaks.sort(function(a, b) { + return a - b; + }); + limits.push(tmpKMeansBreaks[0]); + for (i = am = 1, ref14 = tmpKMeansBreaks.length - 1; am <= ref14; i = am += 2) { + v = tmpKMeansBreaks[i]; + if (!isNaN(v) && limits.indexOf(v) === -1) { + limits.push(v); + } + } + } + return limits; + }; + + hsi2rgb = function(h, s, i) { + + /* + borrowed from here: + http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp + */ + var args, b, g, r; + args = unpack(arguments); + h = args[0], s = args[1], i = args[2]; + if (isNaN(h)) { + h = 0; + } + h /= 360; + if (h < 1 / 3) { + b = (1 - s) / 3; + r = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + g = 1 - (b + r); + } else if (h < 2 / 3) { + h -= 1 / 3; + r = (1 - s) / 3; + g = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + b = 1 - (r + g); + } else { + h -= 2 / 3; + g = (1 - s) / 3; + b = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + r = 1 - (g + b); + } + r = limit(i * r * 3); + g = limit(i * g * 3); + b = limit(i * b * 3); + return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1]; + }; + + rgb2hsi = function() { + + /* + borrowed from here: + http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp + */ + var b, g, h, i, min, r, ref, s; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + TWOPI = Math.PI * 2; + r /= 255; + g /= 255; + b /= 255; + min = Math.min(r, g, b); + i = (r + g + b) / 3; + s = 1 - min / i; + if (s === 0) { + h = 0; + } else { + h = ((r - g) + (r - b)) / 2; + h /= Math.sqrt((r - g) * (r - g) + (r - b) * (g - b)); + h = Math.acos(h); + if (b > g) { + h = TWOPI - h; + } + h /= TWOPI; + } + return [h * 360, s, i]; + }; + + chroma.hsi = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsi']), function(){}); + }; + + _input.hsi = hsi2rgb; + + Color.prototype.hsi = function() { + return rgb2hsi(this._rgb); + }; + + interpolate_hsx = function(col1, col2, f, m) { + var dh, hue, hue0, hue1, lbv, lbv0, lbv1, res, sat, sat0, sat1, xyz0, xyz1; + if (m === 'hsl') { + xyz0 = col1.hsl(); + xyz1 = col2.hsl(); + } else if (m === 'hsv') { + xyz0 = col1.hsv(); + xyz1 = col2.hsv(); + } else if (m === 'hcg') { + xyz0 = col1.hcg(); + xyz1 = col2.hcg(); + } else if (m === 'hsi') { + xyz0 = col1.hsi(); + xyz1 = col2.hsi(); + } else if (m === 'lch' || m === 'hcl') { + m = 'hcl'; + xyz0 = col1.hcl(); + xyz1 = col2.hcl(); + } + if (m.substr(0, 1) === 'h') { + hue0 = xyz0[0], sat0 = xyz0[1], lbv0 = xyz0[2]; + hue1 = xyz1[0], sat1 = xyz1[1], lbv1 = xyz1[2]; + } + if (!isNaN(hue0) && !isNaN(hue1)) { + if (hue1 > hue0 && hue1 - hue0 > 180) { + dh = hue1 - (hue0 + 360); + } else if (hue1 < hue0 && hue0 - hue1 > 180) { + dh = hue1 + 360 - hue0; + } else { + dh = hue1 - hue0; + } + hue = hue0 + f * dh; + } else if (!isNaN(hue0)) { + hue = hue0; + if ((lbv1 === 1 || lbv1 === 0) && m !== 'hsv') { + sat = sat0; + } + } else if (!isNaN(hue1)) { + hue = hue1; + if ((lbv0 === 1 || lbv0 === 0) && m !== 'hsv') { + sat = sat1; + } + } else { + hue = Number.NaN; + } + if (sat == null) { + sat = sat0 + f * (sat1 - sat0); + } + lbv = lbv0 + f * (lbv1 - lbv0); + return res = chroma[m](hue, sat, lbv); + }; + + _interpolators = _interpolators.concat((function() { + var len, o, ref, results; + ref = ['hsv', 'hsl', 'hsi', 'hcl', 'lch', 'hcg']; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + m = ref[o]; + results.push([m, interpolate_hsx]); + } + return results; + })()); + + interpolate_num = function(col1, col2, f, m) { + var n1, n2; + n1 = col1.num(); + n2 = col2.num(); + return chroma.num(n1 + (n2 - n1) * f, 'num'); + }; + + _interpolators.push(['num', interpolate_num]); + + interpolate_lab = function(col1, col2, f, m) { + var res, xyz0, xyz1; + xyz0 = col1.lab(); + xyz1 = col2.lab(); + return res = new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m); + }; + + _interpolators.push(['lab', interpolate_lab]); + +}).call(this); diff --git a/src/static/node_modules/chroma-js/chroma.min.js b/src/static/node_modules/chroma-js/chroma.min.js new file mode 100644 index 0000000..6acb8cd --- /dev/null +++ b/src/static/node_modules/chroma-js/chroma.min.js @@ -0,0 +1,33 @@ +/* +chroma.js - JavaScript library for color conversions + +Copyright (c) 2011-2017, Gregor Aisch +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea,fa,ga,ha,ia,ja,ka,la,ma,na,oa,pa,qa,ra,sa,ta,ua,va,wa,xa,ya,za,Aa=[].slice;va=function(){var a,b,c,d,e;for(a={},e="Boolean Number String Function Array Date RegExp Undefined Null".split(" "),d=0,b=e.length;dc&&(a=c),a},wa=function(a){return a.length>=3?[].slice.call(a):a[0]},t=function(a){var b,c;for(a._clipped=!1,a._unclipped=a.slice(0),b=c=0;c<3;b=++c)b<3?((a[b]<0||a[b]>255)&&(a._clipped=!0),a[b]<0&&(a[b]=0),a[b]>255&&(a[b]=255)):3===b&&(a[b]<0&&(a[b]=0),a[b]>1&&(a[b]=1));return a._clipped||delete a._unclipped,a},d=Math.PI,qa=Math.round,v=Math.cos,A=Math.floor,_=Math.pow,T=Math.log,sa=Math.sin,ta=Math.sqrt,m=Math.atan2,W=Math.max,l=Math.abs,g=2*d,e=d/3,b=d/180,f=180/d,s=function(){return arguments[0]instanceof a?arguments[0]:function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,arguments,function(){})},k=[],"undefined"!=typeof module&&null!==module&&null!=module.exports&&(module.exports=s),"function"==typeof define&&define.amd?define([],function(){return s}):(pa="undefined"!=typeof exports&&null!==exports?exports:this,pa.chroma=s),s.version="1.3.4",j={},h=[],i=!1,a=function(){function a(){var a,b,c,d,e,f,g,k,l;for(f=this,b=[],k=0,d=arguments.length;k3?b[3]:1]},za=function(a){return 255*(a<=.00304?12.92*a:1.055*_(a,1/2.4)-.055)},O=function(a){return a>c.t1?a*a*a:c.t2*(a-c.t0)},c={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},ha=function(){var a,b,c,d,e,f,g,h;return d=wa(arguments),c=d[0],b=d[1],a=d[2],e=ma(c,b,a),f=e[0],g=e[1],h=e[2],[116*g-16,500*(f-g),200*(g-h)]},na=function(a){return(a/=255)<=.04045?a/12.92:_((a+.055)/1.055,2.4)},ya=function(a){return a>c.t3?_(a,1/3):a/c.t2+c.t0},ma=function(){var a,b,d,e,f,g,h;return e=wa(arguments),d=e[0],b=e[1],a=e[2],d=na(d),b=na(b),a=na(a),f=ya((.4124564*d+.3575761*b+.1804375*a)/c.Xn),g=ya((.2126729*d+.7151522*b+.072175*a)/c.Yn),h=ya((.0193339*d+.119192*b+.9503041*a)/c.Zn),[f,g,h]},s.lab=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["lab"]),function(){})},j.lab=N,a.prototype.lab=function(){return ha(this._rgb)},n=function(a){var b,c,d,e,f,g,h,i,j,k,l;return a=function(){var b,c,d;for(d=[],c=0,b=a.length;c=360;)c-=360;p[k]=c}return s(p,b).alpha(e/l)},j.rgb=function(){var a,b,c,d;b=wa(arguments),c=[];for(a in b)d=b[a],c.push(d);return c},s.rgb=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["rgb"]),function(){})},a.prototype.rgb=function(a){return null==a&&(a=!0),a?this._rgb.map(Math.round).slice(0,3):this._rgb.slice(0,3)},a.prototype.rgba=function(a){return null==a&&(a=!0),a?[Math.round(this._rgb[0]),Math.round(this._rgb[1]),Math.round(this._rgb[2]),this._rgb[3]]:this._rgb.slice(0)},h.push({p:3,test:function(a){var b;return b=wa(arguments),"array"===va(b)&&3===b.length?"rgb":4===b.length&&"number"===va(b[3])&&b[3]>=0&&b[3]<=1?"rgb":void 0}}),C=function(a){var b,c,d,e,f,g;if(a.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))return 4!==a.length&&7!==a.length||(a=a.substr(1)),3===a.length&&(a=a.split(""),a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),g=parseInt(a,16),e=g>>16,d=g>>8&255,c=255&g,[e,d,c,1];if(a.match(/^#?([A-Fa-f0-9]{8})$/))return 9===a.length&&(a=a.substr(1)),g=parseInt(a,16),e=g>>24&255,d=g>>16&255,c=g>>8&255,b=qa((255&g)/255*100)/100,[e,d,c,b];if(null!=j.css&&(f=j.css(a)))return f;throw"unknown color: "+a},da=function(a,b){var c,d,e,f,g,h,i;return null==b&&(b="rgb"),g=a[0],e=a[1],d=a[2],c=a[3],g=Math.round(g),e=Math.round(e),d=Math.round(d),i=g<<16|e<<8|d,h="000000"+i.toString(16),h=h.substr(h.length-6),f="0"+qa(255*c).toString(16),f=f.substr(f.length-2),"#"+function(){switch(b.toLowerCase()){case"rgba":return h+f;case"argb":return f+h;default:return h}}()},j.hex=function(a){return C(a)},s.hex=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hex"]),function(){})},a.prototype.hex=function(a){return null==a&&(a="rgb"),da(this._rgb,a)},h.push({p:4,test:function(a){if(1===arguments.length&&"string"===va(a))return"hex"}}),F=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;if(a=wa(arguments),e=a[0],k=a[1],g=a[2],0===k)i=d=b=255*g;else{for(n=[0,0,0],c=[0,0,0],m=g<.5?g*(1+k):g+k-g*k,l=2*g-m,e/=360,n[0]=e+1/3,n[1]=e,n[2]=e-1/3,f=h=0;h<=2;f=++h)n[f]<0&&(n[f]+=1),n[f]>1&&(n[f]-=1),6*n[f]<1?c[f]=l+6*(m-l)*n[f]:2*n[f]<1?c[f]=m:3*n[f]<2?c[f]=l+(m-l)*(2/3-n[f])*6:c[f]=l;j=[qa(255*c[0]),qa(255*c[1]),qa(255*c[2])],i=j[0],d=j[1],b=j[2]}return a.length>3?[i,d,b,a[3]]:[i,d,b]},fa=function(a,b,c){var d,e,f,g,h;return void 0!==a&&a.length>=3&&(g=a,a=g[0],b=g[1],c=g[2]),a/=255,b/=255,c/=255,f=Math.min(a,b,c),W=Math.max(a,b,c),e=(W+f)/2,W===f?(h=0,d=Number.NaN):h=e<.5?(W-f)/(W+f):(W-f)/(2-W-f),a===W?d=(b-c)/(W-f):b===W?d=2+(c-a)/(W-f):c===W&&(d=4+(a-b)/(W-f)),d*=60,d<0&&(d+=360),[d,h,e]},s.hsl=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsl"]),function(){})},j.hsl=F,a.prototype.hsl=function(){return fa(this._rgb)},G=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;if(a=wa(arguments),e=a[0],p=a[1],r=a[2],r*=255,0===p)i=d=b=r;else switch(360===e&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60,f=A(e),c=e-f,g=r*(1-p),h=r*(1-p*c),q=r*(1-p*(1-c)),f){case 0:j=[r,q,g],i=j[0],d=j[1],b=j[2];break;case 1:k=[h,r,g],i=k[0],d=k[1],b=k[2];break;case 2:l=[g,r,q],i=l[0],d=l[1],b=l[2];break;case 3:m=[g,h,r],i=m[0],d=m[1],b=m[2];break;case 4:n=[q,g,r],i=n[0],d=n[1],b=n[2];break;case 5:o=[r,g,h],i=o[0],d=o[1],b=o[2]}return[i,d,b,a.length>3?a[3]:1]},ga=function(){var a,b,c,d,e,f,g,h,i;return g=wa(arguments),f=g[0],c=g[1],a=g[2],e=Math.min(f,c,a),W=Math.max(f,c,a),b=W-e,i=W/255,0===W?(d=Number.NaN,h=0):(h=b/W,f===W&&(d=(c-a)/b),c===W&&(d=2+(a-f)/b),a===W&&(d=4+(f-c)/b),(d*=60)<0&&(d+=360)),[d,h,i]},s.hsv=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsv"]),function(){})},j.hsv=G,a.prototype.hsv=function(){return ga(this._rgb)},Z=function(a){var b,c,d;return"number"===va(a)&&a>=0&&a<=16777215?(d=a>>16,c=a>>8&255,b=255&a,[d,c,b,1]):(console.warn("unknown num color: "+a),[0,0,0,1])},ka=function(){var a,b,c,d;return d=wa(arguments),c=d[0],b=d[1],a=d[2],(c<<16)+(b<<8)+a},s.num=function(b){return new a(b,"num")},a.prototype.num=function(a){return null==a&&(a="rgb"),ka(this._rgb,a)},j.num=Z,h.push({p:1,test:function(a){if(1===arguments.length&&"number"===va(a)&&a>=0&&a<=16777215)return"num"}}),B=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;if(c=wa(arguments),h=c[0],e=c[1],b=c[2],e/=100,g=g/100*255,a=255*e,0===e)l=g=d=b;else switch(360===h&&(h=0),h>360&&(h-=360),h<0&&(h+=360),h/=60,i=A(h),f=h-i,j=b*(1-e),k=j+a*(1-f),s=j+a*f,t=j+a,i){case 0:m=[t,s,j],l=m[0],g=m[1],d=m[2];break;case 1:n=[k,t,j],l=n[0],g=n[1],d=n[2];break;case 2:o=[j,t,s],l=o[0],g=o[1],d=o[2];break;case 3:p=[j,k,t],l=p[0],g=p[1],d=p[2];break;case 4:q=[s,j,t],l=q[0],g=q[1],d=q[2];break;case 5:r=[t,j,k],l=r[0],g=r[1],d=r[2]}return[l,g,d,c.length>3?c[3]:1]},ca=function(){var a,b,c,d,e,f,g,h,i;return i=wa(arguments),h=i[0],e=i[1],b=i[2],g=Math.min(h,e,b),W=Math.max(h,e,b),d=W-g,c=100*d/255,a=g/(255-d)*100,0===d?f=Number.NaN:(h===W&&(f=(e-b)/d),e===W&&(f=2+(b-h)/d),b===W&&(f=4+(h-e)/d),(f*=60)<0&&(f+=360)),[f,c,a]},s.hcg=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hcg"]),function(){})},j.hcg=B,a.prototype.hcg=function(){return ca(this._rgb)},w=function(a){var b,c,d,e,f,g,h,i;if(a=a.toLowerCase(),null!=s.colors&&s.colors[a])return C(s.colors[a]);if(f=a.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){for(h=f.slice(1,4),e=g=0;g<=2;e=++g)h[e]=+h[e];h[3]=1}else if(f=a.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/))for(h=f.slice(1,5),e=i=0;i<=3;e=++i)h[e]=+h[e];else if(f=a.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){for(h=f.slice(1,4),e=b=0;b<=2;e=++b)h[e]=qa(2.55*h[e]);h[3]=1}else if(f=a.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){for(h=f.slice(1,5),e=c=0;c<=2;e=++c)h[e]=qa(2.55*h[e]);h[3]=+h[3]}else(f=a.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/))?(d=f.slice(1,4),d[1]*=.01,d[2]*=.01,h=F(d),h[3]=1):(f=a.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/))&&(d=f.slice(1,4),d[1]*=.01,d[2]*=.01,h=F(d),h[3]=+f[4]);return h},ba=function(a){var b;return b=a[3]<1?"rgba":"rgb","rgb"===b?b+"("+a.slice(0,3).map(qa).join(",")+")":"rgba"===b?b+"("+a.slice(0,3).map(qa).join(",")+","+a[3]+")":void 0},oa=function(a){return qa(100*a)/100},E=function(a,b){var c;return c=b<1?"hsla":"hsl",a[0]=oa(a[0]||0),a[1]=oa(100*a[1])+"%",a[2]=oa(100*a[2])+"%","hsla"===c&&(a[3]=b),c+"("+a.join(",")+")"},j.css=function(a){return w(a)},s.css=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["css"]),function(){})},a.prototype.css=function(a){return null==a&&(a="rgb"),"rgb"===a.slice(0,3)?ba(this._rgb):"hsl"===a.slice(0,3)?E(this.hsl(),this.alpha()):void 0},j.named=function(a){return C(xa[a])},h.push({p:5,test:function(a){if(1===arguments.length&&null!=xa[a])return"named"}}),a.prototype.name=function(a){var b,c;arguments.length&&(xa[a]&&(this._rgb=C(xa[a])),this._rgb[3]=1),b=this.hex();for(c in xa)if(b===xa[c])return c;return b},P=function(){var a,c,d,e;return e=wa(arguments),d=e[0],a=e[1],c=e[2],c*=b,[d,v(c)*a,sa(c)*a]},Q=function(){var a,b,c,d,e,f,g,h,i,j,k;return c=wa(arguments),h=c[0],e=c[1],g=c[2],j=P(h,e,g),a=j[0],b=j[1],d=j[2],k=N(a,b,d),i=k[0],f=k[1],d=k[2],[i,f,d,c.length>3?c[3]:1]},M=function(){var a,b,c,d,e,g;return g=wa(arguments),e=g[0],a=g[1],b=g[2],c=ta(a*a+b*b),d=(m(b,a)*f+360)%360,0===qa(1e4*c)&&(d=Number.NaN),[e,c,d]},ia=function(){var a,b,c,d,e,f,g;return f=wa(arguments),e=f[0],c=f[1],b=f[2],g=ha(e,c,b),d=g[0],a=g[1],b=g[2],M(d,a,b)},s.lch=function(){var b;return b=wa(arguments),new a(b,"lch")},s.hcl=function(){var b;return b=wa(arguments),new a(b,"hcl")},j.lch=Q,j.hcl=function(){var a,b,c,d;return d=wa(arguments),b=d[0],a=d[1],c=d[2],Q([c,a,b])},a.prototype.lch=function(){return ia(this._rgb)},a.prototype.hcl=function(){return ia(this._rgb).reverse()},aa=function(a){var b,c,d,e,f,g,h,i,j;return null==a&&(a="rgb"),i=wa(arguments),h=i[0],e=i[1],b=i[2],h/=255,e/=255,b/=255,f=1-Math.max(h,Math.max(e,b)),d=f<1?1/(1-f):0,c=(1-h-f)*d,g=(1-e-f)*d,j=(1-b-f)*d,[c,g,j,f]},u=function(){var a,b,c,d,e,f,g,h,i;return b=wa(arguments),d=b[0],g=b[1],i=b[2],f=b[3],a=b.length>4?b[4]:1,1===f?[0,0,0,a]:(h=d>=1?0:255*(1-d)*(1-f),e=g>=1?0:255*(1-g)*(1-f),c=i>=1?0:255*(1-i)*(1-f),[h,e,c,a])},j.cmyk=function(){return u(wa(arguments))},s.cmyk=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["cmyk"]),function(){})},a.prototype.cmyk=function(){return aa(this._rgb)},j.gl=function(){var a,b,c,d,e;for(d=function(){var a,c;a=wa(arguments),c=[];for(b in a)e=a[b],c.push(e);return c}.apply(this,arguments),a=c=0;c<=2;a=++c)d[a]*=255;return d},s.gl=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["gl"]),function(){})},a.prototype.gl=function(){var a;return a=this._rgb,[a[0]/255,a[1]/255,a[2]/255,a[3]]},ja=function(a,b,c){var d;return d=wa(arguments),a=d[0],b=d[1],c=d[2],a=U(a),b=U(b),c=U(c),.2126*a+.7152*b+.0722*c},U=function(a){return a/=255,a<=.03928?a/12.92:_((a+.055)/1.055,2.4)},k=[],H=function(a,b,c,d){var e,f,g,h;for(null==c&&(c=.5),null==d&&(d="rgb"),"object"!==va(a)&&(a=s(a)),"object"!==va(b)&&(b=s(b)),g=0,f=k.length;ga?f(c,i):f(i,g)},c=ja(this._rgb),this._rgb=(c>a?f(s("black"),this):f(this,s("white"))).rgba()),this):ja(this._rgb)},ua=function(a){var b,c,d,e;return e=a/100,e<66?(d=255,c=-155.25485562709179-.44596950469579133*(c=e-2)+104.49216199393888*T(c),b=e<20?0:-254.76935184120902+.8274096064007395*(b=e-10)+115.67994401066147*T(b)):(d=351.97690566805693+.114206453784165*(d=e-55)-40.25366309332127*T(d),c=325.4494125711974+.07943456536662342*(c=e-50)-28.0852963507957*T(c),b=255),[d,c,b]},la=function(){var a,b,c,d,e,f,g,h;for(f=wa(arguments),e=f[0],f[1],a=f[2],d=1e3,c=4e4,b=.4;c-d>b;)h=.5*(c+d),g=ua(h),g[2]/g[0]>=a/e?c=h:d=h;return qa(h)},s.temperature=s.kelvin=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["temperature"]),function(){})},j.temperature=j.kelvin=j.K=ua,a.prototype.temperature=function(){return la(this._rgb)},a.prototype.kelvin=a.prototype.temperature,s.contrast=function(b,c){var d,e,f,g;return"string"!==(f=va(b))&&"number"!==f||(b=new a(b)),"string"!==(g=va(c))&&"number"!==g||(c=new a(c)),d=b.luminance(),e=c.luminance(),d>e?(d+.05)/(e+.05):(e+.05)/(d+.05)},s.distance=function(b,c,d){var e,f,g,h,i,j,k;null==d&&(d="lab"),"string"!==(i=va(b))&&"number"!==i||(b=new a(b)),"string"!==(j=va(c))&&"number"!==j||(c=new a(c)),g=b.get(d),h=c.get(d),k=0;for(f in g)e=(g[f]||0)-(h[f]||0),k+=e*e;return Math.sqrt(k)},s.deltaE=function(b,c,e,f){var g,h,i,j,k,n,o,p,q,r,s,t,u,w,x,y,z,A,B,C,D,E,F,G,H,I,J;for(null==e&&(e=1),null==f&&(f=1),"string"!==(z=va(b))&&"number"!==z||(b=new a(b)),"string"!==(A=va(c))&&"number"!==A||(c=new a(c)),B=b.lab(),g=B[0],i=B[1],k=B[2],C=c.lab(),h=C[0],j=C[1],n=C[2],o=ta(i*i+k*k),p=ta(j*j+n*n),F=g<16?.511:.040975*g/(1+.01765*g),D=.0638*o/(1+.0131*o)+.638,y=o<1e-6?0:180*m(k,i)/d;y<0;)y+=360;for(;y>=360;)y-=360;return G=y>=164&&y<=345?.56+l(.2*v(d*(y+168)/180)):.36+l(.4*v(d*(y+35)/180)),q=o*o*o*o,x=ta(q/(q+1900)),E=D*(x*G+1-x),w=g-h,u=o-p,s=i-j,t=k-n,r=s*s+t*t-u*u,H=w/(e*F),I=u/(f*D),J=E,ta(H*H+I*I+r/(J*J))},a.prototype.get=function(a){var b,c,d,e,f,g;return d=this,f=a.split("."),e=f[0],b=f[1],g=d[e](),b?(c=e.indexOf(b),c>-1?g[c]:console.warn("unknown channel "+b+" in mode "+e)):g},a.prototype.set=function(a,b){var c,d,e,f,g,h;if(e=this,g=a.split("."),f=g[0],c=g[1],c)if(h=e[f](),(d=f.indexOf(c))>-1)if("string"===va(b))switch(b.charAt(0)){case"+":case"-":h[d]+=+b;break;case"*":h[d]*=+b.substr(1);break;case"/":h[d]/=+b.substr(1);break;default:h[d]=+b}else h[d]=b;else console.warn("unknown channel "+c+" in mode "+f);else h=b;return s(h,f).alpha(e.alpha())},a.prototype.clipped=function(){return this._rgb._clipped||!1},a.prototype.alpha=function(a){return arguments.length?s.rgb([this._rgb[0],this._rgb[1],this._rgb[2],a]):this._rgb[3]},a.prototype.darken=function(a){var b,d;return null==a&&(a=1),d=this,b=d.lab(),b[0]-=c.Kn*a,s.lab(b).alpha(d.alpha())},a.prototype.brighten=function(a){return null==a&&(a=1),this.darken(-a)},a.prototype.darker=a.prototype.darken,a.prototype.brighter=a.prototype.brighten,a.prototype.saturate=function(a){var b,d;return null==a&&(a=1),d=this,b=d.lch(),b[1]+=a*c.Kn,b[1]<0&&(b[1]=0),s.lch(b).alpha(d.alpha())},a.prototype.desaturate=function(a){return null==a&&(a=1),this.saturate(-a)},a.prototype.premultiply=function(){var a,b;return b=this.rgb(),a=this.alpha(),s(b[0]*a,b[1]*a,b[2]*a,a)},o=function(a,b,c){if(!o[c])throw"unknown blend mode "+c;return o[c](a,b)},p=function(a){return function(b,c){var d,e;return d=s(c).rgb(),e=s(b).rgb(),s(a(d,e),"rgb")}},z=function(a){return function(b,c){var d,e,f;for(f=[],d=e=0;e<=3;d=++e)f[d]=a(b[d],c[d]);return f}},Y=function(a,b){return a},X=function(a,b){return a*b/255},x=function(a,b){return a>b?b:a},R=function(a,b){return a>b?a:b},ra=function(a,b){return 255*(1-(1-a/255)*(1-b/255))},$=function(a,b){return b<128?2*a*b/255:255*(1-2*(1-a/255)*(1-b/255))},r=function(a,b){return 255*(1-(1-b/255)/(a/255))},y=function(a,b){return 255===a?255:(a=b/255*255/(1-a/255),a>255?255:a)},o.normal=p(z(Y)),o.multiply=p(z(X)),o.screen=p(z(ra)),o.overlay=p(z($)),o.darken=p(z(x)),o.lighten=p(z(R)),o.dodge=p(z(y)),o.burn=p(z(r)),s.blend=o,s.analyze=function(a){var b,c,d,e;for(d={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0},c=0,b=a.length;cd.max&&(d.max=e),d.count+=1);return d.domain=[d.min,d.max],d.limits=function(a,b){return s.limits(d,a,b)},d},s.scale=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,t,u,v,w;return j="rgb",k=s("#ccc"),o=0,!1,g=[0,1],n=[],m=[0,0],c=!1,e=[],l=!1,i=0,h=1,f=!1,d={},p=!0,v=function(a){var b,c,d,f,g,h;if(null==a&&(a=["#fff","#000"]),null!=a&&"string"===va(a)&&null!=s.brewer&&(a=s.brewer[a]||s.brewer[a.toLowerCase()]||a),"array"===va(a)){for(a=a.slice(0),b=d=0,f=a.length-1;0<=f?d<=f:d>=f;b=0<=f?++d:--d)c=a[b],"string"===va(c)&&(a[b]=s(c));for(n.length=0,b=h=0,g=a.length-1;0<=g?h<=g:h>=g;b=0<=g?++h:--h)n.push(b/(a.length-1))}return u(),e=a},r=function(a){var b,d;if(null!=c){for(d=c.length-1,b=0;b=c[b];)b++;return b-1}return 0},w=function(a){return a},function(a){var b,d,e,f,g;return g=a,c.length>2&&(f=c.length-1,b=r(a),e=c[0]+(c[1]-c[0])*(0+.5*o),d=c[f-1]+(c[f]-c[f-1])*(1-.5*o),g=i+(c[b]+.5*(c[b+1]-c[b])-e)/(d-e)*(h-i)),g},t=function(a,b){var f,g,l,o,q,t,u,v;if(null==b&&(b=!1),isNaN(a))return k;if(b?v=a:c&&c.length>2?(f=r(a),v=f/(c.length-2),v=m[0]+v*(1-m[0]-m[1])):h!==i?(v=(a-i)/(h-i),v=m[0]+v*(1-m[0]-m[1]),v=Math.min(1,Math.max(0,v))):v=1,b||(v=w(v)),o=Math.floor(1e4*v),p&&d[o])g=d[o];else{if("array"===va(e))for(l=q=0,u=n.length-1;0<=u?q<=u:q>=u;l=0<=u?++q:--q){if(t=n[l],v<=t){g=e[l];break}if(v>=t&&l===n.length-1){g=e[l];break}if(v>t&&v=k;b=0<=k?++l:--l)n.push(b/(d-1));return g=[i,h],q},q.mode=function(a){return arguments.length?(j=a,u(),q):j},q.range=function(a,b){return v(a,b),q},q.out=function(a){return l=a,q},q.spread=function(a){return arguments.length?(o=a,q):o},q.correctLightness=function(a){return null==a&&(a=!0),f=a,u(),w=f?function(a){var b,c,d,e,f,g,h,i,j;for(b=t(0,!0).lab()[0],c=t(1,!0).lab()[0],h=b>c,d=t(a,!0).lab()[0],f=b+(c-b)*a,e=d-f,i=0,j=1,g=20;Math.abs(e)>.01&&g-- >0;)!function(){h&&(e*=-1),e<0?(i=a,a+=.5*(j-a)):(j=a,a+=.5*(i-a)),d=t(a,!0).lab()[0],e=d-f}();return a}:function(a){return a},q},q.padding=function(a){return null!=a?("number"===va(a)&&(a=[a,a]),m=a,q):m},q.colors=function(b,d){var f,h,i,j,k,l,m,n;if(arguments.length<2&&(d="hex"),k=[],0===arguments.length)k=e.slice(0);else if(1===b)k=[q(.5)];else if(b>1)h=g[0],f=g[1]-h,k=function(){l=[];for(var a=0;0<=b?ab;0<=b?a++:a--)l.push(a);return l}.apply(this).map(function(a){return q(h+a/(b-1)*f)});else{if(a=[],m=[],c&&c.length>2)for(i=n=1,j=c.length;1<=j?nj;i=1<=j?++n:--n)m.push(.5*(c[i-1]+c[i]));else m=g;k=m.map(function(a){return q(a)})}return s[d]&&(k=k.map(function(a){return a[d]()})),k},q.cache=function(a){return null!=a?p=a:p},q},null==s.scales&&(s.scales={}),s.scales.cool=function(){return s.scale([s.hsl(180,1,.9),s.hsl(250,.7,.4)])},s.scales.hot=function(){return s.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")},s.analyze=function(a,b,c){var d,e,f,g,h,i,j;if(h={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0},null==c&&(c=function(){return!0}),d=function(a){null==a||isNaN(a)||(h.values.push(a),h.sum+=a,ah.max&&(h.max=a),h.count+=1)},j=function(a,e){if(c(a,e))return d(null!=b&&"function"===va(b)?b(a):null!=b&&"string"===va(b)||"number"===va(b)?a[b]:a)},"array"===va(a))for(g=0,f=a.length;g=O;y=1<=O?++K:--K)C.push(E+y/c*(W-E)) +;C.push(W)}else if("l"===b.substr(0,1)){if(E<=0)throw"Logarithmic scales are only possible for values > 0";for(F=Math.LOG10E*T(E),D=Math.LOG10E*T(W),C.push(E),y=ja=1,P=c-1;1<=P?ja<=P:ja>=P;y=1<=P?++ja:--ja)C.push(_(10,F+y/c*(D-F)));C.push(W)}else if("q"===b.substr(0,1)){for(C.push(E),y=d=1,X=c-1;1<=X?d<=X:d>=X;y=1<=X?++d:--d)L=(ia.length-1)*y/c,M=A(L),M===L?C.push(ia[M]):(N=L-M,C.push(ia[M]*(1-N)+ia[M+1]*N));C.push(W)}else if("k"===b.substr(0,1)){for(H=ia.length,r=new Array(H),w=new Array(c),ea=!0,I=0,u=null,u=[],u.push(E),y=e=1,Y=c-1;1<=Y?e<=Y:e>=Y;y=1<=Y?++e:--e)u.push(E+y/c*(W-E));for(u.push(W);ea;){for(z=f=0,Z=c-1;0<=Z?f<=Z:f>=Z;z=0<=Z?++f:--f)w[z]=0;for(y=g=0,$=H-1;0<=$?g<=$:g>=$;y=0<=$?++g:--g){for(ha=ia[y],G=Number.MAX_VALUE,z=h=0,aa=c-1;0<=aa?h<=aa:h>=aa;z=0<=aa?++h:--h)(x=l(u[z]-ha))=ba;z=0<=ba?++i:--i)J[z]=null;for(y=j=0,ca=H-1;0<=ca?j<=ca:j>=ca;y=0<=ca?++j:--j)v=r[y],null===J[v]?J[v]=ia[y]:J[v]+=ia[y];for(z=k=0,da=c-1;0<=da?k<=da:k>=da;z=0<=da?++k:--k)J[z]*=1/w[z];for(ea=!1,z=m=0,Q=c-1;0<=Q?m<=Q:m>=Q;z=0<=Q?++m:--m)if(J[z]!==u[y]){ea=!0;break}u=J,I++,I>200&&(ea=!1)}for(B={},z=n=0,R=c-1;0<=R?n<=R:n>=R;z=0<=R?++n:--n)B[z]=[];for(y=o=0,S=H-1;0<=S?o<=S:o>=S;y=0<=S?++o:--o)v=r[y],B[v].push(ia[y]);for(fa=[],z=p=0,U=c-1;0<=U?p<=U:p>=U;z=0<=U?++p:--p)fa.push(B[z][0]),fa.push(B[z][B[z].length-1]);for(fa=fa.sort(function(a,b){return a-b}),C.push(fa[0]),y=q=1,V=fa.length-1;q<=V;y=q+=2)ga=fa[y],isNaN(ga)||C.indexOf(ga)!==-1||C.push(ga)}return C},D=function(a,b,c){var d,f,h,i;return d=wa(arguments),a=d[0],b=d[1],c=d[2],isNaN(a)&&(a=0),a/=360,a<1/3?(f=(1-b)/3,i=(1+b*v(g*a)/v(e-g*a))/3,h=1-(f+i)):a<2/3?(a-=1/3,i=(1-b)/3,h=(1+b*v(g*a)/v(e-g*a))/3,f=1-(i+h)):(a-=2/3,h=(1-b)/3,f=(1+b*v(g*a)/v(e-g*a))/3,i=1-(h+f)),i=S(c*i*3),h=S(c*h*3),f=S(c*f*3),[255*i,255*h,255*f,d.length>3?d[3]:1]},ea=function(){var a,b,c,d,e,f,h,i;return h=wa(arguments),f=h[0],b=h[1],a=h[2],g=2*Math.PI,f/=255,b/=255,a/=255,e=Math.min(f,b,a),d=(f+b+a)/3,i=1-e/d,0===i?c=0:(c=(f-b+(f-a))/2,c/=Math.sqrt((f-b)*(f-b)+(f-a)*(b-a)),c=Math.acos(c),a>b&&(c=g-c),c/=g),[360*c,i,d]},s.hsi=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsi"]),function(){})},j.hsi=D,a.prototype.hsi=function(){return ea(this._rgb)},I=function(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;return"hsl"===d?(o=a.hsl(),p=b.hsl()):"hsv"===d?(o=a.hsv(),p=b.hsv()):"hcg"===d?(o=a.hcg(),p=b.hcg()):"hsi"===d?(o=a.hsi(),p=b.hsi()):"lch"!==d&&"hcl"!==d||(d="hcl",o=a.hcl(),p=b.hcl()),"h"===d.substr(0,1)&&(g=o[0],m=o[1],j=o[2],h=p[0],n=p[1],k=p[2]),isNaN(g)||isNaN(h)?isNaN(g)?isNaN(h)?f=Number.NaN:(f=h,1!==j&&0!==j||"hsv"===d||(l=n)):(f=g,1!==k&&0!==k||"hsv"===d||(l=m)):(e=h>g&&h-g>180?h-(g+360):h180?h+360-g:h-g,f=g+c*e),null==l&&(l=m+c*(n-m)),i=j+c*(k-j),s[d](f,l,i)},k=k.concat(function(){var a,b,c,d;for(c=["hsv","hsl","hsi","hcl","lch","hcg"],d=[],b=0,a=c.length;b index.html + bin/post-process + +preview: + http-server + # python -m SimpleHTTPServer diff --git a/src/static/node_modules/chroma-js/docs/assets/bg.png b/src/static/node_modules/chroma-js/docs/assets/bg.png new file mode 100644 index 0000000..857eb8f Binary files /dev/null and b/src/static/node_modules/chroma-js/docs/assets/bg.png differ diff --git a/src/static/node_modules/chroma-js/docs/bin/post-process b/src/static/node_modules/chroma-js/docs/bin/post-process new file mode 100644 index 0000000..608f2de --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/bin/post-process @@ -0,0 +1,11 @@ +#!/usr/bin/env node +var fs = require('fs'); + +var index = fs.readFileSync('index.html', 'utf-8'), + footer = fs.readFileSync('src/footer.inc.html', 'utf-8'); + +index = index.replace('', '\n'+footer+'\n'); +index = index.replace('', '
'); +index = index.replace('', '
'); + +fs.writeFileSync('index.html', index); \ No newline at end of file diff --git a/src/static/node_modules/chroma-js/docs/index.html b/src/static/node_modules/chroma-js/docs/index.html new file mode 100644 index 0000000..8d3fca1 --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/index.html @@ -0,0 +1,685 @@ + + + + chroma.js api docs! + + +
+

chroma.js

+

chroma.js is a tiny JavaScript library (14kB) for dealing with colors!

+

Build Status

+

Quick-start

+

Here are a couple of things chroma.js can do for you:

+
    +
  • read colors from a wide range of formats
  • +
  • analyze and manipulate colors
  • +
  • convert colors into wide range of formats
  • +
  • linear and bezier interpolation in different color spaces
  • +
+

Here's an example for a simple read / manipulate / output chain:

+
chroma('pink').darken().saturate(2).hex()
+
+

Aside from that, chroma.js can also help you generate nice colors using various methods, for instance to be used in color palette for maps or data visualization.

+
chroma.scale(['#fafa6e','#2A4858'])
+    .mode('lch').colors(6)
+
+

chroma.js has a lot more to offer, but that's the gist of it.

+

API

+

chroma

+

(color)

+

The first step is to get your color into chroma.js. That's what the generic constructor chroma() does. The function is trying to guess the color format for you. For instances, it will recognized any named color from the W3CX11 specification:

+
chroma('hotpink')
+
+

If there's no matching named color chroma.js checks for a hexadecimal string. It ignores case, the # sign is optional, and the shorter three letter format is recognized as well. So any of these are valid hexadecimal representations: #ff3399, FF3399, #f39, etc.

+
chroma('#ff3399'); 
+chroma('F39');
+
+

In addition to hex strings, hexadecimal numbers (in fact, just any number between 0 and 16777215), will be recognized, too.

+
chroma(0xff3399)
+
+

If you pass the RGB channels individually, too. Each parameter must be within 0..255. You can pass the numbers as individual arguments or as array.

+
chroma(0xff, 0x33, 0x99);
+chroma(255, 51, 153);
+chroma([255, 51, 153]);
+
+

You can construct colors from different color spaces by passing the name of color space as the last argument. Here we define the same color in HSL by passing the hue angle (0-360) and percentages for saturation and l*ightness:

+
chroma(330, 1, 0.6, 'hsl')
+
+

chroma.hsl

+

(hue, saturation, lightness)

+

Alternatively, every color space has its own constructor function under the chroma namespace. For a list of all supported color spaces, check the appendix.

+
chroma.hsl(330, 1, 0.6)
+
+

chroma.hsv

+

(hue, saturation, value)

+

chroma.lab

+

(Lightness, a, b)

+

chroma.lch

+

(Lightness, chroma, hue)

+

The range for lightness and chroma depend on the hue, but go roughly from 0..100-150. The range for hue is 0..360.

+
chroma.lch(80, 40, 130);
+chroma(80, 40, 130, 'lch');
+
+

chroma.hcl

+

(hue, chroma, lightness)

+

You can use hcl instead of Lch. Lightness and hue channels are switched to be more consistent with HSL.

+
chroma.hcl(130, 40, 80);
+chroma(130, 40, 80, 'hcl');
+
+

chroma.cmyk

+

(cyan, magenta, yellow, black)

+

Each between 0 and 1.

+
chroma.cmyk(0.2, 0.8, 0, 0);
+chroma(0.2, 0.8, 0, 0, 'cmyk');
+
+

chroma.gl

+

(red, green, blue, [alpha])

+

GL is a variant of RGB(A), with the only difference that the components are normalized to the range of 0..1.

+
chroma.gl(0.6, 0, 0.8);
+chroma.gl(0.6, 0, 0.8, 0.5);
+chroma(0.6, 0, 0.8, 'gl');
+
+

chroma.temperature

+

(K)

+

Returns a color from the color temperature scale. Based on Neil Bartlett's implementation.

+
chroma.temperature(2000); // candle light
+chroma.temperature(3500); // sunset
+chroma.temperature(6500); // daylight
+
+

The effective temperature range goes from 0 to about 30000 Kelvin,

+
f = function(i) {
+    return chroma.temperature(i * 30000)
+}
+
+

chroma.mix

+

(color1, color2, ratio=0.5, mode='rgb')

+

Mixes two colors. The mix ratio is a value between 0 and 1.

+
chroma.mix('red', 'blue');
+chroma.mix('red', 'blue', 0.25);
+chroma.mix('red', 'blue', 0.75);
+
+

The color mixing produces different results based the color space used for interpolation.

+
chroma.mix('red', 'blue', 0.5, 'rgb');
+chroma.mix('red', 'blue', 0.5, 'hsl');
+chroma.mix('red', 'blue', 0.5, 'lab');
+chroma.mix('red', 'blue', 0.5, 'lch');
+
+

chroma.average

+

(colors, mode='rgb')

+

Similar to chroma.mix, but accepts more than two colors. Simple averaging of R,G,B components and the alpha channel.

+
colors = ['#ddd', 'yellow', 'red', 'teal'];
+chroma.average(colors);
+chroma.average(colors, 'lab');
+chroma.average(colors, 'lch');
+
+

Also works with alpha channels.

+
chroma.average(['red', 'rgba(0,0,0,0.5)']).css();
+
+

chroma.blend

+

(color1, color2, mode)

+

Blends two colors using RGB channel-wise blend functions. Valid blend modes are multiply, darken, lighten, screen, overlay, burn, and dogde.

+
chroma.blend('4CBBFC', 'EEEE22', 'multiply');
+chroma.blend('4CBBFC', 'EEEE22', 'darken');
+chroma.blend('4CBBFC', 'EEEE22', 'lighten');
+
+

chroma.random

+

()

+

Returns a random color.

+
chroma.random();
+chroma.random();
+chroma.random();
+
+

chroma.contrast

+

(color1, color2)

+

Computes the WCAG contrast ratio between two colors. A minimum contrast of 4.5:1 is recommended to ensure that text is still readable against a background color.

+
// contrast smaller than 4.5 = too low
+chroma.contrast('pink', 'hotpink');
+// contrast greater than 4.5 = high enough
+chroma.contrast('pink', 'purple');
+
+

chroma.distance

+

(color1, color2, mode='lab')

+

Computes the eucledian distance between two colors in a given color space (default is Lab).

+
chroma.distance('#fff', '#ff0', 'rgb');
+chroma.distance('#fff', '#f0f', 'rgb');
+chroma.distance('#fff', '#ff0');
+chroma.distance('#fff', '#f0f');
+
+

chroma.deltaE

+

(reference, sample, L=1, C=1)

+

Computes color difference as developed by the Colour Measurement Committee of the Society of Dyers and Colourists (CMC) in 1984. The implementation is adapted from Bruce Lindbloom. The parameters L and C are weighting factors for lightness and chromacity.

+
chroma.deltaE('#ededee', '#edeeed');
+chroma.deltaE('#ececee', '#eceeec');
+chroma.deltaE('#e9e9ee', '#e9eee9');
+chroma.deltaE('#e4e4ee', '#e4eee4');
+chroma.deltaE('#e0e0ee', '#e0eee0');
+
+

chroma.brewer

+

chroma.brewer is an map of ColorBrewer scales that are included in chroma.js for convenience. chroma.scale uses the colors to construct.

+
chroma.brewer.OrRd
+
+

chroma.limits

+

(data, mode, n)

+

A helper function that computes class breaks for you, based on data. It supports the modes equidistant (e), quantile (q), logarithmic (l), and k-means (k). Let's take a few numbers as sample data.

+
var data = [2.0,3.5,3.6,3.8,3.8,4.1,4.3,4.4,
+            4.6,4.9,5.2,5.3,5.4,5.7,5.8,5.9,
+            6.2,6.5,6.8,7.2,8];
+
+

equidistant breaks are computed by dividing the total range of the data into n groups of equal size.

+
chroma.limits(data, 'e', 4);
+
+

In the quantile mode, the input domain is divided by quantile ranges.

+
chroma.limits(data, 'q', 4);
+
+

logarithmic breaks are equidistant breaks but on a logarithmic scale.

+
chroma.limits(data, 'l', 4);
+
+

k-means break is using the 1-dimensional k-means clustering algorithm to find (roughly) n groups of "similar" values. Note that this k-means implementation does not guarantee to find exactly n groups.

+
chroma.limits(data, 'k', 4);
+
+

color

+

color.alpha

+

(a)

+

Get and set the color opacity using color.alpha.

+
chroma('red').alpha(0.5);
+chroma('rgba(255,0,0,0.35)').alpha();
+
+

color.darken

+

(value=1)

+

Once loaded, chroma.js can change colors. One way we already saw above, you can change the lightness.

+
chroma('hotpink').darken();
+chroma('hotpink').darken(2);
+chroma('hotpink').darken(2.6);
+
+

color.brighten

+

(value=1)

+

Similar to darken, but the opposite direction

+
chroma('hotpink').brighten();
+chroma('hotpink').brighten(2);
+chroma('hotpink').brighten(3);
+
+

color.saturate

+

(value=1)

+

Changes the saturation of a color by manipulating the Lch chromacity.

+
chroma('slategray').saturate(); 
+chroma('slategray').saturate(2); 
+chroma('slategray').saturate(3);
+
+

color.desaturate

+

(value=1)

+

Similar to saturate, but the opposite direction.

+
chroma('hotpink').desaturate();
+chroma('hotpink').desaturate(2);
+chroma('hotpink').desaturate(3);
+
+

color.set

+

(channel, value)

+

Changes a single channel and returns the result a new chroma object.

+
// change hue to 0 deg (=red)
+chroma('skyblue').set('hsl.h', 0);
+// set chromacity to 30
+chroma('hotpink').set('lch.c', 30);
+
+

Relative changes work, too:

+
// half Lab lightness
+chroma('orangered').set('lab.l', '*0.5');
+// double Lch saturation
+chroma('darkseagreen').set('lch.c', '*2');
+
+

color.get

+

(channel)

+

Returns a single channel value.

+
chroma('orangered').get('lab.l');
+chroma('orangered').get('hsl.l');
+chroma('orangered').get('rgb.g');
+
+

color.luminance

+

([lum, mode='rgb'])

+

If called without arguments color.luminance returns the relative brightness, according to the WCAG definition. Normalized to 0 for darkest black and 1 for lightest white.

+
chroma('white').luminance();
+chroma('aquamarine').luminance();
+chroma('hotpink').luminance();
+chroma('darkslateblue').luminance();
+chroma('black').luminance();
+
+

chroma.js also allows you to adjust the luminance of a color. The source color will be interpolated with black or white until the correct luminance is found.

+
// set lumincance to 50% for all colors
+chroma('white').luminance(0.5);
+chroma('aquamarine').luminance(0.5);
+chroma('hotpink').luminance(0.5);
+chroma('darkslateblue').luminance(0.5);
+
+

By default, this interpolation is done in RGB, but you can interpolate in different color spaces by passing them as second argument:

+
chroma('aquamarine').luminance(0.5); // rgb
+chroma('aquamarine').luminance(0.5, 'lab');
+chroma('aquamarine').luminance(0.5, 'hsl');
+
+

color.hex

+

Finally, chroma.js allows you to output colors in various color spaces and formats.

+

Most often you will want to output the color as hexadecimal string.

+
chroma('orange').hex()
+
+

color.name

+

Returns the named color. Falls back to hexadecimal RGB string, if the color isn't present.

+
chroma('#ffa500').name();
+chroma('#ffa505').name();
+
+

color.css

+

Returns a RGB() or HSL() string representation that can be used as CSS-color definition.

+
chroma('teal').css();
+chroma('teal').alpha(0.5).css();
+chroma('teal').css('hsl');
+
+

color.rgb

+

(round=true)

+

Returns an array with the red, green, and blue component, each as number within the range 0..255. Chroma internally stores RGB channels as floats but rounds the numbers before returning them. You can pass false to prevent the rounding.

+
chroma('orange').rgb();
+chroma('orange').darken().rgb();
+chroma('orange').darken().rgb(false);
+
+

color.rgba

+

(round=true)

+

Just like color.rgb but adds the alpha channel to the returned array.

+
chroma('orange').rgba();
+chroma('hsla(20, 100%, 40%, 0.5)').rgba();
+
+

color.hsl

+

Returns an array with the hue, saturation, and lightness component. Hue is the color angle in degree (0..360), saturation and lightness are within 0..1. Note that for hue-less colors (black, white, and grays), the hue component will be NaN.

+
chroma('orange').hsl();
+chroma('white').hsl();
+
+

color.hsv

+

Returns an array with the hue, saturation, and value components. Hue is the color angle in degree (0..360), saturation and value are within 0..1. Note that for hue-less colors (black, white, and grays), the hue component will be NaN.

+
chroma('orange').hsv();
+chroma('white').hsv();
+
+

color.hsi

+

Returns an array with the hue, saturation, and intensity components, each as number between 0 and 255. Note that for hue-less colors (black, white, and grays), the hue component will be NaN.

+
chroma('orange').hsi();
+chroma('white').hsi();
+
+

color.lab

+

Returns an array with the L, a, and b components.

+
chroma('orange').lab()
+
+

color.lch

+

Returns an array with the Lightness, chroma, and hue components.

+
chroma('skyblue').lch()
+
+

color.hcl

+

Alias of lch, but with the components in reverse order.

+
chroma('skyblue').hcl()
+
+

color.temperature

+

Estimate the temperature in Kelvin of any given color, though this makes the only sense for colors from the temperature gradient above.

+
chroma('#ff3300').temperature();
+chroma('#ff8a13').temperature();
+chroma('#ffe3cd').temperature();
+chroma('#cbdbff').temperature();
+chroma('#b3ccff').temperature();
+
+

color.gl

+

Like RGB, but in the channel range of [0..1] instead of [0..255]

+
chroma('33cc00').gl();
+
+

color.clipped

+

When converting colors from CIELab color spaces to RGB the color channels get clipped to the range of [0..255]. Colors outside that range may exist in nature but are not displayable on RGB monitors (such as ultraviolet). you can use color.clipped to test if a color has been clipped or not.

+
[c = chroma.hcl(50, 40, 20), c.clipped()];
+[c = chroma.hcl(50, 40, 40), c.clipped()];
+[c = chroma.hcl(50, 40, 60), c.clipped()];
+[c = chroma.hcl(50, 40, 80), c.clipped()];
+[c = chroma.hcl(50, 40, 100), c.clipped()];
+
+

As a bonus feature you can access the unclipped RGB components using color._rgb._unclipped.

+
chroma.hcl(50, 40, 100).rgb();
+chroma.hcl(50, 40, 100)._rgb._unclipped;
+
+

color scales

+

chroma.scale

+

(colors=['white','black'])

+

A color scale, created with chroma.scale, is a function that maps numeric values to a color palette. The default scale has the domain 0..1 and goes from white to black.

+
f = chroma.scale();
+f(0.25);
+f(0.5);
+f(0.75);
+
+

You can pass an array of colors to chroma.scale. Any color that can be read by chroma() will work here, too. If you pass more than two colors, they will be evenly distributed along the gradient.

+
chroma.scale(['yellow', '008ae5']);
+chroma.scale(['yellow', 'red', 'black']);
+
+

scale.domain

+

(domain)

+

You can change the input domain to match your specific use case.

+
// default domain is [0,1]
+chroma.scale(['yellow', '008ae5']);
+// set domain to [0,100]
+chroma.scale(['yellow', '008ae5']).domain([0,100]);
+
+

You can use the domain to set the exact positions of each color.

+
// default domain is [0,1]
+chroma.scale(['yellow', 'lightgreen', '008ae5'])
+    .domain([0,0.25,1]);
+
+

scale.mode

+

(mode)

+

As with chroma.mix, the result of the color interpolation will depend on the color mode in which the channels are interpolated. The default mode is RGB:

+
chroma.scale(['yellow', '008ae5']);
+
+

This is often fine, but sometimes, two-color RGB gradients goes through kind of grayish colors, and Lab interpolation produces better results:

+
chroma.scale(['yellow', 'navy']);
+chroma.scale(['yellow', 'navy']).mode('lab');
+
+

Other useful interpolation modes could be HSL or Lch, though both tend to produce too saturated / glowing gradients.

+
chroma.scale(['yellow', 'navy']).mode('lab');
+chroma.scale(['yellow', 'navy']).mode('hsl');
+chroma.scale(['yellow', 'navy']).mode('lch');
+
+

scale.correctLightness

+

Sometimes

+
chroma.scale(['yellow', '008ae5']).mode('lch');
+
+chroma.scale(['yellow', '008ae5'])
+    .mode('lch')
+    .correctLightness();
+
+

scale.cache

+

(true|false)

+

By default chroma.scale instances will cache each computed value => color pair. You can turn off the cache by setting

+
chroma.scale(['yellow', '008ae5']).cache(false);
+
+

scale.padding

+

(pad)

+

Reduces the color range by cutting of a fraction of the gradient on both sides. If you pass a single number, the same padding will be applied to both ends.

+
chroma.scale('RdYlBu');
+chroma.scale('RdYlBu').padding(0.15);
+chroma.scale('RdYlBu').padding(0.3);
+chroma.scale('RdYlBu').padding(-0.15);
+
+

Alternatively you can specify the padding for each sides individually by passing an array of two numbers.

+
chroma.scale('OrRd');
+chroma.scale('OrRd').padding([0.2, 0]);
+
+

scale.colors

+

(num, format='hex')

+

You can call scale.colors(n) to quickly grab n equi-distant colors from a color scale. If called with no arguments, scale.colors returns the original array of colors used to create the scale.

+
chroma.scale('OrRd').colors(5);
+chroma.scale(['white', 'black']).colors(12);
+
+

scale.classes

+

(numOrArray)

+

If you want the scale function to return a distinct set of colors instead of a continuous gradient, you can use scale.classes. If you pass a number the scale will broken into equi-distant classes:

+
// continuous
+chroma.scale('OrRd');
+// class breaks
+chroma.scale('OrRd').classes(5);
+chroma.scale('OrRd').classes(8);
+
+

You can also define custom class breaks by passing them as array:

+
chroma.scale('OrRd').classes([0,0.3,0.55,0.85,1]);
+
+

chroma.brewer

+

chroma.js includes the definitions from ColorBrewer2.org. Read more about these colors in the corresponding paper by Mark Harrower and Cynthia A. Brewer.

+
chroma.scale('YlGnBu');
+chroma.scale('Spectral');
+
+

To reverse the colors you could simply reverse the domain:

+
chroma.scale('Spectral').domain([1,0]);
+
+

You can access the colors directly using chroma.brewer.

+
chroma.brewer.OrRd
+
+

chroma.bezier

+

(colors)

+

chroma.bezier returns a function that bezier-interpolates between colors in Lab space. The input range of the function is [0..1].

+
// linear interpolation
+chroma.scale(['yellow', 'red', 'black']);
+// bezier interpolation
+chroma.bezier(['yellow', 'red', 'black']);
+
+

You can convert an bezier interpolator into a chroma.scale instance

+
chroma.bezier(['yellow', 'red', 'black'])
+    .scale()
+    .colors(5);
+
+

cubehelix

+

chroma.cubehelix

+

(start=300, rotations=-1.5, hue=1, gamma=1, lightness=[0,1])

+

Dave Green's cubehelix color scheme!!

+
// use the default helix...
+chroma.cubehelix();
+// or customize it
+chroma.cubehelix()
+    .start(200)
+    .rotations(-0.5)
+    .gamma(0.8)
+    .lightness([0.3, 0.8]);
+
+

cubehelix.start

+

(hue)

+

start color for hue rotation, default=300

+
chroma.cubehelix().start(300);
+chroma.cubehelix().start(200);
+
+

cubehelix.rotations

+

(num)

+

number (and direction) of hue rotations (e.g. 1=360°, 1.5=`540°``), default=-1.5

+
chroma.cubehelix().rotations(-1.5);
+chroma.cubehelix().rotations(0.5);
+chroma.cubehelix().rotations(3);
+
+

cubehelix.hue

+

(numOrRange)

+

hue controls how saturated the colour of all hues are. either single value or range, default=1

+
chroma.cubehelix();
+chroma.cubehelix().hue(0.5);
+chroma.cubehelix().hue([1,0]);
+
+

cubehelix.gamma

+

(factor)

+

gamma factor can be used to emphasise low or high intensity values, default=1

+
chroma.cubehelix().gamma(1);
+chroma.cubehelix().gamma(0.5);
+
+

cubehelix.lightness

+

(range)

+

lightness range: default: [0,1] (black -> white)

+
chroma.cubehelix().lightness([0,1]);
+chroma.cubehelix().lightness([1,0]);
+chroma.cubehelix().lightness([0.3,0.7]);
+
+

cubehelix.scale

+

You can call cubehelix.scale() to use the cube-helix through the chroma.scale interface.

+
chroma.cubehelix()
+    .start(200)
+    .rotations(-0.35)
+    .gamma(0.7)
+    .lightness([0.3, 0.8])
+  .scale() // convert to chroma.scale
+    .correctLightness()
+    .colors(5);
+
+ + + + + + + + + + + +
+ diff --git a/src/static/node_modules/chroma-js/docs/libs/chroma.js b/src/static/node_modules/chroma-js/docs/libs/chroma.js new file mode 100644 index 0000000..bbf7a92 --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/chroma.js @@ -0,0 +1,2707 @@ + +/** + * @license + * + * chroma.js - JavaScript library for color conversions + * + * Copyright (c) 2011-2017, Gregor Aisch + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name Gregor Aisch may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +(function() { + var Color, DEG2RAD, LAB_CONSTANTS, PI, PITHIRD, RAD2DEG, TWOPI, _guess_formats, _guess_formats_sorted, _input, _interpolators, abs, atan2, bezier, blend, blend_f, brewer, burn, chroma, clip_rgb, cmyk2rgb, colors, cos, css2rgb, darken, dodge, each, floor, hcg2rgb, hex2rgb, hsi2rgb, hsl2css, hsl2rgb, hsv2rgb, interpolate, interpolate_hsx, interpolate_lab, interpolate_num, interpolate_rgb, lab2lch, lab2rgb, lab_xyz, lch2lab, lch2rgb, lighten, limit, log, luminance_x, m, max, multiply, normal, num2rgb, overlay, pow, rgb2cmyk, rgb2css, rgb2hcg, rgb2hex, rgb2hsi, rgb2hsl, rgb2hsv, rgb2lab, rgb2lch, rgb2luminance, rgb2num, rgb2temperature, rgb2xyz, rgb_xyz, rnd, root, round, screen, sin, sqrt, temperature2rgb, type, unpack, w3cx11, xyz_lab, xyz_rgb, + slice = [].slice; + + type = (function() { + + /* + for browser-safe type checking+ + ported from jQuery's $.type + */ + var classToType, len, name, o, ref; + classToType = {}; + ref = "Boolean Number String Function Array Date RegExp Undefined Null".split(" "); + for (o = 0, len = ref.length; o < len; o++) { + name = ref[o]; + classToType["[object " + name + "]"] = name.toLowerCase(); + } + return function(obj) { + var strType; + strType = Object.prototype.toString.call(obj); + return classToType[strType] || "object"; + }; + })(); + + limit = function(x, min, max) { + if (min == null) { + min = 0; + } + if (max == null) { + max = 1; + } + if (x < min) { + x = min; + } + if (x > max) { + x = max; + } + return x; + }; + + unpack = function(args) { + if (args.length >= 3) { + return [].slice.call(args); + } else { + return args[0]; + } + }; + + clip_rgb = function(rgb) { + var i, o; + rgb._clipped = false; + rgb._unclipped = rgb.slice(0); + for (i = o = 0; o < 3; i = ++o) { + if (i < 3) { + if (rgb[i] < 0 || rgb[i] > 255) { + rgb._clipped = true; + } + if (rgb[i] < 0) { + rgb[i] = 0; + } + if (rgb[i] > 255) { + rgb[i] = 255; + } + } else if (i === 3) { + if (rgb[i] < 0) { + rgb[i] = 0; + } + if (rgb[i] > 1) { + rgb[i] = 1; + } + } + } + if (!rgb._clipped) { + delete rgb._unclipped; + } + return rgb; + }; + + PI = Math.PI, round = Math.round, cos = Math.cos, floor = Math.floor, pow = Math.pow, log = Math.log, sin = Math.sin, sqrt = Math.sqrt, atan2 = Math.atan2, max = Math.max, abs = Math.abs; + + TWOPI = PI * 2; + + PITHIRD = PI / 3; + + DEG2RAD = PI / 180; + + RAD2DEG = 180 / PI; + + chroma = function() { + if (arguments[0] instanceof Color) { + return arguments[0]; + } + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, arguments, function(){}); + }; + + _interpolators = []; + + if ((typeof module !== "undefined" && module !== null) && (module.exports != null)) { + module.exports = chroma; + } + + if (typeof define === 'function' && define.amd) { + define([], function() { + return chroma; + }); + } else { + root = typeof exports !== "undefined" && exports !== null ? exports : this; + root.chroma = chroma; + } + + chroma.version = '1.3.4'; + + _input = {}; + + _guess_formats = []; + + _guess_formats_sorted = false; + + Color = (function() { + function Color() { + var arg, args, chk, len, len1, me, mode, o, w; + me = this; + args = []; + for (o = 0, len = arguments.length; o < len; o++) { + arg = arguments[o]; + if (arg != null) { + args.push(arg); + } + } + mode = args[args.length - 1]; + if (_input[mode] != null) { + me._rgb = clip_rgb(_input[mode](unpack(args.slice(0, -1)))); + } else { + if (!_guess_formats_sorted) { + _guess_formats = _guess_formats.sort(function(a, b) { + return b.p - a.p; + }); + _guess_formats_sorted = true; + } + for (w = 0, len1 = _guess_formats.length; w < len1; w++) { + chk = _guess_formats[w]; + mode = chk.test.apply(chk, args); + if (mode) { + break; + } + } + if (mode) { + me._rgb = clip_rgb(_input[mode].apply(_input, args)); + } + } + if (me._rgb == null) { + console.warn('unknown format: ' + args); + } + if (me._rgb == null) { + me._rgb = [0, 0, 0]; + } + if (me._rgb.length === 3) { + me._rgb.push(1); + } + } + + Color.prototype.toString = function() { + return this.hex(); + }; + + Color.prototype.clone = function() { + return chroma(me._rgb); + }; + + return Color; + + })(); + + chroma._input = _input; + + + /** + ColorBrewer colors for chroma.js + + Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The + Pennsylvania State University. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed + under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. See the License for the + specific language governing permissions and limitations under the License. + + @preserve + */ + + chroma.brewer = brewer = { + OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'], + PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'], + BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'], + Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'], + BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'], + YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'], + YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'], + Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'], + RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'], + Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'], + YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'], + Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'], + GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'], + Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'], + YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'], + PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'], + Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'], + PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'], + Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'], + Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'], + RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'], + RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'], + PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'], + PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'], + RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'], + BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'], + RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'], + PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'], + Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'], + Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'], + Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'], + Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'], + Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'], + Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'], + Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'], + Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2'] + }; + + (function() { + var key, results; + results = []; + for (key in brewer) { + results.push(brewer[key.toLowerCase()] = brewer[key]); + } + return results; + })(); + + + /** + X11 color names + + http://www.w3.org/TR/css3-color/#svg-color + */ + + w3cx11 = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#00ffff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000000', + blanchedalmond: '#ffebcd', + blue: '#0000ff', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflower: '#6495ed', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#00ffff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgreen: '#006400', + darkgrey: '#a9a9a9', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkslategrey: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#ff00ff', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + green: '#008000', + greenyellow: '#adff2f', + grey: '#808080', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + laserlemon: '#ffff54', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrod: '#fafad2', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgreen: '#90ee90', + lightgrey: '#d3d3d3', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#00ff00', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#ff00ff', + maroon: '#800000', + maroon2: '#7f0000', + maroon3: '#b03060', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370db', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#db7093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + purple2: '#7f007f', + purple3: '#a020f0', + rebeccapurple: '#663399', + red: '#ff0000', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + slategrey: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#ffffff', + whitesmoke: '#f5f5f5', + yellow: '#ffff00', + yellowgreen: '#9acd32' + }; + + chroma.colors = colors = w3cx11; + + lab2rgb = function() { + var a, args, b, g, l, r, x, y, z; + args = unpack(arguments); + l = args[0], a = args[1], b = args[2]; + y = (l + 16) / 116; + x = isNaN(a) ? y : y + a / 500; + z = isNaN(b) ? y : y - b / 200; + y = LAB_CONSTANTS.Yn * lab_xyz(y); + x = LAB_CONSTANTS.Xn * lab_xyz(x); + z = LAB_CONSTANTS.Zn * lab_xyz(z); + r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); + g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z); + b = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z); + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + xyz_rgb = function(r) { + return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055); + }; + + lab_xyz = function(t) { + if (t > LAB_CONSTANTS.t1) { + return t * t * t; + } else { + return LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0); + } + }; + + LAB_CONSTANTS = { + Kn: 18, + Xn: 0.950470, + Yn: 1, + Zn: 1.088830, + t0: 0.137931034, + t1: 0.206896552, + t2: 0.12841855, + t3: 0.008856452 + }; + + rgb2lab = function() { + var b, g, r, ref, ref1, x, y, z; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + ref1 = rgb2xyz(r, g, b), x = ref1[0], y = ref1[1], z = ref1[2]; + return [116 * y - 16, 500 * (x - y), 200 * (y - z)]; + }; + + rgb_xyz = function(r) { + if ((r /= 255) <= 0.04045) { + return r / 12.92; + } else { + return pow((r + 0.055) / 1.055, 2.4); + } + }; + + xyz_lab = function(t) { + if (t > LAB_CONSTANTS.t3) { + return pow(t, 1 / 3); + } else { + return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0; + } + }; + + rgb2xyz = function() { + var b, g, r, ref, x, y, z; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = rgb_xyz(r); + g = rgb_xyz(g); + b = rgb_xyz(b); + x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn); + y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / LAB_CONSTANTS.Yn); + z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn); + return [x, y, z]; + }; + + chroma.lab = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['lab']), function(){}); + }; + + _input.lab = lab2rgb; + + Color.prototype.lab = function() { + return rgb2lab(this._rgb); + }; + + bezier = function(colors) { + var I, I0, I1, c, lab0, lab1, lab2, lab3, ref, ref1, ref2; + colors = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(chroma(c)); + } + return results; + })(); + if (colors.length === 2) { + ref = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref[0], lab1 = ref[1]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push(lab0[i] + t * (lab1[i] - lab0[i])); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 3) { + ref1 = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref1[0], lab1 = ref1[1], lab2 = ref1[2]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push((1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i]); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 4) { + ref2 = (function() { + var len, o, results; + results = []; + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + results.push(c.lab()); + } + return results; + })(), lab0 = ref2[0], lab1 = ref2[1], lab2 = ref2[2], lab3 = ref2[3]; + I = function(t) { + var i, lab; + lab = (function() { + var o, results; + results = []; + for (i = o = 0; o <= 2; i = ++o) { + results.push((1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i]); + } + return results; + })(); + return chroma.lab.apply(chroma, lab); + }; + } else if (colors.length === 5) { + I0 = bezier(colors.slice(0, 3)); + I1 = bezier(colors.slice(2, 5)); + I = function(t) { + if (t < 0.5) { + return I0(t * 2); + } else { + return I1((t - 0.5) * 2); + } + }; + } + return I; + }; + + chroma.bezier = function(colors) { + var f; + f = bezier(colors); + f.scale = function() { + return chroma.scale(f); + }; + return f; + }; + + + /* + chroma.js + + Copyright (c) 2011-2013, Gregor Aisch + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + @source: https://github.com/gka/chroma.js + */ + + chroma.cubehelix = function(start, rotations, hue, gamma, lightness) { + var dh, dl, f; + if (start == null) { + start = 300; + } + if (rotations == null) { + rotations = -1.5; + } + if (hue == null) { + hue = 1; + } + if (gamma == null) { + gamma = 1; + } + if (lightness == null) { + lightness = [0, 1]; + } + dh = 0; + if (type(lightness) === 'array') { + dl = lightness[1] - lightness[0]; + } else { + dl = 0; + lightness = [lightness, lightness]; + } + f = function(fract) { + var a, amp, b, cos_a, g, h, l, r, sin_a; + a = TWOPI * ((start + 120) / 360 + rotations * fract); + l = pow(lightness[0] + dl * fract, gamma); + h = dh !== 0 ? hue[0] + fract * dh : hue; + amp = h * l * (1 - l) / 2; + cos_a = cos(a); + sin_a = sin(a); + r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a); + g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a); + b = l + amp * (+1.97294 * cos_a); + return chroma(clip_rgb([r * 255, g * 255, b * 255])); + }; + f.start = function(s) { + if (s == null) { + return start; + } + start = s; + return f; + }; + f.rotations = function(r) { + if (r == null) { + return rotations; + } + rotations = r; + return f; + }; + f.gamma = function(g) { + if (g == null) { + return gamma; + } + gamma = g; + return f; + }; + f.hue = function(h) { + if (h == null) { + return hue; + } + hue = h; + if (type(hue) === 'array') { + dh = hue[1] - hue[0]; + if (dh === 0) { + hue = hue[1]; + } + } else { + dh = 0; + } + return f; + }; + f.lightness = function(h) { + if (h == null) { + return lightness; + } + if (type(h) === 'array') { + lightness = h; + dl = h[1] - h[0]; + } else { + lightness = [h, h]; + dl = 0; + } + return f; + }; + f.scale = function() { + return chroma.scale(f); + }; + f.hue(hue); + return f; + }; + + chroma.random = function() { + var code, digits, i, o; + digits = '0123456789abcdef'; + code = '#'; + for (i = o = 0; o < 6; i = ++o) { + code += digits.charAt(floor(Math.random() * 16)); + } + return new Color(code); + }; + + chroma.average = function(colors, mode) { + var A, alpha, c, cnt, dx, dy, first, i, l, len, o, xyz, xyz2; + if (mode == null) { + mode = 'rgb'; + } + l = colors.length; + colors = colors.map(function(c) { + return chroma(c); + }); + first = colors.splice(0, 1)[0]; + xyz = first.get(mode); + cnt = []; + dx = 0; + dy = 0; + for (i in xyz) { + xyz[i] = xyz[i] || 0; + cnt.push(!isNaN(xyz[i]) ? 1 : 0); + if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) { + A = xyz[i] / 180 * PI; + dx += cos(A); + dy += sin(A); + } + } + alpha = first.alpha(); + for (o = 0, len = colors.length; o < len; o++) { + c = colors[o]; + xyz2 = c.get(mode); + alpha += c.alpha(); + for (i in xyz) { + if (!isNaN(xyz2[i])) { + xyz[i] += xyz2[i]; + cnt[i] += 1; + if (mode.charAt(i) === 'h') { + A = xyz[i] / 180 * PI; + dx += cos(A); + dy += sin(A); + } + } + } + } + for (i in xyz) { + xyz[i] = xyz[i] / cnt[i]; + if (mode.charAt(i) === 'h') { + A = atan2(dy / cnt[i], dx / cnt[i]) / PI * 180; + while (A < 0) { + A += 360; + } + while (A >= 360) { + A -= 360; + } + xyz[i] = A; + } + } + return chroma(xyz, mode).alpha(alpha / l); + }; + + _input.rgb = function() { + var k, ref, results, v; + ref = unpack(arguments); + results = []; + for (k in ref) { + v = ref[k]; + results.push(v); + } + return results; + }; + + chroma.rgb = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['rgb']), function(){}); + }; + + Color.prototype.rgb = function(round) { + if (round == null) { + round = true; + } + if (round) { + return this._rgb.map(Math.round).slice(0, 3); + } else { + return this._rgb.slice(0, 3); + } + }; + + Color.prototype.rgba = function(round) { + if (round == null) { + round = true; + } + if (!round) { + return this._rgb.slice(0); + } + return [Math.round(this._rgb[0]), Math.round(this._rgb[1]), Math.round(this._rgb[2]), this._rgb[3]]; + }; + + _guess_formats.push({ + p: 3, + test: function(n) { + var a; + a = unpack(arguments); + if (type(a) === 'array' && a.length === 3) { + return 'rgb'; + } + if (a.length === 4 && type(a[3]) === "number" && a[3] >= 0 && a[3] <= 1) { + return 'rgb'; + } + } + }); + + hex2rgb = function(hex) { + var a, b, g, r, rgb, u; + if (hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)) { + if (hex.length === 4 || hex.length === 7) { + hex = hex.substr(1); + } + if (hex.length === 3) { + hex = hex.split(""); + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + u = parseInt(hex, 16); + r = u >> 16; + g = u >> 8 & 0xFF; + b = u & 0xFF; + return [r, g, b, 1]; + } + if (hex.match(/^#?([A-Fa-f0-9]{8})$/)) { + if (hex.length === 9) { + hex = hex.substr(1); + } + u = parseInt(hex, 16); + r = u >> 24 & 0xFF; + g = u >> 16 & 0xFF; + b = u >> 8 & 0xFF; + a = round((u & 0xFF) / 0xFF * 100) / 100; + return [r, g, b, a]; + } + if ((_input.css != null) && (rgb = _input.css(hex))) { + return rgb; + } + throw "unknown color: " + hex; + }; + + rgb2hex = function(channels, mode) { + var a, b, g, hxa, r, str, u; + if (mode == null) { + mode = 'rgb'; + } + r = channels[0], g = channels[1], b = channels[2], a = channels[3]; + r = Math.round(r); + g = Math.round(g); + b = Math.round(b); + u = r << 16 | g << 8 | b; + str = "000000" + u.toString(16); + str = str.substr(str.length - 6); + hxa = '0' + round(a * 255).toString(16); + hxa = hxa.substr(hxa.length - 2); + return "#" + (function() { + switch (mode.toLowerCase()) { + case 'rgba': + return str + hxa; + case 'argb': + return hxa + str; + default: + return str; + } + })(); + }; + + _input.hex = function(h) { + return hex2rgb(h); + }; + + chroma.hex = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hex']), function(){}); + }; + + Color.prototype.hex = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + return rgb2hex(this._rgb, mode); + }; + + _guess_formats.push({ + p: 4, + test: function(n) { + if (arguments.length === 1 && type(n) === "string") { + return 'hex'; + } + } + }); + + hsl2rgb = function() { + var args, b, c, g, h, i, l, o, r, ref, s, t1, t2, t3; + args = unpack(arguments); + h = args[0], s = args[1], l = args[2]; + if (s === 0) { + r = g = b = l * 255; + } else { + t3 = [0, 0, 0]; + c = [0, 0, 0]; + t2 = l < 0.5 ? l * (1 + s) : l + s - l * s; + t1 = 2 * l - t2; + h /= 360; + t3[0] = h + 1 / 3; + t3[1] = h; + t3[2] = h - 1 / 3; + for (i = o = 0; o <= 2; i = ++o) { + if (t3[i] < 0) { + t3[i] += 1; + } + if (t3[i] > 1) { + t3[i] -= 1; + } + if (6 * t3[i] < 1) { + c[i] = t1 + (t2 - t1) * 6 * t3[i]; + } else if (2 * t3[i] < 1) { + c[i] = t2; + } else if (3 * t3[i] < 2) { + c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6; + } else { + c[i] = t1; + } + } + ref = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)], r = ref[0], g = ref[1], b = ref[2]; + } + if (args.length > 3) { + return [r, g, b, args[3]]; + } else { + return [r, g, b]; + } + }; + + rgb2hsl = function(r, g, b) { + var h, l, min, ref, s; + if (r !== void 0 && r.length >= 3) { + ref = r, r = ref[0], g = ref[1], b = ref[2]; + } + r /= 255; + g /= 255; + b /= 255; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + l = (max + min) / 2; + if (max === min) { + s = 0; + h = Number.NaN; + } else { + s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min); + } + if (r === max) { + h = (g - b) / (max - min); + } else if (g === max) { + h = 2 + (b - r) / (max - min); + } else if (b === max) { + h = 4 + (r - g) / (max - min); + } + h *= 60; + if (h < 0) { + h += 360; + } + return [h, s, l]; + }; + + chroma.hsl = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsl']), function(){}); + }; + + _input.hsl = hsl2rgb; + + Color.prototype.hsl = function() { + return rgb2hsl(this._rgb); + }; + + hsv2rgb = function() { + var args, b, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, s, t, v; + args = unpack(arguments); + h = args[0], s = args[1], v = args[2]; + v *= 255; + if (s === 0) { + r = g = b = v; + } else { + if (h === 360) { + h = 0; + } + if (h > 360) { + h -= 360; + } + if (h < 0) { + h += 360; + } + h /= 60; + i = floor(h); + f = h - i; + p = v * (1 - s); + q = v * (1 - s * f); + t = v * (1 - s * (1 - f)); + switch (i) { + case 0: + ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2]; + break; + case 1: + ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2]; + break; + case 2: + ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2]; + break; + case 3: + ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2]; + break; + case 4: + ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2]; + break; + case 5: + ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2]; + } + } + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + rgb2hsv = function() { + var b, delta, g, h, min, r, ref, s, v; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + delta = max - min; + v = max / 255.0; + if (max === 0) { + h = Number.NaN; + s = 0; + } else { + s = delta / max; + if (r === max) { + h = (g - b) / delta; + } + if (g === max) { + h = 2 + (b - r) / delta; + } + if (b === max) { + h = 4 + (r - g) / delta; + } + h *= 60; + if (h < 0) { + h += 360; + } + } + return [h, s, v]; + }; + + chroma.hsv = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsv']), function(){}); + }; + + _input.hsv = hsv2rgb; + + Color.prototype.hsv = function() { + return rgb2hsv(this._rgb); + }; + + num2rgb = function(num) { + var b, g, r; + if (type(num) === "number" && num >= 0 && num <= 0xFFFFFF) { + r = num >> 16; + g = (num >> 8) & 0xFF; + b = num & 0xFF; + return [r, g, b, 1]; + } + console.warn("unknown num color: " + num); + return [0, 0, 0, 1]; + }; + + rgb2num = function() { + var b, g, r, ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + return (r << 16) + (g << 8) + b; + }; + + chroma.num = function(num) { + return new Color(num, 'num'); + }; + + Color.prototype.num = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + return rgb2num(this._rgb, mode); + }; + + _input.num = num2rgb; + + _guess_formats.push({ + p: 1, + test: function(n) { + if (arguments.length === 1 && type(n) === "number" && n >= 0 && n <= 0xFFFFFF) { + return 'num'; + } + } + }); + + hcg2rgb = function() { + var _c, _g, args, b, c, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, t, v; + args = unpack(arguments); + h = args[0], c = args[1], _g = args[2]; + c = c / 100; + g = g / 100 * 255; + _c = c * 255; + if (c === 0) { + r = g = b = _g; + } else { + if (h === 360) { + h = 0; + } + if (h > 360) { + h -= 360; + } + if (h < 0) { + h += 360; + } + h /= 60; + i = floor(h); + f = h - i; + p = _g * (1 - c); + q = p + _c * (1 - f); + t = p + _c * f; + v = p + _c; + switch (i) { + case 0: + ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2]; + break; + case 1: + ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2]; + break; + case 2: + ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2]; + break; + case 3: + ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2]; + break; + case 4: + ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2]; + break; + case 5: + ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2]; + } + } + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + rgb2hcg = function() { + var _g, b, c, delta, g, h, min, r, ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + min = Math.min(r, g, b); + max = Math.max(r, g, b); + delta = max - min; + c = delta * 100 / 255; + _g = min / (255 - delta) * 100; + if (delta === 0) { + h = Number.NaN; + } else { + if (r === max) { + h = (g - b) / delta; + } + if (g === max) { + h = 2 + (b - r) / delta; + } + if (b === max) { + h = 4 + (r - g) / delta; + } + h *= 60; + if (h < 0) { + h += 360; + } + } + return [h, c, _g]; + }; + + chroma.hcg = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hcg']), function(){}); + }; + + _input.hcg = hcg2rgb; + + Color.prototype.hcg = function() { + return rgb2hcg(this._rgb); + }; + + css2rgb = function(css) { + var aa, ab, hsl, i, m, o, rgb, w; + css = css.toLowerCase(); + if ((chroma.colors != null) && chroma.colors[css]) { + return hex2rgb(chroma.colors[css]); + } + if (m = css.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)) { + rgb = m.slice(1, 4); + for (i = o = 0; o <= 2; i = ++o) { + rgb[i] = +rgb[i]; + } + rgb[3] = 1; + } else if (m = css.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/)) { + rgb = m.slice(1, 5); + for (i = w = 0; w <= 3; i = ++w) { + rgb[i] = +rgb[i]; + } + } else if (m = css.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)) { + rgb = m.slice(1, 4); + for (i = aa = 0; aa <= 2; i = ++aa) { + rgb[i] = round(rgb[i] * 2.55); + } + rgb[3] = 1; + } else if (m = css.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)) { + rgb = m.slice(1, 5); + for (i = ab = 0; ab <= 2; i = ++ab) { + rgb[i] = round(rgb[i] * 2.55); + } + rgb[3] = +rgb[3]; + } else if (m = css.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)) { + hsl = m.slice(1, 4); + hsl[1] *= 0.01; + hsl[2] *= 0.01; + rgb = hsl2rgb(hsl); + rgb[3] = 1; + } else if (m = css.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)) { + hsl = m.slice(1, 4); + hsl[1] *= 0.01; + hsl[2] *= 0.01; + rgb = hsl2rgb(hsl); + rgb[3] = +m[4]; + } + return rgb; + }; + + rgb2css = function(rgba) { + var mode; + mode = rgba[3] < 1 ? 'rgba' : 'rgb'; + if (mode === 'rgb') { + return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ')'; + } else if (mode === 'rgba') { + return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ',' + rgba[3] + ')'; + } else { + + } + }; + + rnd = function(a) { + return round(a * 100) / 100; + }; + + hsl2css = function(hsl, alpha) { + var mode; + mode = alpha < 1 ? 'hsla' : 'hsl'; + hsl[0] = rnd(hsl[0] || 0); + hsl[1] = rnd(hsl[1] * 100) + '%'; + hsl[2] = rnd(hsl[2] * 100) + '%'; + if (mode === 'hsla') { + hsl[3] = alpha; + } + return mode + '(' + hsl.join(',') + ')'; + }; + + _input.css = function(h) { + return css2rgb(h); + }; + + chroma.css = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['css']), function(){}); + }; + + Color.prototype.css = function(mode) { + if (mode == null) { + mode = 'rgb'; + } + if (mode.slice(0, 3) === 'rgb') { + return rgb2css(this._rgb); + } else if (mode.slice(0, 3) === 'hsl') { + return hsl2css(this.hsl(), this.alpha()); + } + }; + + _input.named = function(name) { + return hex2rgb(w3cx11[name]); + }; + + _guess_formats.push({ + p: 5, + test: function(n) { + if (arguments.length === 1 && (w3cx11[n] != null)) { + return 'named'; + } + } + }); + + Color.prototype.name = function(n) { + var h, k; + if (arguments.length) { + if (w3cx11[n]) { + this._rgb = hex2rgb(w3cx11[n]); + } + this._rgb[3] = 1; + this; + } + h = this.hex(); + for (k in w3cx11) { + if (h === w3cx11[k]) { + return k; + } + } + return h; + }; + + lch2lab = function() { + + /* + Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel. + These formulas were invented by David Dalrymple to obtain maximum contrast without going + out of gamut if the parameters are in the range 0-1. + + A saturation multiplier was added by Gregor Aisch + */ + var c, h, l, ref; + ref = unpack(arguments), l = ref[0], c = ref[1], h = ref[2]; + h = h * DEG2RAD; + return [l, cos(h) * c, sin(h) * c]; + }; + + lch2rgb = function() { + var L, a, args, b, c, g, h, l, r, ref, ref1; + args = unpack(arguments); + l = args[0], c = args[1], h = args[2]; + ref = lch2lab(l, c, h), L = ref[0], a = ref[1], b = ref[2]; + ref1 = lab2rgb(L, a, b), r = ref1[0], g = ref1[1], b = ref1[2]; + return [r, g, b, args.length > 3 ? args[3] : 1]; + }; + + lab2lch = function() { + var a, b, c, h, l, ref; + ref = unpack(arguments), l = ref[0], a = ref[1], b = ref[2]; + c = sqrt(a * a + b * b); + h = (atan2(b, a) * RAD2DEG + 360) % 360; + if (round(c * 10000) === 0) { + h = Number.NaN; + } + return [l, c, h]; + }; + + rgb2lch = function() { + var a, b, g, l, r, ref, ref1; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + ref1 = rgb2lab(r, g, b), l = ref1[0], a = ref1[1], b = ref1[2]; + return lab2lch(l, a, b); + }; + + chroma.lch = function() { + var args; + args = unpack(arguments); + return new Color(args, 'lch'); + }; + + chroma.hcl = function() { + var args; + args = unpack(arguments); + return new Color(args, 'hcl'); + }; + + _input.lch = lch2rgb; + + _input.hcl = function() { + var c, h, l, ref; + ref = unpack(arguments), h = ref[0], c = ref[1], l = ref[2]; + return lch2rgb([l, c, h]); + }; + + Color.prototype.lch = function() { + return rgb2lch(this._rgb); + }; + + Color.prototype.hcl = function() { + return rgb2lch(this._rgb).reverse(); + }; + + rgb2cmyk = function(mode) { + var b, c, f, g, k, m, r, ref, y; + if (mode == null) { + mode = 'rgb'; + } + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = r / 255; + g = g / 255; + b = b / 255; + k = 1 - Math.max(r, Math.max(g, b)); + f = k < 1 ? 1 / (1 - k) : 0; + c = (1 - r - k) * f; + m = (1 - g - k) * f; + y = (1 - b - k) * f; + return [c, m, y, k]; + }; + + cmyk2rgb = function() { + var alpha, args, b, c, g, k, m, r, y; + args = unpack(arguments); + c = args[0], m = args[1], y = args[2], k = args[3]; + alpha = args.length > 4 ? args[4] : 1; + if (k === 1) { + return [0, 0, 0, alpha]; + } + r = c >= 1 ? 0 : 255 * (1 - c) * (1 - k); + g = m >= 1 ? 0 : 255 * (1 - m) * (1 - k); + b = y >= 1 ? 0 : 255 * (1 - y) * (1 - k); + return [r, g, b, alpha]; + }; + + _input.cmyk = function() { + return cmyk2rgb(unpack(arguments)); + }; + + chroma.cmyk = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['cmyk']), function(){}); + }; + + Color.prototype.cmyk = function() { + return rgb2cmyk(this._rgb); + }; + + _input.gl = function() { + var i, k, o, rgb, v; + rgb = (function() { + var ref, results; + ref = unpack(arguments); + results = []; + for (k in ref) { + v = ref[k]; + results.push(v); + } + return results; + }).apply(this, arguments); + for (i = o = 0; o <= 2; i = ++o) { + rgb[i] *= 255; + } + return rgb; + }; + + chroma.gl = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['gl']), function(){}); + }; + + Color.prototype.gl = function() { + var rgb; + rgb = this._rgb; + return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]]; + }; + + rgb2luminance = function(r, g, b) { + var ref; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + r = luminance_x(r); + g = luminance_x(g); + b = luminance_x(b); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }; + + luminance_x = function(x) { + x /= 255; + if (x <= 0.03928) { + return x / 12.92; + } else { + return pow((x + 0.055) / 1.055, 2.4); + } + }; + + _interpolators = []; + + interpolate = function(col1, col2, f, m) { + var interpol, len, o, res; + if (f == null) { + f = 0.5; + } + if (m == null) { + m = 'rgb'; + } + + /* + interpolates between colors + f = 0 --> me + f = 1 --> col + */ + if (type(col1) !== 'object') { + col1 = chroma(col1); + } + if (type(col2) !== 'object') { + col2 = chroma(col2); + } + for (o = 0, len = _interpolators.length; o < len; o++) { + interpol = _interpolators[o]; + if (m === interpol[0]) { + res = interpol[1](col1, col2, f, m); + break; + } + } + if (res == null) { + throw "color mode " + m + " is not supported"; + } + return res.alpha(col1.alpha() + f * (col2.alpha() - col1.alpha())); + }; + + chroma.interpolate = interpolate; + + Color.prototype.interpolate = function(col2, f, m) { + return interpolate(this, col2, f, m); + }; + + chroma.mix = interpolate; + + Color.prototype.mix = Color.prototype.interpolate; + + interpolate_rgb = function(col1, col2, f, m) { + var xyz0, xyz1; + xyz0 = col1._rgb; + xyz1 = col2._rgb; + return new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m); + }; + + _interpolators.push(['rgb', interpolate_rgb]); + + Color.prototype.luminance = function(lum, mode) { + var cur_lum, eps, max_iter, test; + if (mode == null) { + mode = 'rgb'; + } + if (!arguments.length) { + return rgb2luminance(this._rgb); + } + if (lum === 0) { + this._rgb = [0, 0, 0, this._rgb[3]]; + } else if (lum === 1) { + this._rgb = [255, 255, 255, this._rgb[3]]; + } else { + eps = 1e-7; + max_iter = 20; + test = function(l, h) { + var lm, m; + m = l.interpolate(h, 0.5, mode); + lm = m.luminance(); + if (Math.abs(lum - lm) < eps || !max_iter--) { + return m; + } + if (lm > lum) { + return test(l, m); + } + return test(m, h); + }; + cur_lum = rgb2luminance(this._rgb); + this._rgb = (cur_lum > lum ? test(chroma('black'), this) : test(this, chroma('white'))).rgba(); + } + return this; + }; + + temperature2rgb = function(kelvin) { + var b, g, r, temp; + temp = kelvin / 100; + if (temp < 66) { + r = 255; + g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g); + b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b); + } else { + r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r); + g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g); + b = 255; + } + return [r, g, b]; + }; + + rgb2temperature = function() { + var b, eps, g, maxTemp, minTemp, r, ref, rgb, temp; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + minTemp = 1000; + maxTemp = 40000; + eps = 0.4; + while (maxTemp - minTemp > eps) { + temp = (maxTemp + minTemp) * 0.5; + rgb = temperature2rgb(temp); + if ((rgb[2] / rgb[0]) >= (b / r)) { + maxTemp = temp; + } else { + minTemp = temp; + } + } + return round(temp); + }; + + chroma.temperature = chroma.kelvin = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['temperature']), function(){}); + }; + + _input.temperature = _input.kelvin = _input.K = temperature2rgb; + + Color.prototype.temperature = function() { + return rgb2temperature(this._rgb); + }; + + Color.prototype.kelvin = Color.prototype.temperature; + + chroma.contrast = function(a, b) { + var l1, l2, ref, ref1; + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + l1 = a.luminance(); + l2 = b.luminance(); + if (l1 > l2) { + return (l1 + 0.05) / (l2 + 0.05); + } else { + return (l2 + 0.05) / (l1 + 0.05); + } + }; + + chroma.distance = function(a, b, mode) { + var d, i, l1, l2, ref, ref1, sum_sq; + if (mode == null) { + mode = 'lab'; + } + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + l1 = a.get(mode); + l2 = b.get(mode); + sum_sq = 0; + for (i in l1) { + d = (l1[i] || 0) - (l2[i] || 0); + sum_sq += d * d; + } + return Math.sqrt(sum_sq); + }; + + chroma.deltaE = function(a, b, L, C) { + var L1, L2, a1, a2, b1, b2, c1, c2, c4, dH2, delA, delB, delC, delL, f, h1, ref, ref1, ref2, ref3, sc, sh, sl, t, v1, v2, v3; + if (L == null) { + L = 1; + } + if (C == null) { + C = 1; + } + if ((ref = type(a)) === 'string' || ref === 'number') { + a = new Color(a); + } + if ((ref1 = type(b)) === 'string' || ref1 === 'number') { + b = new Color(b); + } + ref2 = a.lab(), L1 = ref2[0], a1 = ref2[1], b1 = ref2[2]; + ref3 = b.lab(), L2 = ref3[0], a2 = ref3[1], b2 = ref3[2]; + c1 = sqrt(a1 * a1 + b1 * b1); + c2 = sqrt(a2 * a2 + b2 * b2); + sl = L1 < 16.0 ? 0.511 : (0.040975 * L1) / (1.0 + 0.01765 * L1); + sc = (0.0638 * c1) / (1.0 + 0.0131 * c1) + 0.638; + h1 = c1 < 0.000001 ? 0.0 : (atan2(b1, a1) * 180.0) / PI; + while (h1 < 0) { + h1 += 360; + } + while (h1 >= 360) { + h1 -= 360; + } + t = (h1 >= 164.0) && (h1 <= 345.0) ? 0.56 + abs(0.2 * cos((PI * (h1 + 168.0)) / 180.0)) : 0.36 + abs(0.4 * cos((PI * (h1 + 35.0)) / 180.0)); + c4 = c1 * c1 * c1 * c1; + f = sqrt(c4 / (c4 + 1900.0)); + sh = sc * (f * t + 1.0 - f); + delL = L1 - L2; + delC = c1 - c2; + delA = a1 - a2; + delB = b1 - b2; + dH2 = delA * delA + delB * delB - delC * delC; + v1 = delL / (L * sl); + v2 = delC / (C * sc); + v3 = sh; + return sqrt(v1 * v1 + v2 * v2 + (dH2 / (v3 * v3))); + }; + + Color.prototype.get = function(modechan) { + var channel, i, me, mode, ref, src; + me = this; + ref = modechan.split('.'), mode = ref[0], channel = ref[1]; + src = me[mode](); + if (channel) { + i = mode.indexOf(channel); + if (i > -1) { + return src[i]; + } else { + return console.warn('unknown channel ' + channel + ' in mode ' + mode); + } + } else { + return src; + } + }; + + Color.prototype.set = function(modechan, value) { + var channel, i, me, mode, ref, src; + me = this; + ref = modechan.split('.'), mode = ref[0], channel = ref[1]; + if (channel) { + src = me[mode](); + i = mode.indexOf(channel); + if (i > -1) { + if (type(value) === 'string') { + switch (value.charAt(0)) { + case '+': + src[i] += +value; + break; + case '-': + src[i] += +value; + break; + case '*': + src[i] *= +(value.substr(1)); + break; + case '/': + src[i] /= +(value.substr(1)); + break; + default: + src[i] = +value; + } + } else { + src[i] = value; + } + } else { + console.warn('unknown channel ' + channel + ' in mode ' + mode); + } + } else { + src = value; + } + return chroma(src, mode).alpha(me.alpha()); + }; + + Color.prototype.clipped = function() { + return this._rgb._clipped || false; + }; + + Color.prototype.alpha = function(a) { + if (arguments.length) { + return chroma.rgb([this._rgb[0], this._rgb[1], this._rgb[2], a]); + } + return this._rgb[3]; + }; + + Color.prototype.darken = function(amount) { + var lab, me; + if (amount == null) { + amount = 1; + } + me = this; + lab = me.lab(); + lab[0] -= LAB_CONSTANTS.Kn * amount; + return chroma.lab(lab).alpha(me.alpha()); + }; + + Color.prototype.brighten = function(amount) { + if (amount == null) { + amount = 1; + } + return this.darken(-amount); + }; + + Color.prototype.darker = Color.prototype.darken; + + Color.prototype.brighter = Color.prototype.brighten; + + Color.prototype.saturate = function(amount) { + var lch, me; + if (amount == null) { + amount = 1; + } + me = this; + lch = me.lch(); + lch[1] += amount * LAB_CONSTANTS.Kn; + if (lch[1] < 0) { + lch[1] = 0; + } + return chroma.lch(lch).alpha(me.alpha()); + }; + + Color.prototype.desaturate = function(amount) { + if (amount == null) { + amount = 1; + } + return this.saturate(-amount); + }; + + Color.prototype.premultiply = function() { + var a, rgb; + rgb = this.rgb(); + a = this.alpha(); + return chroma(rgb[0] * a, rgb[1] * a, rgb[2] * a, a); + }; + + blend = function(bottom, top, mode) { + if (!blend[mode]) { + throw 'unknown blend mode ' + mode; + } + return blend[mode](bottom, top); + }; + + blend_f = function(f) { + return function(bottom, top) { + var c0, c1; + c0 = chroma(top).rgb(); + c1 = chroma(bottom).rgb(); + return chroma(f(c0, c1), 'rgb'); + }; + }; + + each = function(f) { + return function(c0, c1) { + var i, o, out; + out = []; + for (i = o = 0; o <= 3; i = ++o) { + out[i] = f(c0[i], c1[i]); + } + return out; + }; + }; + + normal = function(a, b) { + return a; + }; + + multiply = function(a, b) { + return a * b / 255; + }; + + darken = function(a, b) { + if (a > b) { + return b; + } else { + return a; + } + }; + + lighten = function(a, b) { + if (a > b) { + return a; + } else { + return b; + } + }; + + screen = function(a, b) { + return 255 * (1 - (1 - a / 255) * (1 - b / 255)); + }; + + overlay = function(a, b) { + if (b < 128) { + return 2 * a * b / 255; + } else { + return 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255)); + } + }; + + burn = function(a, b) { + return 255 * (1 - (1 - b / 255) / (a / 255)); + }; + + dodge = function(a, b) { + if (a === 255) { + return 255; + } + a = 255 * (b / 255) / (1 - a / 255); + if (a > 255) { + return 255; + } else { + return a; + } + }; + + blend.normal = blend_f(each(normal)); + + blend.multiply = blend_f(each(multiply)); + + blend.screen = blend_f(each(screen)); + + blend.overlay = blend_f(each(overlay)); + + blend.darken = blend_f(each(darken)); + + blend.lighten = blend_f(each(lighten)); + + blend.dodge = blend_f(each(dodge)); + + blend.burn = blend_f(each(burn)); + + chroma.blend = blend; + + chroma.analyze = function(data) { + var len, o, r, val; + r = { + min: Number.MAX_VALUE, + max: Number.MAX_VALUE * -1, + sum: 0, + values: [], + count: 0 + }; + for (o = 0, len = data.length; o < len; o++) { + val = data[o]; + if ((val != null) && !isNaN(val)) { + r.values.push(val); + r.sum += val; + if (val < r.min) { + r.min = val; + } + if (val > r.max) { + r.max = val; + } + r.count += 1; + } + } + r.domain = [r.min, r.max]; + r.limits = function(mode, num) { + return chroma.limits(r, mode, num); + }; + return r; + }; + + chroma.scale = function(colors, positions) { + var _classes, _colorCache, _colors, _correctLightness, _domain, _fixed, _max, _min, _mode, _nacol, _out, _padding, _pos, _spread, _useCache, classifyValue, f, getClass, getColor, resetCache, setColors, tmap; + _mode = 'rgb'; + _nacol = chroma('#ccc'); + _spread = 0; + _fixed = false; + _domain = [0, 1]; + _pos = []; + _padding = [0, 0]; + _classes = false; + _colors = []; + _out = false; + _min = 0; + _max = 1; + _correctLightness = false; + _colorCache = {}; + _useCache = true; + setColors = function(colors) { + var c, col, o, ref, ref1, w; + if (colors == null) { + colors = ['#fff', '#000']; + } + if ((colors != null) && type(colors) === 'string' && (chroma.brewer != null)) { + colors = chroma.brewer[colors] || chroma.brewer[colors.toLowerCase()] || colors; + } + if (type(colors) === 'array') { + colors = colors.slice(0); + for (c = o = 0, ref = colors.length - 1; 0 <= ref ? o <= ref : o >= ref; c = 0 <= ref ? ++o : --o) { + col = colors[c]; + if (type(col) === "string") { + colors[c] = chroma(col); + } + } + _pos.length = 0; + for (c = w = 0, ref1 = colors.length - 1; 0 <= ref1 ? w <= ref1 : w >= ref1; c = 0 <= ref1 ? ++w : --w) { + _pos.push(c / (colors.length - 1)); + } + } + resetCache(); + return _colors = colors; + }; + getClass = function(value) { + var i, n; + if (_classes != null) { + n = _classes.length - 1; + i = 0; + while (i < n && value >= _classes[i]) { + i++; + } + return i - 1; + } + return 0; + }; + tmap = function(t) { + return t; + }; + classifyValue = function(value) { + var i, maxc, minc, n, val; + val = value; + if (_classes.length > 2) { + n = _classes.length - 1; + i = getClass(value); + minc = _classes[0] + (_classes[1] - _classes[0]) * (0 + _spread * 0.5); + maxc = _classes[n - 1] + (_classes[n] - _classes[n - 1]) * (1 - _spread * 0.5); + val = _min + ((_classes[i] + (_classes[i + 1] - _classes[i]) * 0.5 - minc) / (maxc - minc)) * (_max - _min); + } + return val; + }; + getColor = function(val, bypassMap) { + var c, col, i, k, o, p, ref, t; + if (bypassMap == null) { + bypassMap = false; + } + if (isNaN(val)) { + return _nacol; + } + if (!bypassMap) { + if (_classes && _classes.length > 2) { + c = getClass(val); + t = c / (_classes.length - 2); + t = _padding[0] + (t * (1 - _padding[0] - _padding[1])); + } else if (_max !== _min) { + t = (val - _min) / (_max - _min); + t = _padding[0] + (t * (1 - _padding[0] - _padding[1])); + t = Math.min(1, Math.max(0, t)); + } else { + t = 1; + } + } else { + t = val; + } + if (!bypassMap) { + t = tmap(t); + } + k = Math.floor(t * 10000); + if (_useCache && _colorCache[k]) { + col = _colorCache[k]; + } else { + if (type(_colors) === 'array') { + for (i = o = 0, ref = _pos.length - 1; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { + p = _pos[i]; + if (t <= p) { + col = _colors[i]; + break; + } + if (t >= p && i === _pos.length - 1) { + col = _colors[i]; + break; + } + if (t > p && t < _pos[i + 1]) { + t = (t - p) / (_pos[i + 1] - p); + col = chroma.interpolate(_colors[i], _colors[i + 1], t, _mode); + break; + } + } + } else if (type(_colors) === 'function') { + col = _colors(t); + } + if (_useCache) { + _colorCache[k] = col; + } + } + return col; + }; + resetCache = function() { + return _colorCache = {}; + }; + setColors(colors); + f = function(v) { + var c; + c = chroma(getColor(v)); + if (_out && c[_out]) { + return c[_out](); + } else { + return c; + } + }; + f.classes = function(classes) { + var d; + if (classes != null) { + if (type(classes) === 'array') { + _classes = classes; + _domain = [classes[0], classes[classes.length - 1]]; + } else { + d = chroma.analyze(_domain); + if (classes === 0) { + _classes = [d.min, d.max]; + } else { + _classes = chroma.limits(d, 'e', classes); + } + } + return f; + } + return _classes; + }; + f.domain = function(domain) { + var c, d, k, len, o, ref, w; + if (!arguments.length) { + return _domain; + } + _min = domain[0]; + _max = domain[domain.length - 1]; + _pos = []; + k = _colors.length; + if (domain.length === k && _min !== _max) { + for (o = 0, len = domain.length; o < len; o++) { + d = domain[o]; + _pos.push((d - _min) / (_max - _min)); + } + } else { + for (c = w = 0, ref = k - 1; 0 <= ref ? w <= ref : w >= ref; c = 0 <= ref ? ++w : --w) { + _pos.push(c / (k - 1)); + } + } + _domain = [_min, _max]; + return f; + }; + f.mode = function(_m) { + if (!arguments.length) { + return _mode; + } + _mode = _m; + resetCache(); + return f; + }; + f.range = function(colors, _pos) { + setColors(colors, _pos); + return f; + }; + f.out = function(_o) { + _out = _o; + return f; + }; + f.spread = function(val) { + if (!arguments.length) { + return _spread; + } + _spread = val; + return f; + }; + f.correctLightness = function(v) { + if (v == null) { + v = true; + } + _correctLightness = v; + resetCache(); + if (_correctLightness) { + tmap = function(t) { + var L0, L1, L_actual, L_diff, L_ideal, max_iter, pol, t0, t1; + L0 = getColor(0, true).lab()[0]; + L1 = getColor(1, true).lab()[0]; + pol = L0 > L1; + L_actual = getColor(t, true).lab()[0]; + L_ideal = L0 + (L1 - L0) * t; + L_diff = L_actual - L_ideal; + t0 = 0; + t1 = 1; + max_iter = 20; + while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) { + (function() { + if (pol) { + L_diff *= -1; + } + if (L_diff < 0) { + t0 = t; + t += (t1 - t) * 0.5; + } else { + t1 = t; + t += (t0 - t) * 0.5; + } + L_actual = getColor(t, true).lab()[0]; + return L_diff = L_actual - L_ideal; + })(); + } + return t; + }; + } else { + tmap = function(t) { + return t; + }; + } + return f; + }; + f.padding = function(p) { + if (p != null) { + if (type(p) === 'number') { + p = [p, p]; + } + _padding = p; + return f; + } else { + return _padding; + } + }; + f.colors = function(numColors, out) { + var dd, dm, i, o, ref, result, results, samples, w; + if (arguments.length < 2) { + out = 'hex'; + } + result = []; + if (arguments.length === 0) { + result = _colors.slice(0); + } else if (numColors === 1) { + result = [f(0.5)]; + } else if (numColors > 1) { + dm = _domain[0]; + dd = _domain[1] - dm; + result = (function() { + results = []; + for (var o = 0; 0 <= numColors ? o < numColors : o > numColors; 0 <= numColors ? o++ : o--){ results.push(o); } + return results; + }).apply(this).map(function(i) { + return f(dm + i / (numColors - 1) * dd); + }); + } else { + colors = []; + samples = []; + if (_classes && _classes.length > 2) { + for (i = w = 1, ref = _classes.length; 1 <= ref ? w < ref : w > ref; i = 1 <= ref ? ++w : --w) { + samples.push((_classes[i - 1] + _classes[i]) * 0.5); + } + } else { + samples = _domain; + } + result = samples.map(function(v) { + return f(v); + }); + } + if (chroma[out]) { + result = result.map(function(c) { + return c[out](); + }); + } + return result; + }; + f.cache = function(c) { + if (c != null) { + return _useCache = c; + } else { + return _useCache; + } + }; + return f; + }; + + if (chroma.scales == null) { + chroma.scales = {}; + } + + chroma.scales.cool = function() { + return chroma.scale([chroma.hsl(180, 1, .9), chroma.hsl(250, .7, .4)]); + }; + + chroma.scales.hot = function() { + return chroma.scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb'); + }; + + chroma.analyze = function(data, key, filter) { + var add, k, len, o, r, val, visit; + r = { + min: Number.MAX_VALUE, + max: Number.MAX_VALUE * -1, + sum: 0, + values: [], + count: 0 + }; + if (filter == null) { + filter = function() { + return true; + }; + } + add = function(val) { + if ((val != null) && !isNaN(val)) { + r.values.push(val); + r.sum += val; + if (val < r.min) { + r.min = val; + } + if (val > r.max) { + r.max = val; + } + r.count += 1; + } + }; + visit = function(val, k) { + if (filter(val, k)) { + if ((key != null) && type(key) === 'function') { + return add(key(val)); + } else if ((key != null) && type(key) === 'string' || type(key) === 'number') { + return add(val[key]); + } else { + return add(val); + } + } + }; + if (type(data) === 'array') { + for (o = 0, len = data.length; o < len; o++) { + val = data[o]; + visit(val); + } + } else { + for (k in data) { + val = data[k]; + visit(val, k); + } + } + r.domain = [r.min, r.max]; + r.limits = function(mode, num) { + return chroma.limits(r, mode, num); + }; + return r; + }; + + chroma.limits = function(data, mode, num) { + var aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, assignments, best, centroids, cluster, clusterSizes, dist, i, j, kClusters, limits, max_log, min, min_log, mindist, n, nb_iters, newCentroids, o, p, pb, pr, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, repeat, sum, tmpKMeansBreaks, v, value, values, w; + if (mode == null) { + mode = 'equal'; + } + if (num == null) { + num = 7; + } + if (type(data) === 'array') { + data = chroma.analyze(data); + } + min = data.min; + max = data.max; + sum = data.sum; + values = data.values.sort(function(a, b) { + return a - b; + }); + if (num === 1) { + return [min, max]; + } + limits = []; + if (mode.substr(0, 1) === 'c') { + limits.push(min); + limits.push(max); + } + if (mode.substr(0, 1) === 'e') { + limits.push(min); + for (i = o = 1, ref = num - 1; 1 <= ref ? o <= ref : o >= ref; i = 1 <= ref ? ++o : --o) { + limits.push(min + (i / num) * (max - min)); + } + limits.push(max); + } else if (mode.substr(0, 1) === 'l') { + if (min <= 0) { + throw 'Logarithmic scales are only possible for values > 0'; + } + min_log = Math.LOG10E * log(min); + max_log = Math.LOG10E * log(max); + limits.push(min); + for (i = w = 1, ref1 = num - 1; 1 <= ref1 ? w <= ref1 : w >= ref1; i = 1 <= ref1 ? ++w : --w) { + limits.push(pow(10, min_log + (i / num) * (max_log - min_log))); + } + limits.push(max); + } else if (mode.substr(0, 1) === 'q') { + limits.push(min); + for (i = aa = 1, ref2 = num - 1; 1 <= ref2 ? aa <= ref2 : aa >= ref2; i = 1 <= ref2 ? ++aa : --aa) { + p = (values.length - 1) * i / num; + pb = floor(p); + if (pb === p) { + limits.push(values[pb]); + } else { + pr = p - pb; + limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr); + } + } + limits.push(max); + } else if (mode.substr(0, 1) === 'k') { + + /* + implementation based on + http://code.google.com/p/figue/source/browse/trunk/figue.js#336 + simplified for 1-d input values + */ + n = values.length; + assignments = new Array(n); + clusterSizes = new Array(num); + repeat = true; + nb_iters = 0; + centroids = null; + centroids = []; + centroids.push(min); + for (i = ab = 1, ref3 = num - 1; 1 <= ref3 ? ab <= ref3 : ab >= ref3; i = 1 <= ref3 ? ++ab : --ab) { + centroids.push(min + (i / num) * (max - min)); + } + centroids.push(max); + while (repeat) { + for (j = ac = 0, ref4 = num - 1; 0 <= ref4 ? ac <= ref4 : ac >= ref4; j = 0 <= ref4 ? ++ac : --ac) { + clusterSizes[j] = 0; + } + for (i = ad = 0, ref5 = n - 1; 0 <= ref5 ? ad <= ref5 : ad >= ref5; i = 0 <= ref5 ? ++ad : --ad) { + value = values[i]; + mindist = Number.MAX_VALUE; + for (j = ae = 0, ref6 = num - 1; 0 <= ref6 ? ae <= ref6 : ae >= ref6; j = 0 <= ref6 ? ++ae : --ae) { + dist = abs(centroids[j] - value); + if (dist < mindist) { + mindist = dist; + best = j; + } + } + clusterSizes[best]++; + assignments[i] = best; + } + newCentroids = new Array(num); + for (j = af = 0, ref7 = num - 1; 0 <= ref7 ? af <= ref7 : af >= ref7; j = 0 <= ref7 ? ++af : --af) { + newCentroids[j] = null; + } + for (i = ag = 0, ref8 = n - 1; 0 <= ref8 ? ag <= ref8 : ag >= ref8; i = 0 <= ref8 ? ++ag : --ag) { + cluster = assignments[i]; + if (newCentroids[cluster] === null) { + newCentroids[cluster] = values[i]; + } else { + newCentroids[cluster] += values[i]; + } + } + for (j = ah = 0, ref9 = num - 1; 0 <= ref9 ? ah <= ref9 : ah >= ref9; j = 0 <= ref9 ? ++ah : --ah) { + newCentroids[j] *= 1 / clusterSizes[j]; + } + repeat = false; + for (j = ai = 0, ref10 = num - 1; 0 <= ref10 ? ai <= ref10 : ai >= ref10; j = 0 <= ref10 ? ++ai : --ai) { + if (newCentroids[j] !== centroids[i]) { + repeat = true; + break; + } + } + centroids = newCentroids; + nb_iters++; + if (nb_iters > 200) { + repeat = false; + } + } + kClusters = {}; + for (j = aj = 0, ref11 = num - 1; 0 <= ref11 ? aj <= ref11 : aj >= ref11; j = 0 <= ref11 ? ++aj : --aj) { + kClusters[j] = []; + } + for (i = ak = 0, ref12 = n - 1; 0 <= ref12 ? ak <= ref12 : ak >= ref12; i = 0 <= ref12 ? ++ak : --ak) { + cluster = assignments[i]; + kClusters[cluster].push(values[i]); + } + tmpKMeansBreaks = []; + for (j = al = 0, ref13 = num - 1; 0 <= ref13 ? al <= ref13 : al >= ref13; j = 0 <= ref13 ? ++al : --al) { + tmpKMeansBreaks.push(kClusters[j][0]); + tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]); + } + tmpKMeansBreaks = tmpKMeansBreaks.sort(function(a, b) { + return a - b; + }); + limits.push(tmpKMeansBreaks[0]); + for (i = am = 1, ref14 = tmpKMeansBreaks.length - 1; am <= ref14; i = am += 2) { + v = tmpKMeansBreaks[i]; + if (!isNaN(v) && limits.indexOf(v) === -1) { + limits.push(v); + } + } + } + return limits; + }; + + hsi2rgb = function(h, s, i) { + + /* + borrowed from here: + http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp + */ + var args, b, g, r; + args = unpack(arguments); + h = args[0], s = args[1], i = args[2]; + if (isNaN(h)) { + h = 0; + } + h /= 360; + if (h < 1 / 3) { + b = (1 - s) / 3; + r = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + g = 1 - (b + r); + } else if (h < 2 / 3) { + h -= 1 / 3; + r = (1 - s) / 3; + g = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + b = 1 - (r + g); + } else { + h -= 2 / 3; + g = (1 - s) / 3; + b = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3; + r = 1 - (g + b); + } + r = limit(i * r * 3); + g = limit(i * g * 3); + b = limit(i * b * 3); + return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1]; + }; + + rgb2hsi = function() { + + /* + borrowed from here: + http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp + */ + var b, g, h, i, min, r, ref, s; + ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2]; + TWOPI = Math.PI * 2; + r /= 255; + g /= 255; + b /= 255; + min = Math.min(r, g, b); + i = (r + g + b) / 3; + s = 1 - min / i; + if (s === 0) { + h = 0; + } else { + h = ((r - g) + (r - b)) / 2; + h /= Math.sqrt((r - g) * (r - g) + (r - b) * (g - b)); + h = Math.acos(h); + if (b > g) { + h = TWOPI - h; + } + h /= TWOPI; + } + return [h * 360, s, i]; + }; + + chroma.hsi = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(Color, slice.call(arguments).concat(['hsi']), function(){}); + }; + + _input.hsi = hsi2rgb; + + Color.prototype.hsi = function() { + return rgb2hsi(this._rgb); + }; + + interpolate_hsx = function(col1, col2, f, m) { + var dh, hue, hue0, hue1, lbv, lbv0, lbv1, res, sat, sat0, sat1, xyz0, xyz1; + if (m === 'hsl') { + xyz0 = col1.hsl(); + xyz1 = col2.hsl(); + } else if (m === 'hsv') { + xyz0 = col1.hsv(); + xyz1 = col2.hsv(); + } else if (m === 'hcg') { + xyz0 = col1.hcg(); + xyz1 = col2.hcg(); + } else if (m === 'hsi') { + xyz0 = col1.hsi(); + xyz1 = col2.hsi(); + } else if (m === 'lch' || m === 'hcl') { + m = 'hcl'; + xyz0 = col1.hcl(); + xyz1 = col2.hcl(); + } + if (m.substr(0, 1) === 'h') { + hue0 = xyz0[0], sat0 = xyz0[1], lbv0 = xyz0[2]; + hue1 = xyz1[0], sat1 = xyz1[1], lbv1 = xyz1[2]; + } + if (!isNaN(hue0) && !isNaN(hue1)) { + if (hue1 > hue0 && hue1 - hue0 > 180) { + dh = hue1 - (hue0 + 360); + } else if (hue1 < hue0 && hue0 - hue1 > 180) { + dh = hue1 + 360 - hue0; + } else { + dh = hue1 - hue0; + } + hue = hue0 + f * dh; + } else if (!isNaN(hue0)) { + hue = hue0; + if ((lbv1 === 1 || lbv1 === 0) && m !== 'hsv') { + sat = sat0; + } + } else if (!isNaN(hue1)) { + hue = hue1; + if ((lbv0 === 1 || lbv0 === 0) && m !== 'hsv') { + sat = sat1; + } + } else { + hue = Number.NaN; + } + if (sat == null) { + sat = sat0 + f * (sat1 - sat0); + } + lbv = lbv0 + f * (lbv1 - lbv0); + return res = chroma[m](hue, sat, lbv); + }; + + _interpolators = _interpolators.concat((function() { + var len, o, ref, results; + ref = ['hsv', 'hsl', 'hsi', 'hcl', 'lch', 'hcg']; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + m = ref[o]; + results.push([m, interpolate_hsx]); + } + return results; + })()); + + interpolate_num = function(col1, col2, f, m) { + var n1, n2; + n1 = col1.num(); + n2 = col2.num(); + return chroma.num(n1 + (n2 - n1) * f, 'num'); + }; + + _interpolators.push(['num', interpolate_num]); + + interpolate_lab = function(col1, col2, f, m) { + var res, xyz0, xyz1; + xyz0 = col1.lab(); + xyz1 = col2.lab(); + return res = new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m); + }; + + _interpolators.push(['lab', interpolate_lab]); + +}).call(this); diff --git a/src/static/node_modules/chroma-js/docs/libs/chroma.min.js b/src/static/node_modules/chroma-js/docs/libs/chroma.min.js new file mode 100644 index 0000000..6acb8cd --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/chroma.min.js @@ -0,0 +1,33 @@ +/* +chroma.js - JavaScript library for color conversions + +Copyright (c) 2011-2017, Gregor Aisch +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. The name Gregor Aisch may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea,fa,ga,ha,ia,ja,ka,la,ma,na,oa,pa,qa,ra,sa,ta,ua,va,wa,xa,ya,za,Aa=[].slice;va=function(){var a,b,c,d,e;for(a={},e="Boolean Number String Function Array Date RegExp Undefined Null".split(" "),d=0,b=e.length;dc&&(a=c),a},wa=function(a){return a.length>=3?[].slice.call(a):a[0]},t=function(a){var b,c;for(a._clipped=!1,a._unclipped=a.slice(0),b=c=0;c<3;b=++c)b<3?((a[b]<0||a[b]>255)&&(a._clipped=!0),a[b]<0&&(a[b]=0),a[b]>255&&(a[b]=255)):3===b&&(a[b]<0&&(a[b]=0),a[b]>1&&(a[b]=1));return a._clipped||delete a._unclipped,a},d=Math.PI,qa=Math.round,v=Math.cos,A=Math.floor,_=Math.pow,T=Math.log,sa=Math.sin,ta=Math.sqrt,m=Math.atan2,W=Math.max,l=Math.abs,g=2*d,e=d/3,b=d/180,f=180/d,s=function(){return arguments[0]instanceof a?arguments[0]:function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,arguments,function(){})},k=[],"undefined"!=typeof module&&null!==module&&null!=module.exports&&(module.exports=s),"function"==typeof define&&define.amd?define([],function(){return s}):(pa="undefined"!=typeof exports&&null!==exports?exports:this,pa.chroma=s),s.version="1.3.4",j={},h=[],i=!1,a=function(){function a(){var a,b,c,d,e,f,g,k,l;for(f=this,b=[],k=0,d=arguments.length;k3?b[3]:1]},za=function(a){return 255*(a<=.00304?12.92*a:1.055*_(a,1/2.4)-.055)},O=function(a){return a>c.t1?a*a*a:c.t2*(a-c.t0)},c={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},ha=function(){var a,b,c,d,e,f,g,h;return d=wa(arguments),c=d[0],b=d[1],a=d[2],e=ma(c,b,a),f=e[0],g=e[1],h=e[2],[116*g-16,500*(f-g),200*(g-h)]},na=function(a){return(a/=255)<=.04045?a/12.92:_((a+.055)/1.055,2.4)},ya=function(a){return a>c.t3?_(a,1/3):a/c.t2+c.t0},ma=function(){var a,b,d,e,f,g,h;return e=wa(arguments),d=e[0],b=e[1],a=e[2],d=na(d),b=na(b),a=na(a),f=ya((.4124564*d+.3575761*b+.1804375*a)/c.Xn),g=ya((.2126729*d+.7151522*b+.072175*a)/c.Yn),h=ya((.0193339*d+.119192*b+.9503041*a)/c.Zn),[f,g,h]},s.lab=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["lab"]),function(){})},j.lab=N,a.prototype.lab=function(){return ha(this._rgb)},n=function(a){var b,c,d,e,f,g,h,i,j,k,l;return a=function(){var b,c,d;for(d=[],c=0,b=a.length;c=360;)c-=360;p[k]=c}return s(p,b).alpha(e/l)},j.rgb=function(){var a,b,c,d;b=wa(arguments),c=[];for(a in b)d=b[a],c.push(d);return c},s.rgb=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["rgb"]),function(){})},a.prototype.rgb=function(a){return null==a&&(a=!0),a?this._rgb.map(Math.round).slice(0,3):this._rgb.slice(0,3)},a.prototype.rgba=function(a){return null==a&&(a=!0),a?[Math.round(this._rgb[0]),Math.round(this._rgb[1]),Math.round(this._rgb[2]),this._rgb[3]]:this._rgb.slice(0)},h.push({p:3,test:function(a){var b;return b=wa(arguments),"array"===va(b)&&3===b.length?"rgb":4===b.length&&"number"===va(b[3])&&b[3]>=0&&b[3]<=1?"rgb":void 0}}),C=function(a){var b,c,d,e,f,g;if(a.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))return 4!==a.length&&7!==a.length||(a=a.substr(1)),3===a.length&&(a=a.split(""),a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),g=parseInt(a,16),e=g>>16,d=g>>8&255,c=255&g,[e,d,c,1];if(a.match(/^#?([A-Fa-f0-9]{8})$/))return 9===a.length&&(a=a.substr(1)),g=parseInt(a,16),e=g>>24&255,d=g>>16&255,c=g>>8&255,b=qa((255&g)/255*100)/100,[e,d,c,b];if(null!=j.css&&(f=j.css(a)))return f;throw"unknown color: "+a},da=function(a,b){var c,d,e,f,g,h,i;return null==b&&(b="rgb"),g=a[0],e=a[1],d=a[2],c=a[3],g=Math.round(g),e=Math.round(e),d=Math.round(d),i=g<<16|e<<8|d,h="000000"+i.toString(16),h=h.substr(h.length-6),f="0"+qa(255*c).toString(16),f=f.substr(f.length-2),"#"+function(){switch(b.toLowerCase()){case"rgba":return h+f;case"argb":return f+h;default:return h}}()},j.hex=function(a){return C(a)},s.hex=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hex"]),function(){})},a.prototype.hex=function(a){return null==a&&(a="rgb"),da(this._rgb,a)},h.push({p:4,test:function(a){if(1===arguments.length&&"string"===va(a))return"hex"}}),F=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;if(a=wa(arguments),e=a[0],k=a[1],g=a[2],0===k)i=d=b=255*g;else{for(n=[0,0,0],c=[0,0,0],m=g<.5?g*(1+k):g+k-g*k,l=2*g-m,e/=360,n[0]=e+1/3,n[1]=e,n[2]=e-1/3,f=h=0;h<=2;f=++h)n[f]<0&&(n[f]+=1),n[f]>1&&(n[f]-=1),6*n[f]<1?c[f]=l+6*(m-l)*n[f]:2*n[f]<1?c[f]=m:3*n[f]<2?c[f]=l+(m-l)*(2/3-n[f])*6:c[f]=l;j=[qa(255*c[0]),qa(255*c[1]),qa(255*c[2])],i=j[0],d=j[1],b=j[2]}return a.length>3?[i,d,b,a[3]]:[i,d,b]},fa=function(a,b,c){var d,e,f,g,h;return void 0!==a&&a.length>=3&&(g=a,a=g[0],b=g[1],c=g[2]),a/=255,b/=255,c/=255,f=Math.min(a,b,c),W=Math.max(a,b,c),e=(W+f)/2,W===f?(h=0,d=Number.NaN):h=e<.5?(W-f)/(W+f):(W-f)/(2-W-f),a===W?d=(b-c)/(W-f):b===W?d=2+(c-a)/(W-f):c===W&&(d=4+(a-b)/(W-f)),d*=60,d<0&&(d+=360),[d,h,e]},s.hsl=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsl"]),function(){})},j.hsl=F,a.prototype.hsl=function(){return fa(this._rgb)},G=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;if(a=wa(arguments),e=a[0],p=a[1],r=a[2],r*=255,0===p)i=d=b=r;else switch(360===e&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60,f=A(e),c=e-f,g=r*(1-p),h=r*(1-p*c),q=r*(1-p*(1-c)),f){case 0:j=[r,q,g],i=j[0],d=j[1],b=j[2];break;case 1:k=[h,r,g],i=k[0],d=k[1],b=k[2];break;case 2:l=[g,r,q],i=l[0],d=l[1],b=l[2];break;case 3:m=[g,h,r],i=m[0],d=m[1],b=m[2];break;case 4:n=[q,g,r],i=n[0],d=n[1],b=n[2];break;case 5:o=[r,g,h],i=o[0],d=o[1],b=o[2]}return[i,d,b,a.length>3?a[3]:1]},ga=function(){var a,b,c,d,e,f,g,h,i;return g=wa(arguments),f=g[0],c=g[1],a=g[2],e=Math.min(f,c,a),W=Math.max(f,c,a),b=W-e,i=W/255,0===W?(d=Number.NaN,h=0):(h=b/W,f===W&&(d=(c-a)/b),c===W&&(d=2+(a-f)/b),a===W&&(d=4+(f-c)/b),(d*=60)<0&&(d+=360)),[d,h,i]},s.hsv=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsv"]),function(){})},j.hsv=G,a.prototype.hsv=function(){return ga(this._rgb)},Z=function(a){var b,c,d;return"number"===va(a)&&a>=0&&a<=16777215?(d=a>>16,c=a>>8&255,b=255&a,[d,c,b,1]):(console.warn("unknown num color: "+a),[0,0,0,1])},ka=function(){var a,b,c,d;return d=wa(arguments),c=d[0],b=d[1],a=d[2],(c<<16)+(b<<8)+a},s.num=function(b){return new a(b,"num")},a.prototype.num=function(a){return null==a&&(a="rgb"),ka(this._rgb,a)},j.num=Z,h.push({p:1,test:function(a){if(1===arguments.length&&"number"===va(a)&&a>=0&&a<=16777215)return"num"}}),B=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;if(c=wa(arguments),h=c[0],e=c[1],b=c[2],e/=100,g=g/100*255,a=255*e,0===e)l=g=d=b;else switch(360===h&&(h=0),h>360&&(h-=360),h<0&&(h+=360),h/=60,i=A(h),f=h-i,j=b*(1-e),k=j+a*(1-f),s=j+a*f,t=j+a,i){case 0:m=[t,s,j],l=m[0],g=m[1],d=m[2];break;case 1:n=[k,t,j],l=n[0],g=n[1],d=n[2];break;case 2:o=[j,t,s],l=o[0],g=o[1],d=o[2];break;case 3:p=[j,k,t],l=p[0],g=p[1],d=p[2];break;case 4:q=[s,j,t],l=q[0],g=q[1],d=q[2];break;case 5:r=[t,j,k],l=r[0],g=r[1],d=r[2]}return[l,g,d,c.length>3?c[3]:1]},ca=function(){var a,b,c,d,e,f,g,h,i;return i=wa(arguments),h=i[0],e=i[1],b=i[2],g=Math.min(h,e,b),W=Math.max(h,e,b),d=W-g,c=100*d/255,a=g/(255-d)*100,0===d?f=Number.NaN:(h===W&&(f=(e-b)/d),e===W&&(f=2+(b-h)/d),b===W&&(f=4+(h-e)/d),(f*=60)<0&&(f+=360)),[f,c,a]},s.hcg=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hcg"]),function(){})},j.hcg=B,a.prototype.hcg=function(){return ca(this._rgb)},w=function(a){var b,c,d,e,f,g,h,i;if(a=a.toLowerCase(),null!=s.colors&&s.colors[a])return C(s.colors[a]);if(f=a.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){for(h=f.slice(1,4),e=g=0;g<=2;e=++g)h[e]=+h[e];h[3]=1}else if(f=a.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/))for(h=f.slice(1,5),e=i=0;i<=3;e=++i)h[e]=+h[e];else if(f=a.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){for(h=f.slice(1,4),e=b=0;b<=2;e=++b)h[e]=qa(2.55*h[e]);h[3]=1}else if(f=a.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){for(h=f.slice(1,5),e=c=0;c<=2;e=++c)h[e]=qa(2.55*h[e]);h[3]=+h[3]}else(f=a.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/))?(d=f.slice(1,4),d[1]*=.01,d[2]*=.01,h=F(d),h[3]=1):(f=a.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/))&&(d=f.slice(1,4),d[1]*=.01,d[2]*=.01,h=F(d),h[3]=+f[4]);return h},ba=function(a){var b;return b=a[3]<1?"rgba":"rgb","rgb"===b?b+"("+a.slice(0,3).map(qa).join(",")+")":"rgba"===b?b+"("+a.slice(0,3).map(qa).join(",")+","+a[3]+")":void 0},oa=function(a){return qa(100*a)/100},E=function(a,b){var c;return c=b<1?"hsla":"hsl",a[0]=oa(a[0]||0),a[1]=oa(100*a[1])+"%",a[2]=oa(100*a[2])+"%","hsla"===c&&(a[3]=b),c+"("+a.join(",")+")"},j.css=function(a){return w(a)},s.css=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["css"]),function(){})},a.prototype.css=function(a){return null==a&&(a="rgb"),"rgb"===a.slice(0,3)?ba(this._rgb):"hsl"===a.slice(0,3)?E(this.hsl(),this.alpha()):void 0},j.named=function(a){return C(xa[a])},h.push({p:5,test:function(a){if(1===arguments.length&&null!=xa[a])return"named"}}),a.prototype.name=function(a){var b,c;arguments.length&&(xa[a]&&(this._rgb=C(xa[a])),this._rgb[3]=1),b=this.hex();for(c in xa)if(b===xa[c])return c;return b},P=function(){var a,c,d,e;return e=wa(arguments),d=e[0],a=e[1],c=e[2],c*=b,[d,v(c)*a,sa(c)*a]},Q=function(){var a,b,c,d,e,f,g,h,i,j,k;return c=wa(arguments),h=c[0],e=c[1],g=c[2],j=P(h,e,g),a=j[0],b=j[1],d=j[2],k=N(a,b,d),i=k[0],f=k[1],d=k[2],[i,f,d,c.length>3?c[3]:1]},M=function(){var a,b,c,d,e,g;return g=wa(arguments),e=g[0],a=g[1],b=g[2],c=ta(a*a+b*b),d=(m(b,a)*f+360)%360,0===qa(1e4*c)&&(d=Number.NaN),[e,c,d]},ia=function(){var a,b,c,d,e,f,g;return f=wa(arguments),e=f[0],c=f[1],b=f[2],g=ha(e,c,b),d=g[0],a=g[1],b=g[2],M(d,a,b)},s.lch=function(){var b;return b=wa(arguments),new a(b,"lch")},s.hcl=function(){var b;return b=wa(arguments),new a(b,"hcl")},j.lch=Q,j.hcl=function(){var a,b,c,d;return d=wa(arguments),b=d[0],a=d[1],c=d[2],Q([c,a,b])},a.prototype.lch=function(){return ia(this._rgb)},a.prototype.hcl=function(){return ia(this._rgb).reverse()},aa=function(a){var b,c,d,e,f,g,h,i,j;return null==a&&(a="rgb"),i=wa(arguments),h=i[0],e=i[1],b=i[2],h/=255,e/=255,b/=255,f=1-Math.max(h,Math.max(e,b)),d=f<1?1/(1-f):0,c=(1-h-f)*d,g=(1-e-f)*d,j=(1-b-f)*d,[c,g,j,f]},u=function(){var a,b,c,d,e,f,g,h,i;return b=wa(arguments),d=b[0],g=b[1],i=b[2],f=b[3],a=b.length>4?b[4]:1,1===f?[0,0,0,a]:(h=d>=1?0:255*(1-d)*(1-f),e=g>=1?0:255*(1-g)*(1-f),c=i>=1?0:255*(1-i)*(1-f),[h,e,c,a])},j.cmyk=function(){return u(wa(arguments))},s.cmyk=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["cmyk"]),function(){})},a.prototype.cmyk=function(){return aa(this._rgb)},j.gl=function(){var a,b,c,d,e;for(d=function(){var a,c;a=wa(arguments),c=[];for(b in a)e=a[b],c.push(e);return c}.apply(this,arguments),a=c=0;c<=2;a=++c)d[a]*=255;return d},s.gl=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["gl"]),function(){})},a.prototype.gl=function(){var a;return a=this._rgb,[a[0]/255,a[1]/255,a[2]/255,a[3]]},ja=function(a,b,c){var d;return d=wa(arguments),a=d[0],b=d[1],c=d[2],a=U(a),b=U(b),c=U(c),.2126*a+.7152*b+.0722*c},U=function(a){return a/=255,a<=.03928?a/12.92:_((a+.055)/1.055,2.4)},k=[],H=function(a,b,c,d){var e,f,g,h;for(null==c&&(c=.5),null==d&&(d="rgb"),"object"!==va(a)&&(a=s(a)),"object"!==va(b)&&(b=s(b)),g=0,f=k.length;ga?f(c,i):f(i,g)},c=ja(this._rgb),this._rgb=(c>a?f(s("black"),this):f(this,s("white"))).rgba()),this):ja(this._rgb)},ua=function(a){var b,c,d,e;return e=a/100,e<66?(d=255,c=-155.25485562709179-.44596950469579133*(c=e-2)+104.49216199393888*T(c),b=e<20?0:-254.76935184120902+.8274096064007395*(b=e-10)+115.67994401066147*T(b)):(d=351.97690566805693+.114206453784165*(d=e-55)-40.25366309332127*T(d),c=325.4494125711974+.07943456536662342*(c=e-50)-28.0852963507957*T(c),b=255),[d,c,b]},la=function(){var a,b,c,d,e,f,g,h;for(f=wa(arguments),e=f[0],f[1],a=f[2],d=1e3,c=4e4,b=.4;c-d>b;)h=.5*(c+d),g=ua(h),g[2]/g[0]>=a/e?c=h:d=h;return qa(h)},s.temperature=s.kelvin=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["temperature"]),function(){})},j.temperature=j.kelvin=j.K=ua,a.prototype.temperature=function(){return la(this._rgb)},a.prototype.kelvin=a.prototype.temperature,s.contrast=function(b,c){var d,e,f,g;return"string"!==(f=va(b))&&"number"!==f||(b=new a(b)),"string"!==(g=va(c))&&"number"!==g||(c=new a(c)),d=b.luminance(),e=c.luminance(),d>e?(d+.05)/(e+.05):(e+.05)/(d+.05)},s.distance=function(b,c,d){var e,f,g,h,i,j,k;null==d&&(d="lab"),"string"!==(i=va(b))&&"number"!==i||(b=new a(b)),"string"!==(j=va(c))&&"number"!==j||(c=new a(c)),g=b.get(d),h=c.get(d),k=0;for(f in g)e=(g[f]||0)-(h[f]||0),k+=e*e;return Math.sqrt(k)},s.deltaE=function(b,c,e,f){var g,h,i,j,k,n,o,p,q,r,s,t,u,w,x,y,z,A,B,C,D,E,F,G,H,I,J;for(null==e&&(e=1),null==f&&(f=1),"string"!==(z=va(b))&&"number"!==z||(b=new a(b)),"string"!==(A=va(c))&&"number"!==A||(c=new a(c)),B=b.lab(),g=B[0],i=B[1],k=B[2],C=c.lab(),h=C[0],j=C[1],n=C[2],o=ta(i*i+k*k),p=ta(j*j+n*n),F=g<16?.511:.040975*g/(1+.01765*g),D=.0638*o/(1+.0131*o)+.638,y=o<1e-6?0:180*m(k,i)/d;y<0;)y+=360;for(;y>=360;)y-=360;return G=y>=164&&y<=345?.56+l(.2*v(d*(y+168)/180)):.36+l(.4*v(d*(y+35)/180)),q=o*o*o*o,x=ta(q/(q+1900)),E=D*(x*G+1-x),w=g-h,u=o-p,s=i-j,t=k-n,r=s*s+t*t-u*u,H=w/(e*F),I=u/(f*D),J=E,ta(H*H+I*I+r/(J*J))},a.prototype.get=function(a){var b,c,d,e,f,g;return d=this,f=a.split("."),e=f[0],b=f[1],g=d[e](),b?(c=e.indexOf(b),c>-1?g[c]:console.warn("unknown channel "+b+" in mode "+e)):g},a.prototype.set=function(a,b){var c,d,e,f,g,h;if(e=this,g=a.split("."),f=g[0],c=g[1],c)if(h=e[f](),(d=f.indexOf(c))>-1)if("string"===va(b))switch(b.charAt(0)){case"+":case"-":h[d]+=+b;break;case"*":h[d]*=+b.substr(1);break;case"/":h[d]/=+b.substr(1);break;default:h[d]=+b}else h[d]=b;else console.warn("unknown channel "+c+" in mode "+f);else h=b;return s(h,f).alpha(e.alpha())},a.prototype.clipped=function(){return this._rgb._clipped||!1},a.prototype.alpha=function(a){return arguments.length?s.rgb([this._rgb[0],this._rgb[1],this._rgb[2],a]):this._rgb[3]},a.prototype.darken=function(a){var b,d;return null==a&&(a=1),d=this,b=d.lab(),b[0]-=c.Kn*a,s.lab(b).alpha(d.alpha())},a.prototype.brighten=function(a){return null==a&&(a=1),this.darken(-a)},a.prototype.darker=a.prototype.darken,a.prototype.brighter=a.prototype.brighten,a.prototype.saturate=function(a){var b,d;return null==a&&(a=1),d=this,b=d.lch(),b[1]+=a*c.Kn,b[1]<0&&(b[1]=0),s.lch(b).alpha(d.alpha())},a.prototype.desaturate=function(a){return null==a&&(a=1),this.saturate(-a)},a.prototype.premultiply=function(){var a,b;return b=this.rgb(),a=this.alpha(),s(b[0]*a,b[1]*a,b[2]*a,a)},o=function(a,b,c){if(!o[c])throw"unknown blend mode "+c;return o[c](a,b)},p=function(a){return function(b,c){var d,e;return d=s(c).rgb(),e=s(b).rgb(),s(a(d,e),"rgb")}},z=function(a){return function(b,c){var d,e,f;for(f=[],d=e=0;e<=3;d=++e)f[d]=a(b[d],c[d]);return f}},Y=function(a,b){return a},X=function(a,b){return a*b/255},x=function(a,b){return a>b?b:a},R=function(a,b){return a>b?a:b},ra=function(a,b){return 255*(1-(1-a/255)*(1-b/255))},$=function(a,b){return b<128?2*a*b/255:255*(1-2*(1-a/255)*(1-b/255))},r=function(a,b){return 255*(1-(1-b/255)/(a/255))},y=function(a,b){return 255===a?255:(a=b/255*255/(1-a/255),a>255?255:a)},o.normal=p(z(Y)),o.multiply=p(z(X)),o.screen=p(z(ra)),o.overlay=p(z($)),o.darken=p(z(x)),o.lighten=p(z(R)),o.dodge=p(z(y)),o.burn=p(z(r)),s.blend=o,s.analyze=function(a){var b,c,d,e;for(d={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0},c=0,b=a.length;cd.max&&(d.max=e),d.count+=1);return d.domain=[d.min,d.max],d.limits=function(a,b){return s.limits(d,a,b)},d},s.scale=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,t,u,v,w;return j="rgb",k=s("#ccc"),o=0,!1,g=[0,1],n=[],m=[0,0],c=!1,e=[],l=!1,i=0,h=1,f=!1,d={},p=!0,v=function(a){var b,c,d,f,g,h;if(null==a&&(a=["#fff","#000"]),null!=a&&"string"===va(a)&&null!=s.brewer&&(a=s.brewer[a]||s.brewer[a.toLowerCase()]||a),"array"===va(a)){for(a=a.slice(0),b=d=0,f=a.length-1;0<=f?d<=f:d>=f;b=0<=f?++d:--d)c=a[b],"string"===va(c)&&(a[b]=s(c));for(n.length=0,b=h=0,g=a.length-1;0<=g?h<=g:h>=g;b=0<=g?++h:--h)n.push(b/(a.length-1))}return u(),e=a},r=function(a){var b,d;if(null!=c){for(d=c.length-1,b=0;b=c[b];)b++;return b-1}return 0},w=function(a){return a},function(a){var b,d,e,f,g;return g=a,c.length>2&&(f=c.length-1,b=r(a),e=c[0]+(c[1]-c[0])*(0+.5*o),d=c[f-1]+(c[f]-c[f-1])*(1-.5*o),g=i+(c[b]+.5*(c[b+1]-c[b])-e)/(d-e)*(h-i)),g},t=function(a,b){var f,g,l,o,q,t,u,v;if(null==b&&(b=!1),isNaN(a))return k;if(b?v=a:c&&c.length>2?(f=r(a),v=f/(c.length-2),v=m[0]+v*(1-m[0]-m[1])):h!==i?(v=(a-i)/(h-i),v=m[0]+v*(1-m[0]-m[1]),v=Math.min(1,Math.max(0,v))):v=1,b||(v=w(v)),o=Math.floor(1e4*v),p&&d[o])g=d[o];else{if("array"===va(e))for(l=q=0,u=n.length-1;0<=u?q<=u:q>=u;l=0<=u?++q:--q){if(t=n[l],v<=t){g=e[l];break}if(v>=t&&l===n.length-1){g=e[l];break}if(v>t&&v=k;b=0<=k?++l:--l)n.push(b/(d-1));return g=[i,h],q},q.mode=function(a){return arguments.length?(j=a,u(),q):j},q.range=function(a,b){return v(a,b),q},q.out=function(a){return l=a,q},q.spread=function(a){return arguments.length?(o=a,q):o},q.correctLightness=function(a){return null==a&&(a=!0),f=a,u(),w=f?function(a){var b,c,d,e,f,g,h,i,j;for(b=t(0,!0).lab()[0],c=t(1,!0).lab()[0],h=b>c,d=t(a,!0).lab()[0],f=b+(c-b)*a,e=d-f,i=0,j=1,g=20;Math.abs(e)>.01&&g-- >0;)!function(){h&&(e*=-1),e<0?(i=a,a+=.5*(j-a)):(j=a,a+=.5*(i-a)),d=t(a,!0).lab()[0],e=d-f}();return a}:function(a){return a},q},q.padding=function(a){return null!=a?("number"===va(a)&&(a=[a,a]),m=a,q):m},q.colors=function(b,d){var f,h,i,j,k,l,m,n;if(arguments.length<2&&(d="hex"),k=[],0===arguments.length)k=e.slice(0);else if(1===b)k=[q(.5)];else if(b>1)h=g[0],f=g[1]-h,k=function(){l=[];for(var a=0;0<=b?ab;0<=b?a++:a--)l.push(a);return l}.apply(this).map(function(a){return q(h+a/(b-1)*f)});else{if(a=[],m=[],c&&c.length>2)for(i=n=1,j=c.length;1<=j?nj;i=1<=j?++n:--n)m.push(.5*(c[i-1]+c[i]));else m=g;k=m.map(function(a){return q(a)})}return s[d]&&(k=k.map(function(a){return a[d]()})),k},q.cache=function(a){return null!=a?p=a:p},q},null==s.scales&&(s.scales={}),s.scales.cool=function(){return s.scale([s.hsl(180,1,.9),s.hsl(250,.7,.4)])},s.scales.hot=function(){return s.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")},s.analyze=function(a,b,c){var d,e,f,g,h,i,j;if(h={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0},null==c&&(c=function(){return!0}),d=function(a){null==a||isNaN(a)||(h.values.push(a),h.sum+=a,ah.max&&(h.max=a),h.count+=1)},j=function(a,e){if(c(a,e))return d(null!=b&&"function"===va(b)?b(a):null!=b&&"string"===va(b)||"number"===va(b)?a[b]:a)},"array"===va(a))for(g=0,f=a.length;g=O;y=1<=O?++K:--K)C.push(E+y/c*(W-E)) +;C.push(W)}else if("l"===b.substr(0,1)){if(E<=0)throw"Logarithmic scales are only possible for values > 0";for(F=Math.LOG10E*T(E),D=Math.LOG10E*T(W),C.push(E),y=ja=1,P=c-1;1<=P?ja<=P:ja>=P;y=1<=P?++ja:--ja)C.push(_(10,F+y/c*(D-F)));C.push(W)}else if("q"===b.substr(0,1)){for(C.push(E),y=d=1,X=c-1;1<=X?d<=X:d>=X;y=1<=X?++d:--d)L=(ia.length-1)*y/c,M=A(L),M===L?C.push(ia[M]):(N=L-M,C.push(ia[M]*(1-N)+ia[M+1]*N));C.push(W)}else if("k"===b.substr(0,1)){for(H=ia.length,r=new Array(H),w=new Array(c),ea=!0,I=0,u=null,u=[],u.push(E),y=e=1,Y=c-1;1<=Y?e<=Y:e>=Y;y=1<=Y?++e:--e)u.push(E+y/c*(W-E));for(u.push(W);ea;){for(z=f=0,Z=c-1;0<=Z?f<=Z:f>=Z;z=0<=Z?++f:--f)w[z]=0;for(y=g=0,$=H-1;0<=$?g<=$:g>=$;y=0<=$?++g:--g){for(ha=ia[y],G=Number.MAX_VALUE,z=h=0,aa=c-1;0<=aa?h<=aa:h>=aa;z=0<=aa?++h:--h)(x=l(u[z]-ha))=ba;z=0<=ba?++i:--i)J[z]=null;for(y=j=0,ca=H-1;0<=ca?j<=ca:j>=ca;y=0<=ca?++j:--j)v=r[y],null===J[v]?J[v]=ia[y]:J[v]+=ia[y];for(z=k=0,da=c-1;0<=da?k<=da:k>=da;z=0<=da?++k:--k)J[z]*=1/w[z];for(ea=!1,z=m=0,Q=c-1;0<=Q?m<=Q:m>=Q;z=0<=Q?++m:--m)if(J[z]!==u[y]){ea=!0;break}u=J,I++,I>200&&(ea=!1)}for(B={},z=n=0,R=c-1;0<=R?n<=R:n>=R;z=0<=R?++n:--n)B[z]=[];for(y=o=0,S=H-1;0<=S?o<=S:o>=S;y=0<=S?++o:--o)v=r[y],B[v].push(ia[y]);for(fa=[],z=p=0,U=c-1;0<=U?p<=U:p>=U;z=0<=U?++p:--p)fa.push(B[z][0]),fa.push(B[z][B[z].length-1]);for(fa=fa.sort(function(a,b){return a-b}),C.push(fa[0]),y=q=1,V=fa.length-1;q<=V;y=q+=2)ga=fa[y],isNaN(ga)||C.indexOf(ga)!==-1||C.push(ga)}return C},D=function(a,b,c){var d,f,h,i;return d=wa(arguments),a=d[0],b=d[1],c=d[2],isNaN(a)&&(a=0),a/=360,a<1/3?(f=(1-b)/3,i=(1+b*v(g*a)/v(e-g*a))/3,h=1-(f+i)):a<2/3?(a-=1/3,i=(1-b)/3,h=(1+b*v(g*a)/v(e-g*a))/3,f=1-(i+h)):(a-=2/3,h=(1-b)/3,f=(1+b*v(g*a)/v(e-g*a))/3,i=1-(h+f)),i=S(c*i*3),h=S(c*h*3),f=S(c*f*3),[255*i,255*h,255*f,d.length>3?d[3]:1]},ea=function(){var a,b,c,d,e,f,h,i;return h=wa(arguments),f=h[0],b=h[1],a=h[2],g=2*Math.PI,f/=255,b/=255,a/=255,e=Math.min(f,b,a),d=(f+b+a)/3,i=1-e/d,0===i?c=0:(c=(f-b+(f-a))/2,c/=Math.sqrt((f-b)*(f-b)+(f-a)*(b-a)),c=Math.acos(c),a>b&&(c=g-c),c/=g),[360*c,i,d]},s.hsi=function(){return function(a,b,c){c.prototype=a.prototype;var d=new c,e=a.apply(d,b);return Object(e)===e?e:d}(a,Aa.call(arguments).concat(["hsi"]),function(){})},j.hsi=D,a.prototype.hsi=function(){return ea(this._rgb)},I=function(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;return"hsl"===d?(o=a.hsl(),p=b.hsl()):"hsv"===d?(o=a.hsv(),p=b.hsv()):"hcg"===d?(o=a.hcg(),p=b.hcg()):"hsi"===d?(o=a.hsi(),p=b.hsi()):"lch"!==d&&"hcl"!==d||(d="hcl",o=a.hcl(),p=b.hcl()),"h"===d.substr(0,1)&&(g=o[0],m=o[1],j=o[2],h=p[0],n=p[1],k=p[2]),isNaN(g)||isNaN(h)?isNaN(g)?isNaN(h)?f=Number.NaN:(f=h,1!==j&&0!==j||"hsv"===d||(l=n)):(f=g,1!==k&&0!==k||"hsv"===d||(l=m)):(e=h>g&&h-g>180?h-(g+360):h180?h+360-g:h-g,f=g+c*e),null==l&&(l=m+c*(n-m)),i=j+c*(k-j),s[d](f,l,i)},k=k.concat(function(){var a,b,c,d;for(c=["hsv","hsl","hsi","hcl","lch","hcg"],d=[],b=0,a=c.length;b + +CodeMirror: JavaScript mode + + + + + + + + + + + + +
+

JavaScript mode

+ + +
+ + + +

+ JavaScript mode supports several configuration options: +

    +
  • json which will set the mode to expect JSON + data rather than a JavaScript program.
  • +
  • jsonld which will set the mode to expect + JSON-LD linked data rather + than a JavaScript program (demo).
  • +
  • typescript which will activate additional + syntax highlighting and some other things for TypeScript code + (demo).
  • +
  • statementIndent which (given a number) will + determine the amount of indentation to use for statements + continued on a new line.
  • +
  • wordCharacters, a regexp that indicates which + characters should be considered part of an identifier. + Defaults to /[\w$]/, which does not handle + non-ASCII identifiers. Can be set to something more elaborate + to improve Unicode support.
  • +
+

+ +

MIME types defined: text/javascript, application/json, application/ld+json, text/typescript, application/typescript.

+
diff --git a/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/javascript.js b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/javascript.js new file mode 100644 index 0000000..c86f49e --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/javascript.js @@ -0,0 +1,704 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// TODO actually recognize syntax of TypeScript constructs + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + var jsKeywords = { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C, + "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C + }; + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = {type: "variable", style: "variable-3"}; + var tsKeywords = { + // object-like things + "interface": kw("interface"), + "extends": kw("extends"), + "constructor": kw("constructor"), + + // scope modifiers + "public": kw("public"), + "private": kw("private"), + "protected": kw("protected"), + "static": kw("static"), + + // types + "string": type, "number": type, "bool": type, "any": type + }; + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr]; + } + } + + return jsKeywords; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (state.lastType == "operator" || state.lastType == "keyword c" || + state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) { + readRegexp(stream); + stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return ret("error", "error"); + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.lastType != ".") ? ret(known.type, known.style, word) : + ret("variable", "variable", word); + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) break; + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/]/.test(ch)) { + return; + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) + if (v.name == varname) return true; + return false; + } + var state = cx.state; + if (state.context) { + cx.marked = "def"; + if (inList(state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else { + if (inList(state.globalVars)) return; + if (parserConfig.globalVars) + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: {name: "arguments"}}; + function pushcontext() { + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + cx.state.localVars = defaultVars; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), block, poplex); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), expression, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex); + if (type == "class") return cont(pushlex("form"), className, poplex); + if (type == "export") return cont(pushlex("form"), afterExport, poplex); + if (type == "import") return cont(pushlex("form"), afterImport, poplex); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + return expressionInner(type, false); + } + function expressionNoComma(type) { + return expressionInner(type, true); + } + function expressionInner(type, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") { return pass(quasi, maybeop); } + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeexpressionNoComma(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expressionNoComma); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(expression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value)) return cont(me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(expression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (type == "[") { + return cont(expression, expect("]"), afterprop); + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(what, proceed); + } + if (type == end) return cont(); + return cont(expect(end)); + } + return function(type) { + if (type == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type) { + if (isTS && type == ":") return cont(typedef); + } + function maybedefault(_, value) { + if (value == "=") return cont(expressionNoComma); + } + function typedef(type) { + if (type == "variable") {cx.marked = "variable-3"; return cont();} + } + function vardef() { + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (type == "variable") { register(value); return cont(); } + if (type == "[") return contCommasep(pattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + return cont(expect(":"), pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type) { + if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, expect(";"), forspec2); + if (type == ";") return cont(forspec2); + if (type == "variable") return cont(formaybeinof); + return pass(expression, expect(";"), forspec2); + } + function formaybeinof(_type, value) { + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return cont(maybeoperatorComma, forspec2); + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3); + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return pass(expression, expect(";"), forspec3); + } + function forspec3(type) { + if (type != ")") cont(expression); + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext); + } + function funarg(type) { + if (type == "spread") return cont(funarg); + return pass(pattern, maybetype, maybedefault); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "extends") return cont(expression, classNameAfter); + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "variable" || cx.style == "keyword") { + if (value == "static") { + cx.marked = "keyword"; + return cont(classBody); + } + cx.marked = "property"; + if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody); + return cont(functiondef, classBody); + } + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == ";") return cont(classBody); + if (type == "}") return cont(); + } + function classGetterSetter(type) { + if (type != "variable") return pass(); + cx.marked = "property"; + return cont(); + } + function afterModule(type, value) { + if (type == "string") return cont(statement); + if (type == "variable") { register(value); return cont(maybeFrom); } + } + function afterExport(_type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + return pass(statement); + } + function afterImport(type) { + if (type == "string") return cont(); + return pass(importSpec, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(expressionNoComma, maybeArrayComprehension); + } + function maybeArrayComprehension(type) { + if (type == "for") return pass(comprehension, expect("]")); + if (type == ",") return cont(commasep(maybeexpressionNoComma, "]")); + return pass(commasep(expressionNoComma, "]")); + } + function comprehension(type) { + if (type == "for") return cont(forspec, comprehension); + if (type == "if") return cont(expression, comprehension); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse) break; + } + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode + }; +}); + +CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/x-javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + +}); diff --git a/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/json-ld.html b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/json-ld.html new file mode 100644 index 0000000..3a37f0b --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/json-ld.html @@ -0,0 +1,72 @@ + + +CodeMirror: JSON-LD mode + + + + + + + + + + + + +
+

JSON-LD mode

+ + +
+ + + +

This is a specialization of the JavaScript mode.

+
diff --git a/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/test.js b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/test.js new file mode 100644 index 0000000..092d25d --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/test.js @@ -0,0 +1,205 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "javascript"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("locals", + "[keyword function] [variable foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }"); + + MT("comma-and-binop", + "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }"); + + MT("destructuring", + "([keyword function]([def a], [[[def b], [def c] ]]) {", + " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", + " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", + "})();"); + + MT("class_body", + "[keyword class] [variable Foo] {", + " [property constructor]() {}", + " [property sayName]() {", + " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", + " }", + "}"); + + MT("class", + "[keyword class] [variable Point] [keyword extends] [variable SuperThing] {", + " [property get] [property prop]() { [keyword return] [number 24]; }", + " [property constructor]([def x], [def y]) {", + " [keyword super]([string 'something']);", + " [keyword this].[property x] [operator =] [variable-2 x];", + " }", + "}"); + + MT("module", + "[keyword module] [string 'foo'] {", + " [keyword export] [keyword let] [def x] [operator =] [number 42];", + " [keyword export] [keyword *] [keyword from] [string 'somewhere'];", + "}"); + + MT("import", + "[keyword function] [variable foo]() {", + " [keyword import] [def $] [keyword from] [string 'jquery'];", + " [keyword module] [def crypto] [keyword from] [string 'crypto'];", + " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", + "}"); + + MT("const", + "[keyword function] [variable f]() {", + " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", + "}"); + + MT("for/of", + "[keyword for]([keyword let] [variable of] [keyword of] [variable something]) {}"); + + MT("generator", + "[keyword function*] [variable repeat]([def n]) {", + " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", + " [keyword yield] [variable-2 i];", + "}"); + + MT("quotedStringAddition", + "[keyword let] [variable f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];"); + + MT("quotedFatArrow", + "[keyword let] [variable f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];"); + + MT("fatArrow", + "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", + "[variable a];", // No longer in scope + "[keyword let] [variable f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", + "[variable c];"); + + MT("spread", + "[keyword function] [variable f]([def a], [meta ...][def b]) {", + " [variable something]([variable-2 a], [meta ...][variable-2 b]);", + "}"); + + MT("comprehension", + "[keyword function] [variable f]() {", + " [[([variable x] [operator +] [number 1]) [keyword for] ([keyword var] [def x] [keyword in] [variable y]) [keyword if] [variable pred]([variable-2 x]) ]];", + " ([variable u] [keyword for] ([keyword var] [def u] [keyword of] [variable generateValues]()) [keyword if] ([variable-2 u].[property color] [operator ===] [string 'blue']));", + "}"); + + MT("quasi", + "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); + + MT("quasi_no_function", + "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); + + MT("indent_statement", + "[keyword var] [variable x] [operator =] [number 10]", + "[variable x] [operator +=] [variable y] [operator +]", + " [atom Infinity]", + "[keyword debugger];"); + + MT("indent_if", + "[keyword if] ([number 1])", + " [keyword break];", + "[keyword else] [keyword if] ([number 2])", + " [keyword continue];", + "[keyword else]", + " [number 10];", + "[keyword if] ([number 1]) {", + " [keyword break];", + "} [keyword else] [keyword if] ([number 2]) {", + " [keyword continue];", + "} [keyword else] {", + " [number 10];", + "}"); + + MT("indent_for", + "[keyword for] ([keyword var] [variable i] [operator =] [number 0];", + " [variable i] [operator <] [number 100];", + " [variable i][operator ++])", + " [variable doSomething]([variable i]);", + "[keyword debugger];"); + + MT("indent_c_style", + "[keyword function] [variable foo]()", + "{", + " [keyword debugger];", + "}"); + + MT("indent_else", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [keyword if] ([variable bar])", + " [number 1];", + " [keyword else]", + " [number 2];", + " [keyword else]", + " [number 3];"); + + MT("indent_funarg", + "[variable foo]([number 10000],", + " [keyword function]([def a]) {", + " [keyword debugger];", + "};"); + + MT("indent_below_if", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [number 1];", + "[number 2];"); + + MT("multilinestring", + "[keyword var] [variable x] [operator =] [string 'foo\\]", + "[string bar'];"); + + MT("scary_regexp", + "[string-2 /foo[[/]]bar/];"); + + MT("indent_strange_array", + "[keyword var] [variable x] [operator =] [[", + " [number 1],,", + " [number 2],", + "]];", + "[number 10];"); + + MT("param_default", + "[keyword function] [variable foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", + " [keyword return] [variable-2 x];", + "}"); + + var jsonld_mode = CodeMirror.getMode( + {indentUnit: 2}, + {name: "javascript", jsonld: true} + ); + function LD(name) { + test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)); + } + + LD("json_ld_keywords", + '{', + ' [meta "@context"]: {', + ' [meta "@base"]: [string "http://example.com"],', + ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', + ' [property "likesFlavor"]: {', + ' [meta "@container"]: [meta "@list"]', + ' [meta "@reverse"]: [string "@beFavoriteOf"]', + ' },', + ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', + ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', + ' },', + ' [meta "@graph"]: [[ {', + ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', + ' [property "name"]: [string "John Lennon"],', + ' [property "modified"]: {', + ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', + ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', + ' }', + ' } ]]', + '}'); + + LD("json_ld_fake", + '{', + ' [property "@fake"]: [string "@fake"],', + ' [property "@contextual"]: [string "@identifier"],', + ' [property "user@domain.com"]: [string "@graphical"],', + ' [property "@ID"]: [string "@@ID"]', + '}'); +})(); diff --git a/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/typescript.html b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/typescript.html new file mode 100644 index 0000000..2cfc538 --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/codemirror/mode/javascript/typescript.html @@ -0,0 +1,61 @@ + + +CodeMirror: TypeScript mode + + + + + + + + + +
+

TypeScript mode

+ + +
+ + + +

This is a specialization of the JavaScript mode.

+
diff --git a/src/static/node_modules/chroma-js/docs/libs/jquery/jquery-1.11.1.min.js b/src/static/node_modules/chroma-js/docs/libs/jquery/jquery-1.11.1.min.js new file mode 100644 index 0000000..ab28a24 --- /dev/null +++ b/src/static/node_modules/chroma-js/docs/libs/jquery/jquery-1.11.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),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("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("