diff --git a/compassql.js b/compassql.js new file mode 100644 index 00000000..a140a0bc --- /dev/null +++ b/compassql.js @@ -0,0 +1,7583 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.cql = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0)) return range; // also handles Invalid Date + offseti(start, 1), floori(start); + if (start < stop) range.push(new Date(+start)); + while (offseti(start, step), floori(start), start < stop) range.push(new Date(+start)); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + while (--step >= 0) while (offseti(date, 1), !test(date)); + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; + }; + + var millisecond = newInterval(function() { + // noop + }, function(date, step) { + date.setTime(+date + step); + }, function(start, end) { + return end - start; + }); + + // An optimized implementation for this simple case. + millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); + }; + + var second = newInterval(function(date) { + date.setMilliseconds(0); + }, function(date, step) { + date.setTime(+date + step * 1e3); + }, function(start, end) { + return (end - start) / 1e3; + }, function(date) { + return date.getSeconds(); + }); + + var minute = newInterval(function(date) { + date.setSeconds(0, 0); + }, function(date, step) { + date.setTime(+date + step * 6e4); + }, function(start, end) { + return (end - start) / 6e4; + }, function(date) { + return date.getMinutes(); + }); + + var hour = newInterval(function(date) { + date.setMinutes(0, 0, 0); + }, function(date, step) { + date.setTime(+date + step * 36e5); + }, function(start, end) { + return (end - start) / 36e5; + }, function(date) { + return date.getHours(); + }); + + var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 864e5; + }, function(date) { + return date.getDate() - 1; + }); + + function weekday(i) { + return newInterval(function(date) { + date.setHours(0, 0, 0, 0); + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 6048e5; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var month = newInterval(function(date) { + date.setHours(0, 0, 0, 0); + date.setDate(1); + }, function(date, step) { + date.setMonth(date.getMonth() + step); + }, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function(date) { + return date.getMonth(); + }); + + var year = newInterval(function(date) { + date.setHours(0, 0, 0, 0); + date.setMonth(0, 1); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step); + }, function(start, end) { + return end.getFullYear() - start.getFullYear(); + }, function(date) { + return date.getFullYear(); + }); + + var utcSecond = newInterval(function(date) { + date.setUTCMilliseconds(0); + }, function(date, step) { + date.setTime(+date + step * 1e3); + }, function(start, end) { + return (end - start) / 1e3; + }, function(date) { + return date.getUTCSeconds(); + }); + + var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); + }, function(date, step) { + date.setTime(+date + step * 6e4); + }, function(start, end) { + return (end - start) / 6e4; + }, function(date) { + return date.getUTCMinutes(); + }); + + var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); + }, function(date, step) { + date.setTime(+date + step * 36e5); + }, function(start, end) { + return (end - start) / 36e5; + }, function(date) { + return date.getUTCHours(); + }); + + var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function(start, end) { + return (end - start) / 864e5; + }, function(date) { + return date.getUTCDate() - 1; + }); + + function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / 6048e5; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcMonth = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); + date.setUTCDate(1); + }, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function(date) { + return date.getUTCMonth(); + }); + + var utcYear = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); + date.setUTCMonth(0, 1); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function(date) { + return date.getUTCFullYear(); + }); + + var milliseconds = millisecond.range; + var seconds = second.range; + var minutes = minute.range; + var hours = hour.range; + var days = day.range; + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + var weeks = sunday.range; + var months = month.range; + var years = year.range; + + var utcMillisecond = millisecond; + var utcMilliseconds = milliseconds; + var utcSeconds = utcSecond.range; + var utcMinutes = utcMinute.range; + var utcHours = utcHour.range; + var utcDays = utcDay.range; + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + var utcWeeks = utcSunday.range; + var utcMonths = utcMonth.range; + var utcYears = utcYear.range; + + var version = "0.1.1"; + + exports.version = version; + exports.milliseconds = milliseconds; + exports.seconds = seconds; + exports.minutes = minutes; + exports.hours = hours; + exports.days = days; + exports.sundays = sundays; + exports.mondays = mondays; + exports.tuesdays = tuesdays; + exports.wednesdays = wednesdays; + exports.thursdays = thursdays; + exports.fridays = fridays; + exports.saturdays = saturdays; + exports.weeks = weeks; + exports.months = months; + exports.years = years; + exports.utcMillisecond = utcMillisecond; + exports.utcMilliseconds = utcMilliseconds; + exports.utcSeconds = utcSeconds; + exports.utcMinutes = utcMinutes; + exports.utcHours = utcHours; + exports.utcDays = utcDays; + exports.utcSundays = utcSundays; + exports.utcMondays = utcMondays; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesdays = utcWednesdays; + exports.utcThursdays = utcThursdays; + exports.utcFridays = utcFridays; + exports.utcSaturdays = utcSaturdays; + exports.utcWeeks = utcWeeks; + exports.utcMonths = utcMonths; + exports.utcYears = utcYears; + exports.millisecond = millisecond; + exports.second = second; + exports.minute = minute; + exports.hour = hour; + exports.day = day; + exports.sunday = sunday; + exports.monday = monday; + exports.tuesday = tuesday; + exports.wednesday = wednesday; + exports.thursday = thursday; + exports.friday = friday; + exports.saturday = saturday; + exports.week = sunday; + exports.month = month; + exports.year = year; + exports.utcSecond = utcSecond; + exports.utcMinute = utcMinute; + exports.utcHour = utcHour; + exports.utcDay = utcDay; + exports.utcSunday = utcSunday; + exports.utcMonday = utcMonday; + exports.utcTuesday = utcTuesday; + exports.utcWednesday = utcWednesday; + exports.utcThursday = utcThursday; + exports.utcFriday = utcFriday; + exports.utcSaturday = utcSaturday; + exports.utcWeek = utcSunday; + exports.utcMonth = utcMonth; + exports.utcYear = utcYear; + exports.interval = newInterval; + +})); +},{}],3:[function(require,module,exports){ +var util = require('../util'), + time = require('../time'), + EPSILON = 1e-15; + +function bins(opt) { + if (!opt) { throw Error("Missing binning options."); } + + // determine range + var maxb = opt.maxbins || 15, + base = opt.base || 10, + logb = Math.log(base), + div = opt.div || [5, 2], + min = opt.min, + max = opt.max, + span = max - min, + step, level, minstep, precision, v, i, eps; + + if (opt.step) { + // if step size is explicitly given, use that + step = opt.step; + } else if (opt.steps) { + // if provided, limit choice to acceptable step sizes + step = opt.steps[Math.min( + opt.steps.length - 1, + bisect(opt.steps, span/maxb, 0, opt.steps.length) + )]; + } else { + // else use span to determine step size + level = Math.ceil(Math.log(maxb) / logb); + minstep = opt.minstep || 0; + step = Math.max( + minstep, + Math.pow(base, Math.round(Math.log(span) / logb) - level) + ); + + // increase step size if too many bins + while (Math.ceil(span/step) > maxb) { step *= base; } + + // decrease step size if allowed + for (i=0; i= minstep && span / v <= maxb) step = v; + } + } + + // update precision, min and max + v = Math.log(step); + precision = v >= 0 ? 0 : ~~(-v / logb) + 1; + eps = Math.pow(base, -precision - 1); + min = Math.min(min, Math.floor(min / step + eps) * step); + max = Math.ceil(max / step) * step; + + return { + start: min, + stop: max, + step: step, + unit: {precision: precision}, + value: value, + index: index + }; +} + +function bisect(a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (util.cmp(a[mid], x) < 0) { lo = mid + 1; } + else { hi = mid; } + } + return lo; +} + +function value(v) { + return this.step * Math.floor(v / this.step + EPSILON); +} + +function index(v) { + return Math.floor((v - this.start) / this.step + EPSILON); +} + +function date_value(v) { + return this.unit.date(value.call(this, v)); +} + +function date_index(v) { + return index.call(this, this.unit.unit(v)); +} + +bins.date = function(opt) { + if (!opt) { throw Error("Missing date binning options."); } + + // find time step, then bin + var units = opt.utc ? time.utc : time, + dmin = opt.min, + dmax = opt.max, + maxb = opt.maxbins || 20, + minb = opt.minbins || 4, + span = (+dmax) - (+dmin), + unit = opt.unit ? units[opt.unit] : units.find(span, minb, maxb), + spec = bins({ + min: unit.min != null ? unit.min : unit.unit(dmin), + max: unit.max != null ? unit.max : unit.unit(dmax), + maxbins: maxb, + minstep: unit.minstep, + steps: unit.step + }); + + spec.unit = unit; + spec.index = date_index; + if (!opt.raw) spec.value = date_value; + return spec; +}; + +module.exports = bins; + +},{"../time":7,"../util":8}],4:[function(require,module,exports){ +var util = require('./util'), + gen = module.exports; + +gen.repeat = function(val, n) { + var a = Array(n), i; + for (i=0; i stop) range.push(j); + else while ((j = start + step * ++i) < stop) range.push(j); + return range; +}; + +gen.random = {}; + +gen.random.uniform = function(min, max) { + if (max === undefined) { + max = min === undefined ? 1 : min; + min = 0; + } + var d = max - min; + var f = function() { + return min + d * Math.random(); + }; + f.samples = function(n) { + return gen.zeros(n).map(f); + }; + f.pdf = function(x) { + return (x >= min && x <= max) ? 1/d : 0; + }; + f.cdf = function(x) { + return x < min ? 0 : x > max ? 1 : (x - min) / d; + }; + f.icdf = function(p) { + return (p >= 0 && p <= 1) ? min + p*d : NaN; + }; + return f; +}; + +gen.random.integer = function(a, b) { + if (b === undefined) { + b = a; + a = 0; + } + var d = b - a; + var f = function() { + return a + Math.floor(d * Math.random()); + }; + f.samples = function(n) { + return gen.zeros(n).map(f); + }; + f.pdf = function(x) { + return (x === Math.floor(x) && x >= a && x < b) ? 1/d : 0; + }; + f.cdf = function(x) { + var v = Math.floor(x); + return v < a ? 0 : v >= b ? 1 : (v - a + 1) / d; + }; + f.icdf = function(p) { + return (p >= 0 && p <= 1) ? a - 1 + Math.floor(p*d) : NaN; + }; + return f; +}; + +gen.random.normal = function(mean, stdev) { + mean = mean || 0; + stdev = stdev || 1; + var next; + var f = function() { + var x = 0, y = 0, rds, c; + if (next !== undefined) { + x = next; + next = undefined; + return x; + } + do { + x = Math.random()*2-1; + y = Math.random()*2-1; + rds = x*x + y*y; + } while (rds === 0 || rds > 1); + c = Math.sqrt(-2*Math.log(rds)/rds); // Box-Muller transform + next = mean + y*c*stdev; + return mean + x*c*stdev; + }; + f.samples = function(n) { + return gen.zeros(n).map(f); + }; + f.pdf = function(x) { + var exp = Math.exp(Math.pow(x-mean, 2) / (-2 * Math.pow(stdev, 2))); + return (1 / (stdev * Math.sqrt(2*Math.PI))) * exp; + }; + f.cdf = function(x) { + // Approximation from West (2009) + // Better Approximations to Cumulative Normal Functions + var cd, + z = (x - mean) / stdev, + Z = Math.abs(z); + if (Z > 37) { + cd = 0; + } else { + var sum, exp = Math.exp(-Z*Z/2); + if (Z < 7.07106781186547) { + sum = 3.52624965998911e-02 * Z + 0.700383064443688; + sum = sum * Z + 6.37396220353165; + sum = sum * Z + 33.912866078383; + sum = sum * Z + 112.079291497871; + sum = sum * Z + 221.213596169931; + sum = sum * Z + 220.206867912376; + cd = exp * sum; + sum = 8.83883476483184e-02 * Z + 1.75566716318264; + sum = sum * Z + 16.064177579207; + sum = sum * Z + 86.7807322029461; + sum = sum * Z + 296.564248779674; + sum = sum * Z + 637.333633378831; + sum = sum * Z + 793.826512519948; + sum = sum * Z + 440.413735824752; + cd = cd / sum; + } else { + sum = Z + 0.65; + sum = Z + 4 / sum; + sum = Z + 3 / sum; + sum = Z + 2 / sum; + sum = Z + 1 / sum; + cd = exp / sum / 2.506628274631; + } + } + return z > 0 ? 1 - cd : cd; + }; + f.icdf = function(p) { + // Approximation of Probit function using inverse error function. + if (p <= 0 || p >= 1) return NaN; + var x = 2*p - 1, + v = (8 * (Math.PI - 3)) / (3 * Math.PI * (4-Math.PI)), + a = (2 / (Math.PI*v)) + (Math.log(1 - Math.pow(x,2)) / 2), + b = Math.log(1 - (x*x)) / v, + s = (x > 0 ? 1 : -1) * Math.sqrt(Math.sqrt((a*a) - b) - a); + return mean + stdev * Math.SQRT2 * s; + }; + return f; +}; + +gen.random.bootstrap = function(domain, smooth) { + // Generates a bootstrap sample from a set of observations. + // Smooth bootstrapping adds random zero-centered noise to the samples. + var val = domain.filter(util.isValid), + len = val.length, + err = smooth ? gen.random.normal(0, smooth) : null; + var f = function() { + return val[~~(Math.random()*len)] + (err ? err() : 0); + }; + f.samples = function(n) { + return gen.zeros(n).map(f); + }; + return f; +}; +},{"./util":8}],5:[function(require,module,exports){ +var util = require('../util'); + +var TYPES = '__types__'; + +var PARSERS = { + boolean: util.boolean, + integer: util.number, + number: util.number, + date: util.date, + string: function(x) { return x==='' ? null : x; } +}; + +var TESTS = { + boolean: function(x) { return x==='true' || x==='false' || util.isBoolean(x); }, + integer: function(x) { return TESTS.number(x) && (x=+x) === ~~x; }, + number: function(x) { return !isNaN(+x) && !util.isDate(x); }, + date: function(x) { return !isNaN(Date.parse(x)); } +}; + +function annotation(data, types) { + if (!types) return data && data[TYPES] || null; + data[TYPES] = types; +} + +function type(values, f) { + values = util.array(values); + f = util.$(f); + var v, i, n; + + // if data array has type annotations, use them + if (values[TYPES]) { + v = f(values[TYPES]); + if (util.isString(v)) return v; + } + + for (i=0, n=values.length; !util.isValid(v) && i 0 ? Math.pow(mean, 1/c) : 0; + return mean; +}; + +// Compute the harmonic mean of an array of numbers. +stats.mean.harmonic = function(values, f) { + f = util.$(f); + var mean = 0, c, n, v, i; + for (i=0, c=0, n=values.length; i b) b = v; + } + } + return [a, b]; +}; + +// Find the integer indices of the minimum and maximum values. +stats.extent.index = function(values, f) { + f = util.$(f); + var x = -1, y = -1, a, b, v, i, n = values.length; + for (i=0; i b) { b = v; y = i; } + } + } + return [x, y]; +}; + +// Compute the dot product of two arrays of numbers. +stats.dot = function(values, a, b) { + var sum = 0, i, v; + if (!b) { + if (values.length !== a.length) { + throw Error('Array lengths must match.'); + } + for (i=0; i -1 && p !== v) { + mu = 1 + (i-1 + tie) / 2; + for (; tie -1) { + mu = 1 + (n-1 + tie) / 2; + for (; tie max) max = x; + delta = x - mean; + mean = mean + delta / (++valid); + M2 = M2 + delta * (x - mean); + vals.push(x); + } + } + M2 = M2 / (valid - 1); + sd = Math.sqrt(M2); + + // sort values for median and iqr + vals.sort(util.cmp); + + return { + type: type(values, f), + unique: u, + count: values.length, + valid: valid, + missing: missing, + distinct: distinct, + min: min, + max: max, + mean: mean, + stdev: sd, + median: (v = stats.quantile(vals, 0.5)), + q1: stats.quantile(vals, 0.25), + q3: stats.quantile(vals, 0.75), + modeskew: sd === 0 ? 0 : (mean - v) / sd + }; +}; + +// Compute profiles for all variables in a data set. +stats.summary = function(data, fields) { + fields = fields || util.keys(data[0]); + var s = fields.map(function(f) { + var p = stats.profile(data, util.$(f)); + return (p.field = f, p); + }); + return (s.__summary__ = true, s); +}; + +},{"./generate":4,"./import/type":5,"./util":8}],7:[function(require,module,exports){ +var d3_time = require('d3-time'); + +var tempDate = new Date(), + baseDate = new Date(0, 0, 1).setFullYear(0), // Jan 1, 0 AD + utcBaseDate = new Date(Date.UTC(0, 0, 1)).setUTCFullYear(0); + +function date(d) { + return (tempDate.setTime(+d), tempDate); +} + +// create a time unit entry +function entry(type, date, unit, step, min, max) { + var e = { + type: type, + date: date, + unit: unit + }; + if (step) { + e.step = step; + } else { + e.minstep = 1; + } + if (min != null) e.min = min; + if (max != null) e.max = max; + return e; +} + +function create(type, unit, base, step, min, max) { + return entry(type, + function(d) { return unit.offset(base, d); }, + function(d) { return unit.count(base, d); }, + step, min, max); +} + +var locale = [ + create('second', d3_time.second, baseDate), + create('minute', d3_time.minute, baseDate), + create('hour', d3_time.hour, baseDate), + create('day', d3_time.day, baseDate, [1, 7]), + create('month', d3_time.month, baseDate, [1, 3, 6]), + create('year', d3_time.year, baseDate), + + // periodic units + entry('seconds', + function(d) { return new Date(1970, 0, 1, 0, 0, d); }, + function(d) { return date(d).getSeconds(); }, + null, 0, 59 + ), + entry('minutes', + function(d) { return new Date(1970, 0, 1, 0, d); }, + function(d) { return date(d).getMinutes(); }, + null, 0, 59 + ), + entry('hours', + function(d) { return new Date(1970, 0, 1, d); }, + function(d) { return date(d).getHours(); }, + null, 0, 23 + ), + entry('weekdays', + function(d) { return new Date(1970, 0, 4+d); }, + function(d) { return date(d).getDay(); }, + [1], 0, 6 + ), + entry('dates', + function(d) { return new Date(1970, 0, d); }, + function(d) { return date(d).getDate(); }, + [1], 1, 31 + ), + entry('months', + function(d) { return new Date(1970, d % 12, 1); }, + function(d) { return date(d).getMonth(); }, + [1], 0, 11 + ) +]; + +var utc = [ + create('second', d3_time.utcSecond, utcBaseDate), + create('minute', d3_time.utcMinute, utcBaseDate), + create('hour', d3_time.utcHour, utcBaseDate), + create('day', d3_time.utcDay, utcBaseDate, [1, 7]), + create('month', d3_time.utcMonth, utcBaseDate, [1, 3, 6]), + create('year', d3_time.utcYear, utcBaseDate), + + // periodic units + entry('seconds', + function(d) { return new Date(Date.UTC(1970, 0, 1, 0, 0, d)); }, + function(d) { return date(d).getUTCSeconds(); }, + null, 0, 59 + ), + entry('minutes', + function(d) { return new Date(Date.UTC(1970, 0, 1, 0, d)); }, + function(d) { return date(d).getUTCMinutes(); }, + null, 0, 59 + ), + entry('hours', + function(d) { return new Date(Date.UTC(1970, 0, 1, d)); }, + function(d) { return date(d).getUTCHours(); }, + null, 0, 23 + ), + entry('weekdays', + function(d) { return new Date(Date.UTC(1970, 0, 4+d)); }, + function(d) { return date(d).getUTCDay(); }, + [1], 0, 6 + ), + entry('dates', + function(d) { return new Date(Date.UTC(1970, 0, d)); }, + function(d) { return date(d).getUTCDate(); }, + [1], 1, 31 + ), + entry('months', + function(d) { return new Date(Date.UTC(1970, d % 12, 1)); }, + function(d) { return date(d).getUTCMonth(); }, + [1], 0, 11 + ) +]; + +var STEPS = [ + [31536e6, 5], // 1-year + [7776e6, 4], // 3-month + [2592e6, 4], // 1-month + [12096e5, 3], // 2-week + [6048e5, 3], // 1-week + [1728e5, 3], // 2-day + [864e5, 3], // 1-day + [432e5, 2], // 12-hour + [216e5, 2], // 6-hour + [108e5, 2], // 3-hour + [36e5, 2], // 1-hour + [18e5, 1], // 30-minute + [9e5, 1], // 15-minute + [3e5, 1], // 5-minute + [6e4, 1], // 1-minute + [3e4, 0], // 30-second + [15e3, 0], // 15-second + [5e3, 0], // 5-second + [1e3, 0] // 1-second +]; + +function find(units, span, minb, maxb) { + var step = STEPS[0], i, n, bins; + + for (i=1, n=STEPS.length; i step[0]) { + bins = span / step[0]; + if (bins > maxb) { + return units[STEPS[i-1][1]]; + } + if (bins >= minb) { + return units[step[1]]; + } + } + } + return units[STEPS[n-1][1]]; +} + +function toUnitMap(units) { + var map = {}, i, n; + for (i=0, n=units.length; i 1 ? + function(x, v) { + for (var i=0; i y) return sign[i]; + } + return 0; + }; +}; + +u.cmp = function(a, b) { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else if (a >= b) { + return 0; + } else if (a === null) { + return -1; + } else if (b === null) { + return 1; + } + return NaN; +}; + +u.numcmp = function(a, b) { return a - b; }; + +u.stablesort = function(array, sortBy, keyFn) { + var indices = array.reduce(function(idx, v, i) { + return (idx[keyFn(v)] = i, idx); + }, {}); + + array.sort(function(a, b) { + var sa = sortBy(a), + sb = sortBy(b); + return sa < sb ? -1 : sa > sb ? 1 + : (indices[keyFn(a)] - indices[keyFn(b)]); + }); + + return array; +}; + +// permutes an array using a Knuth shuffle +u.permute = function(a) { + var m = a.length, + swap, + i; + + while (m) { + i = Math.floor(Math.random() * m--); + swap = a[m]; + a[m] = a[i]; + a[i] = swap; + } +}; + +// string functions + +u.pad = function(s, length, pos, padchar) { + padchar = padchar || " "; + var d = length - s.length; + if (d <= 0) return s; + switch (pos) { + case 'left': + return strrep(d, padchar) + s; + case 'middle': + case 'center': + return strrep(Math.floor(d/2), padchar) + + s + strrep(Math.ceil(d/2), padchar); + default: + return s + strrep(d, padchar); + } +}; + +function strrep(n, str) { + var s = "", i; + for (i=0; i 1) { + return false; + } + } + } + } + return true; + } + }, + { + name: 'omitNonPositionalOverPositionalChannels', + description: 'Do not use non-positional channels unless all positional channels are used', + properties: [property_1.Property.CHANNEL], + allowEnumSpecForProperties: false, + strict: false, + satisfy: function (specM, schema, opt) { + return util_1.some(channel_1.NONSPATIAL_CHANNELS, function (channel) { return specM.channelUsed(channel); }) ? + // if non-positional channels are used, then both x and y must be used. + specM.channelUsed(channel_1.Channel.X) && specM.channelUsed(channel_1.Channel.Y) : + true; + } + }, + { + name: 'omitRaw', + description: 'Omit raw plots.', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowEnumSpecForProperties: false, + strict: false, + satisfy: function (specM, schema, opt) { + if (!specM.isAggregate()) { + return false; + } + return true; + } + }, + { + name: 'omitRawContinuousFieldForAggregatePlot', + description: 'Aggregate plot should not use raw continuous field as group by values. ' + + '(Quantitative should be binned. Temporal should have time unit.)', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.TYPE], + allowEnumSpecForProperties: true, + strict: false, + satisfy: function (specM, schema, opt) { + if (specM.isAggregate()) { + return util_1.every(specM.getEncodings(), function (encQ) { + if (encQ.type === type_1.Type.TEMPORAL) { + // Temporal fields should have timeUnit or is still an enumSpec + return !!encQ.timeUnit; + } + if (encQ.type === type_1.Type.QUANTITATIVE) { + return !!encQ.bin || !!encQ.aggregate || !!encQ.autoCount; + } + return true; + }); + } + return true; + } + }, + { + name: 'omitRawDetail', + description: 'Do not use detail channel with raw plot.', + properties: [property_1.Property.CHANNEL, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowEnumSpecForProperties: false, + strict: true, + satisfy: function (specM, schema, opt) { + if (specM.isAggregate()) { + return true; + } + return util_1.every(specM.getEncodings(), function (encQ) { + return encQ.channel !== channel_1.Channel.DETAIL; + }); + } + }, + { + name: 'omitRepeatedField', + description: 'Each field should be mapped to only one channel', + properties: [property_1.Property.FIELD], + allowEnumSpecForProperties: true, + strict: false, + satisfy: function (specM, schema, opt) { + var usedField = {}; + // the same field should not be encoded twice + return util_1.every(specM.getEncodings(), function (encQ) { + if (encQ.field && !enumspec_1.isEnumSpec(encQ.field)) { + // If field is specified, it should not be used already + if (usedField[encQ.field]) { + return false; + } + usedField[encQ.field] = true; + return true; + } + return true; // unspecified field is valid + }); + } + }, + // TODO: omitShapeWithBin + { + name: 'omitVerticalDotPlot', + description: 'Do not output vertical dot plot.', + properties: [property_1.Property.CHANNEL], + allowEnumSpecForProperties: true, + strict: false, + satisfy: function (specM, schema, opt) { + var encodings = specM.getEncodings(); + if (encodings.length === 1 && encodings[0].channel === channel_1.Channel.Y) { + return false; + } + return true; + } + }, + // EXPENSIVE CONSTRAINTS -- check them later! + { + name: 'hasAppropriateGraphicTypeForMark', + description: 'Has appropriate graphic type for mark', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowEnumSpecForProperties: false, + strict: false, + satisfy: function (specM, schema, opt) { + var mark = specM.getMark(); + switch (mark) { + case mark_1.Mark.AREA: + case mark_1.Mark.LINE: + if (specM.isAggregate()) { + var xEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.X); + var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y); + var xIsMeasure = xEncQ && encoding_2.isMeasure(xEncQ); + var yIsMeasure = yEncQ && encoding_2.isMeasure(yEncQ); + // for aggregate line / area, we need at least one group-by axis and one measure axis. + return xEncQ && yEncQ && (xIsMeasure !== yIsMeasure) && + // and the dimension axis should not be nominal + // TODO: make this clause optional + !(!xIsMeasure && xEncQ.type === type_1.Type.NOMINAL) && + !(!yIsMeasure && yEncQ.type === type_1.Type.NOMINAL); + } + return true; + case mark_1.Mark.TEXT: + // FIXME correctly when we add text + return true; + case mark_1.Mark.BAR: + case mark_1.Mark.TICK: + // Bar and tick should not use size. + if (specM.channelUsed(channel_1.Channel.SIZE)) { + return false; + } + // Tick and Bar should have one and only one measure + if (specM.isMeasure(channel_1.Channel.X) !== specM.isMeasure(channel_1.Channel.Y)) { + // TODO: Bar and tick's dimension should not be continuous (quant/time) scale + return true; + } + return false; + case mark_1.Mark.CIRCLE: + case mark_1.Mark.POINT: + case mark_1.Mark.SQUARE: + case mark_1.Mark.RULE: + return true; + } + /* istanbul ignore next */ + throw new Error('hasAllRequiredChannelsForMark not implemented for mark' + mark); + } + }, + { + name: 'omitNonSumStack', + description: 'Stacked plot should use summative aggregation such as sum, count, or distinct', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowEnumSpecForProperties: false, + strict: false, + satisfy: function (specM, schema, opt) { + var stack = specM.stack(); + if (stack) { + var measureEncQ = specM.getEncodingQueryByChannel(stack.fieldChannel); + return util_1.contains(aggregate_1.SUM_OPS, measureEncQ.aggregate) || !!measureEncQ.autoCount; + } + return true; + } + }, + { + name: 'omitTableWithOcclusionIfAutoAddCount', + description: 'Plots without aggregation or autocount where x and y are both dimensions should be omitted if autoAddCount is enabled as they often lead to occlusion', + properties: [property_1.Property.CHANNEL, property_1.Property.TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowEnumSpecForProperties: false, + strict: false, + satisfy: function (specM, schema, opt) { + if (opt.autoAddCount) { + // TODO(#186): take mark properties channel into account + if (specM.isDimension(channel_1.Channel.X) && + specM.isDimension(channel_1.Channel.Y) && + !specM.isAggregate() // TODO: refactor based on statistics + ) { + return false; + } + } + return true; + } + } +].map(function (sc) { return new SpecConstraintModel(sc); }); +// For testing +exports.SPEC_CONSTRAINT_INDEX = exports.SPEC_CONSTRAINTS.reduce(function (m, c) { + m[c.name()] = c; + return m; +}, {}); +// +exports.SPEC_CONSTRAINTS_BY_PROPERTY = exports.SPEC_CONSTRAINTS.reduce(function (m, c) { + c.properties().forEach(function (prop) { + m[prop] = m[prop] || []; + m[prop].push(c); + }); + return m; +}, {}); +/** + * Check all encoding constraints for a particular property and index tuple + */ +function checkSpec(prop, enumSpec, specM, schema, opt) { + // Check encoding constraint + var specConstraints = exports.SPEC_CONSTRAINTS_BY_PROPERTY[prop] || []; + for (var i = 0; i < specConstraints.length; i++) { + var c = specConstraints[i]; + // Check if the constraint is enabled + if (c.strict() || !!opt[c.name()]) { + // For strict constraint, or enabled non-strict, check the constraints + var satisfy = c.satisfy(specM, schema, opt); + if (!satisfy) { + var violatedConstraint = '(spec) ' + c.name(); + /* istanbul ignore if */ + if (opt.verbose) { + console.log(violatedConstraint + ' failed with ' + specM.toShorthand() + ' for ' + enumSpec.name); + } + return violatedConstraint; + } + } + } + return null; +} +exports.checkSpec = checkSpec; + +},{"../enumspec":16,"../property":22,"../query/encoding":23,"../util":37,"./base":10,"vega-lite/src/aggregate":47,"vega-lite/src/channel":49,"vega-lite/src/mark":52,"vega-lite/src/scale":53,"vega-lite/src/type":57}],14:[function(require,module,exports){ +"use strict"; +exports.version = '0.3.3'; +var util_1 = require('./util'); +exports.constraint = require('./constraint/constraint'); +exports.enumerate = require('./enumerator'); +exports.enumSpec = require('./enumspec'); +var generate_1 = require('./generate'); +exports.generate = generate_1.generate; +exports.model = require('./model'); +exports.modelGroup = require('./modelgroup'); +exports.nest = require('./nest'); +exports.property = require('./property'); +// Make it so that we can call cql.query() as method, or access other methods inside cql.query +var cqlQuery = require('./query/query'); +var query_1 = require('./query/query'); +exports.query = util_1.extend(query_1.query, cqlQuery); +exports.ranking = require('./ranking/ranking'); +exports.schema = require('./schema'); +exports.util = require('./util'); + +},{"./constraint/constraint":11,"./enumerator":15,"./enumspec":16,"./generate":18,"./model":19,"./modelgroup":20,"./nest":21,"./property":22,"./query/query":25,"./ranking/ranking":34,"./schema":35,"./util":37}],15:[function(require,module,exports){ +"use strict"; +var encoding_1 = require('./constraint/encoding'); +var spec_1 = require('./constraint/spec'); +var property_1 = require('./property'); +exports.ENUMERATOR_INDEX = {}; +exports.ENUMERATOR_INDEX[property_1.Property.MARK] = function (enumSpecIndex, schema, opt) { + return function (answerSet, specM) { + var markEnumSpec = specM.getMark(); + // enumerate the value + markEnumSpec.values.forEach(function (mark) { + specM.setMark(mark); + // Check spec constraint + var violatedSpecConstraint = spec_1.checkSpec(property_1.Property.MARK, enumSpecIndex.mark, specM, schema, opt); + if (!violatedSpecConstraint) { + // emit + answerSet.push(specM.duplicate()); + } + }); + // Reset to avoid side effect + specM.resetMark(); + return answerSet; + }; +}; +property_1.ENCODING_PROPERTIES.forEach(function (prop) { + exports.ENUMERATOR_INDEX[prop] = EncodingPropertyGeneratorFactory(prop); +}); +property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) { + exports.ENUMERATOR_INDEX[nestedProp.property] = EncodingPropertyGeneratorFactory(nestedProp.property); +}); +/** + * @param prop property type. + * @return an answer set reducer factory for the given prop. + */ +function EncodingPropertyGeneratorFactory(prop) { + /** + * @return as reducer that takes a specQueryModel as input and output an answer set array. + */ + return function (enumSpecIndex, schema, opt) { + return function (answerSet, specM) { + // index of encoding mappings that require enumeration + var indices = enumSpecIndex.encodingIndicesByProperty[prop]; + function enumerate(jobIndex) { + if (jobIndex === indices.length) { + // emit and terminate + answerSet.push(specM.duplicate()); + return; + } + var index = indices[jobIndex]; + var enumSpec = enumSpecIndex.encodings[index][prop]; + var encQ = specM.getEncodingQueryByIndex(index); + var propEnumSpec = specM.getEncodingProperty(index, prop); + if ( + // TODO: encQ.exclude + // If this encoding query is an excluded autoCount, there is no point enumerating other properties + // for this encoding query because they will be excluded anyway. + // Thus, we can just move on to the next encoding to enumerate. + encQ.autoCount === false || + // nested encoding property might have its parent set to false + // therefore, we no longer have to enumerate them + !propEnumSpec) { + enumerate(jobIndex + 1); + } + else { + enumSpec.values.forEach(function (propVal) { + if (propVal === null) { + // our duplicate() method use JSON.stringify, parse and thus can accidentally + // convert undefined in an array into null + propVal = undefined; + } + specM.setEncodingProperty(index, prop, propVal, enumSpec); + // Check encoding constraint + var violatedEncodingConstraint = encoding_1.checkEncoding(prop, enumSpec, index, specM, schema, opt); + if (violatedEncodingConstraint) { + return; // do not keep searching + } + // Check spec constraint + var violatedSpecConstraint = spec_1.checkSpec(prop, enumSpec, specM, schema, opt); + if (violatedSpecConstraint) { + return; // do not keep searching + } + // If qualify all of the constraints, keep enumerating + enumerate(jobIndex + 1); + }); + // Reset to avoid side effect + specM.resetEncodingProperty(index, prop, enumSpec); + } + } + // start enumerating from 0 + enumerate(0); + return answerSet; + }; + }; +} +exports.EncodingPropertyGeneratorFactory = EncodingPropertyGeneratorFactory; + +},{"./constraint/encoding":12,"./constraint/spec":13,"./property":22}],16:[function(require,module,exports){ +"use strict"; +var util_1 = require('./util'); +/** Enum for a short form of the enumeration spec. */ +(function (ShortEnumSpec) { + ShortEnumSpec[ShortEnumSpec["ENUMSPEC"] = '?'] = "ENUMSPEC"; +})(exports.ShortEnumSpec || (exports.ShortEnumSpec = {})); +var ShortEnumSpec = exports.ShortEnumSpec; +exports.SHORT_ENUM_SPEC = ShortEnumSpec.ENUMSPEC; +function isEnumSpec(prop) { + return prop === exports.SHORT_ENUM_SPEC || (prop !== undefined && (!!prop.values || !!prop.name) && !util_1.isArray(prop)); +} +exports.isEnumSpec = isEnumSpec; +function initEnumSpec(prop, defaultName, defaultEnumValues) { + return util_1.extend({}, { + name: defaultName, + values: defaultEnumValues + }, prop === exports.SHORT_ENUM_SPEC ? {} : prop); +} +exports.initEnumSpec = initEnumSpec; + +},{"./util":37}],17:[function(require,module,exports){ +"use strict"; +var property_1 = require('./property'); +var util_1 = require('./util'); +var EnumSpecIndex = (function () { + function EnumSpecIndex() { + this._mark = undefined; + this._encodings = {}; + this._encodingIndicesByProperty = {}; + } + EnumSpecIndex.prototype.setEncodingProperty = function (index, prop, enumSpec) { + var encodingsIndex = this._encodings; + // Init encoding index and set prop + var encIndex = encodingsIndex[index] = encodingsIndex[index] || {}; + encIndex[prop] = enumSpec; + // Initialize indicesByProperty[prop] and add index + var encodingIndicesByProperty = this._encodingIndicesByProperty; + (encodingIndicesByProperty[prop] = encodingIndicesByProperty[prop] || []).push(index); + return this; + }; + EnumSpecIndex.prototype.hasProperty = function (prop) { + if (property_1.isEncodingProperty(prop)) { + return !!this.encodingIndicesByProperty[prop]; + } + if (prop === property_1.Property.MARK) { + return !!this.mark; + } + /* istanbul ignore next */ + throw new Error('Unimplemented for property ' + prop); + }; + EnumSpecIndex.prototype.isEmpty = function () { + return !this.mark && util_1.keys(this.encodingIndicesByProperty).length === 0; + }; + EnumSpecIndex.prototype.setMark = function (mark) { + this._mark = mark; + return this; + }; + Object.defineProperty(EnumSpecIndex.prototype, "mark", { + get: function () { + return this._mark; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EnumSpecIndex.prototype, "encodings", { + get: function () { + return this._encodings; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EnumSpecIndex.prototype, "encodingIndicesByProperty", { + get: function () { + return this._encodingIndicesByProperty; + }, + enumerable: true, + configurable: true + }); + return EnumSpecIndex; +}()); +exports.EnumSpecIndex = EnumSpecIndex; + +},{"./property":22,"./util":37}],18:[function(require,module,exports){ +"use strict"; +var enumerator_1 = require('../src/enumerator'); +var config_1 = require('./config'); +var model_1 = require('./model'); +var stylize_1 = require('./stylize'); +function generate(specQ, schema, opt) { + if (opt === void 0) { opt = config_1.DEFAULT_QUERY_CONFIG; } + // 1. Build a SpecQueryModel, which also contains enumSpecIndex + var specM = model_1.SpecQueryModel.build(specQ, schema, opt); + var enumSpecIndex = specM.enumSpecIndex; + // 2. Enumerate each of the properties based on propPrecedence. + var answerSet = [specM]; // Initialize Answer Set with only the input spec query. + opt.propertyPrecedence.forEach(function (prop) { + // If the original specQuery contains enumSpec for this prop + if (enumSpecIndex.hasProperty(prop)) { + // update answerset + var reducer = enumerator_1.ENUMERATOR_INDEX[prop](enumSpecIndex, schema, opt); + answerSet = answerSet.reduce(reducer, []); + } + }); + if ((opt.nominalColorScaleForHighCardinality !== null) || (opt.smallBandSizeForHighCardinalityOrFacet !== null)) { + return stylize_1.stylize(answerSet, schema, opt); + } + return answerSet; +} +exports.generate = generate; + +},{"../src/enumerator":15,"./config":9,"./model":19,"./stylize":36}],19:[function(require,module,exports){ +"use strict"; +var aggregate_1 = require('vega-lite/src/aggregate'); +var type_1 = require('vega-lite/src/type'); +var property_1 = require('./property'); +var enumspec_1 = require('./enumspec'); +var enumspecindex_1 = require('./enumspecindex'); +var spec_1 = require('./query/spec'); +var encoding_1 = require('./query/encoding'); +var shorthand_1 = require('./query/shorthand'); +var util_1 = require('./util'); +function getDefaultName(prop) { + switch (prop) { + case property_1.Property.MARK: + return 'm'; + case property_1.Property.CHANNEL: + return 'c'; + case property_1.Property.AGGREGATE: + return 'a'; + case property_1.Property.AUTOCOUNT: + return '#'; + case property_1.Property.BIN: + return 'b'; + case property_1.Property.BIN_MAXBINS: + return 'b-mb'; + case property_1.Property.SORT: + return 'so'; + case property_1.Property.SORT_FIELD: + return 'so-f'; + case property_1.Property.SORT_OP: + return 'so-op'; + case property_1.Property.SORT_ORDER: + return 'so-or'; + case property_1.Property.SCALE: + return 's'; + case property_1.Property.SCALE_BANDSIZE: + return 's-bs'; + case property_1.Property.SCALE_CLAMP: + return 's-c'; + case property_1.Property.SCALE_DOMAIN: + return 's-d'; + case property_1.Property.SCALE_EXPONENT: + return 's-e'; + case property_1.Property.SCALE_NICE: + return 's-n'; + case property_1.Property.SCALE_RANGE: + return 's-ra'; + case property_1.Property.SCALE_ROUND: + return 's-r'; + case property_1.Property.SCALE_TYPE: + return 's-t'; + case property_1.Property.SCALE_USERAWDOMAIN: + return 's-u'; + case property_1.Property.SCALE_ZERO: + return 's-z'; + case property_1.Property.TIMEUNIT: + return 'tu'; + case property_1.Property.FIELD: + return 'f'; + case property_1.Property.TYPE: + return 't'; + } + /* istanbul ignore next */ + throw new Error('Default name undefined'); +} +exports.getDefaultName = getDefaultName; +function getDefaultEnumValues(prop, schema, opt) { + switch (prop) { + case property_1.Property.FIELD: // For field, by default enumerate all fields + case property_1.Property.SORT_FIELD: + return schema.fields(); + // True, False for boolean values + case property_1.Property.BIN: + case property_1.Property.SCALE: + case property_1.Property.SCALE_CLAMP: + case property_1.Property.SCALE_NICE: + case property_1.Property.SCALE_ROUND: + case property_1.Property.SCALE_USERAWDOMAIN: + case property_1.Property.SCALE_ZERO: + case property_1.Property.AUTOCOUNT: + return [false, true]; + // For other properties, take default enumValues from config. + // The config name for each prop is a plural form of the prop. + case property_1.Property.AGGREGATE: + return opt.aggregates; + case property_1.Property.BIN_MAXBINS: + return opt.maxBinsList; + case property_1.Property.CHANNEL: + return opt.channels; + case property_1.Property.MARK: + return opt.marks; + case property_1.Property.SORT: + return opt.sorts; + case property_1.Property.SORT_OP: + return opt.sortOps; + case property_1.Property.SORT_ORDER: + return opt.sortOrders; + case property_1.Property.SCALE_BANDSIZE: + return opt.scaleBandSizes; + case property_1.Property.SCALE_DOMAIN: + return opt.scaleDomains; + case property_1.Property.SCALE_EXPONENT: + return opt.scaleExponents; + case property_1.Property.SCALE_RANGE: + return opt.scaleRanges; + case property_1.Property.SCALE_TYPE: + return opt.scaleTypes; + case property_1.Property.TIMEUNIT: + return opt.timeUnits; + case property_1.Property.TYPE: + return opt.types; + } + /* istanbul ignore next */ + throw new Error('No default enumValues for ' + prop); +} +exports.getDefaultEnumValues = getDefaultEnumValues; +/** + * Internal class for specQuery that provides helper for the enumeration process. + */ +var SpecQueryModel = (function () { + function SpecQueryModel(spec, enumSpecIndex, schema, opt, enumSpecAssignment) { + this._rankingScore = {}; + this._spec = spec; + this._channelCount = spec.encodings.reduce(function (m, encQ) { + if (!enumspec_1.isEnumSpec(encQ.channel) && encQ.autoCount !== false) { + m[encQ.channel] = 1; + } + return m; + }, {}); + this._enumSpecIndex = enumSpecIndex; + this._enumSpecAssignment = enumSpecAssignment; + this._opt = opt; + this._schema = schema; + } + /** + * Build an enumSpecIndex by detecting enumeration specifiers + * in the input specQuery and replace short enum specs with + * full ones that includes both names and enumValues. + * + * @return a SpecQueryModel that wraps the specQuery and the enumSpecIndex. + */ + SpecQueryModel.build = function (specQ, schema, opt) { + var enumSpecIndex = new enumspecindex_1.EnumSpecIndex(); + // mark + if (enumspec_1.isEnumSpec(specQ.mark)) { + var name_1 = getDefaultName(property_1.Property.MARK); + specQ.mark = enumspec_1.initEnumSpec(specQ.mark, name_1, opt.marks); + enumSpecIndex.setMark(specQ.mark); + } + // TODO: transform + // encodings + specQ.encodings.forEach(function (encQ, index) { + if (encQ.autoCount !== undefined) { + // This is only for testing purpose + console.warn('A field with autoCount should not be included as autoCount meant to be an internal object.'); + encQ.type = type_1.Type.QUANTITATIVE; // autoCount is always quantitative + } + if (encQ.type === undefined) { + // type is optional -- we automatically augment enum spec if not specified + encQ.type = enumspec_1.SHORT_ENUM_SPEC; + } + // For each property of the encodingQuery, enumerate + property_1.ENCODING_PROPERTIES.forEach(function (prop) { + if (enumspec_1.isEnumSpec(encQ[prop])) { + // Assign default enum spec name and enum values. + var defaultEnumSpecName = getDefaultName(prop) + index; + var defaultEnumValues = getDefaultEnumValues(prop, schema, opt); + var enumSpec = encQ[prop] = enumspec_1.initEnumSpec(encQ[prop], defaultEnumSpecName, defaultEnumValues); + // Add index of the encoding mapping to the property's enum spec index. + enumSpecIndex.setEncodingProperty(index, prop, enumSpec); + } + }); + // For each nested property of the encoding query (e.g., encQ.bin.maxbins) + property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) { + var propObj = encQ[nestedProp.parent]; // the property object e.g., encQ.bin + if (propObj) { + var prop = nestedProp.property; + var child = nestedProp.child; + if (enumspec_1.isEnumSpec(propObj[child])) { + // Assign default enum spec name and enum values. + var defaultEnumSpecName = getDefaultName(prop) + index; + var defaultEnumValues = getDefaultEnumValues(prop, schema, opt); + var enumSpec = propObj[child] = enumspec_1.initEnumSpec(propObj[child], defaultEnumSpecName, defaultEnumValues); + // Add index of the encoding mapping to the property's enum spec index. + enumSpecIndex.setEncodingProperty(index, prop, enumSpec); + } + } + }); + }); + // AUTO COUNT + // Add Auto Count Field + if (opt.autoAddCount) { + var countEncQ = { + channel: { + name: getDefaultName(property_1.Property.CHANNEL) + specQ.encodings.length, + values: getDefaultEnumValues(property_1.Property.CHANNEL, schema, opt) + }, + autoCount: { + name: getDefaultName(property_1.Property.AUTOCOUNT) + specQ.encodings.length, + values: [false, true] + }, + type: type_1.Type.QUANTITATIVE + }; + specQ.encodings.push(countEncQ); + var index = specQ.encodings.length - 1; + // Add index of the encoding mapping to the property's enum spec index. + enumSpecIndex.setEncodingProperty(index, property_1.Property.CHANNEL, countEncQ.channel); + enumSpecIndex.setEncodingProperty(index, property_1.Property.AUTOCOUNT, countEncQ.autoCount); + } + return new SpecQueryModel(specQ, enumSpecIndex, schema, opt, {}); + }; + Object.defineProperty(SpecQueryModel.prototype, "enumSpecIndex", { + get: function () { + return this._enumSpecIndex; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpecQueryModel.prototype, "schema", { + get: function () { + return this._schema; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpecQueryModel.prototype, "specQuery", { + get: function () { + return this._spec; + }, + enumerable: true, + configurable: true + }); + SpecQueryModel.prototype.duplicate = function () { + return new SpecQueryModel(util_1.duplicate(this._spec), this._enumSpecIndex, this._schema, this._opt, util_1.duplicate(this._enumSpecAssignment)); + }; + SpecQueryModel.prototype.setMark = function (mark) { + var name = this._spec.mark.name; + this._enumSpecAssignment[name] = this._spec.mark = mark; + }; + SpecQueryModel.prototype.resetMark = function () { + var enumSpec = this._spec.mark = this._enumSpecIndex.mark; + delete this._enumSpecAssignment[enumSpec.name]; + }; + SpecQueryModel.prototype.getMark = function () { + return this._spec.mark; + }; + SpecQueryModel.prototype.getEncodingProperty = function (index, prop) { + var encQ = this._spec.encodings[index]; + var nestedProp = property_1.getNestedEncodingProperty(prop); + if (nestedProp) { + return encQ[nestedProp.parent][nestedProp.child]; + } + return encQ[prop]; // encoding property (non-nested) + }; + SpecQueryModel.prototype.setEncodingProperty = function (index, prop, value, enumSpec) { + var encQ = this._spec.encodings[index]; + var nestedProp = property_1.getNestedEncodingProperty(prop); + if (prop === property_1.Property.CHANNEL && encQ.channel && !enumspec_1.isEnumSpec(encQ.channel)) { + // If there is an old channel + this._channelCount[encQ.channel]--; + } + if (nestedProp) { + encQ[nestedProp.parent][nestedProp.child] = value; + } + else if (property_1.hasNestedProperty(prop) && value === true) { + encQ[prop] = util_1.extend({}, encQ[prop], // copy all existing properties + { values: undefined, name: undefined } // except name and values to it no longer an enumSpec + ); + } + else { + encQ[prop] = value; + } + this._enumSpecAssignment[enumSpec.name] = value; + if (prop === property_1.Property.CHANNEL) { + // If there is a new channel, make sure it exists and add it to the count. + this._channelCount[value] = (this._channelCount[value] || 0) + 1; + } + }; + SpecQueryModel.prototype.resetEncodingProperty = function (index, prop, enumSpec) { + var encQ = this._spec.encodings[index]; + var nestedProp = property_1.getNestedEncodingProperty(prop); + if (prop === property_1.Property.CHANNEL) { + this._channelCount[encQ.channel]--; + } + // reset it to enumSpec + if (nestedProp) { + encQ[nestedProp.parent][nestedProp.child] = enumSpec; + } + else { + encQ[prop] = enumSpec; + } + // add remove value that is reset from the assignment map + delete this._enumSpecAssignment[enumSpec.name]; + }; + SpecQueryModel.prototype.channelUsed = function (channel) { + // do not include encoding that has autoCount = false because it is not a part of the output spec. + return this._channelCount[channel] > 0; + }; + SpecQueryModel.prototype.stack = function () { + return spec_1.stack(this._spec); + }; + SpecQueryModel.prototype.getEncodings = function () { + // do not include encoding that has autoCount = false because it is not a part of the output spec. + return this._spec.encodings.filter(function (encQ) { return encQ.autoCount !== false; }); + }; + SpecQueryModel.prototype.getEncodingQueryByChannel = function (channel) { + for (var i = 0; i < this._spec.encodings.length; i++) { + if (this._spec.encodings[i].channel === channel) { + return this._spec.encodings[i]; + } + } + return undefined; + }; + SpecQueryModel.prototype.getEncodingQueryByIndex = function (i) { + return this._spec.encodings[i]; + }; + SpecQueryModel.prototype.isDimension = function (channel) { + var encQ = this.getEncodingQueryByChannel(channel); + return encQ && encoding_1.isDimension(encQ); + }; + SpecQueryModel.prototype.isMeasure = function (channel) { + var encQ = this.getEncodingQueryByChannel(channel); + return encQ && encoding_1.isMeasure(encQ); + }; + SpecQueryModel.prototype.isAggregate = function () { + return spec_1.isAggregate(this._spec); + }; + SpecQueryModel.prototype.toShorthand = function () { + return shorthand_1.spec(this._spec); + }; + SpecQueryModel.prototype._encoding = function () { + var encoding = {}; + for (var i = 0; i < this._spec.encodings.length; i++) { + var encQ = this._spec.encodings[i]; + var fieldDef = {}; + // For count field that is automatically added, convert to correct vega-lite fieldDef + if (encQ.autoCount === true) { + fieldDef.aggregate = aggregate_1.AggregateOp.COUNT; + fieldDef.field = '*'; + fieldDef.type = type_1.Type.QUANTITATIVE; + } + else if (encQ.autoCount === false) { + continue; // Do not include this in the output. + } + // if channel is an enum spec, return null + if (enumspec_1.isEnumSpec(encQ.channel)) + return null; + // assemble other property into a field def. + var PROPERTIES = [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.SORT, property_1.Property.SCALE, property_1.Property.TIMEUNIT, property_1.Property.FIELD, property_1.Property.TYPE]; + for (var j = 0; j < PROPERTIES.length; j++) { + var prop = PROPERTIES[j]; + // if the property is an enum spec, return null + if (enumspec_1.isEnumSpec(encQ[prop])) + return null; + // otherwise, assign the proper to the field def + if (encQ[prop] !== undefined) { + fieldDef[prop] = encQ[prop]; + } + } + encoding[encQ.channel] = fieldDef; + } + return encoding; + }; + /** + * Convert a query to a Vega-Lite spec if it is completed. + * @return a Vega-Lite spec if completed, null otherwise. + */ + SpecQueryModel.prototype.toSpec = function (data) { + if (enumspec_1.isEnumSpec(this._spec.mark)) + return null; + var spec = {}; + data = data || this._spec.data; + if (data) { + spec.data = data; + } + if (this._spec.transform) { + spec.transform = this._spec.transform; + } + spec.mark = this._spec.mark; + spec.encoding = this._encoding(); + if (spec.encoding === null) { + return null; + } + if (this._spec.config || this._opt.defaultSpecConfig) + spec.config = util_1.extend({}, this._opt.defaultSpecConfig, this._spec.config); + return spec; + }; + SpecQueryModel.prototype.getRankingScore = function (rankingName) { + return this._rankingScore[rankingName]; + }; + SpecQueryModel.prototype.setRankingScore = function (rankingName, score) { + this._rankingScore[rankingName] = score; + }; + return SpecQueryModel; +}()); +exports.SpecQueryModel = SpecQueryModel; + +},{"./enumspec":16,"./enumspecindex":17,"./property":22,"./query/encoding":23,"./query/shorthand":26,"./query/spec":27,"./util":37,"vega-lite/src/aggregate":47,"vega-lite/src/type":57}],20:[function(require,module,exports){ +"use strict"; +function isSpecQueryModelGroup(item) { + return item && item.hasOwnProperty('items'); +} +exports.isSpecQueryModelGroup = isSpecQueryModelGroup; +function getTopItem(g) { + var topItem = g.items[0]; + if (isSpecQueryModelGroup(topItem)) { + return getTopItem(topItem); + } + else { + return topItem; + } +} +exports.getTopItem = getTopItem; + +},{}],21:[function(require,module,exports){ +"use strict"; +var channel_1 = require('vega-lite/src/channel'); +var util_1 = require('datalib/src/util'); +var enumspec_1 = require('./enumspec'); +var util_2 = require('./util'); +var groupby_1 = require('./query/groupby'); +var shorthand_1 = require('./query/shorthand'); +var spec_1 = require('./query/spec'); +/** + * Registry for all possible grouping key functions. + */ +var groupRegistry = {}; +/** + * Add a grouping function to the registry. + */ +function registerKeyFn(name, keyFn) { + groupRegistry[name] = keyFn; +} +exports.registerKeyFn = registerKeyFn; +exports.FIELD = 'field'; +exports.FIELD_TRANSFORM = 'fieldTransform'; +exports.ENCODING = 'encoding'; +exports.TRANSPOSE = 'transpose'; +exports.SPEC = 'spec'; +/** + * Group the input spec query model by a key function registered in the group registry + * @return + */ +function nest(specModels, query) { + var rootGroup = { name: '', path: '', items: [] }; + var groupIndex = {}; + if (query.nest) { + // global `includes` and `replaces` will get augmented by each level's groupBy. + // Upper level's `groupBy` will get cascaded to lower-level groupBy. + // `replace` can be overriden in a lower-level to support different grouping. + var includes_1 = []; + var replaces_1 = []; + var replacers_1 = []; + var _loop_1 = function(l) { + includes_1.push(l > 0 ? util_2.duplicate(includes_1[l - 1]) : {}); + replaces_1.push(l > 0 ? util_2.duplicate(replaces_1[l - 1]) : {}); + var groupBy = query.nest[l].groupBy; + if (util_1.isArray(groupBy)) { + groupBy.forEach(function (grpBy) { + if (groupby_1.isExtendedGroupBy(grpBy)) { + includes_1[l][grpBy.property] = true; + replaces_1[l][grpBy.property] = grpBy.replace; + } + else { + includes_1[l][grpBy] = true; + } + }); + var replaceFnIndex = util_2.keys(replaces_1[l]).reduce(function (fnIndex, prop) { + fnIndex[prop] = shorthand_1.getReplacer(replaces_1[l][prop]); + return fnIndex; + }, {}); + replacers_1.push(replaceFnIndex); + } + }; + for (var l = 0; l < query.nest.length; l++) { + _loop_1(l); + } + // With includes and replacers, now we can construct the nesting tree + specModels.forEach(function (specM) { + var path = ''; + var group = rootGroup; + for (var l = 0; l < query.nest.length; l++) { + var groupBy = group.groupBy = query.nest[l].groupBy; + group.orderGroupBy = query.nest[l].orderGroupBy; + var key = util_1.isArray(groupBy) ? + shorthand_1.spec(specM.specQuery, includes_1[l], replacers_1[l]) : + groupRegistry[groupBy](specM); + path += '/' + key; + if (!groupIndex[path]) { + groupIndex[path] = { + name: key, + path: path, + items: [] + }; + group.items.push(groupIndex[path]); + } + group = groupIndex[path]; + } + group.items.push(specM); + }); + } + else { + rootGroup.items = specModels; + } + return rootGroup; +} +exports.nest = nest; +registerKeyFn(exports.FIELD, function (specM) { + return specM.getEncodings().map(function (encQ) { return encQ.field; }) + .filter(function (field) { return field && field !== '*'; }) + .sort() + .join('|'); +}); +registerKeyFn(exports.FIELD_TRANSFORM, function (specM) { + return specM.getEncodings().map(function (encQ) { return shorthand_1.fieldDef(encQ); }) + .sort() + .join('|'); +}); +function channelType(channel) { + if (enumspec_1.isEnumSpec(channel)) { + return enumspec_1.SHORT_ENUM_SPEC + ''; + } + var c = channel; + switch (c) { + case channel_1.Channel.X: + case channel_1.Channel.Y: + return 'xy'; + case channel_1.Channel.ROW: + case channel_1.Channel.COLUMN: + return 'facet'; + case channel_1.Channel.COLOR: + case channel_1.Channel.SIZE: + case channel_1.Channel.SHAPE: + case channel_1.Channel.OPACITY: + return 'non-xy'; + case channel_1.Channel.TEXT: + case channel_1.Channel.DETAIL: + case channel_1.Channel.PATH: + case channel_1.Channel.ORDER: + return c + ''; + /* istanbul ignore next */ + default: + console.warn('channel type not implemented for ' + c); + return c + ''; + } +} +function stringifyStack(specM) { + var _stack = spec_1.stack(specM.specQuery); + return (!!_stack ? 'stack=' + _stack.offset + '|' : ''); +} +registerKeyFn(exports.ENCODING, function (specM) { + // mark does not matter + return stringifyStack(specM) + + specM.getEncodings().map(function (encQ) { + var fieldDef = shorthand_1.fieldDef(encQ); + return channelType(encQ.channel) + ':' + fieldDef; + }) + .sort() + .join('|'); +}); +registerKeyFn(exports.TRANSPOSE, function (specM) { + return specM.getMark() + '|' + + stringifyStack(specM) + + specM.getEncodings().map(function (encQ) { + var fieldDef = shorthand_1.fieldDef(encQ); + var channel = (encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) ? 'xy' : + (encQ.channel === channel_1.Channel.ROW || encQ.channel === channel_1.Channel.COLUMN) ? 'facet' : + encQ.channel; + return channel + ':' + fieldDef; + }) + .sort() + .join('|'); +}); +registerKeyFn(exports.SPEC, function (specM) { return JSON.stringify(specM.specQuery); }); + +},{"./enumspec":16,"./query/groupby":24,"./query/shorthand":26,"./query/spec":27,"./util":37,"datalib/src/util":8,"vega-lite/src/channel":49}],22:[function(require,module,exports){ +"use strict"; +var scale_1 = require('vega-lite/src/scale'); +(function (Property) { + Property[Property["MARK"] = 'mark'] = "MARK"; + // TODO: Filter (Field, Value?) + // Layout + Property[Property["STACK"] = 'stack'] = "STACK"; + // TODO: sub parts of stack + // Encoding Properties + Property[Property["CHANNEL"] = 'channel'] = "CHANNEL"; + Property[Property["AGGREGATE"] = 'aggregate'] = "AGGREGATE"; + Property[Property["AUTOCOUNT"] = 'autoCount'] = "AUTOCOUNT"; + Property[Property["BIN"] = 'bin'] = "BIN"; + Property[Property["BIN_MAXBINS"] = 'binMaxBins'] = "BIN_MAXBINS"; + Property[Property["TIMEUNIT"] = 'timeUnit'] = "TIMEUNIT"; + Property[Property["FIELD"] = 'field'] = "FIELD"; + Property[Property["TYPE"] = 'type'] = "TYPE"; + // - Sort + Property[Property["SORT"] = 'sort'] = "SORT"; + Property[Property["SORT_FIELD"] = 'sortField'] = "SORT_FIELD"; + Property[Property["SORT_OP"] = 'sortOp'] = "SORT_OP"; + Property[Property["SORT_ORDER"] = 'sortOrder'] = "SORT_ORDER"; + // - Scale + Property[Property["SCALE"] = 'scale'] = "SCALE"; + Property[Property["SCALE_BANDSIZE"] = 'scaleBandSize'] = "SCALE_BANDSIZE"; + Property[Property["SCALE_CLAMP"] = 'scaleClamp'] = "SCALE_CLAMP"; + Property[Property["SCALE_DOMAIN"] = 'scaleDomain'] = "SCALE_DOMAIN"; + Property[Property["SCALE_EXPONENT"] = 'scaleExponent'] = "SCALE_EXPONENT"; + Property[Property["SCALE_NICE"] = 'scaleNice'] = "SCALE_NICE"; + Property[Property["SCALE_RANGE"] = 'scaleRange'] = "SCALE_RANGE"; + Property[Property["SCALE_ROUND"] = 'scaleRound'] = "SCALE_ROUND"; + Property[Property["SCALE_TYPE"] = 'scaleType'] = "SCALE_TYPE"; + Property[Property["SCALE_USERAWDOMAIN"] = 'scaleUseRawDomain'] = "SCALE_USERAWDOMAIN"; + Property[Property["SCALE_ZERO"] = 'scaleZero'] = "SCALE_ZERO"; + // - Axis + Property[Property["AXIS"] = 'axis'] = "AXIS"; + // TODO: AXIS_* + // - Legend + Property[Property["LEGEND"] = 'legend'] = "LEGEND"; +})(exports.Property || (exports.Property = {})); +var Property = exports.Property; +function hasNestedProperty(prop) { + switch (prop) { + case Property.BIN: + case Property.SCALE: + case Property.SORT: + // TODO: AXIS, LEGEND + return true; + case Property.MARK: + case Property.STACK: + case Property.CHANNEL: + case Property.AGGREGATE: + case Property.AUTOCOUNT: + case Property.TIMEUNIT: + case Property.FIELD: + case Property.TYPE: + case Property.BIN_MAXBINS: + case Property.SCALE_BANDSIZE: + case Property.SCALE_CLAMP: + case Property.SCALE_DOMAIN: + case Property.SCALE_EXPONENT: + case Property.SCALE_NICE: + case Property.SCALE_RANGE: + case Property.SCALE_ROUND: + case Property.SCALE_TYPE: + case Property.SCALE_USERAWDOMAIN: + case Property.SCALE_ZERO: + return false; + } + /* istanbul ignore next */ + throw new Error('hasNestedProperty undefined for property ' + prop); +} +exports.hasNestedProperty = hasNestedProperty; +exports.ENCODING_PROPERTIES = [ + Property.CHANNEL, + Property.BIN, + Property.BIN_MAXBINS, + Property.TIMEUNIT, + Property.AGGREGATE, + Property.AUTOCOUNT, + Property.FIELD, + Property.TYPE, + Property.SORT, + Property.SORT_FIELD, + Property.SORT_OP, + Property.SORT_ORDER, + Property.SCALE, + Property.SCALE_BANDSIZE, + Property.SCALE_CLAMP, + Property.SCALE_DOMAIN, + Property.SCALE_EXPONENT, + Property.SCALE_NICE, + Property.SCALE_RANGE, + Property.SCALE_ROUND, + Property.SCALE_TYPE, + Property.SCALE_USERAWDOMAIN, + Property.SCALE_ZERO +]; +exports.DEFAULT_PROPERTY_PRECEDENCE = [ + // Projection + Property.TYPE, + Property.FIELD, + // TODO: Add stack and remove it from INCLUDE_ALL in shorthand + // Field Transform + Property.BIN, + Property.TIMEUNIT, + Property.AGGREGATE, + Property.AUTOCOUNT, + Property.SORT, + Property.SORT_FIELD, + Property.SORT_OP, + Property.SORT_ORDER, + // Nested Transform Property + Property.BIN_MAXBINS, + // Encoding + Property.CHANNEL, + Property.MARK, + Property.SCALE, + // Nested Encoding Property + Property.SCALE_BANDSIZE, + Property.SCALE_CLAMP, + Property.SCALE_DOMAIN, + Property.SCALE_EXPONENT, + Property.SCALE_NICE, + Property.SCALE_RANGE, + Property.SCALE_ROUND, + Property.SCALE_TYPE, + Property.SCALE_USERAWDOMAIN, + Property.SCALE_ZERO +]; +exports.NESTED_ENCODING_PROPERTIES = [ + { + property: Property.BIN_MAXBINS, + parent: 'bin', + child: 'maxbins' + }, + { + property: Property.SORT_FIELD, + parent: 'sort', + child: 'field' + }, + { + property: Property.SORT_OP, + parent: 'sort', + child: 'op' + }, + { + property: Property.SORT_ORDER, + parent: 'sort', + child: 'order' + }, + { + property: Property.SCALE_BANDSIZE, + parent: 'scale', + child: 'bandSize' + }, + { + property: Property.SCALE_CLAMP, + parent: 'scale', + child: 'clamp' + }, + { + property: Property.SCALE_DOMAIN, + parent: 'scale', + child: 'domain' + }, + { + property: Property.SCALE_EXPONENT, + parent: 'scale', + child: 'exponent' + }, + { + property: Property.SCALE_NICE, + parent: 'scale', + child: 'nice' + }, + { + property: Property.SCALE_RANGE, + parent: 'scale', + child: 'range' + }, + { + property: Property.SCALE_ROUND, + parent: 'scale', + child: 'round' + }, + { + property: Property.SCALE_TYPE, + parent: 'scale', + child: 'type' + }, + { + property: Property.SCALE_USERAWDOMAIN, + parent: 'scale', + child: 'useRawDomain' + }, + { + property: Property.SCALE_ZERO, + parent: 'scale', + child: 'zero' + } +]; +var NESTED_ENCODING_INDEX = exports.NESTED_ENCODING_PROPERTIES.reduce(function (m, nestedProp) { + m[nestedProp.property] = nestedProp; + return m; +}, {}); +var NESTED_ENCODING_PROPERTY_PARENT_INDEX = exports.NESTED_ENCODING_PROPERTIES.reduce(function (m, nestedProp) { + var parent = nestedProp.parent; + // if the parent does not exist in m yet, add it as a key in m with empty [] as value + if (!(parent in m)) { + m[parent] = []; + } + m[nestedProp.parent].push(nestedProp); + return m; +}, {}); // as Dict>); +exports.SCALE_PROPERTIES = NESTED_ENCODING_PROPERTY_PARENT_INDEX['scale'].map(function (nestedProp) { + return nestedProp.property; +}); +var ENCODING_INDEX = exports.ENCODING_PROPERTIES.reduce(function (m, prop) { + m[prop] = prop; + return m; +}, {}); +function isEncodingProperty(prop) { + return ENCODING_INDEX[prop] !== undefined; +} +exports.isEncodingProperty = isEncodingProperty; +function getNestedEncodingProperty(prop) { + return NESTED_ENCODING_INDEX[prop]; +} +exports.getNestedEncodingProperty = getNestedEncodingProperty; +function getNestedEncodingPropertyChildren(parent) { + return NESTED_ENCODING_PROPERTY_PARENT_INDEX[parent]; +} +exports.getNestedEncodingPropertyChildren = getNestedEncodingPropertyChildren; +function isNestedEncodingProperty(prop) { + return prop in NESTED_ENCODING_INDEX; +} +exports.isNestedEncodingProperty = isNestedEncodingProperty; +var SUPPORTED_SCALE_PROPERTY = [ + { + property: 'bandSize', + supportedScaleType: [ + scale_1.ScaleType.ORDINAL + ] + }, + { + property: 'clamp', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'domain', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.QUANTILE, + scale_1.ScaleType.QUANTIZE, + scale_1.ScaleType.ORDINAL, + scale_1.ScaleType.SQRT, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'exponent', + supportedScaleType: [ + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.SQRT + ] + }, + { + property: 'nice', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'range', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.QUANTILE, + scale_1.ScaleType.QUANTIZE, + scale_1.ScaleType.ORDINAL, + scale_1.ScaleType.SQRT, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'round', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.SQRT, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'useRawDomain', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.LOG, + scale_1.ScaleType.POW, + scale_1.ScaleType.QUANTILE, + scale_1.ScaleType.QUANTIZE, + scale_1.ScaleType.ORDINAL, + scale_1.ScaleType.SQRT, + scale_1.ScaleType.TIME, + scale_1.ScaleType.UTC + ] + }, + { + property: 'zero', + supportedScaleType: [ + scale_1.ScaleType.LINEAR, + scale_1.ScaleType.POW, + scale_1.ScaleType.SQRT + ] + } +]; +exports.SUPPORTED_SCALE_PROPERTY_INDEX = SUPPORTED_SCALE_PROPERTY.reduce(function (m, scaleProp) { + var prop = scaleProp.property; + m[prop] = scaleProp.supportedScaleType; + return m; +}, {}); + +},{"vega-lite/src/scale":53}],23:[function(require,module,exports){ +"use strict"; +var scale_1 = require('vega-lite/src/scale'); +var timeunit_1 = require('vega-lite/src/timeunit'); +var type_1 = require('vega-lite/src/type'); +var enumspec_1 = require('../enumspec'); +var util_1 = require('../util'); +function isDimension(encQ) { + return util_1.contains([type_1.Type.NOMINAL, type_1.Type.ORDINAL], encQ.type) || + (!enumspec_1.isEnumSpec(encQ.bin) && !!encQ.bin) || + (!enumspec_1.isEnumSpec(encQ.timeUnit) && !!encQ.timeUnit); // surely T type + // TODO For T type, take scale type of the timeUnit into account +} +exports.isDimension = isDimension; +function isMeasure(encQ) { + return (encQ.type === type_1.Type.QUANTITATIVE && !encQ.bin) || + (encQ.type === type_1.Type.TEMPORAL && !encQ.timeUnit); + // TODO For T type, take scale type of the timeUnit into account +} +exports.isMeasure = isMeasure; +/** + * Returns the true scale type of an encoding. + * @returns {ScaleType} If the scale type was not specified, it is inferred from the encoding's Type. + * @returns {undefined} If the scale type was not specified and Type (or TimeUnit if applicable) is an EnumSpec, there is no clear scale type + */ +function scaleType(scaleType, timeUnit, type) { + if (scaleType !== undefined) { + return scaleType; + } + if (enumspec_1.isEnumSpec(type)) { + return undefined; + } + /* istanbul ignore else */ + if (type === type_1.Type.QUANTITATIVE) { + return scale_1.ScaleType.LINEAR; + } + else if (type === type_1.Type.ORDINAL || type === type_1.Type.NOMINAL) { + return scale_1.ScaleType.ORDINAL; + } + else if (type === type_1.Type.TEMPORAL) { + if (timeUnit !== undefined) { + if (enumspec_1.isEnumSpec(timeUnit)) { + return undefined; + } + return timeunit_1.defaultScaleType(timeUnit); + } + else { + return scale_1.ScaleType.TIME; + } + } + else { + throw new Error(); + } +} +exports.scaleType = scaleType; + +},{"../enumspec":16,"../util":37,"vega-lite/src/scale":53,"vega-lite/src/timeunit":56,"vega-lite/src/type":57}],24:[function(require,module,exports){ +"use strict"; +var util_1 = require('datalib/src/util'); +var util_2 = require('../util'); +exports.REPLACE_BLANK_FIELDS = { '*': '' }; +exports.REPLACE_XY_CHANNELS = { x: 'xy', y: 'xy' }; +exports.REPLACE_FACET_CHANNELS = { row: 'facet', column: 'facet' }; +exports.REPLACE_MARK_STYLE_CHANNELS = { color: 'style', opacity: 'style', shape: 'style', size: 'style' }; +function isExtendedGroupBy(g) { + return util_1.isObject(g) && !!g['property']; +} +exports.isExtendedGroupBy = isExtendedGroupBy; +function toString(groupBy) { + if (util_1.isArray(groupBy)) { + return groupBy.map(function (g) { + if (isExtendedGroupBy(g)) { + if (g.replace) { + var replaceIndex = util_2.keys(g.replace).reduce(function (index, valFrom) { + var valTo = g.replace[valFrom]; + (index[valTo] = index[valTo] || []).push(valFrom); + return index; + }, {}); + return g.property + '[' + util_2.keys(replaceIndex).map(function (valTo) { + var valsFrom = replaceIndex[valTo].sort(); + return valsFrom.join(',') + '=>' + valTo; + }).join(';') + ']'; + } + return g.property; + } + return g; + }).join(','); + } + else { + return groupBy; + } +} +exports.toString = toString; + +},{"../util":37,"datalib/src/util":8}],25:[function(require,module,exports){ +"use strict"; +var config_1 = require('../config'); +var generate_1 = require('../generate'); +var nest_1 = require('../nest'); +var ranking_1 = require('../ranking/ranking'); +var util_1 = require('../util'); +exports.encoding = require('./encoding'); +exports.groupBy = require('./groupby'); +exports.shorthand = require('./shorthand'); +exports.spec = require('./spec'); +exports.transform = require('./transform'); +function query(q, schema, config) { + // 1. Normalize non-nested `groupBy` to always have `groupBy` inside `nest` + // and merge config with the following precedence + // query.config > config > DEFAULT_QUERY_CONFIG + q = util_1.extend({}, normalize(q), { + config: util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, config, q.config) + }); + // 2. Generate + var answerSet = generate_1.generate(q.spec, schema, q.config); + var nestedAnswerSet = nest_1.nest(answerSet, q); + var result = ranking_1.rank(nestedAnswerSet, q, schema, 0); + return { + query: q, + result: result + }; +} +exports.query = query; +/** + * Normalize the non-nested version of the query to a standardize nested + */ +function normalize(q) { + if (q.groupBy) { + var nest_2 = { + groupBy: q.groupBy + }; + if (q.orderBy) { + nest_2.orderGroupBy = q.orderBy; + } + var normalizedQ = { + spec: util_1.duplicate(q.spec), + nest: [nest_2], + }; + if (q.chooseBy) { + normalizedQ.chooseBy = q.chooseBy; + } + if (q.config) { + normalizedQ.config = q.config; + } + return normalizedQ; + } + return util_1.duplicate(q); // We will cause side effect to q.spec in SpecQueryModel.build +} +exports.normalize = normalize; + +},{"../config":9,"../generate":18,"../nest":21,"../ranking/ranking":34,"../util":37,"./encoding":23,"./groupby":24,"./shorthand":26,"./spec":27,"./transform":28}],26:[function(require,module,exports){ +"use strict"; +var type_1 = require('vega-lite/src/type'); +var util_1 = require('datalib/src/util'); +var spec_1 = require('./spec'); +var enumspec_1 = require('../enumspec'); +var property_1 = require('../property'); +var util_2 = require('../util'); +function getReplacer(replace) { + return function (s) { + if (replace[s] !== undefined) { + return replace[s]; + } + return s; + }; +} +exports.getReplacer = getReplacer; +function value(v, replace) { + if (enumspec_1.isEnumSpec(v)) { + return enumspec_1.SHORT_ENUM_SPEC; + } + if (replace) { + return replace(v); + } + return v; +} +exports.value = value; +exports.INCLUDE_ALL = +// TODO: remove manual stack concat once we really support enumerating it. +property_1.DEFAULT_PROPERTY_PRECEDENCE.concat([property_1.Property.STACK]) + .reduce(function (m, prop) { + m[prop] = true; + return m; +}, {}); +/** + * Returns a shorthand for a spec query + * @param specQ a spec query + * @param include Dict Set listing property types (key) to be included in the shorthand + * @param replace Dictionary of replace function for values of a particular property type (key) + */ +function spec(specQ, include, replace) { + if (include === void 0) { include = exports.INCLUDE_ALL; } + if (replace === void 0) { replace = {}; } + var parts = []; + if (include[property_1.Property.MARK]) { + parts.push(value(specQ.mark, replace[property_1.Property.MARK])); + } + // TODO: transform + // TODO: extract this to its own stack method + if (include[property_1.Property.STACK]) { + var _stack = spec_1.stack(specQ); + if (_stack) { + // TODO: Refactor this once we have child stack property. + // Exclude type since we don't care about type in stack + var includeExceptType = util_2.extend({}, include, { type: false }); + var field = fieldDef(_stack.fieldEncQ, includeExceptType, replace); + var groupby = fieldDef(_stack.groupByEncQ, includeExceptType, replace); + parts.push(("stack={field:" + field + ",") + + (groupby ? "by:" + groupby + "," : '') + + ("offset:" + _stack.offset + "}")); + } + } + parts.push(specQ.encodings.reduce(function (encQs, encQ) { + // Exclude encoding mapping with autoCount=false as they are basically disabled. + if (encQ.autoCount !== false) { + var str = encoding(encQ, include, replace); + if (str) { + encQs.push(str); + } + } + return encQs; + }, []) + .sort() // sort at the end to ignore order + .join('|')); + return parts.join('|'); +} +exports.spec = spec; +/** + * Returns a shorthand for an encoding query + * @param encQ an encoding query + * @param include Dict Set listing property types (key) to be included in the shorthand + * @param replace Dictionary of replace function for values of a particular property type (key) + */ +function encoding(encQ, include, replace) { + if (include === void 0) { include = exports.INCLUDE_ALL; } + if (replace === void 0) { replace = {}; } + var parts = []; + if (include[property_1.Property.CHANNEL]) { + parts.push(value(encQ.channel, replace[property_1.Property.CHANNEL])); + } + var fieldDefStr = fieldDef(encQ, include, replace); + if (fieldDefStr) { + parts.push(fieldDefStr); + } + return parts.join(':'); +} +exports.encoding = encoding; +/** + * Returns a field definiton shorthand for an encoding query + * @param encQ an encoding query + * @param include Dict Set listing property types (key) to be included in the shorthand + * @param replace Dictionary of replace function for values of a particular property type (key) + */ +function fieldDef(encQ, include, replace) { + if (include === void 0) { include = exports.INCLUDE_ALL; } + if (replace === void 0) { replace = {}; } + var fn = null; + /** Encoding properties e.g., Scale, Axis, Legend */ + var props = []; + if (include[property_1.Property.AGGREGATE] && encQ.autoCount === false) { + return '-'; + } + else if (include[property_1.Property.AGGREGATE] && encQ.aggregate && !enumspec_1.isEnumSpec(encQ.aggregate)) { + fn = value(encQ.aggregate, replace[property_1.Property.AGGREGATE]); + } + else if (include[property_1.Property.AGGREGATE] && encQ.autoCount && !enumspec_1.isEnumSpec(encQ.autoCount)) { + fn = value('count', replace[property_1.Property.AGGREGATE]); + ; + } + else if (include[property_1.Property.TIMEUNIT] && encQ.timeUnit && !enumspec_1.isEnumSpec(encQ.timeUnit)) { + fn = value(encQ.timeUnit, replace[property_1.Property.TIMEUNIT]); + } + else if (include[property_1.Property.BIN] && encQ.bin && !enumspec_1.isEnumSpec(encQ.bin)) { + fn = 'bin'; + if (include[property_1.Property.BIN_MAXBINS] && encQ.bin['maxbins']) { + props.push({ + key: 'maxbins', + value: value(encQ.bin['maxbins'], replace[property_1.Property.BIN_MAXBINS]) + }); + } + } + else { + for (var _i = 0, _a = [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN]; _i < _a.length; _i++) { + var prop = _a[_i]; + if (include[prop] && encQ[prop] && enumspec_1.isEnumSpec(encQ[prop])) { + fn = enumspec_1.SHORT_ENUM_SPEC + ''; + break; + } + } + } + // Scale + // TODO: axis, legend + var _loop_1 = function(nestedPropParent) { + if (include[nestedPropParent]) { + if (encQ[nestedPropParent] && !enumspec_1.isEnumSpec(encQ[nestedPropParent])) { + // `sort` can be a string (ascending/descending). + if (util_1.isString(encQ[nestedPropParent])) { + props.push({ + key: nestedPropParent + '', + value: encQ[nestedPropParent] + }); + } + else { + var nestedProps = property_1.getNestedEncodingPropertyChildren(nestedPropParent); + var nestedPropChildren = nestedProps.reduce(function (p, nestedProp) { + if (include[nestedProp.property] && encQ[nestedPropParent][nestedProp.child] !== undefined) { + p[nestedProp.child] = value(encQ[nestedPropParent][nestedProp.child], replace[nestedProp.property]); + } + return p; + }, {}); + if (util_2.keys(nestedPropChildren).length > 0) { + props.push({ + key: nestedPropParent + '', + value: JSON.stringify(nestedPropChildren) + }); + } + } + } + else if (encQ[nestedPropParent] === false || encQ[nestedPropParent] === null) { + // `scale`, `axis`, `legend` can be false/null. + props.push({ + key: nestedPropParent + '', + value: false + }); + } + } + }; + for (var _b = 0, _c = [property_1.Property.SCALE, property_1.Property.SORT]; _b < _c.length; _b++) { + var nestedPropParent = _c[_b]; + _loop_1(nestedPropParent); + } + // field + var fieldAndParams = include[property_1.Property.FIELD] ? value(encQ.field || '*', replace[property_1.Property.FIELD]) : '...'; + // type + if (include[property_1.Property.TYPE]) { + var typeShort = ((encQ.type || type_1.Type.QUANTITATIVE) + '').substr(0, 1); + fieldAndParams += ',' + value(typeShort, replace[property_1.Property.TYPE]); + } + // encoding properties + fieldAndParams += props.map(function (p) { return ',' + p.key + '=' + p.value; }).join(''); + return (fn ? fn + '(' + fieldAndParams + ')' : fieldAndParams); +} +exports.fieldDef = fieldDef; + +},{"../enumspec":16,"../property":22,"../util":37,"./spec":27,"datalib/src/util":8,"vega-lite/src/type":57}],27:[function(require,module,exports){ +"use strict"; +var channel_1 = require('vega-lite/src/channel'); +var mark_1 = require('vega-lite/src/mark'); +var stack_1 = require('vega-lite/src/stack'); +var enumspec_1 = require('../enumspec'); +var property_1 = require('../property'); +var util_1 = require('../util'); +/** + * Convert a Vega-Lite's ExtendedUnitSpec into a CompassQL's SpecQuery + * @param {ExtendedUnitSpec} spec + * @returns + */ +function fromSpec(spec) { + return util_1.extend(spec.data ? { data: spec.data } : {}, spec.transform ? { transform: spec.transform } : {}, { + mark: spec.mark, + encodings: util_1.keys(spec.encoding).map(function (channel) { + var encQ = { channel: channel }; + var channelDef = spec.encoding[channel]; + for (var _i = 0, ENCODING_PROPERTIES_1 = property_1.ENCODING_PROPERTIES; _i < ENCODING_PROPERTIES_1.length; _i++) { + var prop = ENCODING_PROPERTIES_1[_i]; + if (!property_1.isNestedEncodingProperty(prop) && channelDef[prop] !== undefined) { + encQ[prop] = channelDef[prop]; + } + // Currently scale, axis, legend only support boolean, but not null. + // Therefore convert null to false. + if (util_1.contains([property_1.Property.SCALE, property_1.Property.AXIS, property_1.Property.LEGEND], prop) && encQ[prop] === null) { + encQ[prop] = false; + } + } + return encQ; + }) + }, spec.config ? { config: spec.config } : {}); +} +exports.fromSpec = fromSpec; +function isAggregate(specQ) { + return util_1.some(specQ.encodings, function (encQ) { + return (!enumspec_1.isEnumSpec(encQ.aggregate) && !!encQ.aggregate) || encQ.autoCount === true; + }); +} +exports.isAggregate = isAggregate; +/** + * @return the stack offset type for the specQuery + */ +function stack(specQ) { + var config = specQ.config; + var stacked = (config && config.mark) ? config.mark.stacked : undefined; + // Should not have stack explicitly disabled + if (util_1.contains([stack_1.StackOffset.NONE, null, false], stacked)) { + return null; + } + // Should have stackable mark + if (!util_1.contains([mark_1.BAR, mark_1.AREA], specQ.mark)) { + return null; + } + // Should be aggregate plot + if (!isAggregate(specQ)) { + return null; + } + var stackByChannels = specQ.encodings.reduce(function (sc, encQ) { + if (util_1.contains(channel_1.STACK_GROUP_CHANNELS, encQ.channel) && !encQ.aggregate) { + sc.push(encQ.channel); + } + return sc; + }, []); + if (stackByChannels.length === 0) { + return null; + } + // Has only one aggregate axis + var xEncQ = specQ.encodings.reduce(function (f, encQ) { + return f || (encQ.channel === channel_1.Channel.X ? encQ : null); + }, null); + var yEncQ = specQ.encodings.reduce(function (f, encQ) { + return f || (encQ.channel === channel_1.Channel.Y ? encQ : null); + }, null); + var xIsAggregate = !!xEncQ && (!!xEncQ.aggregate || !!xEncQ.autoCount); + var yIsAggregate = !!yEncQ && (!!yEncQ.aggregate || !!yEncQ.autoCount); + if (xIsAggregate !== yIsAggregate) { + return { + groupbyChannel: xIsAggregate ? (!!yEncQ ? channel_1.Y : null) : (!!xEncQ ? channel_1.X : null), + groupByEncQ: xIsAggregate ? yEncQ : xEncQ, + fieldChannel: xIsAggregate ? channel_1.X : channel_1.Y, + fieldEncQ: xIsAggregate ? xEncQ : yEncQ, + stackByChannels: stackByChannels, + offset: stacked || stack_1.StackOffset.ZERO + }; + } + return null; +} +exports.stack = stack; + +},{"../enumspec":16,"../property":22,"../util":37,"vega-lite/src/channel":49,"vega-lite/src/mark":52,"vega-lite/src/stack":55}],28:[function(require,module,exports){ +"use strict"; + +},{}],29:[function(require,module,exports){ +"use strict"; +var aggregate_1 = require('vega-lite/src/aggregate'); +var type_1 = require('vega-lite/src/type'); +var util_1 = require('../util'); +var encoding_1 = require('../query/encoding'); +exports.name = 'aggregationQuality'; +function score(specM, schema, opt) { + var feature = aggregationQualityFeature(specM, schema, opt); + return { + score: feature.score, + features: [feature] + }; +} +exports.score = score; +function aggregationQualityFeature(specM, schema, opt) { + var encodings = specM.getEncodings(); + if (specM.isAggregate()) { + var isRawContinuous = function (encQ) { + return (encQ.type === type_1.Type.QUANTITATIVE && !encQ.bin && !encQ.aggregate && !encQ.autoCount) || + (encQ.type === type_1.Type.TEMPORAL && !encQ.timeUnit); + }; + if (util_1.some(encodings, isRawContinuous)) { + // These are plots that pollute continuous fields as dimension. + // They are often intermediate visualizations rather than what users actually want. + return { + type: exports.name, + score: 0.1, + feature: 'Aggregate with raw continuous' + }; + } + if (util_1.some(encodings, encoding_1.isDimension)) { + if (util_1.some(encodings, function (encQ) { return encQ.aggregate === aggregate_1.AggregateOp.COUNT; })) { + // If there is count, we might add additional count field, making it a little less simple + // then when we just apply aggregate to Q field + return { + type: exports.name, + score: 0.8, + feature: 'Aggregate with count' + }; + } + return { + type: exports.name, + score: 0.9, + feature: 'Aggregate without count' + }; + } + // no dimension -- often not very useful + return { + type: exports.name, + score: 0.3, + feature: 'Aggregate without dimension' + }; + } + else { + if (util_1.some(encodings, encoding_1.isMeasure)) { + // raw plots with measure -- simplest of all! + return { + type: exports.name, + score: 1, + feature: 'Raw with measure' + }; + } + // raw plots with no measure -- often a lot of occlusion + return { + type: exports.name, + score: 0.2, + feature: 'Raw without measure' + }; + } +} + +},{"../query/encoding":23,"../util":37,"vega-lite/src/aggregate":47,"vega-lite/src/type":57}],30:[function(require,module,exports){ +"use strict"; +var channel_1 = require('vega-lite/src/channel'); +var config_1 = require('../../config'); +var shorthand_1 = require('../../query/shorthand'); +var util_1 = require('../../util'); +var effectiveness_1 = require('./effectiveness'); +var type_1 = require('./type'); +/** + * Field Type (with Bin and TimeUnit) and Channel Score (Cleveland / Mackinlay based) + */ +var TypeChannelScore; +(function (TypeChannelScore) { + TypeChannelScore.TYPE_CHANNEL = 'typeChannel'; + function init() { + var SCORE = {}; + var ORDERED_TYPE_CHANNEL_SCORE = { + x: 0, + y: 0, + size: -0.45, + color: -0.6, + opacity: -0.75, + text: -0.775, + row: -0.8, + column: -0.8, + shape: -2.5, + detail: -3 + }; + [type_1.Q, type_1.BIN_Q, type_1.T, type_1.TIMEUNIT_T, type_1.O].forEach(function (type) { + util_1.keys(ORDERED_TYPE_CHANNEL_SCORE).forEach(function (channel) { + SCORE[featurize(type, channel)] = ORDERED_TYPE_CHANNEL_SCORE[channel]; + }); + }); + // Penalize row/column for bin quantitative / timeUnit_temporal + [type_1.BIN_Q, type_1.TIMEUNIT_T, type_1.O].forEach(function (type) { + [channel_1.Channel.ROW, channel_1.Channel.COLUMN].forEach(function (channel) { + SCORE[featurize(type, channel)] += 0.25; + }); + }); + var NOMINAL_TYPE_CHANNEL_SCORE = { + x: 0, + y: 0, + color: -0.5, + shape: -0.6, + row: -0.7, + column: -0.7, + text: -0.8, + size: -1.8, + detail: -2, + opacity: -2.1 + }; + util_1.keys(NOMINAL_TYPE_CHANNEL_SCORE).forEach(function (channel) { + SCORE[featurize(type_1.N, channel)] = NOMINAL_TYPE_CHANNEL_SCORE[channel]; + }); + return SCORE; + } + TypeChannelScore.init = init; + function featurize(type, channel) { + return type + '_' + channel; + } + TypeChannelScore.featurize = featurize; + function getScore(specM, schema, opt) { + var encodingQueryByField = specM.getEncodings().reduce(function (m, encQ) { + var fieldKey = shorthand_1.fieldDef(encQ); + (m[fieldKey] = m[fieldKey] || []).push(encQ); + return m; + }, {}); + var features = []; + util_1.forEach(encodingQueryByField, function (encQs) { + var bestFieldFeature = encQs.reduce(function (best, encQ) { + var type = effectiveness_1.getExtendedType(encQ); + var feature = featurize(type, encQ.channel); + var featureScore = effectiveness_1.getFeatureScore(TypeChannelScore.TYPE_CHANNEL, feature); + if (best === null || featureScore.score > best.score) { + return featureScore; + } + return best; + }, null); + features.push(bestFieldFeature); + // TODO: add plus for over-encoding of one field + }); + return features; + } + TypeChannelScore.getScore = getScore; +})(TypeChannelScore = exports.TypeChannelScore || (exports.TypeChannelScore = {})); +var PreferredAxisScore; +(function (PreferredAxisScore) { + PreferredAxisScore.PREFERRED_AXIS = 'preferredAxis'; + // FIXME support doing this at runtime + function init(opt) { + if (opt === void 0) { opt = {}; } + opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt); + var score = {}; + var preferredAxes = [{ + feature: type_1.BIN_Q, + opt: 'preferredBinAxis' + }, { + feature: type_1.T, + opt: 'preferredTemporalAxis' + }, { + feature: type_1.TIMEUNIT_T, + opt: 'preferredTemporalAxis' + }, { + feature: type_1.O, + opt: 'preferredOrdinalAxis' + }, { + feature: type_1.N, + opt: 'preferredNominalAxis' + }]; + preferredAxes.forEach(function (preferredAxis) { + if (opt[preferredAxis.opt] === channel_1.Channel.X) { + // penalize the other axis + score[preferredAxis.feature + '_' + channel_1.Channel.Y] = -0.01; + } + else if (opt[preferredAxis.opt] === channel_1.Channel.Y) { + // penalize the other axis + score[preferredAxis.feature + '_' + channel_1.Channel.X] = -0.01; + } + }); + return score; + } + PreferredAxisScore.init = init; + function featurize(type, channel) { + return type + '_' + channel; + } + PreferredAxisScore.featurize = featurize; + function getScore(specM, schema, opt) { + return specM.getEncodings().reduce(function (features, encQ) { + var type = effectiveness_1.getExtendedType(encQ); + var feature = featurize(type, encQ.channel); + var featureScore = effectiveness_1.getFeatureScore(PreferredAxisScore.PREFERRED_AXIS, feature); + if (featureScore) { + features.push(featureScore); + } + return features; + }, []); + } + PreferredAxisScore.getScore = getScore; +})(PreferredAxisScore = exports.PreferredAxisScore || (exports.PreferredAxisScore = {})); +var PreferredFacetScore; +(function (PreferredFacetScore) { + PreferredFacetScore.PREFERRED_FACET = 'preferredFacet'; + // FIXME support doing this at runtime + function init(opt) { + opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt); + var score = {}; + if (opt.preferredFacet === channel_1.Channel.ROW) { + // penalize the other axis + score[channel_1.Channel.COLUMN] = -0.01; + } + else if (opt.preferredFacet === channel_1.Channel.COLUMN) { + // penalize the other axis + score[channel_1.Channel.ROW] = -0.01; + } + return score; + } + PreferredFacetScore.init = init; + function getScore(specM, schema, opt) { + return specM.getEncodings().reduce(function (features, encQ) { + var featureScore = effectiveness_1.getFeatureScore(PreferredFacetScore.PREFERRED_FACET, encQ.channel); + if (featureScore) { + features.push(featureScore); + } + return features; + }, []); + } + PreferredFacetScore.getScore = getScore; +})(PreferredFacetScore = exports.PreferredFacetScore || (exports.PreferredFacetScore = {})); +var MarkChannelScore; +(function (MarkChannelScore) { + // Penalty for certain channel for certain mark types + MarkChannelScore.MARK_CHANNEL = 'markChannel'; + function init() { + return { + bar_size: -2, + tick_size: -2 + }; + } + MarkChannelScore.init = init; + function getScore(specM, schema, opt) { + var mark = specM.getMark(); + return specM.getEncodings().reduce(function (featureScores, encQ) { + var feature = mark + '_' + encQ.channel; + var featureScore = effectiveness_1.getFeatureScore(MarkChannelScore.MARK_CHANNEL, feature); + if (featureScore) { + featureScores.push(featureScore); + } + return featureScores; + }, []); + } + MarkChannelScore.getScore = getScore; +})(MarkChannelScore = exports.MarkChannelScore || (exports.MarkChannelScore = {})); +/** + * Penalize if facet channels are the only dimensions + */ +var DimensionScore; +(function (DimensionScore) { + DimensionScore.DIMENSION = 'dimension'; + function init() { + return { + row: -2, + column: -2, + color: 0, + opacity: 0, + size: 0, + shape: 0 + }; + } + DimensionScore.init = init; + function getScore(specM, schema, opt) { + if (specM.isAggregate()) { + specM.getEncodings().reduce(function (maxFScore, encQ) { + if (!encQ.aggregate && !encQ.autoCount) { + var featureScore = effectiveness_1.getFeatureScore(DimensionScore.DIMENSION, encQ.channel + ''); + if (featureScore.score > maxFScore.score) { + return featureScore; + } + } + return maxFScore; + }, { type: DimensionScore.DIMENSION, feature: 'No Dimension', score: -5 }); + } + return []; + } + DimensionScore.getScore = getScore; +})(DimensionScore = exports.DimensionScore || (exports.DimensionScore = {})); + +},{"../../config":9,"../../query/shorthand":26,"../../util":37,"./effectiveness":31,"./type":33,"vega-lite/src/channel":49}],31:[function(require,module,exports){ +"use strict"; +var channel_1 = require('./channel'); +var mark_1 = require('./mark'); +exports.FEATURE_INDEX = {}; +var FEATURE_FACTORIES = []; +function getFeatureScore(type, feature) { + var score = exports.FEATURE_INDEX[type][feature]; + if (score !== undefined) { + return { + score: score, + type: type, + feature: feature + }; + } + return null; +} +exports.getFeatureScore = getFeatureScore; +function addFeatureFactory(factory) { + FEATURE_FACTORIES.push(factory); + exports.FEATURE_INDEX[factory.type] = factory.init(); +} +exports.addFeatureFactory = addFeatureFactory; +addFeatureFactory({ + type: channel_1.TypeChannelScore.TYPE_CHANNEL, + init: channel_1.TypeChannelScore.init, + getScore: channel_1.TypeChannelScore.getScore +}); +addFeatureFactory({ + type: channel_1.PreferredAxisScore.PREFERRED_AXIS, + init: channel_1.PreferredAxisScore.init, + getScore: channel_1.PreferredAxisScore.getScore +}); +addFeatureFactory({ + type: channel_1.PreferredFacetScore.PREFERRED_FACET, + init: channel_1.PreferredFacetScore.init, + getScore: channel_1.PreferredFacetScore.getScore +}); +addFeatureFactory({ + type: channel_1.MarkChannelScore.MARK_CHANNEL, + init: channel_1.MarkChannelScore.init, + getScore: channel_1.MarkChannelScore.getScore +}); +addFeatureFactory({ + type: mark_1.MarkScore.MARK_SCORE, + init: mark_1.MarkScore.init, + getScore: mark_1.MarkScore.getScore +}); +// TODO: x/y, row/column preference +// TODO: stacking +// TODO: Channel, Cardinality +// TODO: Penalize over encoding +function getExtendedType(encQ) { + return (encQ.bin ? 'bin_' : encQ.timeUnit ? 'timeUnit_' : '') + encQ.type; +} +exports.getExtendedType = getExtendedType; +function default_1(specM, schema, opt) { + var features = FEATURE_FACTORIES.reduce(function (f, factory) { + var scores = factory.getScore(specM, schema, opt); + return f.concat(scores); + }, []); + return { + score: features.reduce(function (s, f) { + return s + f.score; + }, 0), + features: features + }; +} +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = default_1; + +},{"./channel":30,"./mark":32}],32:[function(require,module,exports){ +"use strict"; +var channel_1 = require('vega-lite/src/channel'); +var mark_1 = require('vega-lite/src/mark'); +var util_1 = require('../../util'); +var effectiveness_1 = require('./effectiveness'); +var type_1 = require('./type'); +var MarkScore; +(function (MarkScore) { + MarkScore.MARK_SCORE = 'markScore'; + function featurize(xType, yType, hasOcclusion, mark) { + return xType + '_' + yType + '_' + hasOcclusion + '_' + mark; + } + MarkScore.featurize = featurize; + function init() { + var MEASURES = [type_1.Q, type_1.T]; + var DIMENSIONS = [type_1.BIN_Q, type_1.TIMEUNIT_T, type_1.O, type_1.N]; + var DIMENSIONS_OR_NONE = DIMENSIONS.concat([type_1.NONE]); + var SCORE = {}; + // QxQ + MEASURES.forEach(function (xType) { + MEASURES.forEach(function (yType) { + // has occlusion + var occludedQQMark = { + point: 0, + text: -0.2, + tick: -0.5, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + util_1.forEach(occludedQQMark, function (score, mark) { + var feature = featurize(xType, yType, true, mark); + SCORE[feature] = score; + }); + // no occlusion + // TODO: possible to use connected scatter plot + var noOccludedQQMark = { + point: 0, + text: -0.2, + tick: -0.5, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + util_1.forEach(noOccludedQQMark, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + }); + }); + }); + // DxQ, QxD + MEASURES.forEach(function (xType) { + // has occlusion + DIMENSIONS_OR_NONE.forEach(function (yType) { + var occludedDimensionMeasureMark = { + tick: 0, + point: -0.2, + text: -0.5, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + util_1.forEach(occludedDimensionMeasureMark, function (score, mark) { + var feature = featurize(xType, yType, true, mark); + SCORE[feature] = score; + // also do the inverse + var feature2 = featurize(yType, xType, true, mark); + SCORE[feature2] = score; + }); + }); + // no occlusion + [type_1.NONE, type_1.N].forEach(function (yType) { + var noOccludedQxN = { + bar: 0, + point: -0.2, + tick: -0.25, + text: -0.3, + // Line / Area can mislead trend for N + line: -2, + area: -2, + // Non-sense to use rule here + rule: -2.5 + }; + util_1.forEach(noOccludedQxN, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + // also do the inverse + var feature2 = featurize(yType, xType, false, mark); + SCORE[feature2] = score; + }); + }); + [type_1.BIN_Q].forEach(function (yType) { + var noOccludedQxBinQ = { + bar: 0, + point: -0.2, + tick: -0.25, + text: -0.3, + // Line / Area isn't the best fit for bin + line: -0.5, + area: -0.5, + // Non-sense to use rule here + rule: -2.5 + }; + util_1.forEach(noOccludedQxBinQ, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + // also do the inverse + var feature2 = featurize(yType, xType, false, mark); + SCORE[feature2] = score; + }); + }); + [type_1.TIMEUNIT_T, type_1.O].forEach(function (yType) { + var noOccludedQxBinQ = { + line: 0, + area: -0.1, + bar: -0.2, + point: -0.3, + tick: -0.35, + text: -0.4, + // Non-sense to use rule here + rule: -2.5 + }; + util_1.forEach(noOccludedQxBinQ, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + // also do the inverse + var feature2 = featurize(yType, xType, false, mark); + SCORE[feature2] = score; + }); + }); + }); + // DxD + DIMENSIONS_OR_NONE.forEach(function (xType) { + DIMENSIONS_OR_NONE.forEach(function (yType) { + // has occlusion + var ddMark = { + point: 0, + rect: 0, + text: -0.1, + tick: -1, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + // No difference between has occlusion and no occlusion + util_1.forEach(ddMark, function (score, mark) { + var feature = featurize(xType, yType, true, mark); + SCORE[feature] = score; + }); + util_1.forEach(ddMark, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + }); + }); + }); + return SCORE; + } + MarkScore.init = init; + function getScore(specM, schema, opt) { + var mark = specM.getMark(); + if (mark === mark_1.Mark.CIRCLE || mark === mark_1.Mark.SQUARE) { + mark = mark_1.Mark.POINT; + } + var xEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.X); + var xType = xEncQ ? effectiveness_1.getExtendedType(xEncQ) : '-'; + var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y); + var yType = yEncQ ? effectiveness_1.getExtendedType(yEncQ) : '-'; + var isOccluded = !specM.isAggregate(); // FIXME + var feature = xType + '_' + yType + '_' + isOccluded + '_' + mark; + var featureScore = effectiveness_1.getFeatureScore(MarkScore.MARK_SCORE, feature); + return [featureScore]; + } + MarkScore.getScore = getScore; +})(MarkScore = exports.MarkScore || (exports.MarkScore = {})); + +},{"../../util":37,"./effectiveness":31,"./type":33,"vega-lite/src/channel":49,"vega-lite/src/mark":52}],33:[function(require,module,exports){ +"use strict"; +var type_1 = require('vega-lite/src/type'); +/** + * Finer grained data types that takes binning and timeUnit into account. + */ +(function (ExtendedType) { + ExtendedType[ExtendedType["Q"] = type_1.Type.QUANTITATIVE] = "Q"; + ExtendedType[ExtendedType["BIN_Q"] = 'bin_' + type_1.Type.QUANTITATIVE] = "BIN_Q"; + ExtendedType[ExtendedType["T"] = type_1.Type.TEMPORAL] = "T"; + ExtendedType[ExtendedType["TIMEUNIT_T"] = 'timeUnit_' + type_1.Type.TEMPORAL] = "TIMEUNIT_T"; + ExtendedType[ExtendedType["O"] = type_1.Type.ORDINAL] = "O"; + ExtendedType[ExtendedType["N"] = type_1.Type.NOMINAL] = "N"; + ExtendedType[ExtendedType["NONE"] = '-'] = "NONE"; +})(exports.ExtendedType || (exports.ExtendedType = {})); +var ExtendedType = exports.ExtendedType; +exports.Q = ExtendedType.Q; +exports.BIN_Q = ExtendedType.BIN_Q; +exports.T = ExtendedType.T; +exports.TIMEUNIT_T = ExtendedType.TIMEUNIT_T; +exports.O = ExtendedType.O; +exports.N = ExtendedType.N; +exports.NONE = ExtendedType.NONE; + +},{"vega-lite/src/type":57}],34:[function(require,module,exports){ +"use strict"; +var modelgroup_1 = require('../modelgroup'); +exports.effectiveness = require('./effectiveness/effectiveness'); +exports.aggregation = require('./aggregation'); +/** + * Registry for all encoding ranking functions + */ +var rankingRegistry = {}; +/** + * Add an ordering function to the registry. + */ +function register(name, keyFn) { + rankingRegistry[name] = keyFn; +} +exports.register = register; +function get(name) { + return rankingRegistry[name]; +} +exports.get = get; +function rank(group, query, schema, level) { + if (!query.nest || level === query.nest.length) { + if (query.orderBy || query.chooseBy) { + group.items.sort(comparator(query.orderBy || query.chooseBy, schema, query.config)); + if (query.chooseBy) { + if (group.items.length > 0) { + // for chooseBy -- only keep the top-item + group.items = [group.items[0]]; + } + else { + group.items = []; + } + } + } + } + else { + // sort lower-level nodes first because our ranking takes top-item in the subgroup + group.items.forEach(function (subgroup) { + rank(subgroup, query, schema, level + 1); + }); + if (query.nest[level].orderGroupBy) { + group.items.sort(groupComparator(query.nest[level].orderGroupBy, schema, query.config)); + } + } + return group; +} +exports.rank = rank; +function getScore(model, rankingName, schema, opt) { + if (model.getRankingScore(rankingName) !== undefined) { + return model.getRankingScore(rankingName); + } + var fn = get(rankingName); + var score = fn(model, schema, opt); + model.setRankingScore(rankingName, score); + return score; +} +function comparator(name, schema, opt) { + return function (m1, m2) { + return getScore(m2, name, schema, opt).score - getScore(m1, name, schema, opt).score; + }; +} +exports.comparator = comparator; +function groupComparator(name, schema, opt) { + return function (g1, g2) { + var m1 = modelgroup_1.getTopItem(g1); + var m2 = modelgroup_1.getTopItem(g2); + return getScore(m2, name, schema, opt).score - getScore(m1, name, schema, opt).score; + }; +} +exports.groupComparator = groupComparator; +exports.EFFECTIVENESS = 'effectiveness'; +register(exports.EFFECTIVENESS, exports.effectiveness.default); +register(exports.aggregation.name, exports.aggregation.score); + +},{"../modelgroup":20,"./aggregation":29,"./effectiveness/effectiveness":31}],35:[function(require,module,exports){ +"use strict"; +var type_1 = require('vega-lite/src/type'); +var bin_1 = require('vega-lite/src/bin'); +var timeunit_1 = require('vega-lite/src/timeunit'); +var stats_1 = require('datalib/src/stats'); +var type_2 = require('datalib/src/import/type'); +var dlBin = require('datalib/src/bins/bins'); +var config_1 = require('./config'); +var util_1 = require('./util'); +var Schema = (function () { + function Schema(fieldSchemas) { + this.fieldSchemas = fieldSchemas; + this.fieldSchemaIndex = fieldSchemas.reduce(function (m, fieldSchema) { + m[fieldSchema.field] = fieldSchema; + return m; + }, {}); + } + /** + * Build a Schema object. + * + * @param data - a set of raw data + * @return a Schema object + */ + Schema.build = function (data, opt) { + if (opt === void 0) { opt = {}; } + opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt); + // create profiles for each variable + var summaries = stats_1.summary(data); + var types = type_2.inferAll(data); // inferAll does stronger type inference than summary + var fieldSchemas = summaries.map(function (summary) { + var field = summary.field; + var primitiveType = types[field]; + var distinct = summary.distinct; + var type; + if (primitiveType === PrimitiveType.NUMBER) { + type = type_1.Type.QUANTITATIVE; + } + else if (primitiveType === PrimitiveType.INTEGER) { + // use ordinal or nominal when cardinality of integer type is relatively low + if (distinct / summary.count < opt.numberOrdinalProportion) { + // use nominal if the integers are 1,2,3,...,N or 0,1,2,3,...,N-1 where N = cardinality + type = (summary.max - summary.min === distinct - 1 && util_1.contains([0, 1], summary.min)) ? type_1.Type.NOMINAL : type_1.Type.ORDINAL; + } + else { + type = type_1.Type.QUANTITATIVE; + } + } + else if (primitiveType === PrimitiveType.DATE) { + type = type_1.Type.TEMPORAL; + // need to get correct min/max of date data because datalib's summary method does not + // calculate this correctly for date types. + summary.min = new Date(data[0][field]); + summary.max = new Date(data[0][field]); + for (var i = 0; i < data.length; i++) { + var time = new Date(data[i][field]).getTime(); + if (time < summary.min.getTime()) { + summary.min = new Date(time); + } + if (time > summary.max.getTime()) { + summary.max = new Date(time); + } + } + } + else { + type = type_1.Type.NOMINAL; + } + return { + field: field, + type: type, + primitiveType: primitiveType, + stats: summary, + timeStats: {}, + binStats: {} + }; + }); + // order the fieldSchemas (sort them) + var order = { + 'nominal': 0, + 'ordinal': 1, + 'temporal': 2, + 'quantitative': 3 + }; + fieldSchemas.sort(function (a, b) { + // first order by type: nominal < temporal < quantitative < ordinal + if (order[a.type] < order[b.type]) { + return -1; + } + else if (order[a.type] > order[b.type]) { + return 1; + } + else { + // then order by field (alphabetically) + return a.field.localeCompare(b.field); + } + }); + // calculate preset bins for quantitative and temporal data + for (var _i = 0, fieldSchemas_1 = fieldSchemas; _i < fieldSchemas_1.length; _i++) { + var fieldSchema = fieldSchemas_1[_i]; + if (fieldSchema.type === type_1.Type.QUANTITATIVE) { + for (var _a = 0, _b = opt.maxBinsList; _a < _b.length; _a++) { + var maxbins = _b[_a]; + fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats); + } + } + else if (fieldSchema.type === type_1.Type.TEMPORAL) { + for (var _c = 0, _d = opt.timeUnits; _c < _d.length; _c++) { + var unit = _d[_c]; + if (unit !== undefined) { + fieldSchema.timeStats[unit] = timeSummary(unit, fieldSchema.stats); + } + } + } + } + return new Schema(fieldSchemas); + }; + Schema.prototype.fields = function () { + return this.fieldSchemas.map(function (fieldSchema) { return fieldSchema.field; }); + }; + /** + * @return primitive type of the field if exist, otherwise return null + */ + Schema.prototype.primitiveType = function (field) { + return this.fieldSchemaIndex[field] ? this.fieldSchemaIndex[field].primitiveType : null; + }; + /** + * @return type of measturement of the field if exist, otherwise return null + */ + Schema.prototype.type = function (field) { + return this.fieldSchemaIndex[field] ? this.fieldSchemaIndex[field].type : null; + }; + /** @return cardinality of the field associated with encQ, null if it doesn't exist. + * @param augmentTimeUnitDomain - TimeUnit field domains will not be augmented if explicitly set to false. + */ + Schema.prototype.cardinality = function (encQ, augmentTimeUnitDomain) { + if (augmentTimeUnitDomain === void 0) { augmentTimeUnitDomain = true; } + var fieldSchema = this.fieldSchemaIndex[encQ.field]; + if (encQ.aggregate || encQ.autoCount) { + return 1; + } + else if (encQ.bin) { + // encQ.bin will either be a boolean or a BinQuery + var bin; + if (typeof encQ.bin === 'boolean') { + // autoMaxBins defaults to 10 if channel is EnumSpec + bin = { + maxbins: bin_1.autoMaxBins(encQ.channel) + }; + } + else { + bin = encQ.bin; + } + var maxbins = bin.maxbins; + if (!fieldSchema.binStats[maxbins]) { + // need to calculate + fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats); + } + return fieldSchema.binStats[maxbins].distinct; + } + else if (encQ.timeUnit) { + if (augmentTimeUnitDomain) { + switch (encQ.timeUnit) { + // TODO: this should not always be the case once Vega-Lite supports turning off domain augmenting (VL issue #1385) + case timeunit_1.TimeUnit.SECONDS: return 60; + case timeunit_1.TimeUnit.MINUTES: return 60; + case timeunit_1.TimeUnit.HOURS: return 24; + case timeunit_1.TimeUnit.DAY: return 7; + case timeunit_1.TimeUnit.DATE: return 31; + case timeunit_1.TimeUnit.MONTH: return 12; + case timeunit_1.TimeUnit.QUARTER: return 4; + case timeunit_1.TimeUnit.MILLISECONDS: return 1000; + } + } + // if the cardinality for the timeUnit is not cached, calculate it + if (!fieldSchema.timeStats[encQ.timeUnit]) { + fieldSchema.timeStats[encQ.timeUnit] = timeSummary(encQ.timeUnit, fieldSchema.stats); + } + return fieldSchema.timeStats[encQ.timeUnit].distinct; + } + else { + return fieldSchema ? fieldSchema.stats.distinct : null; + } + }; + Schema.prototype.domain = function (encQ) { + // TODO: differentiate for field with bin / timeUnit + var fieldSchema = this.fieldSchemaIndex[encQ.field]; + var domain = util_1.keys(fieldSchema.stats.unique); + if (fieldSchema.type === type_1.Type.QUANTITATIVE || fieldSchema.primitiveType === PrimitiveType.DATE) { + // return [min, max] for quantitative and date data + domain = [fieldSchema.stats.min, fieldSchema.stats.max]; + } + else if (fieldSchema.primitiveType === PrimitiveType.INTEGER || + fieldSchema.primitiveType === PrimitiveType.NUMBER) { + // coerce non-quantitative numerical data into number type + domain = domain.map(function (x) { return +x; }); + } + return domain.sort(); + }; + /** + * @return a Summary corresponding to the field of the given EncodingQuery + */ + Schema.prototype.stats = function (encQ) { + // TODO: differentiate for field with bin / timeUnit vs without + var fieldSchema = this.fieldSchemaIndex[encQ.field]; + return fieldSchema ? fieldSchema.stats : null; + }; + return Schema; +}()); +exports.Schema = Schema; +/** + * @return a summary of the binning scheme determined from the given max number of bins + */ +function binSummary(maxbins, summary) { + var bin = dlBin({ + min: summary.min, + max: summary.max, + maxbins: maxbins + }); + // start with summary, pre-binning + var result = util_1.extend({}, summary); + result.unique = binUnique(bin, summary.unique); + result.distinct = (bin.stop - bin.start) / bin.step; + result.min = bin.start; + result.max = bin.stop; + return result; +} +/** @return a modified version of the passed summary with unique and distinct set according to the timeunit */ +function timeSummary(timeunit, summary) { + var result = util_1.extend({}, summary); + var unique = {}; + util_1.keys(summary.unique).forEach(function (dateString) { + var date = new Date(dateString); + var key = ((timeunit === timeunit_1.TimeUnit.DAY) ? date.getDay() : timeunit_1.convert(timeunit, new Date(dateString))).toString(); + unique[key] = unique[key] ? unique[key] + summary.unique[dateString] : summary.unique[dateString]; + }); + result.unique = unique; + result.distinct = util_1.keys(unique).length; + return result; +} +/** + * @return a new unique object based off of the old unique count and a binning scheme + */ +function binUnique(bin, oldUnique) { + var newUnique = {}; + for (var value in oldUnique) { + var bucket = bin.value(Number(value)); + if (!newUnique[bucket]) { + newUnique[bucket] = oldUnique[value]; + } + else { + newUnique[bucket] += oldUnique[value]; + } + } + return newUnique; +} +(function (PrimitiveType) { + PrimitiveType[PrimitiveType["STRING"] = 'string'] = "STRING"; + PrimitiveType[PrimitiveType["NUMBER"] = 'number'] = "NUMBER"; + PrimitiveType[PrimitiveType["INTEGER"] = 'integer'] = "INTEGER"; + PrimitiveType[PrimitiveType["BOOLEAN"] = 'boolean'] = "BOOLEAN"; + PrimitiveType[PrimitiveType["DATE"] = 'date'] = "DATE"; +})(exports.PrimitiveType || (exports.PrimitiveType = {})); +var PrimitiveType = exports.PrimitiveType; + +},{"./config":9,"./util":37,"datalib/src/bins/bins":3,"datalib/src/import/type":5,"datalib/src/stats":6,"vega-lite/src/bin":48,"vega-lite/src/timeunit":56,"vega-lite/src/type":57}],36:[function(require,module,exports){ +"use strict"; +var channel_1 = require('vega-lite/src/channel'); +var scale_1 = require('vega-lite/src/scale'); +var type_1 = require('vega-lite/src/type'); +var config_1 = require('./config'); +var encoding_1 = require('./query/encoding'); +var util_1 = require('./util'); +function stylize(answerSet, schema, opt) { + answerSet = answerSet.map(function (specM) { + if (opt.smallBandSizeForHighCardinalityOrFacet) { + specM = smallBandSizeForHighCardinalityOrFacet(specM, schema); + } + if (opt.nominalColorScaleForHighCardinality) { + specM = nominalColorScaleForHighCardinality(specM, schema); + } + return specM; + }); + return answerSet; +} +exports.stylize = stylize; +var encQIndex = {}; +function smallBandSizeForHighCardinalityOrFacet(specM, schema) { + [channel_1.Channel.ROW, channel_1.Channel.Y, channel_1.Channel.COLUMN, channel_1.Channel.X].forEach(function (channel) { + encQIndex[channel] = specM.getEncodingQueryByChannel(channel); + }); + var yEncQ = encQIndex[channel_1.Channel.Y]; + if (yEncQ !== undefined) { + if (encQIndex[channel_1.Channel.ROW] || + schema.cardinality(yEncQ) > config_1.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality) { + // We check for undefined rather than + // yEncQ.scale = yEncQ.scale || {} to cover the case where + // yEncQ.scale has been set to false/null. + // This prevents us from incorrectly overriding scale and + // assigning a bandSize when scale is set to false. + if (yEncQ.scale === undefined) { + yEncQ.scale = {}; + } + // We do not want to assign a bandSize if scale is set to false + // and we only apply this if the scale is (or can be) an ordinal scale. + if (yEncQ.scale && util_1.contains([scale_1.ScaleType.ORDINAL, undefined], encoding_1.scaleType(yEncQ.scale.type, yEncQ.timeUnit, yEncQ.type))) { + if (!yEncQ.scale.bandSize) { + yEncQ.scale.bandSize = 12; + } + } + } + } + var xEncQ = encQIndex[channel_1.Channel.X]; + if (xEncQ !== undefined) { + if (encQIndex[channel_1.Channel.COLUMN] || + schema.cardinality(xEncQ) > config_1.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality) { + // Just like y, we don't want to do this if scale is null/false + if (xEncQ.scale === undefined) { + xEncQ.scale = {}; + } + // We do not want to assign a bandSize if scale is set to false + // and we only apply this if the scale is (or can be) an ordinal scale. + if (xEncQ.scale && util_1.contains([scale_1.ScaleType.ORDINAL, undefined], encoding_1.scaleType(xEncQ.scale.type, xEncQ.timeUnit, xEncQ.type))) { + if (!xEncQ.scale.bandSize) { + xEncQ.scale.bandSize = 12; + } + } + } + } + return specM; +} +exports.smallBandSizeForHighCardinalityOrFacet = smallBandSizeForHighCardinalityOrFacet; +function nominalColorScaleForHighCardinality(specM, schema) { + encQIndex[channel_1.Channel.COLOR] = specM.getEncodingQueryByChannel(channel_1.Channel.COLOR); + var colorEncQ = encQIndex[channel_1.Channel.COLOR]; + if ((colorEncQ !== undefined) && (colorEncQ.type === type_1.Type.NOMINAL) && + (schema.cardinality(colorEncQ) > config_1.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.maxCardinality)) { + if (colorEncQ.scale === undefined) { + colorEncQ.scale = {}; + } + if (colorEncQ.scale) { + if (!colorEncQ.scale.range) { + colorEncQ.scale.range = config_1.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.palette; + } + } + } + return specM; +} +exports.nominalColorScaleForHighCardinality = nominalColorScaleForHighCardinality; + +},{"./config":9,"./query/encoding":23,"./util":37,"vega-lite/src/channel":49,"vega-lite/src/scale":53,"vega-lite/src/type":57}],37:[function(require,module,exports){ +"use strict"; +var util_1 = require('datalib/src/util'); +var util_2 = require('datalib/src/util'); +exports.keys = util_2.keys; +exports.duplicate = util_2.duplicate; +exports.extend = util_2.extend; +exports.isObject = util_2.isObject; +exports.isArray = util_2.isArray; +function contains(array, item) { + return array.indexOf(item) !== -1; +} +exports.contains = contains; +; +function every(arr, f) { + var i = 0, k; + for (k in arr) { + if (!f(arr[k], k, i++)) { + return false; + } + } + return true; +} +exports.every = every; +; +function forEach(obj, f, thisArg) { + if (obj.forEach) { + obj.forEach.call(thisArg, f); + } + else { + for (var k in obj) { + f.call(thisArg, obj[k], k, obj); + } + } +} +exports.forEach = forEach; +; +function some(arr, f) { + var i = 0, k; + for (k in arr) { + if (f(arr[k], k, i++)) { + return true; + } + } + return false; +} +exports.some = some; +; +function nestedMap(array, f) { + return array.map(function (a) { + if (util_1.isArray(a)) { + return nestedMap(a, f); + } + return f(a); + }); +} +exports.nestedMap = nestedMap; +/** Returns the array without the elements in item */ +function without(array, excludedItems) { + return array.filter(function (item) { + return !contains(excludedItems, item); + }); +} +exports.without = without; + +},{"datalib/src/util":8}],38:[function(require,module,exports){ +arguments[4][2][0].apply(exports,arguments) +},{"dup":2}],39:[function(require,module,exports){ +arguments[4][3][0].apply(exports,arguments) +},{"../time":41,"../util":42,"dup":3}],40:[function(require,module,exports){ +arguments[4][4][0].apply(exports,arguments) +},{"./util":42,"dup":4}],41:[function(require,module,exports){ +arguments[4][7][0].apply(exports,arguments) +},{"d3-time":38,"dup":7}],42:[function(require,module,exports){ +(function (Buffer){ +var u = module.exports; + +// utility functions + +var FNAME = '__name__'; + +u.namedfunc = function(name, f) { return (f[FNAME] = name, f); }; + +u.name = function(f) { return f==null ? null : f[FNAME]; }; + +u.identity = function(x) { return x; }; + +u.true = u.namedfunc('true', function() { return true; }); + +u.false = u.namedfunc('false', function() { return false; }); + +u.duplicate = function(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +u.equal = function(a, b) { + return JSON.stringify(a) === JSON.stringify(b); +}; + +u.extend = function(obj) { + for (var x, name, i=1, len=arguments.length; i 1 ? + function(x, v) { + for (var i=0; i b || b == null) && a != null ? 1 : + ((b = b instanceof Date ? +b : b), + (a = a instanceof Date ? +a : a)) !== a && b === b ? -1 : + b !== b && a === a ? 1 : 0; +}; + +u.numcmp = function(a, b) { return a - b; }; + +u.stablesort = function(array, sortBy, keyFn) { + var indices = array.reduce(function(idx, v, i) { + return (idx[keyFn(v)] = i, idx); + }, {}); + + array.sort(function(a, b) { + var sa = sortBy(a), + sb = sortBy(b); + return sa < sb ? -1 : sa > sb ? 1 + : (indices[keyFn(a)] - indices[keyFn(b)]); + }); + + return array; +}; + +// permutes an array using a Knuth shuffle +u.permute = function(a) { + var m = a.length, + swap, + i; + + while (m) { + i = Math.floor(Math.random() * m--); + swap = a[m]; + a[m] = a[i]; + a[i] = swap; + } +}; + +// string functions + +u.pad = function(s, length, pos, padchar) { + padchar = padchar || " "; + var d = length - s.length; + if (d <= 0) return s; + switch (pos) { + case 'left': + return strrep(d, padchar) + s; + case 'middle': + case 'center': + return strrep(Math.floor(d/2), padchar) + + s + strrep(Math.ceil(d/2), padchar); + default: + return s + strrep(d, padchar); + } +}; + +function strrep(n, str) { + var s = "", i; + for (i=0; i= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (!isFinite(number)) { + error("Bad number"); + } else { + return number; + } + }, + + string = function () { + // Parse a string value. + var hex, + i, + string = '', + uffff; + + // When parsing for string values, we must look for " and \ characters. + if (ch === '"') { + while (next()) { + if (ch === '"') { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else { + string += ch; + } + } + } + error("Bad string"); + }, + + white = function () { + +// Skip whitespace. + + while (ch && ch <= ' ') { + next(); + } + }, + + word = function () { + +// true, false, or null. + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error("Unexpected '" + ch + "'"); + }, + + value, // Place holder for the value function. + + array = function () { + +// Parse an array value. + + var array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error("Bad array"); + }, + + object = function () { + +// Parse an object value. + + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if (Object.hasOwnProperty.call(object, key)) { + error('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error("Bad object"); + }; + +value = function () { + +// Parse a JSON value. It could be an object, an array, a string, a number, +// or a word. + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } +}; + +// Return the json_parse function. It will have access to all of the above +// functions and variables. + +module.exports = function (source, reviver) { + var result; + + text = source; + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error("Syntax error"); + } + + // If there is a reviver function, we recursively walk the new structure, + // passing each name/value pair to the reviver function for possible + // transformation, starting with a temporary root object that holds the result + // in an empty key. If there is not a reviver function, we simply return the + // result. + + return typeof reviver === 'function' ? (function walk(holder, key) { + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({'': result}, '')) : result; +}; + +},{}],46:[function(require,module,exports){ +var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + +function quote(string) { + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can safely slap some quotes around it. + // Otherwise we must also replace the offending characters with safe escape + // sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; +} + +function str(key, holder) { + // Produce a string from holder[key]. + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + + // If the value has a toJSON method, call it to obtain a replacement value. + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + // If we were called with a replacer function, then call the replacer to + // obtain a replacement value. + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + + // What happens next depends on the value's type. + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + // JSON numbers must be finite. Encode non-finite numbers as null. + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + // If the value is a boolean or null, convert it to a string. Note: + // typeof null does not produce 'null'. The case is included here in + // the remote chance that this gets fixed someday. + return String(value); + + case 'object': + if (!value) return 'null'; + gap += indent; + partial = []; + + // Array.isArray + if (Object.prototype.toString.apply(value) === '[object Array]') { + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + + // Join all of the elements together, separated with commas, and + // wrap them in brackets. + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + + // If the replacer is an array, use it to select the members to be + // stringified. + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + else { + // Otherwise, iterate through all of the keys in the object. + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + + // Join all of the member texts together, separated with commas, + // and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } +} + +module.exports = function (value, replacer, space) { + var i; + gap = ''; + indent = ''; + + // If the space parameter is a number, make an indent string containing that + // many spaces. + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + } + // If the space parameter is a string, it will be used as the indent string. + else if (typeof space === 'string') { + indent = space; + } + + // If there is a replacer, it must be a function or an array. + // Otherwise, throw an error. + rep = replacer; + if (replacer && typeof replacer !== 'function' + && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + + // Make a fake root object containing our value under the key of ''. + // Return the result of stringifying the value. + return str('', {'': value}); +}; + +},{}],47:[function(require,module,exports){ +"use strict"; +(function (AggregateOp) { + AggregateOp[AggregateOp["VALUES"] = 'values'] = "VALUES"; + AggregateOp[AggregateOp["COUNT"] = 'count'] = "COUNT"; + AggregateOp[AggregateOp["VALID"] = 'valid'] = "VALID"; + AggregateOp[AggregateOp["MISSING"] = 'missing'] = "MISSING"; + AggregateOp[AggregateOp["DISTINCT"] = 'distinct'] = "DISTINCT"; + AggregateOp[AggregateOp["SUM"] = 'sum'] = "SUM"; + AggregateOp[AggregateOp["MEAN"] = 'mean'] = "MEAN"; + AggregateOp[AggregateOp["AVERAGE"] = 'average'] = "AVERAGE"; + AggregateOp[AggregateOp["VARIANCE"] = 'variance'] = "VARIANCE"; + AggregateOp[AggregateOp["VARIANCEP"] = 'variancep'] = "VARIANCEP"; + AggregateOp[AggregateOp["STDEV"] = 'stdev'] = "STDEV"; + AggregateOp[AggregateOp["STDEVP"] = 'stdevp'] = "STDEVP"; + AggregateOp[AggregateOp["MEDIAN"] = 'median'] = "MEDIAN"; + AggregateOp[AggregateOp["Q1"] = 'q1'] = "Q1"; + AggregateOp[AggregateOp["Q3"] = 'q3'] = "Q3"; + AggregateOp[AggregateOp["MODESKEW"] = 'modeskew'] = "MODESKEW"; + AggregateOp[AggregateOp["MIN"] = 'min'] = "MIN"; + AggregateOp[AggregateOp["MAX"] = 'max'] = "MAX"; + AggregateOp[AggregateOp["ARGMIN"] = 'argmin'] = "ARGMIN"; + AggregateOp[AggregateOp["ARGMAX"] = 'argmax'] = "ARGMAX"; +})(exports.AggregateOp || (exports.AggregateOp = {})); +var AggregateOp = exports.AggregateOp; +exports.AGGREGATE_OPS = [ + AggregateOp.VALUES, + AggregateOp.COUNT, + AggregateOp.VALID, + AggregateOp.MISSING, + AggregateOp.DISTINCT, + AggregateOp.SUM, + AggregateOp.MEAN, + AggregateOp.AVERAGE, + AggregateOp.VARIANCE, + AggregateOp.VARIANCEP, + AggregateOp.STDEV, + AggregateOp.STDEVP, + AggregateOp.MEDIAN, + AggregateOp.Q1, + AggregateOp.Q3, + AggregateOp.MODESKEW, + AggregateOp.MIN, + AggregateOp.MAX, + AggregateOp.ARGMIN, + AggregateOp.ARGMAX, +]; +/** Additive-based aggregation operations. These can be applied to stack. */ +exports.SUM_OPS = [ + AggregateOp.COUNT, + AggregateOp.SUM, + AggregateOp.DISTINCT +]; +exports.SHARED_DOMAIN_OPS = [ + AggregateOp.MEAN, + AggregateOp.AVERAGE, + AggregateOp.STDEV, + AggregateOp.STDEVP, + AggregateOp.MEDIAN, + AggregateOp.Q1, + AggregateOp.Q3, + AggregateOp.MIN, + AggregateOp.MAX, +]; +// TODO: move supportedTypes, supportedEnums from schema to here + +},{}],48:[function(require,module,exports){ +"use strict"; +var channel_1 = require('./channel'); +function autoMaxBins(channel) { + switch (channel) { + case channel_1.ROW: + case channel_1.COLUMN: + case channel_1.SIZE: + // Facets and Size shouldn't have too many bins + // We choose 6 like shape to simplify the rule + case channel_1.SHAPE: + return 6; // Vega's "shape" has 6 distinct values + default: + return 10; + } +} +exports.autoMaxBins = autoMaxBins; + +},{"./channel":49}],49:[function(require,module,exports){ +/* + * Constants and utilities for encoding channels (Visual variables) + * such as 'x', 'y', 'color'. + */ +"use strict"; +var util_1 = require('./util'); +(function (Channel) { + Channel[Channel["X"] = 'x'] = "X"; + Channel[Channel["Y"] = 'y'] = "Y"; + Channel[Channel["X2"] = 'x2'] = "X2"; + Channel[Channel["Y2"] = 'y2'] = "Y2"; + Channel[Channel["ROW"] = 'row'] = "ROW"; + Channel[Channel["COLUMN"] = 'column'] = "COLUMN"; + Channel[Channel["SHAPE"] = 'shape'] = "SHAPE"; + Channel[Channel["SIZE"] = 'size'] = "SIZE"; + Channel[Channel["COLOR"] = 'color'] = "COLOR"; + Channel[Channel["TEXT"] = 'text'] = "TEXT"; + Channel[Channel["DETAIL"] = 'detail'] = "DETAIL"; + Channel[Channel["LABEL"] = 'label'] = "LABEL"; + Channel[Channel["PATH"] = 'path'] = "PATH"; + Channel[Channel["ORDER"] = 'order'] = "ORDER"; + Channel[Channel["OPACITY"] = 'opacity'] = "OPACITY"; +})(exports.Channel || (exports.Channel = {})); +var Channel = exports.Channel; +exports.X = Channel.X; +exports.Y = Channel.Y; +exports.X2 = Channel.X2; +exports.Y2 = Channel.Y2; +exports.ROW = Channel.ROW; +exports.COLUMN = Channel.COLUMN; +exports.SHAPE = Channel.SHAPE; +exports.SIZE = Channel.SIZE; +exports.COLOR = Channel.COLOR; +exports.TEXT = Channel.TEXT; +exports.DETAIL = Channel.DETAIL; +exports.LABEL = Channel.LABEL; +exports.PATH = Channel.PATH; +exports.ORDER = Channel.ORDER; +exports.OPACITY = Channel.OPACITY; +exports.CHANNELS = [exports.X, exports.Y, exports.X2, exports.Y2, exports.ROW, exports.COLUMN, exports.SIZE, exports.SHAPE, exports.COLOR, exports.PATH, exports.ORDER, exports.OPACITY, exports.TEXT, exports.DETAIL, exports.LABEL]; +exports.UNIT_CHANNELS = util_1.without(exports.CHANNELS, [exports.ROW, exports.COLUMN]); +exports.UNIT_SCALE_CHANNELS = util_1.without(exports.UNIT_CHANNELS, [exports.PATH, exports.ORDER, exports.DETAIL, exports.TEXT, exports.LABEL, exports.X2, exports.Y2]); +exports.NONSPATIAL_CHANNELS = util_1.without(exports.UNIT_CHANNELS, [exports.X, exports.Y, exports.X2, exports.Y2]); +exports.NONSPATIAL_SCALE_CHANNELS = util_1.without(exports.UNIT_SCALE_CHANNELS, [exports.X, exports.Y, exports.X2, exports.Y2]); +/** Channels that can serve as groupings for stacked charts. */ +exports.STACK_GROUP_CHANNELS = [exports.COLOR, exports.DETAIL, exports.ORDER, exports.OPACITY, exports.SIZE]; +; +/** + * Return whether a channel supports a particular mark type. + * @param channel channel name + * @param mark the mark type + * @return whether the mark supports the channel + */ +function supportMark(channel, mark) { + return !!getSupportedMark(channel)[mark]; +} +exports.supportMark = supportMark; +/** + * Return a dictionary showing whether a channel supports mark type. + * @param channel + * @return A dictionary mapping mark types to boolean values. + */ +function getSupportedMark(channel) { + switch (channel) { + case exports.X: + case exports.Y: + case exports.COLOR: + case exports.DETAIL: + case exports.ORDER: + case exports.OPACITY: + case exports.ROW: + case exports.COLUMN: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, line: true, area: true, text: true + }; + case exports.X2: + case exports.Y2: + return { + rule: true, bar: true, area: true + }; + case exports.SIZE: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, text: true + }; + case exports.SHAPE: + return { point: true }; + case exports.TEXT: + return { text: true }; + case exports.PATH: + return { line: true }; + } + return {}; +} +exports.getSupportedMark = getSupportedMark; +; +/** + * Return whether a channel supports dimension / measure role + * @param channel + * @return A dictionary mapping role to boolean values. + */ +function getSupportedRole(channel) { + switch (channel) { + case exports.X: + case exports.Y: + case exports.COLOR: + case exports.OPACITY: + case exports.LABEL: + case exports.DETAIL: + return { + measure: true, + dimension: true + }; + case exports.ROW: + case exports.COLUMN: + case exports.SHAPE: + return { + measure: false, + dimension: true + }; + case exports.X2: + case exports.Y2: + case exports.SIZE: + case exports.TEXT: + return { + measure: true, + dimension: false + }; + case exports.PATH: + return { + measure: false, + dimension: true + }; + } + throw new Error('Invalid encoding channel' + channel); +} +exports.getSupportedRole = getSupportedRole; +function hasScale(channel) { + return !util_1.contains([exports.DETAIL, exports.PATH, exports.TEXT, exports.LABEL, exports.ORDER], channel); +} +exports.hasScale = hasScale; + +},{"./util":58}],50:[function(require,module,exports){ +// DateTime definition object +"use strict"; +var util_1 = require('./util'); +function isDateTime(o) { + return !!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day || + !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds; +} +exports.isDateTime = isDateTime; +exports.MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; +exports.SHORT_MONTHS = exports.MONTHS.map(function (m) { return m.substr(0, 3); }); +exports.DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; +exports.SHORT_DAYS = exports.DAYS.map(function (d) { return d.substr(0, 3); }); +function normalizeQuarter(q) { + if (util_1.isNumber(q)) { + // We accept 1-based quarter, so need to readjust to 0-based quarter + return (q - 1) + ''; + } + else { + // Simply an expression string, but normalize should not be called in this case. + console.warn('Potentially invalid quarter', q); + return q; + } +} +function normalizeMonth(m) { + if (util_1.isNumber(m)) { + // We accept 1-based month, so need to readjust to 0-based month + return (m - 1) + ''; + } + else { + var lowerM = m.toLowerCase(); + var monthIndex = exports.MONTHS.indexOf(lowerM); + if (monthIndex !== -1) { + return monthIndex + ''; // 0 for january, ... + } + var shortM = lowerM.substr(0, 3); + var shortMonthIndex = exports.SHORT_MONTHS.indexOf(shortM); + if (shortMonthIndex !== -1) { + return shortMonthIndex + ''; + } + // Simply an expression string, but normalize should not be called in this case. + console.warn('Potentially invalid month', m); + return m; + } +} +function normalizeDay(d) { + if (util_1.isNumber(d)) { + // mod so that this can be both 0-based where 0 = sunday + // and 1-based where 7=sunday + return (d % 7) + ''; + } + else { + var lowerD = d.toLowerCase(); + var dayIndex = exports.DAYS.indexOf(lowerD); + if (dayIndex !== -1) { + return dayIndex + ''; // 0 for january, ... + } + var shortD = lowerD.substr(0, 3); + var shortDayIndex = exports.SHORT_DAYS.indexOf(shortD); + if (shortDayIndex !== -1) { + return shortDayIndex + ''; + } + // Simply an expression string, but normalize should not be called in this case. + console.warn('Potentially invalid day', d); + return d; + } +} +/** + * Return Vega Expression for a particular date time. + * @param d + * @param normalize whether to normalize quarter, month, day. + */ +function dateTimeExpr(d, normalize) { + if (normalize === void 0) { normalize = false; } + var units = []; + if (normalize && d.day !== undefined) { + for (var _i = 0, _a = ['year', 'quarter', 'month', 'date']; _i < _a.length; _i++) { + var unit = _a[_i]; + if (d[unit] !== undefined) { + console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with', unit); + d = util_1.duplicate(d); + delete d.day; + break; + } + } + } + if (d.year !== undefined) { + units.push(d.year); + } + else if (d.day !== undefined) { + // Set year to 2006 for working with day since January 1 2006 is a Sunday + units.push(2006); + } + else { + units.push(0); + } + if (d.month !== undefined) { + var month = normalize ? normalizeMonth(d.month) : d.month; + units.push(month); + } + else if (d.quarter !== undefined) { + var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter; + units.push(quarter + '*3'); + } + else { + units.push(0); // months start at zero in JS + } + if (d.date !== undefined) { + units.push(d.date); + } + else if (d.day !== undefined) { + // HACK: Day only works as a standalone unit + // This is only correct because we always set year to 2006 for day + var day = normalize ? normalizeDay(d.day) : d.day; + units.push(day + '+1'); + } + else { + units.push(1); // Date starts at 1 in JS + } + // Note: can't use TimeUnit enum here as importing it will create + // circular dependency problem! + for (var _b = 0, _c = ['hours', 'minutes', 'seconds', 'milliseconds']; _b < _c.length; _b++) { + var timeUnit = _c[_b]; + if (d[timeUnit] !== undefined) { + units.push(d[timeUnit]); + } + else { + units.push(0); + } + } + return 'datetime(' + units.join(', ') + ')'; +} +exports.dateTimeExpr = dateTimeExpr; + +},{"./util":58}],51:[function(require,module,exports){ +"use strict"; +var channel_1 = require('./channel'); +var util_1 = require('./util'); +function countRetinal(encoding) { + var count = 0; + if (encoding.color) { + count++; + } + if (encoding.opacity) { + count++; + } + if (encoding.size) { + count++; + } + if (encoding.shape) { + count++; + } + return count; +} +exports.countRetinal = countRetinal; +function channels(encoding) { + return channel_1.CHANNELS.filter(function (channel) { + return has(encoding, channel); + }); +} +exports.channels = channels; +// TOD: rename this to hasChannelField and only use we really want it. +function has(encoding, channel) { + var channelEncoding = encoding && encoding[channel]; + return channelEncoding && (channelEncoding.field !== undefined || + // TODO: check that we have field in the array + (util_1.isArray(channelEncoding) && channelEncoding.length > 0)); +} +exports.has = has; +function isAggregate(encoding) { + return util_1.some(channel_1.CHANNELS, function (channel) { + if (has(encoding, channel) && encoding[channel].aggregate) { + return true; + } + return false; + }); +} +exports.isAggregate = isAggregate; +function isRanged(encoding) { + return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2)); +} +exports.isRanged = isRanged; +function fieldDefs(encoding) { + var arr = []; + channel_1.CHANNELS.forEach(function (channel) { + if (has(encoding, channel)) { + if (util_1.isArray(encoding[channel])) { + encoding[channel].forEach(function (fieldDef) { + arr.push(fieldDef); + }); + } + else { + arr.push(encoding[channel]); + } + } + }); + return arr; +} +exports.fieldDefs = fieldDefs; +; +function forEach(encoding, f, thisArg) { + channelMappingForEach(channel_1.CHANNELS, encoding, f, thisArg); +} +exports.forEach = forEach; +function channelMappingForEach(channels, mapping, f, thisArg) { + var i = 0; + channels.forEach(function (channel) { + if (has(mapping, channel)) { + if (util_1.isArray(mapping[channel])) { + mapping[channel].forEach(function (fieldDef) { + f.call(thisArg, fieldDef, channel, i++); + }); + } + else { + f.call(thisArg, mapping[channel], channel, i++); + } + } + }); +} +exports.channelMappingForEach = channelMappingForEach; +function map(encoding, f, thisArg) { + return channelMappingMap(channel_1.CHANNELS, encoding, f, thisArg); +} +exports.map = map; +function channelMappingMap(channels, mapping, f, thisArg) { + var arr = []; + channels.forEach(function (channel) { + if (has(mapping, channel)) { + if (util_1.isArray(mapping[channel])) { + mapping[channel].forEach(function (fieldDef) { + arr.push(f.call(thisArg, fieldDef, channel)); + }); + } + else { + arr.push(f.call(thisArg, mapping[channel], channel)); + } + } + }); + return arr; +} +exports.channelMappingMap = channelMappingMap; +function reduce(encoding, f, init, thisArg) { + return channelMappingReduce(channel_1.CHANNELS, encoding, f, init, thisArg); +} +exports.reduce = reduce; +function channelMappingReduce(channels, mapping, f, init, thisArg) { + var r = init; + channel_1.CHANNELS.forEach(function (channel) { + if (has(mapping, channel)) { + if (util_1.isArray(mapping[channel])) { + mapping[channel].forEach(function (fieldDef) { + r = f.call(thisArg, r, fieldDef, channel); + }); + } + else { + r = f.call(thisArg, r, mapping[channel], channel); + } + } + }); + return r; +} +exports.channelMappingReduce = channelMappingReduce; + +},{"./channel":49,"./util":58}],52:[function(require,module,exports){ +"use strict"; +(function (Mark) { + Mark[Mark["AREA"] = 'area'] = "AREA"; + Mark[Mark["BAR"] = 'bar'] = "BAR"; + Mark[Mark["LINE"] = 'line'] = "LINE"; + Mark[Mark["POINT"] = 'point'] = "POINT"; + Mark[Mark["TEXT"] = 'text'] = "TEXT"; + Mark[Mark["TICK"] = 'tick'] = "TICK"; + Mark[Mark["RULE"] = 'rule'] = "RULE"; + Mark[Mark["CIRCLE"] = 'circle'] = "CIRCLE"; + Mark[Mark["SQUARE"] = 'square'] = "SQUARE"; + Mark[Mark["ERRORBAR"] = 'errorBar'] = "ERRORBAR"; +})(exports.Mark || (exports.Mark = {})); +var Mark = exports.Mark; +exports.AREA = Mark.AREA; +exports.BAR = Mark.BAR; +exports.LINE = Mark.LINE; +exports.POINT = Mark.POINT; +exports.TEXT = Mark.TEXT; +exports.TICK = Mark.TICK; +exports.RULE = Mark.RULE; +exports.CIRCLE = Mark.CIRCLE; +exports.SQUARE = Mark.SQUARE; +exports.ERRORBAR = Mark.ERRORBAR; +exports.PRIMITIVE_MARKS = [exports.AREA, exports.BAR, exports.LINE, exports.POINT, exports.TEXT, exports.TICK, exports.RULE, exports.CIRCLE, exports.SQUARE]; + +},{}],53:[function(require,module,exports){ +"use strict"; +(function (ScaleType) { + ScaleType[ScaleType["LINEAR"] = 'linear'] = "LINEAR"; + ScaleType[ScaleType["LOG"] = 'log'] = "LOG"; + ScaleType[ScaleType["POW"] = 'pow'] = "POW"; + ScaleType[ScaleType["SQRT"] = 'sqrt'] = "SQRT"; + ScaleType[ScaleType["QUANTILE"] = 'quantile'] = "QUANTILE"; + ScaleType[ScaleType["QUANTIZE"] = 'quantize'] = "QUANTIZE"; + ScaleType[ScaleType["ORDINAL"] = 'ordinal'] = "ORDINAL"; + ScaleType[ScaleType["TIME"] = 'time'] = "TIME"; + ScaleType[ScaleType["UTC"] = 'utc'] = "UTC"; +})(exports.ScaleType || (exports.ScaleType = {})); +var ScaleType = exports.ScaleType; +(function (NiceTime) { + NiceTime[NiceTime["SECOND"] = 'second'] = "SECOND"; + NiceTime[NiceTime["MINUTE"] = 'minute'] = "MINUTE"; + NiceTime[NiceTime["HOUR"] = 'hour'] = "HOUR"; + NiceTime[NiceTime["DAY"] = 'day'] = "DAY"; + NiceTime[NiceTime["WEEK"] = 'week'] = "WEEK"; + NiceTime[NiceTime["MONTH"] = 'month'] = "MONTH"; + NiceTime[NiceTime["YEAR"] = 'year'] = "YEAR"; +})(exports.NiceTime || (exports.NiceTime = {})); +var NiceTime = exports.NiceTime; +(function (BandSize) { + BandSize[BandSize["FIT"] = 'fit'] = "FIT"; +})(exports.BandSize || (exports.BandSize = {})); +var BandSize = exports.BandSize; +exports.BANDSIZE_FIT = BandSize.FIT; +exports.defaultScaleConfig = { + round: true, + textBandWidth: 90, + bandSize: 21, + padding: 0.1, + useRawDomain: false, + opacity: [0.3, 0.8], + nominalColorRange: 'category10', + sequentialColorRange: ['#AFC6A3', '#09622A'], + shapeRange: 'shapes', + fontSizeRange: [8, 40], + ruleSizeRange: [1, 5], + tickSizeRange: [1, 20] +}; +exports.defaultFacetScaleConfig = { + round: true, + padding: 16 +}; + +},{}],54:[function(require,module,exports){ +"use strict"; +(function (SortOrder) { + SortOrder[SortOrder["ASCENDING"] = 'ascending'] = "ASCENDING"; + SortOrder[SortOrder["DESCENDING"] = 'descending'] = "DESCENDING"; + SortOrder[SortOrder["NONE"] = 'none'] = "NONE"; +})(exports.SortOrder || (exports.SortOrder = {})); +var SortOrder = exports.SortOrder; +function isSortField(sort) { + return !!sort && !!sort['field'] && !!sort['op']; +} +exports.isSortField = isSortField; + +},{}],55:[function(require,module,exports){ +"use strict"; +var channel_1 = require('./channel'); +var encoding_1 = require('./encoding'); +var mark_1 = require('./mark'); +var util_1 = require('./util'); +(function (StackOffset) { + StackOffset[StackOffset["ZERO"] = 'zero'] = "ZERO"; + StackOffset[StackOffset["CENTER"] = 'center'] = "CENTER"; + StackOffset[StackOffset["NORMALIZE"] = 'normalize'] = "NORMALIZE"; + StackOffset[StackOffset["NONE"] = 'none'] = "NONE"; +})(exports.StackOffset || (exports.StackOffset = {})); +var StackOffset = exports.StackOffset; +function stack(mark, encoding, config) { + var stacked = (config && config.mark) ? config.mark.stacked : undefined; + // Should not have stack explicitly disabled + if (util_1.contains([StackOffset.NONE, null, false], stacked)) { + return null; + } + // Should have stackable mark + if (!util_1.contains([mark_1.BAR, mark_1.AREA], mark)) { + return null; + } + // Should be aggregate plot + if (!encoding_1.isAggregate(encoding)) { + return null; + } + // Should have grouping level of detail + var stackByChannels = channel_1.STACK_GROUP_CHANNELS.reduce(function (sc, channel) { + if (encoding_1.has(encoding, channel) && !encoding[channel].aggregate) { + sc.push(channel); + } + return sc; + }, []); + if (stackByChannels.length === 0) { + return null; + } + // Has only one aggregate axis + var hasXField = encoding_1.has(encoding, channel_1.X); + var hasYField = encoding_1.has(encoding, channel_1.Y); + var xIsAggregate = hasXField && !!encoding.x.aggregate; + var yIsAggregate = hasYField && !!encoding.y.aggregate; + if (xIsAggregate !== yIsAggregate) { + return { + groupbyChannel: xIsAggregate ? (hasYField ? channel_1.Y : null) : (hasXField ? channel_1.X : null), + fieldChannel: xIsAggregate ? channel_1.X : channel_1.Y, + stackByChannels: stackByChannels, + offset: stacked || StackOffset.ZERO + }; + } + return null; +} +exports.stack = stack; + +},{"./channel":49,"./encoding":51,"./mark":52,"./util":58}],56:[function(require,module,exports){ +"use strict"; +var channel_1 = require('./channel'); +var datetime_1 = require('./datetime'); +var scale_1 = require('./scale'); +var util_1 = require('./util'); +(function (TimeUnit) { + TimeUnit[TimeUnit["YEAR"] = 'year'] = "YEAR"; + TimeUnit[TimeUnit["MONTH"] = 'month'] = "MONTH"; + TimeUnit[TimeUnit["DAY"] = 'day'] = "DAY"; + TimeUnit[TimeUnit["DATE"] = 'date'] = "DATE"; + TimeUnit[TimeUnit["HOURS"] = 'hours'] = "HOURS"; + TimeUnit[TimeUnit["MINUTES"] = 'minutes'] = "MINUTES"; + TimeUnit[TimeUnit["SECONDS"] = 'seconds'] = "SECONDS"; + TimeUnit[TimeUnit["MILLISECONDS"] = 'milliseconds'] = "MILLISECONDS"; + TimeUnit[TimeUnit["YEARMONTH"] = 'yearmonth'] = "YEARMONTH"; + // Note: don't add MONTH DATE because it will be incorrect + // since days on a leap year will be shifted by one if + // we only add + TimeUnit[TimeUnit["YEARMONTHDATE"] = 'yearmonthdate'] = "YEARMONTHDATE"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURS"] = 'yearmonthdatehours'] = "YEARMONTHDATEHOURS"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTES"] = 'yearmonthdatehoursminutes'] = "YEARMONTHDATEHOURSMINUTES"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTESSECONDS"] = 'yearmonthdatehoursminutesseconds'] = "YEARMONTHDATEHOURSMINUTESSECONDS"; + TimeUnit[TimeUnit["HOURSMINUTES"] = 'hoursminutes'] = "HOURSMINUTES"; + TimeUnit[TimeUnit["HOURSMINUTESSECONDS"] = 'hoursminutesseconds'] = "HOURSMINUTESSECONDS"; + TimeUnit[TimeUnit["MINUTESSECONDS"] = 'minutesseconds'] = "MINUTESSECONDS"; + TimeUnit[TimeUnit["SECONDSMILLISECONDS"] = 'secondsmilliseconds'] = "SECONDSMILLISECONDS"; + TimeUnit[TimeUnit["QUARTER"] = 'quarter'] = "QUARTER"; + TimeUnit[TimeUnit["YEARQUARTER"] = 'yearquarter'] = "YEARQUARTER"; + TimeUnit[TimeUnit["QUARTERMONTH"] = 'quartermonth'] = "QUARTERMONTH"; + TimeUnit[TimeUnit["YEARQUARTERMONTH"] = 'yearquartermonth'] = "YEARQUARTERMONTH"; +})(exports.TimeUnit || (exports.TimeUnit = {})); +var TimeUnit = exports.TimeUnit; +/** Time Unit that only corresponds to only one part of Date objects. */ +exports.SINGLE_TIMEUNITS = [ + TimeUnit.YEAR, + TimeUnit.QUARTER, + TimeUnit.MONTH, + TimeUnit.DAY, + TimeUnit.DATE, + TimeUnit.HOURS, + TimeUnit.MINUTES, + TimeUnit.SECONDS, + TimeUnit.MILLISECONDS, +]; +var SINGLE_TIMEUNIT_INDEX = exports.SINGLE_TIMEUNITS.reduce(function (d, timeUnit) { + d[timeUnit] = true; + return d; +}, {}); +function isSingleTimeUnit(timeUnit) { + return !!SINGLE_TIMEUNIT_INDEX[timeUnit]; +} +exports.isSingleTimeUnit = isSingleTimeUnit; +/** + * Converts a date to only have the measurements relevant to the specified unit + * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00' + * Note: the base date is Jan 01 1900 00:00:00 + */ +function convert(unit, date) { + var result = new Date(0, 0, 1, 0, 0, 0, 0); // start with uniform date + exports.SINGLE_TIMEUNITS.forEach(function (singleUnit) { + if (containsTimeUnit(unit, singleUnit)) { + switch (singleUnit) { + case TimeUnit.DAY: + throw new Error('Cannot convert to TimeUnits containing \'day\''); + case TimeUnit.YEAR: + result.setFullYear(date.getFullYear()); + break; + case TimeUnit.QUARTER: + // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3) + result.setMonth((Math.floor(date.getMonth() / 3)) * 3); + break; + case TimeUnit.MONTH: + result.setMonth(date.getMonth()); + break; + case TimeUnit.DATE: + result.setDate(date.getDate()); + break; + case TimeUnit.HOURS: + result.setHours(date.getHours()); + break; + case TimeUnit.MINUTES: + result.setMinutes(date.getMinutes()); + break; + case TimeUnit.SECONDS: + result.setSeconds(date.getSeconds()); + break; + case TimeUnit.MILLISECONDS: + result.setMilliseconds(date.getMilliseconds()); + break; + } + } + }); + return result; +} +exports.convert = convert; +exports.MULTI_TIMEUNITS = [ + TimeUnit.YEARQUARTER, + TimeUnit.YEARQUARTERMONTH, + TimeUnit.YEARMONTH, + TimeUnit.YEARMONTHDATE, + TimeUnit.YEARMONTHDATEHOURS, + TimeUnit.YEARMONTHDATEHOURSMINUTES, + TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS, + TimeUnit.QUARTERMONTH, + TimeUnit.HOURSMINUTES, + TimeUnit.HOURSMINUTESSECONDS, + TimeUnit.MINUTESSECONDS, + TimeUnit.SECONDSMILLISECONDS, +]; +var MULTI_TIMEUNIT_INDEX = exports.MULTI_TIMEUNITS.reduce(function (d, timeUnit) { + d[timeUnit] = true; + return d; +}, {}); +function isMultiTimeUnit(timeUnit) { + return !!MULTI_TIMEUNIT_INDEX[timeUnit]; +} +exports.isMultiTimeUnit = isMultiTimeUnit; +exports.TIMEUNITS = exports.SINGLE_TIMEUNITS.concat(exports.MULTI_TIMEUNITS); +/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */ +function containsTimeUnit(fullTimeUnit, timeUnit) { + var fullTimeUnitStr = fullTimeUnit.toString(); + var timeUnitStr = timeUnit.toString(); + var index = fullTimeUnitStr.indexOf(timeUnitStr); + return index > -1 && + (timeUnit !== TimeUnit.SECONDS || + index === 0 || + fullTimeUnitStr.charAt(index - 1) !== 'i' // exclude milliseconds + ); +} +exports.containsTimeUnit = containsTimeUnit; +function defaultScaleType(timeUnit) { + switch (timeUnit) { + case TimeUnit.HOURS: + case TimeUnit.DAY: + case TimeUnit.MONTH: + case TimeUnit.QUARTER: + return scale_1.ScaleType.ORDINAL; + } + // date, year, minute, second, yearmonth, monthday, ... + return scale_1.ScaleType.TIME; +} +exports.defaultScaleType = defaultScaleType; +/** + * Returns Vega expresssion for a given timeUnit and fieldRef + */ +function fieldExpr(fullTimeUnit, field) { + var fieldRef = 'datum["' + field + '"]'; + function func(timeUnit) { + if (timeUnit === TimeUnit.QUARTER) { + // Divide by 3 to get the corresponding quarter number, multiply by 3 + // to scale to the first month of the corresponding quarter(0,3,6,9). + return 'floor(month(' + fieldRef + ')' + '/3)'; + } + else { + return timeUnit + '(' + fieldRef + ')'; + } + } + var d = exports.SINGLE_TIMEUNITS.reduce(function (_d, tu) { + if (containsTimeUnit(fullTimeUnit, tu)) { + _d[tu] = func(tu); + } + return _d; + }, {}); + if (d.day && util_1.keys(d).length > 1) { + console.warn('Time unit "' + fullTimeUnit + '" is not supported. We are replacing it with ', (fullTimeUnit + '').replace('day', 'date') + '.'); + delete d.day; + d.date = func(TimeUnit.DATE); + } + return datetime_1.dateTimeExpr(d); +} +exports.fieldExpr = fieldExpr; +/** Generate the complete raw domain. */ +function rawDomain(timeUnit, channel) { + if (util_1.contains([channel_1.ROW, channel_1.COLUMN, channel_1.SHAPE, channel_1.COLOR], channel)) { + return null; + } + switch (timeUnit) { + case TimeUnit.SECONDS: + return util_1.range(0, 60); + case TimeUnit.MINUTES: + return util_1.range(0, 60); + case TimeUnit.HOURS: + return util_1.range(0, 24); + case TimeUnit.DAY: + return util_1.range(0, 7); + case TimeUnit.DATE: + return util_1.range(1, 32); + case TimeUnit.MONTH: + return util_1.range(0, 12); + case TimeUnit.QUARTER: + return [0, 3, 6, 9]; + } + return null; +} +exports.rawDomain = rawDomain; +/** returns the smallest nice unit for scale.nice */ +function smallestUnit(timeUnit) { + if (!timeUnit) { + return undefined; + } + if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) { + return 'second'; + } + if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) { + return 'minute'; + } + if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) { + return 'hour'; + } + if (containsTimeUnit(timeUnit, TimeUnit.DAY) || + containsTimeUnit(timeUnit, TimeUnit.DATE)) { + return 'day'; + } + if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) { + return 'month'; + } + if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) { + return 'year'; + } + return undefined; +} +exports.smallestUnit = smallestUnit; +/** returns the template name used for axis labels for a time unit */ +function template(timeUnit, field, shortTimeLabels) { + if (!timeUnit) { + return undefined; + } + var dateComponents = []; + if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) { + dateComponents.push(shortTimeLabels ? '%y' : '%Y'); + } + if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) { + // special template for quarter + dateComponents.push('\'}}Q{{' + field + ' | quarter}}{{' + field + ' | time:\''); + } + if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) { + dateComponents.push(shortTimeLabels ? '%b' : '%B'); + } + if (containsTimeUnit(timeUnit, TimeUnit.DAY)) { + dateComponents.push(shortTimeLabels ? '%a' : '%A'); + } + else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) { + dateComponents.push('%d'); + } + var timeComponents = []; + if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) { + timeComponents.push('%H'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) { + timeComponents.push('%M'); + } + if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) { + timeComponents.push('%S'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) { + timeComponents.push('%L'); + } + var out = []; + if (dateComponents.length > 0) { + out.push(dateComponents.join('-')); + } + if (timeComponents.length > 0) { + out.push(timeComponents.join(':')); + } + if (out.length > 0) { + // clean up empty formatting expressions that may have been generated by the quarter time unit + var template_1 = '{{' + field + ' | time:\'' + out.join(' ') + '\'}}'; + // FIXME: Remove these RegExp Hacks!!! + var escapedField = field.replace(/(\[|\])/g, '\\$1'); // excape field for use in Regex + return template_1.replace(new RegExp('{{' + escapedField + ' \\| time:\'\'}}', 'g'), ''); // remove empty templates with Regex + } + else { + return undefined; + } +} +exports.template = template; + +},{"./channel":49,"./datetime":50,"./scale":53,"./util":58}],57:[function(require,module,exports){ +/** Constants and utilities for data type */ +"use strict"; +(function (Type) { + Type[Type["QUANTITATIVE"] = 'quantitative'] = "QUANTITATIVE"; + Type[Type["ORDINAL"] = 'ordinal'] = "ORDINAL"; + Type[Type["TEMPORAL"] = 'temporal'] = "TEMPORAL"; + Type[Type["NOMINAL"] = 'nominal'] = "NOMINAL"; +})(exports.Type || (exports.Type = {})); +var Type = exports.Type; +exports.QUANTITATIVE = Type.QUANTITATIVE; +exports.ORDINAL = Type.ORDINAL; +exports.TEMPORAL = Type.TEMPORAL; +exports.NOMINAL = Type.NOMINAL; +/** + * Mapping from full type names to short type names. + * @type {Object} + */ +exports.SHORT_TYPE = { + quantitative: 'Q', + temporal: 'T', + nominal: 'N', + ordinal: 'O' +}; +/** + * Mapping from short type names to full type names. + * @type {Object} + */ +exports.TYPE_FROM_SHORT_TYPE = { + Q: exports.QUANTITATIVE, + T: exports.TEMPORAL, + O: exports.ORDINAL, + N: exports.NOMINAL +}; +/** + * Get full, lowercase type name for a given type. + * @param type + * @return Full type name. + */ +function getFullName(type) { + var typeString = type; // force type as string so we can translate short types + return exports.TYPE_FROM_SHORT_TYPE[typeString.toUpperCase()] || + typeString.toLowerCase(); +} +exports.getFullName = getFullName; + +},{}],58:[function(require,module,exports){ +/// +/// +"use strict"; +var stringify = require('json-stable-stringify'); +var util_1 = require('datalib/src/util'); +exports.keys = util_1.keys; +exports.extend = util_1.extend; +exports.duplicate = util_1.duplicate; +exports.isArray = util_1.isArray; +exports.vals = util_1.vals; +exports.truncate = util_1.truncate; +exports.toMap = util_1.toMap; +exports.isObject = util_1.isObject; +exports.isString = util_1.isString; +exports.isNumber = util_1.isNumber; +exports.isBoolean = util_1.isBoolean; +var util_2 = require('datalib/src/util'); +var generate_1 = require('datalib/src/generate'); +exports.range = generate_1.range; +var util_3 = require('datalib/src/util'); +/** + * Creates an object composed of the picked object properties. + * + * Example: (from lodash) + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * pick(object, ['a', 'c']); + * // → { 'a': 1, 'c': 3 } + * + */ +function pick(obj, props) { + var copy = {}; + props.forEach(function (prop) { + if (obj.hasOwnProperty(prop)) { + copy[prop] = obj[prop]; + } + }); + return copy; +} +exports.pick = pick; +/** + * The opposite of _.pick; this method creates an object composed of the own + * and inherited enumerable string keyed properties of object that are not omitted. + */ +function omit(obj, props) { + var copy = util_2.duplicate(obj); + props.forEach(function (prop) { + delete copy[prop]; + }); + return copy; +} +exports.omit = omit; +function hash(a) { + if (util_3.isString(a) || util_3.isNumber(a) || util_3.isBoolean(a)) { + return String(a); + } + return stringify(a); +} +exports.hash = hash; +function contains(array, item) { + return array.indexOf(item) > -1; +} +exports.contains = contains; +/** Returns the array without the elements in item */ +function without(array, excludedItems) { + return array.filter(function (item) { + return !contains(excludedItems, item); + }); +} +exports.without = without; +function union(array, other) { + return array.concat(without(other, array)); +} +exports.union = union; +function forEach(obj, f, thisArg) { + if (obj.forEach) { + obj.forEach.call(thisArg, f); + } + else { + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + f.call(thisArg, obj[k], k, obj); + } + } + } +} +exports.forEach = forEach; +function reduce(obj, f, init, thisArg) { + if (obj.reduce) { + return obj.reduce.call(thisArg, f, init); + } + else { + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + init = f.call(thisArg, init, obj[k], k, obj); + } + } + return init; + } +} +exports.reduce = reduce; +function map(obj, f, thisArg) { + if (obj.map) { + return obj.map.call(thisArg, f); + } + else { + var output = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + output.push(f.call(thisArg, obj[k], k, obj)); + } + } + return output; + } +} +exports.map = map; +function some(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (f(arr[k], k, i++)) { + return true; + } + } + return false; +} +exports.some = some; +function every(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (!f(arr[k], k, i++)) { + return false; + } + } + return true; +} +exports.every = every; +function flatten(arrays) { + return [].concat.apply([], arrays); +} +exports.flatten = flatten; +function mergeDeep(dest) { + var src = []; + for (var _i = 1; _i < arguments.length; _i++) { + src[_i - 1] = arguments[_i]; + } + for (var i = 0; i < src.length; i++) { + dest = deepMerge_(dest, src[i]); + } + return dest; +} +exports.mergeDeep = mergeDeep; +; +// recursively merges src into dest +function deepMerge_(dest, src) { + if (typeof src !== 'object' || src === null) { + return dest; + } + for (var p in src) { + if (!src.hasOwnProperty(p)) { + continue; + } + if (src[p] === undefined) { + continue; + } + if (typeof src[p] !== 'object' || src[p] === null) { + dest[p] = src[p]; + } + else if (typeof dest[p] !== 'object' || dest[p] === null) { + dest[p] = mergeDeep(src[p].constructor === Array ? [] : {}, src[p]); + } + else { + mergeDeep(dest[p], src[p]); + } + } + return dest; +} +// FIXME remove this +var dlBin = require('datalib/src/bins/bins'); +function getbins(stats, maxbins) { + return dlBin({ + min: stats.min, + max: stats.max, + maxbins: maxbins + }); +} +exports.getbins = getbins; +function unique(values, f) { + var results = []; + var u = {}, v, i, n; + for (i = 0, n = values.length; i < n; ++i) { + v = f ? f(values[i]) : values[i]; + if (v in u) { + continue; + } + u[v] = 1; + results.push(values[i]); + } + return results; +} +exports.unique = unique; +; +function warning(message) { + console.warn('[VL Warning]', message); +} +exports.warning = warning; +function error(message) { + console.error('[VL Error]', message); +} +exports.error = error; +/** + * Returns true if the two dicitonaries disagree. Applies only to defioned values. + */ +function differ(dict, other) { + for (var key in dict) { + if (dict.hasOwnProperty(key)) { + if (other[key] && dict[key] && other[key] !== dict[key]) { + return true; + } + } + } + return false; +} +exports.differ = differ; + +},{"datalib/src/bins/bins":39,"datalib/src/generate":40,"datalib/src/util":42,"json-stable-stringify":43}]},{},[14])(14) +}); +//# sourceMappingURL=compassql.js.map diff --git a/compassql.js.map b/compassql.js.map new file mode 100644 index 00000000..942d71df --- /dev/null +++ b/compassql.js.map @@ -0,0 +1,121 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "node_modules/browser-resolve/empty.js", + "node_modules/d3-time/build/d3-time.js", + "node_modules/datalib/src/bins/bins.js", + "node_modules/datalib/src/generate.js", + "node_modules/datalib/src/import/type.js", + "node_modules/datalib/src/stats.js", + "node_modules/datalib/src/time.js", + "node_modules/datalib/src/util.js", + "src/config.js", + "src/constraint/base.js", + "src/constraint/constraint.js", + "src/constraint/encoding.js", + "src/constraint/spec.js", + "src/cql.js", + "src/enumerator.js", + "src/enumspec.js", + "src/enumspecindex.js", + "src/generate.js", + "src/model.js", + "src/modelgroup.js", + "src/nest.js", + "src/property.js", + "src/query/encoding.js", + "src/query/groupby.js", + "src/query/query.js", + "src/query/shorthand.js", + "src/query/spec.js", + "src/query/transform.js", + "src/ranking/aggregation.js", + "src/ranking/effectiveness/channel.js", + "src/ranking/effectiveness/effectiveness.js", + "src/ranking/effectiveness/mark.js", + "src/ranking/effectiveness/type.js", + "src/ranking/ranking.js", + "src/schema.js", + "src/stylize.js", + "src/util.js", + "../vega-lite/node_modules/datalib/src/util.js", + "../vega-lite/node_modules/json-stable-stringify/index.js", + "../vega-lite/node_modules/jsonify/index.js", + "../vega-lite/node_modules/jsonify/lib/parse.js", + "../vega-lite/node_modules/jsonify/lib/stringify.js", + "../vega-lite/src/aggregate.js", + "../vega-lite/src/bin.js", + "../vega-lite/src/channel.js", + "../vega-lite/src/datetime.js", + "../vega-lite/src/encoding.js", + "../vega-lite/src/mark.js", + "../vega-lite/src/scale.js", + "../vega-lite/src/sort.js", + "../vega-lite/src/stack.js", + "../vega-lite/src/timeunit.js", + "../vega-lite/src/type.js", + "../vega-lite/src/util.js" + ], + "names": [], + "mappings": "AAAA;ACAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0)) return range; // also handles Invalid Date\n offseti(start, 1), floori(start);\n if (start < stop) range.push(new Date(+start));\n while (offseti(start, step), floori(start), start < stop) range.push(new Date(+start));\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n while (--step >= 0) while (offseti(date, 1), !test(date));\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n };\n\n var millisecond = newInterval(function() {\n // noop\n }, function(date, step) {\n date.setTime(+date + step);\n }, function(start, end) {\n return end - start;\n });\n\n // An optimized implementation for this simple case.\n millisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return newInterval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n };\n\n var second = newInterval(function(date) {\n date.setMilliseconds(0);\n }, function(date, step) {\n date.setTime(+date + step * 1e3);\n }, function(start, end) {\n return (end - start) / 1e3;\n }, function(date) {\n return date.getSeconds();\n });\n\n var minute = newInterval(function(date) {\n date.setSeconds(0, 0);\n }, function(date, step) {\n date.setTime(+date + step * 6e4);\n }, function(start, end) {\n return (end - start) / 6e4;\n }, function(date) {\n return date.getMinutes();\n });\n\n var hour = newInterval(function(date) {\n date.setMinutes(0, 0, 0);\n }, function(date, step) {\n date.setTime(+date + step * 36e5);\n }, function(start, end) {\n return (end - start) / 36e5;\n }, function(date) {\n return date.getHours();\n });\n\n var day = newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 864e5;\n }, function(date) {\n return date.getDate() - 1;\n });\n\n function weekday(i) {\n return newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 6048e5;\n });\n }\n\n var sunday = weekday(0);\n var monday = weekday(1);\n var tuesday = weekday(2);\n var wednesday = weekday(3);\n var thursday = weekday(4);\n var friday = weekday(5);\n var saturday = weekday(6);\n\n var month = newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n date.setDate(1);\n }, function(date, step) {\n date.setMonth(date.getMonth() + step);\n }, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n }, function(date) {\n return date.getMonth();\n });\n\n var year = newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n date.setMonth(0, 1);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n }, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n }, function(date) {\n return date.getFullYear();\n });\n\n var utcSecond = newInterval(function(date) {\n date.setUTCMilliseconds(0);\n }, function(date, step) {\n date.setTime(+date + step * 1e3);\n }, function(start, end) {\n return (end - start) / 1e3;\n }, function(date) {\n return date.getUTCSeconds();\n });\n\n var utcMinute = newInterval(function(date) {\n date.setUTCSeconds(0, 0);\n }, function(date, step) {\n date.setTime(+date + step * 6e4);\n }, function(start, end) {\n return (end - start) / 6e4;\n }, function(date) {\n return date.getUTCMinutes();\n });\n\n var utcHour = newInterval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n }, function(date, step) {\n date.setTime(+date + step * 36e5);\n }, function(start, end) {\n return (end - start) / 36e5;\n }, function(date) {\n return date.getUTCHours();\n });\n\n var utcDay = newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n }, function(start, end) {\n return (end - start) / 864e5;\n }, function(date) {\n return date.getUTCDate() - 1;\n });\n\n function utcWeekday(i) {\n return newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / 6048e5;\n });\n }\n\n var utcSunday = utcWeekday(0);\n var utcMonday = utcWeekday(1);\n var utcTuesday = utcWeekday(2);\n var utcWednesday = utcWeekday(3);\n var utcThursday = utcWeekday(4);\n var utcFriday = utcWeekday(5);\n var utcSaturday = utcWeekday(6);\n\n var utcMonth = newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCDate(1);\n }, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n }, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n }, function(date) {\n return date.getUTCMonth();\n });\n\n var utcYear = newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCMonth(0, 1);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n }, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n }, function(date) {\n return date.getUTCFullYear();\n });\n\n var milliseconds = millisecond.range;\n var seconds = second.range;\n var minutes = minute.range;\n var hours = hour.range;\n var days = day.range;\n var sundays = sunday.range;\n var mondays = monday.range;\n var tuesdays = tuesday.range;\n var wednesdays = wednesday.range;\n var thursdays = thursday.range;\n var fridays = friday.range;\n var saturdays = saturday.range;\n var weeks = sunday.range;\n var months = month.range;\n var years = year.range;\n\n var utcMillisecond = millisecond;\n var utcMilliseconds = milliseconds;\n var utcSeconds = utcSecond.range;\n var utcMinutes = utcMinute.range;\n var utcHours = utcHour.range;\n var utcDays = utcDay.range;\n var utcSundays = utcSunday.range;\n var utcMondays = utcMonday.range;\n var utcTuesdays = utcTuesday.range;\n var utcWednesdays = utcWednesday.range;\n var utcThursdays = utcThursday.range;\n var utcFridays = utcFriday.range;\n var utcSaturdays = utcSaturday.range;\n var utcWeeks = utcSunday.range;\n var utcMonths = utcMonth.range;\n var utcYears = utcYear.range;\n\n var version = \"0.1.1\";\n\n exports.version = version;\n exports.milliseconds = milliseconds;\n exports.seconds = seconds;\n exports.minutes = minutes;\n exports.hours = hours;\n exports.days = days;\n exports.sundays = sundays;\n exports.mondays = mondays;\n exports.tuesdays = tuesdays;\n exports.wednesdays = wednesdays;\n exports.thursdays = thursdays;\n exports.fridays = fridays;\n exports.saturdays = saturdays;\n exports.weeks = weeks;\n exports.months = months;\n exports.years = years;\n exports.utcMillisecond = utcMillisecond;\n exports.utcMilliseconds = utcMilliseconds;\n exports.utcSeconds = utcSeconds;\n exports.utcMinutes = utcMinutes;\n exports.utcHours = utcHours;\n exports.utcDays = utcDays;\n exports.utcSundays = utcSundays;\n exports.utcMondays = utcMondays;\n exports.utcTuesdays = utcTuesdays;\n exports.utcWednesdays = utcWednesdays;\n exports.utcThursdays = utcThursdays;\n exports.utcFridays = utcFridays;\n exports.utcSaturdays = utcSaturdays;\n exports.utcWeeks = utcWeeks;\n exports.utcMonths = utcMonths;\n exports.utcYears = utcYears;\n exports.millisecond = millisecond;\n exports.second = second;\n exports.minute = minute;\n exports.hour = hour;\n exports.day = day;\n exports.sunday = sunday;\n exports.monday = monday;\n exports.tuesday = tuesday;\n exports.wednesday = wednesday;\n exports.thursday = thursday;\n exports.friday = friday;\n exports.saturday = saturday;\n exports.week = sunday;\n exports.month = month;\n exports.year = year;\n exports.utcSecond = utcSecond;\n exports.utcMinute = utcMinute;\n exports.utcHour = utcHour;\n exports.utcDay = utcDay;\n exports.utcSunday = utcSunday;\n exports.utcMonday = utcMonday;\n exports.utcTuesday = utcTuesday;\n exports.utcWednesday = utcWednesday;\n exports.utcThursday = utcThursday;\n exports.utcFriday = utcFriday;\n exports.utcSaturday = utcSaturday;\n exports.utcWeek = utcSunday;\n exports.utcMonth = utcMonth;\n exports.utcYear = utcYear;\n exports.interval = newInterval;\n\n}));", + "var util = require('../util'),\n time = require('../time'),\n EPSILON = 1e-15;\n\nfunction bins(opt) {\n if (!opt) { throw Error(\"Missing binning options.\"); }\n\n // determine range\n var maxb = opt.maxbins || 15,\n base = opt.base || 10,\n logb = Math.log(base),\n div = opt.div || [5, 2],\n min = opt.min,\n max = opt.max,\n span = max - min,\n step, level, minstep, precision, v, i, eps;\n\n if (opt.step) {\n // if step size is explicitly given, use that\n step = opt.step;\n } else if (opt.steps) {\n // if provided, limit choice to acceptable step sizes\n step = opt.steps[Math.min(\n opt.steps.length - 1,\n bisect(opt.steps, span/maxb, 0, opt.steps.length)\n )];\n } else {\n // else use span to determine step size\n level = Math.ceil(Math.log(maxb) / logb);\n minstep = opt.minstep || 0;\n step = Math.max(\n minstep,\n Math.pow(base, Math.round(Math.log(span) / logb) - level)\n );\n\n // increase step size if too many bins\n while (Math.ceil(span/step) > maxb) { step *= base; }\n\n // decrease step size if allowed\n for (i=0; i= minstep && span / v <= maxb) step = v;\n }\n }\n\n // update precision, min and max\n v = Math.log(step);\n precision = v >= 0 ? 0 : ~~(-v / logb) + 1;\n eps = Math.pow(base, -precision - 1);\n min = Math.min(min, Math.floor(min / step + eps) * step);\n max = Math.ceil(max / step) * step;\n\n return {\n start: min,\n stop: max,\n step: step,\n unit: {precision: precision},\n value: value,\n index: index\n };\n}\n\nfunction bisect(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (util.cmp(a[mid], x) < 0) { lo = mid + 1; }\n else { hi = mid; }\n }\n return lo;\n}\n\nfunction value(v) {\n return this.step * Math.floor(v / this.step + EPSILON);\n}\n\nfunction index(v) {\n return Math.floor((v - this.start) / this.step + EPSILON);\n}\n\nfunction date_value(v) {\n return this.unit.date(value.call(this, v));\n}\n\nfunction date_index(v) {\n return index.call(this, this.unit.unit(v));\n}\n\nbins.date = function(opt) {\n if (!opt) { throw Error(\"Missing date binning options.\"); }\n\n // find time step, then bin\n var units = opt.utc ? time.utc : time,\n dmin = opt.min,\n dmax = opt.max,\n maxb = opt.maxbins || 20,\n minb = opt.minbins || 4,\n span = (+dmax) - (+dmin),\n unit = opt.unit ? units[opt.unit] : units.find(span, minb, maxb),\n spec = bins({\n min: unit.min != null ? unit.min : unit.unit(dmin),\n max: unit.max != null ? unit.max : unit.unit(dmax),\n maxbins: maxb,\n minstep: unit.minstep,\n steps: unit.step\n });\n\n spec.unit = unit;\n spec.index = date_index;\n if (!opt.raw) spec.value = date_value;\n return spec;\n};\n\nmodule.exports = bins;\n", + "var util = require('./util'),\n gen = module.exports;\n\ngen.repeat = function(val, n) {\n var a = Array(n), i;\n for (i=0; i stop) range.push(j);\n else while ((j = start + step * ++i) < stop) range.push(j);\n return range;\n};\n\ngen.random = {};\n\ngen.random.uniform = function(min, max) {\n if (max === undefined) {\n max = min === undefined ? 1 : min;\n min = 0;\n }\n var d = max - min;\n var f = function() {\n return min + d * Math.random();\n };\n f.samples = function(n) {\n return gen.zeros(n).map(f);\n };\n f.pdf = function(x) {\n return (x >= min && x <= max) ? 1/d : 0;\n };\n f.cdf = function(x) {\n return x < min ? 0 : x > max ? 1 : (x - min) / d;\n };\n f.icdf = function(p) {\n return (p >= 0 && p <= 1) ? min + p*d : NaN;\n };\n return f;\n};\n\ngen.random.integer = function(a, b) {\n if (b === undefined) {\n b = a;\n a = 0;\n }\n var d = b - a;\n var f = function() {\n return a + Math.floor(d * Math.random());\n };\n f.samples = function(n) {\n return gen.zeros(n).map(f);\n };\n f.pdf = function(x) {\n return (x === Math.floor(x) && x >= a && x < b) ? 1/d : 0;\n };\n f.cdf = function(x) {\n var v = Math.floor(x);\n return v < a ? 0 : v >= b ? 1 : (v - a + 1) / d;\n };\n f.icdf = function(p) {\n return (p >= 0 && p <= 1) ? a - 1 + Math.floor(p*d) : NaN;\n };\n return f;\n};\n\ngen.random.normal = function(mean, stdev) {\n mean = mean || 0;\n stdev = stdev || 1;\n var next;\n var f = function() {\n var x = 0, y = 0, rds, c;\n if (next !== undefined) {\n x = next;\n next = undefined;\n return x;\n }\n do {\n x = Math.random()*2-1;\n y = Math.random()*2-1;\n rds = x*x + y*y;\n } while (rds === 0 || rds > 1);\n c = Math.sqrt(-2*Math.log(rds)/rds); // Box-Muller transform\n next = mean + y*c*stdev;\n return mean + x*c*stdev;\n };\n f.samples = function(n) {\n return gen.zeros(n).map(f);\n };\n f.pdf = function(x) {\n var exp = Math.exp(Math.pow(x-mean, 2) / (-2 * Math.pow(stdev, 2)));\n return (1 / (stdev * Math.sqrt(2*Math.PI))) * exp;\n };\n f.cdf = function(x) {\n // Approximation from West (2009)\n // Better Approximations to Cumulative Normal Functions\n var cd,\n z = (x - mean) / stdev,\n Z = Math.abs(z);\n if (Z > 37) {\n cd = 0;\n } else {\n var sum, exp = Math.exp(-Z*Z/2);\n if (Z < 7.07106781186547) {\n sum = 3.52624965998911e-02 * Z + 0.700383064443688;\n sum = sum * Z + 6.37396220353165;\n sum = sum * Z + 33.912866078383;\n sum = sum * Z + 112.079291497871;\n sum = sum * Z + 221.213596169931;\n sum = sum * Z + 220.206867912376;\n cd = exp * sum;\n sum = 8.83883476483184e-02 * Z + 1.75566716318264;\n sum = sum * Z + 16.064177579207;\n sum = sum * Z + 86.7807322029461;\n sum = sum * Z + 296.564248779674;\n sum = sum * Z + 637.333633378831;\n sum = sum * Z + 793.826512519948;\n sum = sum * Z + 440.413735824752;\n cd = cd / sum;\n } else {\n sum = Z + 0.65;\n sum = Z + 4 / sum;\n sum = Z + 3 / sum;\n sum = Z + 2 / sum;\n sum = Z + 1 / sum;\n cd = exp / sum / 2.506628274631;\n }\n }\n return z > 0 ? 1 - cd : cd;\n };\n f.icdf = function(p) {\n // Approximation of Probit function using inverse error function.\n if (p <= 0 || p >= 1) return NaN;\n var x = 2*p - 1,\n v = (8 * (Math.PI - 3)) / (3 * Math.PI * (4-Math.PI)),\n a = (2 / (Math.PI*v)) + (Math.log(1 - Math.pow(x,2)) / 2),\n b = Math.log(1 - (x*x)) / v,\n s = (x > 0 ? 1 : -1) * Math.sqrt(Math.sqrt((a*a) - b) - a);\n return mean + stdev * Math.SQRT2 * s;\n };\n return f;\n};\n\ngen.random.bootstrap = function(domain, smooth) {\n // Generates a bootstrap sample from a set of observations.\n // Smooth bootstrapping adds random zero-centered noise to the samples.\n var val = domain.filter(util.isValid),\n len = val.length,\n err = smooth ? gen.random.normal(0, smooth) : null;\n var f = function() {\n return val[~~(Math.random()*len)] + (err ? err() : 0);\n };\n f.samples = function(n) {\n return gen.zeros(n).map(f);\n };\n return f;\n};", + "var util = require('../util');\n\nvar TYPES = '__types__';\n\nvar PARSERS = {\n boolean: util.boolean,\n integer: util.number,\n number: util.number,\n date: util.date,\n string: function(x) { return x==='' ? null : x; }\n};\n\nvar TESTS = {\n boolean: function(x) { return x==='true' || x==='false' || util.isBoolean(x); },\n integer: function(x) { return TESTS.number(x) && (x=+x) === ~~x; },\n number: function(x) { return !isNaN(+x) && !util.isDate(x); },\n date: function(x) { return !isNaN(Date.parse(x)); }\n};\n\nfunction annotation(data, types) {\n if (!types) return data && data[TYPES] || null;\n data[TYPES] = types;\n}\n\nfunction type(values, f) {\n values = util.array(values);\n f = util.$(f);\n var v, i, n;\n\n // if data array has type annotations, use them\n if (values[TYPES]) {\n v = f(values[TYPES]);\n if (util.isString(v)) return v;\n }\n\n for (i=0, n=values.length; !util.isValid(v) && i 0 ? Math.pow(mean, 1/c) : 0;\n return mean;\n};\n\n// Compute the harmonic mean of an array of numbers.\nstats.mean.harmonic = function(values, f) {\n f = util.$(f);\n var mean = 0, c, n, v, i;\n for (i=0, c=0, n=values.length; i b) b = v;\n }\n }\n return [a, b];\n};\n\n// Find the integer indices of the minimum and maximum values.\nstats.extent.index = function(values, f) {\n f = util.$(f);\n var x = -1, y = -1, a, b, v, i, n = values.length;\n for (i=0; i b) { b = v; y = i; }\n }\n }\n return [x, y];\n};\n\n// Compute the dot product of two arrays of numbers.\nstats.dot = function(values, a, b) {\n var sum = 0, i, v;\n if (!b) {\n if (values.length !== a.length) {\n throw Error('Array lengths must match.');\n }\n for (i=0; i -1 && p !== v) {\n mu = 1 + (i-1 + tie) / 2;\n for (; tie -1) {\n mu = 1 + (n-1 + tie) / 2;\n for (; tie max) max = x;\n delta = x - mean;\n mean = mean + delta / (++valid);\n M2 = M2 + delta * (x - mean);\n vals.push(x);\n }\n }\n M2 = M2 / (valid - 1);\n sd = Math.sqrt(M2);\n\n // sort values for median and iqr\n vals.sort(util.cmp);\n\n return {\n type: type(values, f),\n unique: u,\n count: values.length,\n valid: valid,\n missing: missing,\n distinct: distinct,\n min: min,\n max: max,\n mean: mean,\n stdev: sd,\n median: (v = stats.quantile(vals, 0.5)),\n q1: stats.quantile(vals, 0.25),\n q3: stats.quantile(vals, 0.75),\n modeskew: sd === 0 ? 0 : (mean - v) / sd\n };\n};\n\n// Compute profiles for all variables in a data set.\nstats.summary = function(data, fields) {\n fields = fields || util.keys(data[0]);\n var s = fields.map(function(f) {\n var p = stats.profile(data, util.$(f));\n return (p.field = f, p);\n });\n return (s.__summary__ = true, s);\n};\n", + "var d3_time = require('d3-time');\n\nvar tempDate = new Date(),\n baseDate = new Date(0, 0, 1).setFullYear(0), // Jan 1, 0 AD\n utcBaseDate = new Date(Date.UTC(0, 0, 1)).setUTCFullYear(0);\n\nfunction date(d) {\n return (tempDate.setTime(+d), tempDate);\n}\n\n// create a time unit entry\nfunction entry(type, date, unit, step, min, max) {\n var e = {\n type: type,\n date: date,\n unit: unit\n };\n if (step) {\n e.step = step;\n } else {\n e.minstep = 1;\n }\n if (min != null) e.min = min;\n if (max != null) e.max = max;\n return e;\n}\n\nfunction create(type, unit, base, step, min, max) {\n return entry(type,\n function(d) { return unit.offset(base, d); },\n function(d) { return unit.count(base, d); },\n step, min, max);\n}\n\nvar locale = [\n create('second', d3_time.second, baseDate),\n create('minute', d3_time.minute, baseDate),\n create('hour', d3_time.hour, baseDate),\n create('day', d3_time.day, baseDate, [1, 7]),\n create('month', d3_time.month, baseDate, [1, 3, 6]),\n create('year', d3_time.year, baseDate),\n\n // periodic units\n entry('seconds',\n function(d) { return new Date(1970, 0, 1, 0, 0, d); },\n function(d) { return date(d).getSeconds(); },\n null, 0, 59\n ),\n entry('minutes',\n function(d) { return new Date(1970, 0, 1, 0, d); },\n function(d) { return date(d).getMinutes(); },\n null, 0, 59\n ),\n entry('hours',\n function(d) { return new Date(1970, 0, 1, d); },\n function(d) { return date(d).getHours(); },\n null, 0, 23\n ),\n entry('weekdays',\n function(d) { return new Date(1970, 0, 4+d); },\n function(d) { return date(d).getDay(); },\n [1], 0, 6\n ),\n entry('dates',\n function(d) { return new Date(1970, 0, d); },\n function(d) { return date(d).getDate(); },\n [1], 1, 31\n ),\n entry('months',\n function(d) { return new Date(1970, d % 12, 1); },\n function(d) { return date(d).getMonth(); },\n [1], 0, 11\n )\n];\n\nvar utc = [\n create('second', d3_time.utcSecond, utcBaseDate),\n create('minute', d3_time.utcMinute, utcBaseDate),\n create('hour', d3_time.utcHour, utcBaseDate),\n create('day', d3_time.utcDay, utcBaseDate, [1, 7]),\n create('month', d3_time.utcMonth, utcBaseDate, [1, 3, 6]),\n create('year', d3_time.utcYear, utcBaseDate),\n\n // periodic units\n entry('seconds',\n function(d) { return new Date(Date.UTC(1970, 0, 1, 0, 0, d)); },\n function(d) { return date(d).getUTCSeconds(); },\n null, 0, 59\n ),\n entry('minutes',\n function(d) { return new Date(Date.UTC(1970, 0, 1, 0, d)); },\n function(d) { return date(d).getUTCMinutes(); },\n null, 0, 59\n ),\n entry('hours',\n function(d) { return new Date(Date.UTC(1970, 0, 1, d)); },\n function(d) { return date(d).getUTCHours(); },\n null, 0, 23\n ),\n entry('weekdays',\n function(d) { return new Date(Date.UTC(1970, 0, 4+d)); },\n function(d) { return date(d).getUTCDay(); },\n [1], 0, 6\n ),\n entry('dates',\n function(d) { return new Date(Date.UTC(1970, 0, d)); },\n function(d) { return date(d).getUTCDate(); },\n [1], 1, 31\n ),\n entry('months',\n function(d) { return new Date(Date.UTC(1970, d % 12, 1)); },\n function(d) { return date(d).getUTCMonth(); },\n [1], 0, 11\n )\n];\n\nvar STEPS = [\n [31536e6, 5], // 1-year\n [7776e6, 4], // 3-month\n [2592e6, 4], // 1-month\n [12096e5, 3], // 2-week\n [6048e5, 3], // 1-week\n [1728e5, 3], // 2-day\n [864e5, 3], // 1-day\n [432e5, 2], // 12-hour\n [216e5, 2], // 6-hour\n [108e5, 2], // 3-hour\n [36e5, 2], // 1-hour\n [18e5, 1], // 30-minute\n [9e5, 1], // 15-minute\n [3e5, 1], // 5-minute\n [6e4, 1], // 1-minute\n [3e4, 0], // 30-second\n [15e3, 0], // 15-second\n [5e3, 0], // 5-second\n [1e3, 0] // 1-second\n];\n\nfunction find(units, span, minb, maxb) {\n var step = STEPS[0], i, n, bins;\n\n for (i=1, n=STEPS.length; i step[0]) {\n bins = span / step[0];\n if (bins > maxb) {\n return units[STEPS[i-1][1]];\n }\n if (bins >= minb) {\n return units[step[1]];\n }\n }\n }\n return units[STEPS[n-1][1]];\n}\n\nfunction toUnitMap(units) {\n var map = {}, i, n;\n for (i=0, n=units.length; i 1 ?\n function(x, v) {\n for (var i=0; i y) return sign[i];\n }\n return 0;\n };\n};\n\nu.cmp = function(a, b) {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else if (a >= b) {\n return 0;\n } else if (a === null) {\n return -1;\n } else if (b === null) {\n return 1;\n }\n return NaN;\n};\n\nu.numcmp = function(a, b) { return a - b; };\n\nu.stablesort = function(array, sortBy, keyFn) {\n var indices = array.reduce(function(idx, v, i) {\n return (idx[keyFn(v)] = i, idx);\n }, {});\n\n array.sort(function(a, b) {\n var sa = sortBy(a),\n sb = sortBy(b);\n return sa < sb ? -1 : sa > sb ? 1\n : (indices[keyFn(a)] - indices[keyFn(b)]);\n });\n\n return array;\n};\n\n// permutes an array using a Knuth shuffle\nu.permute = function(a) {\n var m = a.length,\n swap,\n i;\n\n while (m) {\n i = Math.floor(Math.random() * m--);\n swap = a[m];\n a[m] = a[i];\n a[i] = swap;\n }\n};\n\n// string functions\n\nu.pad = function(s, length, pos, padchar) {\n padchar = padchar || \" \";\n var d = length - s.length;\n if (d <= 0) return s;\n switch (pos) {\n case 'left':\n return strrep(d, padchar) + s;\n case 'middle':\n case 'center':\n return strrep(Math.floor(d/2), padchar) +\n s + strrep(Math.ceil(d/2), padchar);\n default:\n return s + strrep(d, padchar);\n }\n};\n\nfunction strrep(n, str) {\n var s = \"\", i;\n for (i=0; i 1) {\n return false;\n }\n }\n }\n }\n return true;\n }\n },\n {\n name: 'omitNonPositionalOverPositionalChannels',\n description: 'Do not use non-positional channels unless all positional channels are used',\n properties: [property_1.Property.CHANNEL],\n allowEnumSpecForProperties: false,\n strict: false,\n satisfy: function (specM, schema, opt) {\n return util_1.some(channel_1.NONSPATIAL_CHANNELS, function (channel) { return specM.channelUsed(channel); }) ?\n // if non-positional channels are used, then both x and y must be used.\n specM.channelUsed(channel_1.Channel.X) && specM.channelUsed(channel_1.Channel.Y) :\n true;\n }\n },\n {\n name: 'omitRaw',\n description: 'Omit raw plots.',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowEnumSpecForProperties: false,\n strict: false,\n satisfy: function (specM, schema, opt) {\n if (!specM.isAggregate()) {\n return false;\n }\n return true;\n }\n },\n {\n name: 'omitRawContinuousFieldForAggregatePlot',\n description: 'Aggregate plot should not use raw continuous field as group by values. ' +\n '(Quantitative should be binned. Temporal should have time unit.)',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.TYPE],\n allowEnumSpecForProperties: true,\n strict: false,\n satisfy: function (specM, schema, opt) {\n if (specM.isAggregate()) {\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (encQ.type === type_1.Type.TEMPORAL) {\n // Temporal fields should have timeUnit or is still an enumSpec\n return !!encQ.timeUnit;\n }\n if (encQ.type === type_1.Type.QUANTITATIVE) {\n return !!encQ.bin || !!encQ.aggregate || !!encQ.autoCount;\n }\n return true;\n });\n }\n return true;\n }\n },\n {\n name: 'omitRawDetail',\n description: 'Do not use detail channel with raw plot.',\n properties: [property_1.Property.CHANNEL, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowEnumSpecForProperties: false,\n strict: true,\n satisfy: function (specM, schema, opt) {\n if (specM.isAggregate()) {\n return true;\n }\n return util_1.every(specM.getEncodings(), function (encQ) {\n return encQ.channel !== channel_1.Channel.DETAIL;\n });\n }\n },\n {\n name: 'omitRepeatedField',\n description: 'Each field should be mapped to only one channel',\n properties: [property_1.Property.FIELD],\n allowEnumSpecForProperties: true,\n strict: false,\n satisfy: function (specM, schema, opt) {\n var usedField = {};\n // the same field should not be encoded twice\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (encQ.field && !enumspec_1.isEnumSpec(encQ.field)) {\n // If field is specified, it should not be used already\n if (usedField[encQ.field]) {\n return false;\n }\n usedField[encQ.field] = true;\n return true;\n }\n return true; // unspecified field is valid\n });\n }\n },\n // TODO: omitShapeWithBin\n {\n name: 'omitVerticalDotPlot',\n description: 'Do not output vertical dot plot.',\n properties: [property_1.Property.CHANNEL],\n allowEnumSpecForProperties: true,\n strict: false,\n satisfy: function (specM, schema, opt) {\n var encodings = specM.getEncodings();\n if (encodings.length === 1 && encodings[0].channel === channel_1.Channel.Y) {\n return false;\n }\n return true;\n }\n },\n // EXPENSIVE CONSTRAINTS -- check them later!\n {\n name: 'hasAppropriateGraphicTypeForMark',\n description: 'Has appropriate graphic type for mark',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowEnumSpecForProperties: false,\n strict: false,\n satisfy: function (specM, schema, opt) {\n var mark = specM.getMark();\n switch (mark) {\n case mark_1.Mark.AREA:\n case mark_1.Mark.LINE:\n if (specM.isAggregate()) {\n var xEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.X);\n var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y);\n var xIsMeasure = xEncQ && encoding_2.isMeasure(xEncQ);\n var yIsMeasure = yEncQ && encoding_2.isMeasure(yEncQ);\n // for aggregate line / area, we need at least one group-by axis and one measure axis.\n return xEncQ && yEncQ && (xIsMeasure !== yIsMeasure) &&\n // and the dimension axis should not be nominal\n // TODO: make this clause optional\n !(!xIsMeasure && xEncQ.type === type_1.Type.NOMINAL) &&\n !(!yIsMeasure && yEncQ.type === type_1.Type.NOMINAL);\n }\n return true;\n case mark_1.Mark.TEXT:\n // FIXME correctly when we add text\n return true;\n case mark_1.Mark.BAR:\n case mark_1.Mark.TICK:\n // Bar and tick should not use size.\n if (specM.channelUsed(channel_1.Channel.SIZE)) {\n return false;\n }\n // Tick and Bar should have one and only one measure\n if (specM.isMeasure(channel_1.Channel.X) !== specM.isMeasure(channel_1.Channel.Y)) {\n // TODO: Bar and tick's dimension should not be continuous (quant/time) scale\n return true;\n }\n return false;\n case mark_1.Mark.CIRCLE:\n case mark_1.Mark.POINT:\n case mark_1.Mark.SQUARE:\n case mark_1.Mark.RULE:\n return true;\n }\n /* istanbul ignore next */\n throw new Error('hasAllRequiredChannelsForMark not implemented for mark' + mark);\n }\n },\n {\n name: 'omitNonSumStack',\n description: 'Stacked plot should use summative aggregation such as sum, count, or distinct',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowEnumSpecForProperties: false,\n strict: false,\n satisfy: function (specM, schema, opt) {\n var stack = specM.stack();\n if (stack) {\n var measureEncQ = specM.getEncodingQueryByChannel(stack.fieldChannel);\n return util_1.contains(aggregate_1.SUM_OPS, measureEncQ.aggregate) || !!measureEncQ.autoCount;\n }\n return true;\n }\n },\n {\n name: 'omitTableWithOcclusionIfAutoAddCount',\n description: 'Plots without aggregation or autocount where x and y are both dimensions should be omitted if autoAddCount is enabled as they often lead to occlusion',\n properties: [property_1.Property.CHANNEL, property_1.Property.TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowEnumSpecForProperties: false,\n strict: false,\n satisfy: function (specM, schema, opt) {\n if (opt.autoAddCount) {\n // TODO(#186): take mark properties channel into account\n if (specM.isDimension(channel_1.Channel.X) &&\n specM.isDimension(channel_1.Channel.Y) &&\n !specM.isAggregate() // TODO: refactor based on statistics\n ) {\n return false;\n }\n }\n return true;\n }\n }\n].map(function (sc) { return new SpecConstraintModel(sc); });\n// For testing\nexports.SPEC_CONSTRAINT_INDEX = exports.SPEC_CONSTRAINTS.reduce(function (m, c) {\n m[c.name()] = c;\n return m;\n}, {});\n//\nexports.SPEC_CONSTRAINTS_BY_PROPERTY = exports.SPEC_CONSTRAINTS.reduce(function (m, c) {\n c.properties().forEach(function (prop) {\n m[prop] = m[prop] || [];\n m[prop].push(c);\n });\n return m;\n}, {});\n/**\n * Check all encoding constraints for a particular property and index tuple\n */\nfunction checkSpec(prop, enumSpec, specM, schema, opt) {\n // Check encoding constraint\n var specConstraints = exports.SPEC_CONSTRAINTS_BY_PROPERTY[prop] || [];\n for (var i = 0; i < specConstraints.length; i++) {\n var c = specConstraints[i];\n // Check if the constraint is enabled\n if (c.strict() || !!opt[c.name()]) {\n // For strict constraint, or enabled non-strict, check the constraints\n var satisfy = c.satisfy(specM, schema, opt);\n if (!satisfy) {\n var violatedConstraint = '(spec) ' + c.name();\n /* istanbul ignore if */\n if (opt.verbose) {\n console.log(violatedConstraint + ' failed with ' + specM.toShorthand() + ' for ' + enumSpec.name);\n }\n return violatedConstraint;\n }\n }\n }\n return null;\n}\nexports.checkSpec = checkSpec;\n//# sourceMappingURL=spec.js.map", + "\"use strict\";\nexports.version = '0.3.3';\nvar util_1 = require('./util');\nexports.constraint = require('./constraint/constraint');\nexports.enumerate = require('./enumerator');\nexports.enumSpec = require('./enumspec');\nvar generate_1 = require('./generate');\nexports.generate = generate_1.generate;\nexports.model = require('./model');\nexports.modelGroup = require('./modelgroup');\nexports.nest = require('./nest');\nexports.property = require('./property');\n// Make it so that we can call cql.query() as method, or access other methods inside cql.query\nvar cqlQuery = require('./query/query');\nvar query_1 = require('./query/query');\nexports.query = util_1.extend(query_1.query, cqlQuery);\nexports.ranking = require('./ranking/ranking');\nexports.schema = require('./schema');\nexports.util = require('./util');\n//# sourceMappingURL=cql.js.map", + "\"use strict\";\nvar encoding_1 = require('./constraint/encoding');\nvar spec_1 = require('./constraint/spec');\nvar property_1 = require('./property');\nexports.ENUMERATOR_INDEX = {};\nexports.ENUMERATOR_INDEX[property_1.Property.MARK] = function (enumSpecIndex, schema, opt) {\n return function (answerSet, specM) {\n var markEnumSpec = specM.getMark();\n // enumerate the value\n markEnumSpec.values.forEach(function (mark) {\n specM.setMark(mark);\n // Check spec constraint\n var violatedSpecConstraint = spec_1.checkSpec(property_1.Property.MARK, enumSpecIndex.mark, specM, schema, opt);\n if (!violatedSpecConstraint) {\n // emit\n answerSet.push(specM.duplicate());\n }\n });\n // Reset to avoid side effect\n specM.resetMark();\n return answerSet;\n };\n};\nproperty_1.ENCODING_PROPERTIES.forEach(function (prop) {\n exports.ENUMERATOR_INDEX[prop] = EncodingPropertyGeneratorFactory(prop);\n});\nproperty_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) {\n exports.ENUMERATOR_INDEX[nestedProp.property] = EncodingPropertyGeneratorFactory(nestedProp.property);\n});\n/**\n * @param prop property type.\n * @return an answer set reducer factory for the given prop.\n */\nfunction EncodingPropertyGeneratorFactory(prop) {\n /**\n * @return as reducer that takes a specQueryModel as input and output an answer set array.\n */\n return function (enumSpecIndex, schema, opt) {\n return function (answerSet, specM) {\n // index of encoding mappings that require enumeration\n var indices = enumSpecIndex.encodingIndicesByProperty[prop];\n function enumerate(jobIndex) {\n if (jobIndex === indices.length) {\n // emit and terminate\n answerSet.push(specM.duplicate());\n return;\n }\n var index = indices[jobIndex];\n var enumSpec = enumSpecIndex.encodings[index][prop];\n var encQ = specM.getEncodingQueryByIndex(index);\n var propEnumSpec = specM.getEncodingProperty(index, prop);\n if (\n // TODO: encQ.exclude\n // If this encoding query is an excluded autoCount, there is no point enumerating other properties\n // for this encoding query because they will be excluded anyway.\n // Thus, we can just move on to the next encoding to enumerate.\n encQ.autoCount === false ||\n // nested encoding property might have its parent set to false\n // therefore, we no longer have to enumerate them\n !propEnumSpec) {\n enumerate(jobIndex + 1);\n }\n else {\n enumSpec.values.forEach(function (propVal) {\n if (propVal === null) {\n // our duplicate() method use JSON.stringify, parse and thus can accidentally\n // convert undefined in an array into null\n propVal = undefined;\n }\n specM.setEncodingProperty(index, prop, propVal, enumSpec);\n // Check encoding constraint\n var violatedEncodingConstraint = encoding_1.checkEncoding(prop, enumSpec, index, specM, schema, opt);\n if (violatedEncodingConstraint) {\n return; // do not keep searching\n }\n // Check spec constraint\n var violatedSpecConstraint = spec_1.checkSpec(prop, enumSpec, specM, schema, opt);\n if (violatedSpecConstraint) {\n return; // do not keep searching\n }\n // If qualify all of the constraints, keep enumerating\n enumerate(jobIndex + 1);\n });\n // Reset to avoid side effect\n specM.resetEncodingProperty(index, prop, enumSpec);\n }\n }\n // start enumerating from 0\n enumerate(0);\n return answerSet;\n };\n };\n}\nexports.EncodingPropertyGeneratorFactory = EncodingPropertyGeneratorFactory;\n//# sourceMappingURL=enumerator.js.map", + "\"use strict\";\nvar util_1 = require('./util');\n/** Enum for a short form of the enumeration spec. */\n(function (ShortEnumSpec) {\n ShortEnumSpec[ShortEnumSpec[\"ENUMSPEC\"] = '?'] = \"ENUMSPEC\";\n})(exports.ShortEnumSpec || (exports.ShortEnumSpec = {}));\nvar ShortEnumSpec = exports.ShortEnumSpec;\nexports.SHORT_ENUM_SPEC = ShortEnumSpec.ENUMSPEC;\nfunction isEnumSpec(prop) {\n return prop === exports.SHORT_ENUM_SPEC || (prop !== undefined && (!!prop.values || !!prop.name) && !util_1.isArray(prop));\n}\nexports.isEnumSpec = isEnumSpec;\nfunction initEnumSpec(prop, defaultName, defaultEnumValues) {\n return util_1.extend({}, {\n name: defaultName,\n values: defaultEnumValues\n }, prop === exports.SHORT_ENUM_SPEC ? {} : prop);\n}\nexports.initEnumSpec = initEnumSpec;\n//# sourceMappingURL=enumspec.js.map", + "\"use strict\";\nvar property_1 = require('./property');\nvar util_1 = require('./util');\nvar EnumSpecIndex = (function () {\n function EnumSpecIndex() {\n this._mark = undefined;\n this._encodings = {};\n this._encodingIndicesByProperty = {};\n }\n EnumSpecIndex.prototype.setEncodingProperty = function (index, prop, enumSpec) {\n var encodingsIndex = this._encodings;\n // Init encoding index and set prop\n var encIndex = encodingsIndex[index] = encodingsIndex[index] || {};\n encIndex[prop] = enumSpec;\n // Initialize indicesByProperty[prop] and add index\n var encodingIndicesByProperty = this._encodingIndicesByProperty;\n (encodingIndicesByProperty[prop] = encodingIndicesByProperty[prop] || []).push(index);\n return this;\n };\n EnumSpecIndex.prototype.hasProperty = function (prop) {\n if (property_1.isEncodingProperty(prop)) {\n return !!this.encodingIndicesByProperty[prop];\n }\n if (prop === property_1.Property.MARK) {\n return !!this.mark;\n }\n /* istanbul ignore next */\n throw new Error('Unimplemented for property ' + prop);\n };\n EnumSpecIndex.prototype.isEmpty = function () {\n return !this.mark && util_1.keys(this.encodingIndicesByProperty).length === 0;\n };\n EnumSpecIndex.prototype.setMark = function (mark) {\n this._mark = mark;\n return this;\n };\n Object.defineProperty(EnumSpecIndex.prototype, \"mark\", {\n get: function () {\n return this._mark;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EnumSpecIndex.prototype, \"encodings\", {\n get: function () {\n return this._encodings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EnumSpecIndex.prototype, \"encodingIndicesByProperty\", {\n get: function () {\n return this._encodingIndicesByProperty;\n },\n enumerable: true,\n configurable: true\n });\n return EnumSpecIndex;\n}());\nexports.EnumSpecIndex = EnumSpecIndex;\n//# sourceMappingURL=enumspecindex.js.map", + "\"use strict\";\nvar enumerator_1 = require('../src/enumerator');\nvar config_1 = require('./config');\nvar model_1 = require('./model');\nvar stylize_1 = require('./stylize');\nfunction generate(specQ, schema, opt) {\n if (opt === void 0) { opt = config_1.DEFAULT_QUERY_CONFIG; }\n // 1. Build a SpecQueryModel, which also contains enumSpecIndex\n var specM = model_1.SpecQueryModel.build(specQ, schema, opt);\n var enumSpecIndex = specM.enumSpecIndex;\n // 2. Enumerate each of the properties based on propPrecedence.\n var answerSet = [specM]; // Initialize Answer Set with only the input spec query.\n opt.propertyPrecedence.forEach(function (prop) {\n // If the original specQuery contains enumSpec for this prop\n if (enumSpecIndex.hasProperty(prop)) {\n // update answerset\n var reducer = enumerator_1.ENUMERATOR_INDEX[prop](enumSpecIndex, schema, opt);\n answerSet = answerSet.reduce(reducer, []);\n }\n });\n if ((opt.nominalColorScaleForHighCardinality !== null) || (opt.smallBandSizeForHighCardinalityOrFacet !== null)) {\n return stylize_1.stylize(answerSet, schema, opt);\n }\n return answerSet;\n}\nexports.generate = generate;\n//# sourceMappingURL=generate.js.map", + "\"use strict\";\nvar aggregate_1 = require('vega-lite/src/aggregate');\nvar type_1 = require('vega-lite/src/type');\nvar property_1 = require('./property');\nvar enumspec_1 = require('./enumspec');\nvar enumspecindex_1 = require('./enumspecindex');\nvar spec_1 = require('./query/spec');\nvar encoding_1 = require('./query/encoding');\nvar shorthand_1 = require('./query/shorthand');\nvar util_1 = require('./util');\nfunction getDefaultName(prop) {\n switch (prop) {\n case property_1.Property.MARK:\n return 'm';\n case property_1.Property.CHANNEL:\n return 'c';\n case property_1.Property.AGGREGATE:\n return 'a';\n case property_1.Property.AUTOCOUNT:\n return '#';\n case property_1.Property.BIN:\n return 'b';\n case property_1.Property.BIN_MAXBINS:\n return 'b-mb';\n case property_1.Property.SORT:\n return 'so';\n case property_1.Property.SORT_FIELD:\n return 'so-f';\n case property_1.Property.SORT_OP:\n return 'so-op';\n case property_1.Property.SORT_ORDER:\n return 'so-or';\n case property_1.Property.SCALE:\n return 's';\n case property_1.Property.SCALE_BANDSIZE:\n return 's-bs';\n case property_1.Property.SCALE_CLAMP:\n return 's-c';\n case property_1.Property.SCALE_DOMAIN:\n return 's-d';\n case property_1.Property.SCALE_EXPONENT:\n return 's-e';\n case property_1.Property.SCALE_NICE:\n return 's-n';\n case property_1.Property.SCALE_RANGE:\n return 's-ra';\n case property_1.Property.SCALE_ROUND:\n return 's-r';\n case property_1.Property.SCALE_TYPE:\n return 's-t';\n case property_1.Property.SCALE_USERAWDOMAIN:\n return 's-u';\n case property_1.Property.SCALE_ZERO:\n return 's-z';\n case property_1.Property.TIMEUNIT:\n return 'tu';\n case property_1.Property.FIELD:\n return 'f';\n case property_1.Property.TYPE:\n return 't';\n }\n /* istanbul ignore next */\n throw new Error('Default name undefined');\n}\nexports.getDefaultName = getDefaultName;\nfunction getDefaultEnumValues(prop, schema, opt) {\n switch (prop) {\n case property_1.Property.FIELD: // For field, by default enumerate all fields\n case property_1.Property.SORT_FIELD:\n return schema.fields();\n // True, False for boolean values\n case property_1.Property.BIN:\n case property_1.Property.SCALE:\n case property_1.Property.SCALE_CLAMP:\n case property_1.Property.SCALE_NICE:\n case property_1.Property.SCALE_ROUND:\n case property_1.Property.SCALE_USERAWDOMAIN:\n case property_1.Property.SCALE_ZERO:\n case property_1.Property.AUTOCOUNT:\n return [false, true];\n // For other properties, take default enumValues from config.\n // The config name for each prop is a plural form of the prop.\n case property_1.Property.AGGREGATE:\n return opt.aggregates;\n case property_1.Property.BIN_MAXBINS:\n return opt.maxBinsList;\n case property_1.Property.CHANNEL:\n return opt.channels;\n case property_1.Property.MARK:\n return opt.marks;\n case property_1.Property.SORT:\n return opt.sorts;\n case property_1.Property.SORT_OP:\n return opt.sortOps;\n case property_1.Property.SORT_ORDER:\n return opt.sortOrders;\n case property_1.Property.SCALE_BANDSIZE:\n return opt.scaleBandSizes;\n case property_1.Property.SCALE_DOMAIN:\n return opt.scaleDomains;\n case property_1.Property.SCALE_EXPONENT:\n return opt.scaleExponents;\n case property_1.Property.SCALE_RANGE:\n return opt.scaleRanges;\n case property_1.Property.SCALE_TYPE:\n return opt.scaleTypes;\n case property_1.Property.TIMEUNIT:\n return opt.timeUnits;\n case property_1.Property.TYPE:\n return opt.types;\n }\n /* istanbul ignore next */\n throw new Error('No default enumValues for ' + prop);\n}\nexports.getDefaultEnumValues = getDefaultEnumValues;\n/**\n * Internal class for specQuery that provides helper for the enumeration process.\n */\nvar SpecQueryModel = (function () {\n function SpecQueryModel(spec, enumSpecIndex, schema, opt, enumSpecAssignment) {\n this._rankingScore = {};\n this._spec = spec;\n this._channelCount = spec.encodings.reduce(function (m, encQ) {\n if (!enumspec_1.isEnumSpec(encQ.channel) && encQ.autoCount !== false) {\n m[encQ.channel] = 1;\n }\n return m;\n }, {});\n this._enumSpecIndex = enumSpecIndex;\n this._enumSpecAssignment = enumSpecAssignment;\n this._opt = opt;\n this._schema = schema;\n }\n /**\n * Build an enumSpecIndex by detecting enumeration specifiers\n * in the input specQuery and replace short enum specs with\n * full ones that includes both names and enumValues.\n *\n * @return a SpecQueryModel that wraps the specQuery and the enumSpecIndex.\n */\n SpecQueryModel.build = function (specQ, schema, opt) {\n var enumSpecIndex = new enumspecindex_1.EnumSpecIndex();\n // mark\n if (enumspec_1.isEnumSpec(specQ.mark)) {\n var name_1 = getDefaultName(property_1.Property.MARK);\n specQ.mark = enumspec_1.initEnumSpec(specQ.mark, name_1, opt.marks);\n enumSpecIndex.setMark(specQ.mark);\n }\n // TODO: transform\n // encodings\n specQ.encodings.forEach(function (encQ, index) {\n if (encQ.autoCount !== undefined) {\n // This is only for testing purpose\n console.warn('A field with autoCount should not be included as autoCount meant to be an internal object.');\n encQ.type = type_1.Type.QUANTITATIVE; // autoCount is always quantitative\n }\n if (encQ.type === undefined) {\n // type is optional -- we automatically augment enum spec if not specified\n encQ.type = enumspec_1.SHORT_ENUM_SPEC;\n }\n // For each property of the encodingQuery, enumerate\n property_1.ENCODING_PROPERTIES.forEach(function (prop) {\n if (enumspec_1.isEnumSpec(encQ[prop])) {\n // Assign default enum spec name and enum values.\n var defaultEnumSpecName = getDefaultName(prop) + index;\n var defaultEnumValues = getDefaultEnumValues(prop, schema, opt);\n var enumSpec = encQ[prop] = enumspec_1.initEnumSpec(encQ[prop], defaultEnumSpecName, defaultEnumValues);\n // Add index of the encoding mapping to the property's enum spec index.\n enumSpecIndex.setEncodingProperty(index, prop, enumSpec);\n }\n });\n // For each nested property of the encoding query (e.g., encQ.bin.maxbins)\n property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) {\n var propObj = encQ[nestedProp.parent]; // the property object e.g., encQ.bin\n if (propObj) {\n var prop = nestedProp.property;\n var child = nestedProp.child;\n if (enumspec_1.isEnumSpec(propObj[child])) {\n // Assign default enum spec name and enum values.\n var defaultEnumSpecName = getDefaultName(prop) + index;\n var defaultEnumValues = getDefaultEnumValues(prop, schema, opt);\n var enumSpec = propObj[child] = enumspec_1.initEnumSpec(propObj[child], defaultEnumSpecName, defaultEnumValues);\n // Add index of the encoding mapping to the property's enum spec index.\n enumSpecIndex.setEncodingProperty(index, prop, enumSpec);\n }\n }\n });\n });\n // AUTO COUNT\n // Add Auto Count Field\n if (opt.autoAddCount) {\n var countEncQ = {\n channel: {\n name: getDefaultName(property_1.Property.CHANNEL) + specQ.encodings.length,\n values: getDefaultEnumValues(property_1.Property.CHANNEL, schema, opt)\n },\n autoCount: {\n name: getDefaultName(property_1.Property.AUTOCOUNT) + specQ.encodings.length,\n values: [false, true]\n },\n type: type_1.Type.QUANTITATIVE\n };\n specQ.encodings.push(countEncQ);\n var index = specQ.encodings.length - 1;\n // Add index of the encoding mapping to the property's enum spec index.\n enumSpecIndex.setEncodingProperty(index, property_1.Property.CHANNEL, countEncQ.channel);\n enumSpecIndex.setEncodingProperty(index, property_1.Property.AUTOCOUNT, countEncQ.autoCount);\n }\n return new SpecQueryModel(specQ, enumSpecIndex, schema, opt, {});\n };\n Object.defineProperty(SpecQueryModel.prototype, \"enumSpecIndex\", {\n get: function () {\n return this._enumSpecIndex;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModel.prototype, \"schema\", {\n get: function () {\n return this._schema;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModel.prototype, \"specQuery\", {\n get: function () {\n return this._spec;\n },\n enumerable: true,\n configurable: true\n });\n SpecQueryModel.prototype.duplicate = function () {\n return new SpecQueryModel(util_1.duplicate(this._spec), this._enumSpecIndex, this._schema, this._opt, util_1.duplicate(this._enumSpecAssignment));\n };\n SpecQueryModel.prototype.setMark = function (mark) {\n var name = this._spec.mark.name;\n this._enumSpecAssignment[name] = this._spec.mark = mark;\n };\n SpecQueryModel.prototype.resetMark = function () {\n var enumSpec = this._spec.mark = this._enumSpecIndex.mark;\n delete this._enumSpecAssignment[enumSpec.name];\n };\n SpecQueryModel.prototype.getMark = function () {\n return this._spec.mark;\n };\n SpecQueryModel.prototype.getEncodingProperty = function (index, prop) {\n var encQ = this._spec.encodings[index];\n var nestedProp = property_1.getNestedEncodingProperty(prop);\n if (nestedProp) {\n return encQ[nestedProp.parent][nestedProp.child];\n }\n return encQ[prop]; // encoding property (non-nested)\n };\n SpecQueryModel.prototype.setEncodingProperty = function (index, prop, value, enumSpec) {\n var encQ = this._spec.encodings[index];\n var nestedProp = property_1.getNestedEncodingProperty(prop);\n if (prop === property_1.Property.CHANNEL && encQ.channel && !enumspec_1.isEnumSpec(encQ.channel)) {\n // If there is an old channel\n this._channelCount[encQ.channel]--;\n }\n if (nestedProp) {\n encQ[nestedProp.parent][nestedProp.child] = value;\n }\n else if (property_1.hasNestedProperty(prop) && value === true) {\n encQ[prop] = util_1.extend({}, encQ[prop], // copy all existing properties\n { values: undefined, name: undefined } // except name and values to it no longer an enumSpec\n );\n }\n else {\n encQ[prop] = value;\n }\n this._enumSpecAssignment[enumSpec.name] = value;\n if (prop === property_1.Property.CHANNEL) {\n // If there is a new channel, make sure it exists and add it to the count.\n this._channelCount[value] = (this._channelCount[value] || 0) + 1;\n }\n };\n SpecQueryModel.prototype.resetEncodingProperty = function (index, prop, enumSpec) {\n var encQ = this._spec.encodings[index];\n var nestedProp = property_1.getNestedEncodingProperty(prop);\n if (prop === property_1.Property.CHANNEL) {\n this._channelCount[encQ.channel]--;\n }\n // reset it to enumSpec\n if (nestedProp) {\n encQ[nestedProp.parent][nestedProp.child] = enumSpec;\n }\n else {\n encQ[prop] = enumSpec;\n }\n // add remove value that is reset from the assignment map\n delete this._enumSpecAssignment[enumSpec.name];\n };\n SpecQueryModel.prototype.channelUsed = function (channel) {\n // do not include encoding that has autoCount = false because it is not a part of the output spec.\n return this._channelCount[channel] > 0;\n };\n SpecQueryModel.prototype.stack = function () {\n return spec_1.stack(this._spec);\n };\n SpecQueryModel.prototype.getEncodings = function () {\n // do not include encoding that has autoCount = false because it is not a part of the output spec.\n return this._spec.encodings.filter(function (encQ) { return encQ.autoCount !== false; });\n };\n SpecQueryModel.prototype.getEncodingQueryByChannel = function (channel) {\n for (var i = 0; i < this._spec.encodings.length; i++) {\n if (this._spec.encodings[i].channel === channel) {\n return this._spec.encodings[i];\n }\n }\n return undefined;\n };\n SpecQueryModel.prototype.getEncodingQueryByIndex = function (i) {\n return this._spec.encodings[i];\n };\n SpecQueryModel.prototype.isDimension = function (channel) {\n var encQ = this.getEncodingQueryByChannel(channel);\n return encQ && encoding_1.isDimension(encQ);\n };\n SpecQueryModel.prototype.isMeasure = function (channel) {\n var encQ = this.getEncodingQueryByChannel(channel);\n return encQ && encoding_1.isMeasure(encQ);\n };\n SpecQueryModel.prototype.isAggregate = function () {\n return spec_1.isAggregate(this._spec);\n };\n SpecQueryModel.prototype.toShorthand = function () {\n return shorthand_1.spec(this._spec);\n };\n SpecQueryModel.prototype._encoding = function () {\n var encoding = {};\n for (var i = 0; i < this._spec.encodings.length; i++) {\n var encQ = this._spec.encodings[i];\n var fieldDef = {};\n // For count field that is automatically added, convert to correct vega-lite fieldDef\n if (encQ.autoCount === true) {\n fieldDef.aggregate = aggregate_1.AggregateOp.COUNT;\n fieldDef.field = '*';\n fieldDef.type = type_1.Type.QUANTITATIVE;\n }\n else if (encQ.autoCount === false) {\n continue; // Do not include this in the output.\n }\n // if channel is an enum spec, return null\n if (enumspec_1.isEnumSpec(encQ.channel))\n return null;\n // assemble other property into a field def.\n var PROPERTIES = [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.SORT, property_1.Property.SCALE, property_1.Property.TIMEUNIT, property_1.Property.FIELD, property_1.Property.TYPE];\n for (var j = 0; j < PROPERTIES.length; j++) {\n var prop = PROPERTIES[j];\n // if the property is an enum spec, return null\n if (enumspec_1.isEnumSpec(encQ[prop]))\n return null;\n // otherwise, assign the proper to the field def\n if (encQ[prop] !== undefined) {\n fieldDef[prop] = encQ[prop];\n }\n }\n encoding[encQ.channel] = fieldDef;\n }\n return encoding;\n };\n /**\n * Convert a query to a Vega-Lite spec if it is completed.\n * @return a Vega-Lite spec if completed, null otherwise.\n */\n SpecQueryModel.prototype.toSpec = function (data) {\n if (enumspec_1.isEnumSpec(this._spec.mark))\n return null;\n var spec = {};\n data = data || this._spec.data;\n if (data) {\n spec.data = data;\n }\n if (this._spec.transform) {\n spec.transform = this._spec.transform;\n }\n spec.mark = this._spec.mark;\n spec.encoding = this._encoding();\n if (spec.encoding === null) {\n return null;\n }\n if (this._spec.config || this._opt.defaultSpecConfig)\n spec.config = util_1.extend({}, this._opt.defaultSpecConfig, this._spec.config);\n return spec;\n };\n SpecQueryModel.prototype.getRankingScore = function (rankingName) {\n return this._rankingScore[rankingName];\n };\n SpecQueryModel.prototype.setRankingScore = function (rankingName, score) {\n this._rankingScore[rankingName] = score;\n };\n return SpecQueryModel;\n}());\nexports.SpecQueryModel = SpecQueryModel;\n//# sourceMappingURL=model.js.map", + "\"use strict\";\nfunction isSpecQueryModelGroup(item) {\n return item && item.hasOwnProperty('items');\n}\nexports.isSpecQueryModelGroup = isSpecQueryModelGroup;\nfunction getTopItem(g) {\n var topItem = g.items[0];\n if (isSpecQueryModelGroup(topItem)) {\n return getTopItem(topItem);\n }\n else {\n return topItem;\n }\n}\nexports.getTopItem = getTopItem;\n//# sourceMappingURL=modelgroup.js.map", + "\"use strict\";\nvar channel_1 = require('vega-lite/src/channel');\nvar util_1 = require('datalib/src/util');\nvar enumspec_1 = require('./enumspec');\nvar util_2 = require('./util');\nvar groupby_1 = require('./query/groupby');\nvar shorthand_1 = require('./query/shorthand');\nvar spec_1 = require('./query/spec');\n/**\n * Registry for all possible grouping key functions.\n */\nvar groupRegistry = {};\n/**\n * Add a grouping function to the registry.\n */\nfunction registerKeyFn(name, keyFn) {\n groupRegistry[name] = keyFn;\n}\nexports.registerKeyFn = registerKeyFn;\nexports.FIELD = 'field';\nexports.FIELD_TRANSFORM = 'fieldTransform';\nexports.ENCODING = 'encoding';\nexports.TRANSPOSE = 'transpose';\nexports.SPEC = 'spec';\n/**\n * Group the input spec query model by a key function registered in the group registry\n * @return\n */\nfunction nest(specModels, query) {\n var rootGroup = { name: '', path: '', items: [] };\n var groupIndex = {};\n if (query.nest) {\n // global `includes` and `replaces` will get augmented by each level's groupBy.\n // Upper level's `groupBy` will get cascaded to lower-level groupBy.\n // `replace` can be overriden in a lower-level to support different grouping.\n var includes_1 = [];\n var replaces_1 = [];\n var replacers_1 = [];\n var _loop_1 = function(l) {\n includes_1.push(l > 0 ? util_2.duplicate(includes_1[l - 1]) : {});\n replaces_1.push(l > 0 ? util_2.duplicate(replaces_1[l - 1]) : {});\n var groupBy = query.nest[l].groupBy;\n if (util_1.isArray(groupBy)) {\n groupBy.forEach(function (grpBy) {\n if (groupby_1.isExtendedGroupBy(grpBy)) {\n includes_1[l][grpBy.property] = true;\n replaces_1[l][grpBy.property] = grpBy.replace;\n }\n else {\n includes_1[l][grpBy] = true;\n }\n });\n var replaceFnIndex = util_2.keys(replaces_1[l]).reduce(function (fnIndex, prop) {\n fnIndex[prop] = shorthand_1.getReplacer(replaces_1[l][prop]);\n return fnIndex;\n }, {});\n replacers_1.push(replaceFnIndex);\n }\n };\n for (var l = 0; l < query.nest.length; l++) {\n _loop_1(l);\n }\n // With includes and replacers, now we can construct the nesting tree\n specModels.forEach(function (specM) {\n var path = '';\n var group = rootGroup;\n for (var l = 0; l < query.nest.length; l++) {\n var groupBy = group.groupBy = query.nest[l].groupBy;\n group.orderGroupBy = query.nest[l].orderGroupBy;\n var key = util_1.isArray(groupBy) ?\n shorthand_1.spec(specM.specQuery, includes_1[l], replacers_1[l]) :\n groupRegistry[groupBy](specM);\n path += '/' + key;\n if (!groupIndex[path]) {\n groupIndex[path] = {\n name: key,\n path: path,\n items: []\n };\n group.items.push(groupIndex[path]);\n }\n group = groupIndex[path];\n }\n group.items.push(specM);\n });\n }\n else {\n rootGroup.items = specModels;\n }\n return rootGroup;\n}\nexports.nest = nest;\nregisterKeyFn(exports.FIELD, function (specM) {\n return specM.getEncodings().map(function (encQ) { return encQ.field; })\n .filter(function (field) { return field && field !== '*'; })\n .sort()\n .join('|');\n});\nregisterKeyFn(exports.FIELD_TRANSFORM, function (specM) {\n return specM.getEncodings().map(function (encQ) { return shorthand_1.fieldDef(encQ); })\n .sort()\n .join('|');\n});\nfunction channelType(channel) {\n if (enumspec_1.isEnumSpec(channel)) {\n return enumspec_1.SHORT_ENUM_SPEC + '';\n }\n var c = channel;\n switch (c) {\n case channel_1.Channel.X:\n case channel_1.Channel.Y:\n return 'xy';\n case channel_1.Channel.ROW:\n case channel_1.Channel.COLUMN:\n return 'facet';\n case channel_1.Channel.COLOR:\n case channel_1.Channel.SIZE:\n case channel_1.Channel.SHAPE:\n case channel_1.Channel.OPACITY:\n return 'non-xy';\n case channel_1.Channel.TEXT:\n case channel_1.Channel.DETAIL:\n case channel_1.Channel.PATH:\n case channel_1.Channel.ORDER:\n return c + '';\n /* istanbul ignore next */\n default:\n console.warn('channel type not implemented for ' + c);\n return c + '';\n }\n}\nfunction stringifyStack(specM) {\n var _stack = spec_1.stack(specM.specQuery);\n return (!!_stack ? 'stack=' + _stack.offset + '|' : '');\n}\nregisterKeyFn(exports.ENCODING, function (specM) {\n // mark does not matter\n return stringifyStack(specM) +\n specM.getEncodings().map(function (encQ) {\n var fieldDef = shorthand_1.fieldDef(encQ);\n return channelType(encQ.channel) + ':' + fieldDef;\n })\n .sort()\n .join('|');\n});\nregisterKeyFn(exports.TRANSPOSE, function (specM) {\n return specM.getMark() + '|' +\n stringifyStack(specM) +\n specM.getEncodings().map(function (encQ) {\n var fieldDef = shorthand_1.fieldDef(encQ);\n var channel = (encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) ? 'xy' :\n (encQ.channel === channel_1.Channel.ROW || encQ.channel === channel_1.Channel.COLUMN) ? 'facet' :\n encQ.channel;\n return channel + ':' + fieldDef;\n })\n .sort()\n .join('|');\n});\nregisterKeyFn(exports.SPEC, function (specM) { return JSON.stringify(specM.specQuery); });\n//# sourceMappingURL=nest.js.map", + "\"use strict\";\nvar scale_1 = require('vega-lite/src/scale');\n(function (Property) {\n Property[Property[\"MARK\"] = 'mark'] = \"MARK\";\n // TODO: Filter (Field, Value?)\n // Layout\n Property[Property[\"STACK\"] = 'stack'] = \"STACK\";\n // TODO: sub parts of stack\n // Encoding Properties\n Property[Property[\"CHANNEL\"] = 'channel'] = \"CHANNEL\";\n Property[Property[\"AGGREGATE\"] = 'aggregate'] = \"AGGREGATE\";\n Property[Property[\"AUTOCOUNT\"] = 'autoCount'] = \"AUTOCOUNT\";\n Property[Property[\"BIN\"] = 'bin'] = \"BIN\";\n Property[Property[\"BIN_MAXBINS\"] = 'binMaxBins'] = \"BIN_MAXBINS\";\n Property[Property[\"TIMEUNIT\"] = 'timeUnit'] = \"TIMEUNIT\";\n Property[Property[\"FIELD\"] = 'field'] = \"FIELD\";\n Property[Property[\"TYPE\"] = 'type'] = \"TYPE\";\n // - Sort\n Property[Property[\"SORT\"] = 'sort'] = \"SORT\";\n Property[Property[\"SORT_FIELD\"] = 'sortField'] = \"SORT_FIELD\";\n Property[Property[\"SORT_OP\"] = 'sortOp'] = \"SORT_OP\";\n Property[Property[\"SORT_ORDER\"] = 'sortOrder'] = \"SORT_ORDER\";\n // - Scale\n Property[Property[\"SCALE\"] = 'scale'] = \"SCALE\";\n Property[Property[\"SCALE_BANDSIZE\"] = 'scaleBandSize'] = \"SCALE_BANDSIZE\";\n Property[Property[\"SCALE_CLAMP\"] = 'scaleClamp'] = \"SCALE_CLAMP\";\n Property[Property[\"SCALE_DOMAIN\"] = 'scaleDomain'] = \"SCALE_DOMAIN\";\n Property[Property[\"SCALE_EXPONENT\"] = 'scaleExponent'] = \"SCALE_EXPONENT\";\n Property[Property[\"SCALE_NICE\"] = 'scaleNice'] = \"SCALE_NICE\";\n Property[Property[\"SCALE_RANGE\"] = 'scaleRange'] = \"SCALE_RANGE\";\n Property[Property[\"SCALE_ROUND\"] = 'scaleRound'] = \"SCALE_ROUND\";\n Property[Property[\"SCALE_TYPE\"] = 'scaleType'] = \"SCALE_TYPE\";\n Property[Property[\"SCALE_USERAWDOMAIN\"] = 'scaleUseRawDomain'] = \"SCALE_USERAWDOMAIN\";\n Property[Property[\"SCALE_ZERO\"] = 'scaleZero'] = \"SCALE_ZERO\";\n // - Axis\n Property[Property[\"AXIS\"] = 'axis'] = \"AXIS\";\n // TODO: AXIS_*\n // - Legend\n Property[Property[\"LEGEND\"] = 'legend'] = \"LEGEND\";\n})(exports.Property || (exports.Property = {}));\nvar Property = exports.Property;\nfunction hasNestedProperty(prop) {\n switch (prop) {\n case Property.BIN:\n case Property.SCALE:\n case Property.SORT:\n // TODO: AXIS, LEGEND\n return true;\n case Property.MARK:\n case Property.STACK:\n case Property.CHANNEL:\n case Property.AGGREGATE:\n case Property.AUTOCOUNT:\n case Property.TIMEUNIT:\n case Property.FIELD:\n case Property.TYPE:\n case Property.BIN_MAXBINS:\n case Property.SCALE_BANDSIZE:\n case Property.SCALE_CLAMP:\n case Property.SCALE_DOMAIN:\n case Property.SCALE_EXPONENT:\n case Property.SCALE_NICE:\n case Property.SCALE_RANGE:\n case Property.SCALE_ROUND:\n case Property.SCALE_TYPE:\n case Property.SCALE_USERAWDOMAIN:\n case Property.SCALE_ZERO:\n return false;\n }\n /* istanbul ignore next */\n throw new Error('hasNestedProperty undefined for property ' + prop);\n}\nexports.hasNestedProperty = hasNestedProperty;\nexports.ENCODING_PROPERTIES = [\n Property.CHANNEL,\n Property.BIN,\n Property.BIN_MAXBINS,\n Property.TIMEUNIT,\n Property.AGGREGATE,\n Property.AUTOCOUNT,\n Property.FIELD,\n Property.TYPE,\n Property.SORT,\n Property.SORT_FIELD,\n Property.SORT_OP,\n Property.SORT_ORDER,\n Property.SCALE,\n Property.SCALE_BANDSIZE,\n Property.SCALE_CLAMP,\n Property.SCALE_DOMAIN,\n Property.SCALE_EXPONENT,\n Property.SCALE_NICE,\n Property.SCALE_RANGE,\n Property.SCALE_ROUND,\n Property.SCALE_TYPE,\n Property.SCALE_USERAWDOMAIN,\n Property.SCALE_ZERO\n];\nexports.DEFAULT_PROPERTY_PRECEDENCE = [\n // Projection\n Property.TYPE,\n Property.FIELD,\n // TODO: Add stack and remove it from INCLUDE_ALL in shorthand\n // Field Transform\n Property.BIN,\n Property.TIMEUNIT,\n Property.AGGREGATE,\n Property.AUTOCOUNT,\n Property.SORT,\n Property.SORT_FIELD,\n Property.SORT_OP,\n Property.SORT_ORDER,\n // Nested Transform Property\n Property.BIN_MAXBINS,\n // Encoding\n Property.CHANNEL,\n Property.MARK,\n Property.SCALE,\n // Nested Encoding Property\n Property.SCALE_BANDSIZE,\n Property.SCALE_CLAMP,\n Property.SCALE_DOMAIN,\n Property.SCALE_EXPONENT,\n Property.SCALE_NICE,\n Property.SCALE_RANGE,\n Property.SCALE_ROUND,\n Property.SCALE_TYPE,\n Property.SCALE_USERAWDOMAIN,\n Property.SCALE_ZERO\n];\nexports.NESTED_ENCODING_PROPERTIES = [\n {\n property: Property.BIN_MAXBINS,\n parent: 'bin',\n child: 'maxbins'\n },\n {\n property: Property.SORT_FIELD,\n parent: 'sort',\n child: 'field'\n },\n {\n property: Property.SORT_OP,\n parent: 'sort',\n child: 'op'\n },\n {\n property: Property.SORT_ORDER,\n parent: 'sort',\n child: 'order'\n },\n {\n property: Property.SCALE_BANDSIZE,\n parent: 'scale',\n child: 'bandSize'\n },\n {\n property: Property.SCALE_CLAMP,\n parent: 'scale',\n child: 'clamp'\n },\n {\n property: Property.SCALE_DOMAIN,\n parent: 'scale',\n child: 'domain'\n },\n {\n property: Property.SCALE_EXPONENT,\n parent: 'scale',\n child: 'exponent'\n },\n {\n property: Property.SCALE_NICE,\n parent: 'scale',\n child: 'nice'\n },\n {\n property: Property.SCALE_RANGE,\n parent: 'scale',\n child: 'range'\n },\n {\n property: Property.SCALE_ROUND,\n parent: 'scale',\n child: 'round'\n },\n {\n property: Property.SCALE_TYPE,\n parent: 'scale',\n child: 'type'\n },\n {\n property: Property.SCALE_USERAWDOMAIN,\n parent: 'scale',\n child: 'useRawDomain'\n },\n {\n property: Property.SCALE_ZERO,\n parent: 'scale',\n child: 'zero'\n }\n];\nvar NESTED_ENCODING_INDEX = exports.NESTED_ENCODING_PROPERTIES.reduce(function (m, nestedProp) {\n m[nestedProp.property] = nestedProp;\n return m;\n}, {});\nvar NESTED_ENCODING_PROPERTY_PARENT_INDEX = exports.NESTED_ENCODING_PROPERTIES.reduce(function (m, nestedProp) {\n var parent = nestedProp.parent;\n // if the parent does not exist in m yet, add it as a key in m with empty [] as value\n if (!(parent in m)) {\n m[parent] = [];\n }\n m[nestedProp.parent].push(nestedProp);\n return m;\n}, {}); // as Dict>);\nexports.SCALE_PROPERTIES = NESTED_ENCODING_PROPERTY_PARENT_INDEX['scale'].map(function (nestedProp) {\n return nestedProp.property;\n});\nvar ENCODING_INDEX = exports.ENCODING_PROPERTIES.reduce(function (m, prop) {\n m[prop] = prop;\n return m;\n}, {});\nfunction isEncodingProperty(prop) {\n return ENCODING_INDEX[prop] !== undefined;\n}\nexports.isEncodingProperty = isEncodingProperty;\nfunction getNestedEncodingProperty(prop) {\n return NESTED_ENCODING_INDEX[prop];\n}\nexports.getNestedEncodingProperty = getNestedEncodingProperty;\nfunction getNestedEncodingPropertyChildren(parent) {\n return NESTED_ENCODING_PROPERTY_PARENT_INDEX[parent];\n}\nexports.getNestedEncodingPropertyChildren = getNestedEncodingPropertyChildren;\nfunction isNestedEncodingProperty(prop) {\n return prop in NESTED_ENCODING_INDEX;\n}\nexports.isNestedEncodingProperty = isNestedEncodingProperty;\nvar SUPPORTED_SCALE_PROPERTY = [\n {\n property: 'bandSize',\n supportedScaleType: [\n scale_1.ScaleType.ORDINAL\n ]\n },\n {\n property: 'clamp',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'domain',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.QUANTILE,\n scale_1.ScaleType.QUANTIZE,\n scale_1.ScaleType.ORDINAL,\n scale_1.ScaleType.SQRT,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'exponent',\n supportedScaleType: [\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.SQRT\n ]\n },\n {\n property: 'nice',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'range',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.QUANTILE,\n scale_1.ScaleType.QUANTIZE,\n scale_1.ScaleType.ORDINAL,\n scale_1.ScaleType.SQRT,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'round',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.SQRT,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'useRawDomain',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.LOG,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.QUANTILE,\n scale_1.ScaleType.QUANTIZE,\n scale_1.ScaleType.ORDINAL,\n scale_1.ScaleType.SQRT,\n scale_1.ScaleType.TIME,\n scale_1.ScaleType.UTC\n ]\n },\n {\n property: 'zero',\n supportedScaleType: [\n scale_1.ScaleType.LINEAR,\n scale_1.ScaleType.POW,\n scale_1.ScaleType.SQRT\n ]\n }\n];\nexports.SUPPORTED_SCALE_PROPERTY_INDEX = SUPPORTED_SCALE_PROPERTY.reduce(function (m, scaleProp) {\n var prop = scaleProp.property;\n m[prop] = scaleProp.supportedScaleType;\n return m;\n}, {});\n//# sourceMappingURL=property.js.map", + "\"use strict\";\nvar scale_1 = require('vega-lite/src/scale');\nvar timeunit_1 = require('vega-lite/src/timeunit');\nvar type_1 = require('vega-lite/src/type');\nvar enumspec_1 = require('../enumspec');\nvar util_1 = require('../util');\nfunction isDimension(encQ) {\n return util_1.contains([type_1.Type.NOMINAL, type_1.Type.ORDINAL], encQ.type) ||\n (!enumspec_1.isEnumSpec(encQ.bin) && !!encQ.bin) ||\n (!enumspec_1.isEnumSpec(encQ.timeUnit) && !!encQ.timeUnit); // surely T type\n // TODO For T type, take scale type of the timeUnit into account\n}\nexports.isDimension = isDimension;\nfunction isMeasure(encQ) {\n return (encQ.type === type_1.Type.QUANTITATIVE && !encQ.bin) ||\n (encQ.type === type_1.Type.TEMPORAL && !encQ.timeUnit);\n // TODO For T type, take scale type of the timeUnit into account\n}\nexports.isMeasure = isMeasure;\n/**\n * Returns the true scale type of an encoding.\n * @returns {ScaleType} If the scale type was not specified, it is inferred from the encoding's Type.\n * @returns {undefined} If the scale type was not specified and Type (or TimeUnit if applicable) is an EnumSpec, there is no clear scale type\n */\nfunction scaleType(scaleType, timeUnit, type) {\n if (scaleType !== undefined) {\n return scaleType;\n }\n if (enumspec_1.isEnumSpec(type)) {\n return undefined;\n }\n /* istanbul ignore else */\n if (type === type_1.Type.QUANTITATIVE) {\n return scale_1.ScaleType.LINEAR;\n }\n else if (type === type_1.Type.ORDINAL || type === type_1.Type.NOMINAL) {\n return scale_1.ScaleType.ORDINAL;\n }\n else if (type === type_1.Type.TEMPORAL) {\n if (timeUnit !== undefined) {\n if (enumspec_1.isEnumSpec(timeUnit)) {\n return undefined;\n }\n return timeunit_1.defaultScaleType(timeUnit);\n }\n else {\n return scale_1.ScaleType.TIME;\n }\n }\n else {\n throw new Error();\n }\n}\nexports.scaleType = scaleType;\n//# sourceMappingURL=encoding.js.map", + "\"use strict\";\nvar util_1 = require('datalib/src/util');\nvar util_2 = require('../util');\nexports.REPLACE_BLANK_FIELDS = { '*': '' };\nexports.REPLACE_XY_CHANNELS = { x: 'xy', y: 'xy' };\nexports.REPLACE_FACET_CHANNELS = { row: 'facet', column: 'facet' };\nexports.REPLACE_MARK_STYLE_CHANNELS = { color: 'style', opacity: 'style', shape: 'style', size: 'style' };\nfunction isExtendedGroupBy(g) {\n return util_1.isObject(g) && !!g['property'];\n}\nexports.isExtendedGroupBy = isExtendedGroupBy;\nfunction toString(groupBy) {\n if (util_1.isArray(groupBy)) {\n return groupBy.map(function (g) {\n if (isExtendedGroupBy(g)) {\n if (g.replace) {\n var replaceIndex = util_2.keys(g.replace).reduce(function (index, valFrom) {\n var valTo = g.replace[valFrom];\n (index[valTo] = index[valTo] || []).push(valFrom);\n return index;\n }, {});\n return g.property + '[' + util_2.keys(replaceIndex).map(function (valTo) {\n var valsFrom = replaceIndex[valTo].sort();\n return valsFrom.join(',') + '=>' + valTo;\n }).join(';') + ']';\n }\n return g.property;\n }\n return g;\n }).join(',');\n }\n else {\n return groupBy;\n }\n}\nexports.toString = toString;\n//# sourceMappingURL=groupby.js.map", + "\"use strict\";\nvar config_1 = require('../config');\nvar generate_1 = require('../generate');\nvar nest_1 = require('../nest');\nvar ranking_1 = require('../ranking/ranking');\nvar util_1 = require('../util');\nexports.encoding = require('./encoding');\nexports.groupBy = require('./groupby');\nexports.shorthand = require('./shorthand');\nexports.spec = require('./spec');\nexports.transform = require('./transform');\nfunction query(q, schema, config) {\n // 1. Normalize non-nested `groupBy` to always have `groupBy` inside `nest`\n // and merge config with the following precedence\n // query.config > config > DEFAULT_QUERY_CONFIG\n q = util_1.extend({}, normalize(q), {\n config: util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, config, q.config)\n });\n // 2. Generate\n var answerSet = generate_1.generate(q.spec, schema, q.config);\n var nestedAnswerSet = nest_1.nest(answerSet, q);\n var result = ranking_1.rank(nestedAnswerSet, q, schema, 0);\n return {\n query: q,\n result: result\n };\n}\nexports.query = query;\n/**\n * Normalize the non-nested version of the query to a standardize nested\n */\nfunction normalize(q) {\n if (q.groupBy) {\n var nest_2 = {\n groupBy: q.groupBy\n };\n if (q.orderBy) {\n nest_2.orderGroupBy = q.orderBy;\n }\n var normalizedQ = {\n spec: util_1.duplicate(q.spec),\n nest: [nest_2],\n };\n if (q.chooseBy) {\n normalizedQ.chooseBy = q.chooseBy;\n }\n if (q.config) {\n normalizedQ.config = q.config;\n }\n return normalizedQ;\n }\n return util_1.duplicate(q); // We will cause side effect to q.spec in SpecQueryModel.build\n}\nexports.normalize = normalize;\n//# sourceMappingURL=query.js.map", + "\"use strict\";\nvar type_1 = require('vega-lite/src/type');\nvar util_1 = require('datalib/src/util');\nvar spec_1 = require('./spec');\nvar enumspec_1 = require('../enumspec');\nvar property_1 = require('../property');\nvar util_2 = require('../util');\nfunction getReplacer(replace) {\n return function (s) {\n if (replace[s] !== undefined) {\n return replace[s];\n }\n return s;\n };\n}\nexports.getReplacer = getReplacer;\nfunction value(v, replace) {\n if (enumspec_1.isEnumSpec(v)) {\n return enumspec_1.SHORT_ENUM_SPEC;\n }\n if (replace) {\n return replace(v);\n }\n return v;\n}\nexports.value = value;\nexports.INCLUDE_ALL = \n// TODO: remove manual stack concat once we really support enumerating it.\nproperty_1.DEFAULT_PROPERTY_PRECEDENCE.concat([property_1.Property.STACK])\n .reduce(function (m, prop) {\n m[prop] = true;\n return m;\n}, {});\n/**\n * Returns a shorthand for a spec query\n * @param specQ a spec query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction spec(specQ, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = {}; }\n var parts = [];\n if (include[property_1.Property.MARK]) {\n parts.push(value(specQ.mark, replace[property_1.Property.MARK]));\n }\n // TODO: transform\n // TODO: extract this to its own stack method\n if (include[property_1.Property.STACK]) {\n var _stack = spec_1.stack(specQ);\n if (_stack) {\n // TODO: Refactor this once we have child stack property.\n // Exclude type since we don't care about type in stack\n var includeExceptType = util_2.extend({}, include, { type: false });\n var field = fieldDef(_stack.fieldEncQ, includeExceptType, replace);\n var groupby = fieldDef(_stack.groupByEncQ, includeExceptType, replace);\n parts.push((\"stack={field:\" + field + \",\") +\n (groupby ? \"by:\" + groupby + \",\" : '') +\n (\"offset:\" + _stack.offset + \"}\"));\n }\n }\n parts.push(specQ.encodings.reduce(function (encQs, encQ) {\n // Exclude encoding mapping with autoCount=false as they are basically disabled.\n if (encQ.autoCount !== false) {\n var str = encoding(encQ, include, replace);\n if (str) {\n encQs.push(str);\n }\n }\n return encQs;\n }, [])\n .sort() // sort at the end to ignore order\n .join('|'));\n return parts.join('|');\n}\nexports.spec = spec;\n/**\n * Returns a shorthand for an encoding query\n * @param encQ an encoding query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction encoding(encQ, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = {}; }\n var parts = [];\n if (include[property_1.Property.CHANNEL]) {\n parts.push(value(encQ.channel, replace[property_1.Property.CHANNEL]));\n }\n var fieldDefStr = fieldDef(encQ, include, replace);\n if (fieldDefStr) {\n parts.push(fieldDefStr);\n }\n return parts.join(':');\n}\nexports.encoding = encoding;\n/**\n * Returns a field definiton shorthand for an encoding query\n * @param encQ an encoding query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction fieldDef(encQ, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = {}; }\n var fn = null;\n /** Encoding properties e.g., Scale, Axis, Legend */\n var props = [];\n if (include[property_1.Property.AGGREGATE] && encQ.autoCount === false) {\n return '-';\n }\n else if (include[property_1.Property.AGGREGATE] && encQ.aggregate && !enumspec_1.isEnumSpec(encQ.aggregate)) {\n fn = value(encQ.aggregate, replace[property_1.Property.AGGREGATE]);\n }\n else if (include[property_1.Property.AGGREGATE] && encQ.autoCount && !enumspec_1.isEnumSpec(encQ.autoCount)) {\n fn = value('count', replace[property_1.Property.AGGREGATE]);\n ;\n }\n else if (include[property_1.Property.TIMEUNIT] && encQ.timeUnit && !enumspec_1.isEnumSpec(encQ.timeUnit)) {\n fn = value(encQ.timeUnit, replace[property_1.Property.TIMEUNIT]);\n }\n else if (include[property_1.Property.BIN] && encQ.bin && !enumspec_1.isEnumSpec(encQ.bin)) {\n fn = 'bin';\n if (include[property_1.Property.BIN_MAXBINS] && encQ.bin['maxbins']) {\n props.push({\n key: 'maxbins',\n value: value(encQ.bin['maxbins'], replace[property_1.Property.BIN_MAXBINS])\n });\n }\n }\n else {\n for (var _i = 0, _a = [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN]; _i < _a.length; _i++) {\n var prop = _a[_i];\n if (include[prop] && encQ[prop] && enumspec_1.isEnumSpec(encQ[prop])) {\n fn = enumspec_1.SHORT_ENUM_SPEC + '';\n break;\n }\n }\n }\n // Scale\n // TODO: axis, legend\n var _loop_1 = function(nestedPropParent) {\n if (include[nestedPropParent]) {\n if (encQ[nestedPropParent] && !enumspec_1.isEnumSpec(encQ[nestedPropParent])) {\n // `sort` can be a string (ascending/descending).\n if (util_1.isString(encQ[nestedPropParent])) {\n props.push({\n key: nestedPropParent + '',\n value: encQ[nestedPropParent]\n });\n }\n else {\n var nestedProps = property_1.getNestedEncodingPropertyChildren(nestedPropParent);\n var nestedPropChildren = nestedProps.reduce(function (p, nestedProp) {\n if (include[nestedProp.property] && encQ[nestedPropParent][nestedProp.child] !== undefined) {\n p[nestedProp.child] = value(encQ[nestedPropParent][nestedProp.child], replace[nestedProp.property]);\n }\n return p;\n }, {});\n if (util_2.keys(nestedPropChildren).length > 0) {\n props.push({\n key: nestedPropParent + '',\n value: JSON.stringify(nestedPropChildren)\n });\n }\n }\n }\n else if (encQ[nestedPropParent] === false || encQ[nestedPropParent] === null) {\n // `scale`, `axis`, `legend` can be false/null.\n props.push({\n key: nestedPropParent + '',\n value: false\n });\n }\n }\n };\n for (var _b = 0, _c = [property_1.Property.SCALE, property_1.Property.SORT]; _b < _c.length; _b++) {\n var nestedPropParent = _c[_b];\n _loop_1(nestedPropParent);\n }\n // field\n var fieldAndParams = include[property_1.Property.FIELD] ? value(encQ.field || '*', replace[property_1.Property.FIELD]) : '...';\n // type\n if (include[property_1.Property.TYPE]) {\n var typeShort = ((encQ.type || type_1.Type.QUANTITATIVE) + '').substr(0, 1);\n fieldAndParams += ',' + value(typeShort, replace[property_1.Property.TYPE]);\n }\n // encoding properties\n fieldAndParams += props.map(function (p) { return ',' + p.key + '=' + p.value; }).join('');\n return (fn ? fn + '(' + fieldAndParams + ')' : fieldAndParams);\n}\nexports.fieldDef = fieldDef;\n//# sourceMappingURL=shorthand.js.map", + "\"use strict\";\nvar channel_1 = require('vega-lite/src/channel');\nvar mark_1 = require('vega-lite/src/mark');\nvar stack_1 = require('vega-lite/src/stack');\nvar enumspec_1 = require('../enumspec');\nvar property_1 = require('../property');\nvar util_1 = require('../util');\n/**\n * Convert a Vega-Lite's ExtendedUnitSpec into a CompassQL's SpecQuery\n * @param {ExtendedUnitSpec} spec\n * @returns\n */\nfunction fromSpec(spec) {\n return util_1.extend(spec.data ? { data: spec.data } : {}, spec.transform ? { transform: spec.transform } : {}, {\n mark: spec.mark,\n encodings: util_1.keys(spec.encoding).map(function (channel) {\n var encQ = { channel: channel };\n var channelDef = spec.encoding[channel];\n for (var _i = 0, ENCODING_PROPERTIES_1 = property_1.ENCODING_PROPERTIES; _i < ENCODING_PROPERTIES_1.length; _i++) {\n var prop = ENCODING_PROPERTIES_1[_i];\n if (!property_1.isNestedEncodingProperty(prop) && channelDef[prop] !== undefined) {\n encQ[prop] = channelDef[prop];\n }\n // Currently scale, axis, legend only support boolean, but not null.\n // Therefore convert null to false.\n if (util_1.contains([property_1.Property.SCALE, property_1.Property.AXIS, property_1.Property.LEGEND], prop) && encQ[prop] === null) {\n encQ[prop] = false;\n }\n }\n return encQ;\n })\n }, spec.config ? { config: spec.config } : {});\n}\nexports.fromSpec = fromSpec;\nfunction isAggregate(specQ) {\n return util_1.some(specQ.encodings, function (encQ) {\n return (!enumspec_1.isEnumSpec(encQ.aggregate) && !!encQ.aggregate) || encQ.autoCount === true;\n });\n}\nexports.isAggregate = isAggregate;\n/**\n * @return the stack offset type for the specQuery\n */\nfunction stack(specQ) {\n var config = specQ.config;\n var stacked = (config && config.mark) ? config.mark.stacked : undefined;\n // Should not have stack explicitly disabled\n if (util_1.contains([stack_1.StackOffset.NONE, null, false], stacked)) {\n return null;\n }\n // Should have stackable mark\n if (!util_1.contains([mark_1.BAR, mark_1.AREA], specQ.mark)) {\n return null;\n }\n // Should be aggregate plot\n if (!isAggregate(specQ)) {\n return null;\n }\n var stackByChannels = specQ.encodings.reduce(function (sc, encQ) {\n if (util_1.contains(channel_1.STACK_GROUP_CHANNELS, encQ.channel) && !encQ.aggregate) {\n sc.push(encQ.channel);\n }\n return sc;\n }, []);\n if (stackByChannels.length === 0) {\n return null;\n }\n // Has only one aggregate axis\n var xEncQ = specQ.encodings.reduce(function (f, encQ) {\n return f || (encQ.channel === channel_1.Channel.X ? encQ : null);\n }, null);\n var yEncQ = specQ.encodings.reduce(function (f, encQ) {\n return f || (encQ.channel === channel_1.Channel.Y ? encQ : null);\n }, null);\n var xIsAggregate = !!xEncQ && (!!xEncQ.aggregate || !!xEncQ.autoCount);\n var yIsAggregate = !!yEncQ && (!!yEncQ.aggregate || !!yEncQ.autoCount);\n if (xIsAggregate !== yIsAggregate) {\n return {\n groupbyChannel: xIsAggregate ? (!!yEncQ ? channel_1.Y : null) : (!!xEncQ ? channel_1.X : null),\n groupByEncQ: xIsAggregate ? yEncQ : xEncQ,\n fieldChannel: xIsAggregate ? channel_1.X : channel_1.Y,\n fieldEncQ: xIsAggregate ? xEncQ : yEncQ,\n stackByChannels: stackByChannels,\n offset: stacked || stack_1.StackOffset.ZERO\n };\n }\n return null;\n}\nexports.stack = stack;\n//# sourceMappingURL=spec.js.map", + "\"use strict\";\n//# sourceMappingURL=transform.js.map", + "\"use strict\";\nvar aggregate_1 = require('vega-lite/src/aggregate');\nvar type_1 = require('vega-lite/src/type');\nvar util_1 = require('../util');\nvar encoding_1 = require('../query/encoding');\nexports.name = 'aggregationQuality';\nfunction score(specM, schema, opt) {\n var feature = aggregationQualityFeature(specM, schema, opt);\n return {\n score: feature.score,\n features: [feature]\n };\n}\nexports.score = score;\nfunction aggregationQualityFeature(specM, schema, opt) {\n var encodings = specM.getEncodings();\n if (specM.isAggregate()) {\n var isRawContinuous = function (encQ) {\n return (encQ.type === type_1.Type.QUANTITATIVE && !encQ.bin && !encQ.aggregate && !encQ.autoCount) ||\n (encQ.type === type_1.Type.TEMPORAL && !encQ.timeUnit);\n };\n if (util_1.some(encodings, isRawContinuous)) {\n // These are plots that pollute continuous fields as dimension.\n // They are often intermediate visualizations rather than what users actually want.\n return {\n type: exports.name,\n score: 0.1,\n feature: 'Aggregate with raw continuous'\n };\n }\n if (util_1.some(encodings, encoding_1.isDimension)) {\n if (util_1.some(encodings, function (encQ) { return encQ.aggregate === aggregate_1.AggregateOp.COUNT; })) {\n // If there is count, we might add additional count field, making it a little less simple\n // then when we just apply aggregate to Q field\n return {\n type: exports.name,\n score: 0.8,\n feature: 'Aggregate with count'\n };\n }\n return {\n type: exports.name,\n score: 0.9,\n feature: 'Aggregate without count'\n };\n }\n // no dimension -- often not very useful\n return {\n type: exports.name,\n score: 0.3,\n feature: 'Aggregate without dimension'\n };\n }\n else {\n if (util_1.some(encodings, encoding_1.isMeasure)) {\n // raw plots with measure -- simplest of all!\n return {\n type: exports.name,\n score: 1,\n feature: 'Raw with measure'\n };\n }\n // raw plots with no measure -- often a lot of occlusion\n return {\n type: exports.name,\n score: 0.2,\n feature: 'Raw without measure'\n };\n }\n}\n//# sourceMappingURL=aggregation.js.map", + "\"use strict\";\nvar channel_1 = require('vega-lite/src/channel');\nvar config_1 = require('../../config');\nvar shorthand_1 = require('../../query/shorthand');\nvar util_1 = require('../../util');\nvar effectiveness_1 = require('./effectiveness');\nvar type_1 = require('./type');\n/**\n * Field Type (with Bin and TimeUnit) and Channel Score (Cleveland / Mackinlay based)\n */\nvar TypeChannelScore;\n(function (TypeChannelScore) {\n TypeChannelScore.TYPE_CHANNEL = 'typeChannel';\n function init() {\n var SCORE = {};\n var ORDERED_TYPE_CHANNEL_SCORE = {\n x: 0,\n y: 0,\n size: -0.45,\n color: -0.6,\n opacity: -0.75,\n text: -0.775,\n row: -0.8,\n column: -0.8,\n shape: -2.5,\n detail: -3\n };\n [type_1.Q, type_1.BIN_Q, type_1.T, type_1.TIMEUNIT_T, type_1.O].forEach(function (type) {\n util_1.keys(ORDERED_TYPE_CHANNEL_SCORE).forEach(function (channel) {\n SCORE[featurize(type, channel)] = ORDERED_TYPE_CHANNEL_SCORE[channel];\n });\n });\n // Penalize row/column for bin quantitative / timeUnit_temporal\n [type_1.BIN_Q, type_1.TIMEUNIT_T, type_1.O].forEach(function (type) {\n [channel_1.Channel.ROW, channel_1.Channel.COLUMN].forEach(function (channel) {\n SCORE[featurize(type, channel)] += 0.25;\n });\n });\n var NOMINAL_TYPE_CHANNEL_SCORE = {\n x: 0,\n y: 0,\n color: -0.5,\n shape: -0.6,\n row: -0.7,\n column: -0.7,\n text: -0.8,\n size: -1.8,\n detail: -2,\n opacity: -2.1\n };\n util_1.keys(NOMINAL_TYPE_CHANNEL_SCORE).forEach(function (channel) {\n SCORE[featurize(type_1.N, channel)] = NOMINAL_TYPE_CHANNEL_SCORE[channel];\n });\n return SCORE;\n }\n TypeChannelScore.init = init;\n function featurize(type, channel) {\n return type + '_' + channel;\n }\n TypeChannelScore.featurize = featurize;\n function getScore(specM, schema, opt) {\n var encodingQueryByField = specM.getEncodings().reduce(function (m, encQ) {\n var fieldKey = shorthand_1.fieldDef(encQ);\n (m[fieldKey] = m[fieldKey] || []).push(encQ);\n return m;\n }, {});\n var features = [];\n util_1.forEach(encodingQueryByField, function (encQs) {\n var bestFieldFeature = encQs.reduce(function (best, encQ) {\n var type = effectiveness_1.getExtendedType(encQ);\n var feature = featurize(type, encQ.channel);\n var featureScore = effectiveness_1.getFeatureScore(TypeChannelScore.TYPE_CHANNEL, feature);\n if (best === null || featureScore.score > best.score) {\n return featureScore;\n }\n return best;\n }, null);\n features.push(bestFieldFeature);\n // TODO: add plus for over-encoding of one field\n });\n return features;\n }\n TypeChannelScore.getScore = getScore;\n})(TypeChannelScore = exports.TypeChannelScore || (exports.TypeChannelScore = {}));\nvar PreferredAxisScore;\n(function (PreferredAxisScore) {\n PreferredAxisScore.PREFERRED_AXIS = 'preferredAxis';\n // FIXME support doing this at runtime\n function init(opt) {\n if (opt === void 0) { opt = {}; }\n opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt);\n var score = {};\n var preferredAxes = [{\n feature: type_1.BIN_Q,\n opt: 'preferredBinAxis'\n }, {\n feature: type_1.T,\n opt: 'preferredTemporalAxis'\n }, {\n feature: type_1.TIMEUNIT_T,\n opt: 'preferredTemporalAxis'\n }, {\n feature: type_1.O,\n opt: 'preferredOrdinalAxis'\n }, {\n feature: type_1.N,\n opt: 'preferredNominalAxis'\n }];\n preferredAxes.forEach(function (preferredAxis) {\n if (opt[preferredAxis.opt] === channel_1.Channel.X) {\n // penalize the other axis\n score[preferredAxis.feature + '_' + channel_1.Channel.Y] = -0.01;\n }\n else if (opt[preferredAxis.opt] === channel_1.Channel.Y) {\n // penalize the other axis\n score[preferredAxis.feature + '_' + channel_1.Channel.X] = -0.01;\n }\n });\n return score;\n }\n PreferredAxisScore.init = init;\n function featurize(type, channel) {\n return type + '_' + channel;\n }\n PreferredAxisScore.featurize = featurize;\n function getScore(specM, schema, opt) {\n return specM.getEncodings().reduce(function (features, encQ) {\n var type = effectiveness_1.getExtendedType(encQ);\n var feature = featurize(type, encQ.channel);\n var featureScore = effectiveness_1.getFeatureScore(PreferredAxisScore.PREFERRED_AXIS, feature);\n if (featureScore) {\n features.push(featureScore);\n }\n return features;\n }, []);\n }\n PreferredAxisScore.getScore = getScore;\n})(PreferredAxisScore = exports.PreferredAxisScore || (exports.PreferredAxisScore = {}));\nvar PreferredFacetScore;\n(function (PreferredFacetScore) {\n PreferredFacetScore.PREFERRED_FACET = 'preferredFacet';\n // FIXME support doing this at runtime\n function init(opt) {\n opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt);\n var score = {};\n if (opt.preferredFacet === channel_1.Channel.ROW) {\n // penalize the other axis\n score[channel_1.Channel.COLUMN] = -0.01;\n }\n else if (opt.preferredFacet === channel_1.Channel.COLUMN) {\n // penalize the other axis\n score[channel_1.Channel.ROW] = -0.01;\n }\n return score;\n }\n PreferredFacetScore.init = init;\n function getScore(specM, schema, opt) {\n return specM.getEncodings().reduce(function (features, encQ) {\n var featureScore = effectiveness_1.getFeatureScore(PreferredFacetScore.PREFERRED_FACET, encQ.channel);\n if (featureScore) {\n features.push(featureScore);\n }\n return features;\n }, []);\n }\n PreferredFacetScore.getScore = getScore;\n})(PreferredFacetScore = exports.PreferredFacetScore || (exports.PreferredFacetScore = {}));\nvar MarkChannelScore;\n(function (MarkChannelScore) {\n // Penalty for certain channel for certain mark types\n MarkChannelScore.MARK_CHANNEL = 'markChannel';\n function init() {\n return {\n bar_size: -2,\n tick_size: -2\n };\n }\n MarkChannelScore.init = init;\n function getScore(specM, schema, opt) {\n var mark = specM.getMark();\n return specM.getEncodings().reduce(function (featureScores, encQ) {\n var feature = mark + '_' + encQ.channel;\n var featureScore = effectiveness_1.getFeatureScore(MarkChannelScore.MARK_CHANNEL, feature);\n if (featureScore) {\n featureScores.push(featureScore);\n }\n return featureScores;\n }, []);\n }\n MarkChannelScore.getScore = getScore;\n})(MarkChannelScore = exports.MarkChannelScore || (exports.MarkChannelScore = {}));\n/**\n * Penalize if facet channels are the only dimensions\n */\nvar DimensionScore;\n(function (DimensionScore) {\n DimensionScore.DIMENSION = 'dimension';\n function init() {\n return {\n row: -2,\n column: -2,\n color: 0,\n opacity: 0,\n size: 0,\n shape: 0\n };\n }\n DimensionScore.init = init;\n function getScore(specM, schema, opt) {\n if (specM.isAggregate()) {\n specM.getEncodings().reduce(function (maxFScore, encQ) {\n if (!encQ.aggregate && !encQ.autoCount) {\n var featureScore = effectiveness_1.getFeatureScore(DimensionScore.DIMENSION, encQ.channel + '');\n if (featureScore.score > maxFScore.score) {\n return featureScore;\n }\n }\n return maxFScore;\n }, { type: DimensionScore.DIMENSION, feature: 'No Dimension', score: -5 });\n }\n return [];\n }\n DimensionScore.getScore = getScore;\n})(DimensionScore = exports.DimensionScore || (exports.DimensionScore = {}));\n//# sourceMappingURL=channel.js.map", + "\"use strict\";\nvar channel_1 = require('./channel');\nvar mark_1 = require('./mark');\nexports.FEATURE_INDEX = {};\nvar FEATURE_FACTORIES = [];\nfunction getFeatureScore(type, feature) {\n var score = exports.FEATURE_INDEX[type][feature];\n if (score !== undefined) {\n return {\n score: score,\n type: type,\n feature: feature\n };\n }\n return null;\n}\nexports.getFeatureScore = getFeatureScore;\nfunction addFeatureFactory(factory) {\n FEATURE_FACTORIES.push(factory);\n exports.FEATURE_INDEX[factory.type] = factory.init();\n}\nexports.addFeatureFactory = addFeatureFactory;\naddFeatureFactory({\n type: channel_1.TypeChannelScore.TYPE_CHANNEL,\n init: channel_1.TypeChannelScore.init,\n getScore: channel_1.TypeChannelScore.getScore\n});\naddFeatureFactory({\n type: channel_1.PreferredAxisScore.PREFERRED_AXIS,\n init: channel_1.PreferredAxisScore.init,\n getScore: channel_1.PreferredAxisScore.getScore\n});\naddFeatureFactory({\n type: channel_1.PreferredFacetScore.PREFERRED_FACET,\n init: channel_1.PreferredFacetScore.init,\n getScore: channel_1.PreferredFacetScore.getScore\n});\naddFeatureFactory({\n type: channel_1.MarkChannelScore.MARK_CHANNEL,\n init: channel_1.MarkChannelScore.init,\n getScore: channel_1.MarkChannelScore.getScore\n});\naddFeatureFactory({\n type: mark_1.MarkScore.MARK_SCORE,\n init: mark_1.MarkScore.init,\n getScore: mark_1.MarkScore.getScore\n});\n// TODO: x/y, row/column preference\n// TODO: stacking\n// TODO: Channel, Cardinality\n// TODO: Penalize over encoding\nfunction getExtendedType(encQ) {\n return (encQ.bin ? 'bin_' : encQ.timeUnit ? 'timeUnit_' : '') + encQ.type;\n}\nexports.getExtendedType = getExtendedType;\nfunction default_1(specM, schema, opt) {\n var features = FEATURE_FACTORIES.reduce(function (f, factory) {\n var scores = factory.getScore(specM, schema, opt);\n return f.concat(scores);\n }, []);\n return {\n score: features.reduce(function (s, f) {\n return s + f.score;\n }, 0),\n features: features\n };\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = default_1;\n//# sourceMappingURL=effectiveness.js.map", + "\"use strict\";\nvar channel_1 = require('vega-lite/src/channel');\nvar mark_1 = require('vega-lite/src/mark');\nvar util_1 = require('../../util');\nvar effectiveness_1 = require('./effectiveness');\nvar type_1 = require('./type');\nvar MarkScore;\n(function (MarkScore) {\n MarkScore.MARK_SCORE = 'markScore';\n function featurize(xType, yType, hasOcclusion, mark) {\n return xType + '_' + yType + '_' + hasOcclusion + '_' + mark;\n }\n MarkScore.featurize = featurize;\n function init() {\n var MEASURES = [type_1.Q, type_1.T];\n var DIMENSIONS = [type_1.BIN_Q, type_1.TIMEUNIT_T, type_1.O, type_1.N];\n var DIMENSIONS_OR_NONE = DIMENSIONS.concat([type_1.NONE]);\n var SCORE = {};\n // QxQ\n MEASURES.forEach(function (xType) {\n MEASURES.forEach(function (yType) {\n // has occlusion\n var occludedQQMark = {\n point: 0,\n text: -0.2,\n tick: -0.5,\n bar: -2,\n line: -2,\n area: -2,\n rule: -2.5\n };\n util_1.forEach(occludedQQMark, function (score, mark) {\n var feature = featurize(xType, yType, true, mark);\n SCORE[feature] = score;\n });\n // no occlusion\n // TODO: possible to use connected scatter plot\n var noOccludedQQMark = {\n point: 0,\n text: -0.2,\n tick: -0.5,\n bar: -2,\n line: -2,\n area: -2,\n rule: -2.5\n };\n util_1.forEach(noOccludedQQMark, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n });\n });\n });\n // DxQ, QxD\n MEASURES.forEach(function (xType) {\n // has occlusion\n DIMENSIONS_OR_NONE.forEach(function (yType) {\n var occludedDimensionMeasureMark = {\n tick: 0,\n point: -0.2,\n text: -0.5,\n bar: -2,\n line: -2,\n area: -2,\n rule: -2.5\n };\n util_1.forEach(occludedDimensionMeasureMark, function (score, mark) {\n var feature = featurize(xType, yType, true, mark);\n SCORE[feature] = score;\n // also do the inverse\n var feature2 = featurize(yType, xType, true, mark);\n SCORE[feature2] = score;\n });\n });\n // no occlusion\n [type_1.NONE, type_1.N].forEach(function (yType) {\n var noOccludedQxN = {\n bar: 0,\n point: -0.2,\n tick: -0.25,\n text: -0.3,\n // Line / Area can mislead trend for N\n line: -2,\n area: -2,\n // Non-sense to use rule here\n rule: -2.5\n };\n util_1.forEach(noOccludedQxN, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n // also do the inverse\n var feature2 = featurize(yType, xType, false, mark);\n SCORE[feature2] = score;\n });\n });\n [type_1.BIN_Q].forEach(function (yType) {\n var noOccludedQxBinQ = {\n bar: 0,\n point: -0.2,\n tick: -0.25,\n text: -0.3,\n // Line / Area isn't the best fit for bin\n line: -0.5,\n area: -0.5,\n // Non-sense to use rule here\n rule: -2.5\n };\n util_1.forEach(noOccludedQxBinQ, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n // also do the inverse\n var feature2 = featurize(yType, xType, false, mark);\n SCORE[feature2] = score;\n });\n });\n [type_1.TIMEUNIT_T, type_1.O].forEach(function (yType) {\n var noOccludedQxBinQ = {\n line: 0,\n area: -0.1,\n bar: -0.2,\n point: -0.3,\n tick: -0.35,\n text: -0.4,\n // Non-sense to use rule here\n rule: -2.5\n };\n util_1.forEach(noOccludedQxBinQ, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n // also do the inverse\n var feature2 = featurize(yType, xType, false, mark);\n SCORE[feature2] = score;\n });\n });\n });\n // DxD\n DIMENSIONS_OR_NONE.forEach(function (xType) {\n DIMENSIONS_OR_NONE.forEach(function (yType) {\n // has occlusion\n var ddMark = {\n point: 0,\n rect: 0,\n text: -0.1,\n tick: -1,\n bar: -2,\n line: -2,\n area: -2,\n rule: -2.5\n };\n // No difference between has occlusion and no occlusion\n util_1.forEach(ddMark, function (score, mark) {\n var feature = featurize(xType, yType, true, mark);\n SCORE[feature] = score;\n });\n util_1.forEach(ddMark, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n });\n });\n });\n return SCORE;\n }\n MarkScore.init = init;\n function getScore(specM, schema, opt) {\n var mark = specM.getMark();\n if (mark === mark_1.Mark.CIRCLE || mark === mark_1.Mark.SQUARE) {\n mark = mark_1.Mark.POINT;\n }\n var xEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.X);\n var xType = xEncQ ? effectiveness_1.getExtendedType(xEncQ) : '-';\n var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y);\n var yType = yEncQ ? effectiveness_1.getExtendedType(yEncQ) : '-';\n var isOccluded = !specM.isAggregate(); // FIXME\n var feature = xType + '_' + yType + '_' + isOccluded + '_' + mark;\n var featureScore = effectiveness_1.getFeatureScore(MarkScore.MARK_SCORE, feature);\n return [featureScore];\n }\n MarkScore.getScore = getScore;\n})(MarkScore = exports.MarkScore || (exports.MarkScore = {}));\n//# sourceMappingURL=mark.js.map", + "\"use strict\";\nvar type_1 = require('vega-lite/src/type');\n/**\n * Finer grained data types that takes binning and timeUnit into account.\n */\n(function (ExtendedType) {\n ExtendedType[ExtendedType[\"Q\"] = type_1.Type.QUANTITATIVE] = \"Q\";\n ExtendedType[ExtendedType[\"BIN_Q\"] = 'bin_' + type_1.Type.QUANTITATIVE] = \"BIN_Q\";\n ExtendedType[ExtendedType[\"T\"] = type_1.Type.TEMPORAL] = \"T\";\n ExtendedType[ExtendedType[\"TIMEUNIT_T\"] = 'timeUnit_' + type_1.Type.TEMPORAL] = \"TIMEUNIT_T\";\n ExtendedType[ExtendedType[\"O\"] = type_1.Type.ORDINAL] = \"O\";\n ExtendedType[ExtendedType[\"N\"] = type_1.Type.NOMINAL] = \"N\";\n ExtendedType[ExtendedType[\"NONE\"] = '-'] = \"NONE\";\n})(exports.ExtendedType || (exports.ExtendedType = {}));\nvar ExtendedType = exports.ExtendedType;\nexports.Q = ExtendedType.Q;\nexports.BIN_Q = ExtendedType.BIN_Q;\nexports.T = ExtendedType.T;\nexports.TIMEUNIT_T = ExtendedType.TIMEUNIT_T;\nexports.O = ExtendedType.O;\nexports.N = ExtendedType.N;\nexports.NONE = ExtendedType.NONE;\n//# sourceMappingURL=type.js.map", + "\"use strict\";\nvar modelgroup_1 = require('../modelgroup');\nexports.effectiveness = require('./effectiveness/effectiveness');\nexports.aggregation = require('./aggregation');\n/**\n * Registry for all encoding ranking functions\n */\nvar rankingRegistry = {};\n/**\n * Add an ordering function to the registry.\n */\nfunction register(name, keyFn) {\n rankingRegistry[name] = keyFn;\n}\nexports.register = register;\nfunction get(name) {\n return rankingRegistry[name];\n}\nexports.get = get;\nfunction rank(group, query, schema, level) {\n if (!query.nest || level === query.nest.length) {\n if (query.orderBy || query.chooseBy) {\n group.items.sort(comparator(query.orderBy || query.chooseBy, schema, query.config));\n if (query.chooseBy) {\n if (group.items.length > 0) {\n // for chooseBy -- only keep the top-item\n group.items = [group.items[0]];\n }\n else {\n group.items = [];\n }\n }\n }\n }\n else {\n // sort lower-level nodes first because our ranking takes top-item in the subgroup\n group.items.forEach(function (subgroup) {\n rank(subgroup, query, schema, level + 1);\n });\n if (query.nest[level].orderGroupBy) {\n group.items.sort(groupComparator(query.nest[level].orderGroupBy, schema, query.config));\n }\n }\n return group;\n}\nexports.rank = rank;\nfunction getScore(model, rankingName, schema, opt) {\n if (model.getRankingScore(rankingName) !== undefined) {\n return model.getRankingScore(rankingName);\n }\n var fn = get(rankingName);\n var score = fn(model, schema, opt);\n model.setRankingScore(rankingName, score);\n return score;\n}\nfunction comparator(name, schema, opt) {\n return function (m1, m2) {\n return getScore(m2, name, schema, opt).score - getScore(m1, name, schema, opt).score;\n };\n}\nexports.comparator = comparator;\nfunction groupComparator(name, schema, opt) {\n return function (g1, g2) {\n var m1 = modelgroup_1.getTopItem(g1);\n var m2 = modelgroup_1.getTopItem(g2);\n return getScore(m2, name, schema, opt).score - getScore(m1, name, schema, opt).score;\n };\n}\nexports.groupComparator = groupComparator;\nexports.EFFECTIVENESS = 'effectiveness';\nregister(exports.EFFECTIVENESS, exports.effectiveness.default);\nregister(exports.aggregation.name, exports.aggregation.score);\n//# sourceMappingURL=ranking.js.map", + "\"use strict\";\nvar type_1 = require('vega-lite/src/type');\nvar bin_1 = require('vega-lite/src/bin');\nvar timeunit_1 = require('vega-lite/src/timeunit');\nvar stats_1 = require('datalib/src/stats');\nvar type_2 = require('datalib/src/import/type');\nvar dlBin = require('datalib/src/bins/bins');\nvar config_1 = require('./config');\nvar util_1 = require('./util');\nvar Schema = (function () {\n function Schema(fieldSchemas) {\n this.fieldSchemas = fieldSchemas;\n this.fieldSchemaIndex = fieldSchemas.reduce(function (m, fieldSchema) {\n m[fieldSchema.field] = fieldSchema;\n return m;\n }, {});\n }\n /**\n * Build a Schema object.\n *\n * @param data - a set of raw data\n * @return a Schema object\n */\n Schema.build = function (data, opt) {\n if (opt === void 0) { opt = {}; }\n opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt);\n // create profiles for each variable\n var summaries = stats_1.summary(data);\n var types = type_2.inferAll(data); // inferAll does stronger type inference than summary\n var fieldSchemas = summaries.map(function (summary) {\n var field = summary.field;\n var primitiveType = types[field];\n var distinct = summary.distinct;\n var type;\n if (primitiveType === PrimitiveType.NUMBER) {\n type = type_1.Type.QUANTITATIVE;\n }\n else if (primitiveType === PrimitiveType.INTEGER) {\n // use ordinal or nominal when cardinality of integer type is relatively low\n if (distinct / summary.count < opt.numberOrdinalProportion) {\n // use nominal if the integers are 1,2,3,...,N or 0,1,2,3,...,N-1 where N = cardinality\n type = (summary.max - summary.min === distinct - 1 && util_1.contains([0, 1], summary.min)) ? type_1.Type.NOMINAL : type_1.Type.ORDINAL;\n }\n else {\n type = type_1.Type.QUANTITATIVE;\n }\n }\n else if (primitiveType === PrimitiveType.DATE) {\n type = type_1.Type.TEMPORAL;\n // need to get correct min/max of date data because datalib's summary method does not\n // calculate this correctly for date types.\n summary.min = new Date(data[0][field]);\n summary.max = new Date(data[0][field]);\n for (var i = 0; i < data.length; i++) {\n var time = new Date(data[i][field]).getTime();\n if (time < summary.min.getTime()) {\n summary.min = new Date(time);\n }\n if (time > summary.max.getTime()) {\n summary.max = new Date(time);\n }\n }\n }\n else {\n type = type_1.Type.NOMINAL;\n }\n return {\n field: field,\n type: type,\n primitiveType: primitiveType,\n stats: summary,\n timeStats: {},\n binStats: {}\n };\n });\n // order the fieldSchemas (sort them)\n var order = {\n 'nominal': 0,\n 'ordinal': 1,\n 'temporal': 2,\n 'quantitative': 3\n };\n fieldSchemas.sort(function (a, b) {\n // first order by type: nominal < temporal < quantitative < ordinal\n if (order[a.type] < order[b.type]) {\n return -1;\n }\n else if (order[a.type] > order[b.type]) {\n return 1;\n }\n else {\n // then order by field (alphabetically)\n return a.field.localeCompare(b.field);\n }\n });\n // calculate preset bins for quantitative and temporal data\n for (var _i = 0, fieldSchemas_1 = fieldSchemas; _i < fieldSchemas_1.length; _i++) {\n var fieldSchema = fieldSchemas_1[_i];\n if (fieldSchema.type === type_1.Type.QUANTITATIVE) {\n for (var _a = 0, _b = opt.maxBinsList; _a < _b.length; _a++) {\n var maxbins = _b[_a];\n fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats);\n }\n }\n else if (fieldSchema.type === type_1.Type.TEMPORAL) {\n for (var _c = 0, _d = opt.timeUnits; _c < _d.length; _c++) {\n var unit = _d[_c];\n if (unit !== undefined) {\n fieldSchema.timeStats[unit] = timeSummary(unit, fieldSchema.stats);\n }\n }\n }\n }\n return new Schema(fieldSchemas);\n };\n Schema.prototype.fields = function () {\n return this.fieldSchemas.map(function (fieldSchema) { return fieldSchema.field; });\n };\n /**\n * @return primitive type of the field if exist, otherwise return null\n */\n Schema.prototype.primitiveType = function (field) {\n return this.fieldSchemaIndex[field] ? this.fieldSchemaIndex[field].primitiveType : null;\n };\n /**\n * @return type of measturement of the field if exist, otherwise return null\n */\n Schema.prototype.type = function (field) {\n return this.fieldSchemaIndex[field] ? this.fieldSchemaIndex[field].type : null;\n };\n /** @return cardinality of the field associated with encQ, null if it doesn't exist.\n * @param augmentTimeUnitDomain - TimeUnit field domains will not be augmented if explicitly set to false.\n */\n Schema.prototype.cardinality = function (encQ, augmentTimeUnitDomain) {\n if (augmentTimeUnitDomain === void 0) { augmentTimeUnitDomain = true; }\n var fieldSchema = this.fieldSchemaIndex[encQ.field];\n if (encQ.aggregate || encQ.autoCount) {\n return 1;\n }\n else if (encQ.bin) {\n // encQ.bin will either be a boolean or a BinQuery\n var bin;\n if (typeof encQ.bin === 'boolean') {\n // autoMaxBins defaults to 10 if channel is EnumSpec\n bin = {\n maxbins: bin_1.autoMaxBins(encQ.channel)\n };\n }\n else {\n bin = encQ.bin;\n }\n var maxbins = bin.maxbins;\n if (!fieldSchema.binStats[maxbins]) {\n // need to calculate\n fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats);\n }\n return fieldSchema.binStats[maxbins].distinct;\n }\n else if (encQ.timeUnit) {\n if (augmentTimeUnitDomain) {\n switch (encQ.timeUnit) {\n // TODO: this should not always be the case once Vega-Lite supports turning off domain augmenting (VL issue #1385)\n case timeunit_1.TimeUnit.SECONDS: return 60;\n case timeunit_1.TimeUnit.MINUTES: return 60;\n case timeunit_1.TimeUnit.HOURS: return 24;\n case timeunit_1.TimeUnit.DAY: return 7;\n case timeunit_1.TimeUnit.DATE: return 31;\n case timeunit_1.TimeUnit.MONTH: return 12;\n case timeunit_1.TimeUnit.QUARTER: return 4;\n case timeunit_1.TimeUnit.MILLISECONDS: return 1000;\n }\n }\n // if the cardinality for the timeUnit is not cached, calculate it\n if (!fieldSchema.timeStats[encQ.timeUnit]) {\n fieldSchema.timeStats[encQ.timeUnit] = timeSummary(encQ.timeUnit, fieldSchema.stats);\n }\n return fieldSchema.timeStats[encQ.timeUnit].distinct;\n }\n else {\n return fieldSchema ? fieldSchema.stats.distinct : null;\n }\n };\n Schema.prototype.domain = function (encQ) {\n // TODO: differentiate for field with bin / timeUnit\n var fieldSchema = this.fieldSchemaIndex[encQ.field];\n var domain = util_1.keys(fieldSchema.stats.unique);\n if (fieldSchema.type === type_1.Type.QUANTITATIVE || fieldSchema.primitiveType === PrimitiveType.DATE) {\n // return [min, max] for quantitative and date data\n domain = [fieldSchema.stats.min, fieldSchema.stats.max];\n }\n else if (fieldSchema.primitiveType === PrimitiveType.INTEGER ||\n fieldSchema.primitiveType === PrimitiveType.NUMBER) {\n // coerce non-quantitative numerical data into number type\n domain = domain.map(function (x) { return +x; });\n }\n return domain.sort();\n };\n /**\n * @return a Summary corresponding to the field of the given EncodingQuery\n */\n Schema.prototype.stats = function (encQ) {\n // TODO: differentiate for field with bin / timeUnit vs without\n var fieldSchema = this.fieldSchemaIndex[encQ.field];\n return fieldSchema ? fieldSchema.stats : null;\n };\n return Schema;\n}());\nexports.Schema = Schema;\n/**\n * @return a summary of the binning scheme determined from the given max number of bins\n */\nfunction binSummary(maxbins, summary) {\n var bin = dlBin({\n min: summary.min,\n max: summary.max,\n maxbins: maxbins\n });\n // start with summary, pre-binning\n var result = util_1.extend({}, summary);\n result.unique = binUnique(bin, summary.unique);\n result.distinct = (bin.stop - bin.start) / bin.step;\n result.min = bin.start;\n result.max = bin.stop;\n return result;\n}\n/** @return a modified version of the passed summary with unique and distinct set according to the timeunit */\nfunction timeSummary(timeunit, summary) {\n var result = util_1.extend({}, summary);\n var unique = {};\n util_1.keys(summary.unique).forEach(function (dateString) {\n var date = new Date(dateString);\n var key = ((timeunit === timeunit_1.TimeUnit.DAY) ? date.getDay() : timeunit_1.convert(timeunit, new Date(dateString))).toString();\n unique[key] = unique[key] ? unique[key] + summary.unique[dateString] : summary.unique[dateString];\n });\n result.unique = unique;\n result.distinct = util_1.keys(unique).length;\n return result;\n}\n/**\n * @return a new unique object based off of the old unique count and a binning scheme\n */\nfunction binUnique(bin, oldUnique) {\n var newUnique = {};\n for (var value in oldUnique) {\n var bucket = bin.value(Number(value));\n if (!newUnique[bucket]) {\n newUnique[bucket] = oldUnique[value];\n }\n else {\n newUnique[bucket] += oldUnique[value];\n }\n }\n return newUnique;\n}\n(function (PrimitiveType) {\n PrimitiveType[PrimitiveType[\"STRING\"] = 'string'] = \"STRING\";\n PrimitiveType[PrimitiveType[\"NUMBER\"] = 'number'] = \"NUMBER\";\n PrimitiveType[PrimitiveType[\"INTEGER\"] = 'integer'] = \"INTEGER\";\n PrimitiveType[PrimitiveType[\"BOOLEAN\"] = 'boolean'] = \"BOOLEAN\";\n PrimitiveType[PrimitiveType[\"DATE\"] = 'date'] = \"DATE\";\n})(exports.PrimitiveType || (exports.PrimitiveType = {}));\nvar PrimitiveType = exports.PrimitiveType;\n//# sourceMappingURL=schema.js.map", + "\"use strict\";\nvar channel_1 = require('vega-lite/src/channel');\nvar scale_1 = require('vega-lite/src/scale');\nvar type_1 = require('vega-lite/src/type');\nvar config_1 = require('./config');\nvar encoding_1 = require('./query/encoding');\nvar util_1 = require('./util');\nfunction stylize(answerSet, schema, opt) {\n answerSet = answerSet.map(function (specM) {\n if (opt.smallBandSizeForHighCardinalityOrFacet) {\n specM = smallBandSizeForHighCardinalityOrFacet(specM, schema);\n }\n if (opt.nominalColorScaleForHighCardinality) {\n specM = nominalColorScaleForHighCardinality(specM, schema);\n }\n return specM;\n });\n return answerSet;\n}\nexports.stylize = stylize;\nvar encQIndex = {};\nfunction smallBandSizeForHighCardinalityOrFacet(specM, schema) {\n [channel_1.Channel.ROW, channel_1.Channel.Y, channel_1.Channel.COLUMN, channel_1.Channel.X].forEach(function (channel) {\n encQIndex[channel] = specM.getEncodingQueryByChannel(channel);\n });\n var yEncQ = encQIndex[channel_1.Channel.Y];\n if (yEncQ !== undefined) {\n if (encQIndex[channel_1.Channel.ROW] ||\n schema.cardinality(yEncQ) > config_1.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality) {\n // We check for undefined rather than\n // yEncQ.scale = yEncQ.scale || {} to cover the case where\n // yEncQ.scale has been set to false/null.\n // This prevents us from incorrectly overriding scale and\n // assigning a bandSize when scale is set to false.\n if (yEncQ.scale === undefined) {\n yEncQ.scale = {};\n }\n // We do not want to assign a bandSize if scale is set to false\n // and we only apply this if the scale is (or can be) an ordinal scale.\n if (yEncQ.scale && util_1.contains([scale_1.ScaleType.ORDINAL, undefined], encoding_1.scaleType(yEncQ.scale.type, yEncQ.timeUnit, yEncQ.type))) {\n if (!yEncQ.scale.bandSize) {\n yEncQ.scale.bandSize = 12;\n }\n }\n }\n }\n var xEncQ = encQIndex[channel_1.Channel.X];\n if (xEncQ !== undefined) {\n if (encQIndex[channel_1.Channel.COLUMN] ||\n schema.cardinality(xEncQ) > config_1.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality) {\n // Just like y, we don't want to do this if scale is null/false\n if (xEncQ.scale === undefined) {\n xEncQ.scale = {};\n }\n // We do not want to assign a bandSize if scale is set to false\n // and we only apply this if the scale is (or can be) an ordinal scale.\n if (xEncQ.scale && util_1.contains([scale_1.ScaleType.ORDINAL, undefined], encoding_1.scaleType(xEncQ.scale.type, xEncQ.timeUnit, xEncQ.type))) {\n if (!xEncQ.scale.bandSize) {\n xEncQ.scale.bandSize = 12;\n }\n }\n }\n }\n return specM;\n}\nexports.smallBandSizeForHighCardinalityOrFacet = smallBandSizeForHighCardinalityOrFacet;\nfunction nominalColorScaleForHighCardinality(specM, schema) {\n encQIndex[channel_1.Channel.COLOR] = specM.getEncodingQueryByChannel(channel_1.Channel.COLOR);\n var colorEncQ = encQIndex[channel_1.Channel.COLOR];\n if ((colorEncQ !== undefined) && (colorEncQ.type === type_1.Type.NOMINAL) &&\n (schema.cardinality(colorEncQ) > config_1.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.maxCardinality)) {\n if (colorEncQ.scale === undefined) {\n colorEncQ.scale = {};\n }\n if (colorEncQ.scale) {\n if (!colorEncQ.scale.range) {\n colorEncQ.scale.range = config_1.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.palette;\n }\n }\n }\n return specM;\n}\nexports.nominalColorScaleForHighCardinality = nominalColorScaleForHighCardinality;\n//# sourceMappingURL=stylize.js.map", + "\"use strict\";\nvar util_1 = require('datalib/src/util');\nvar util_2 = require('datalib/src/util');\nexports.keys = util_2.keys;\nexports.duplicate = util_2.duplicate;\nexports.extend = util_2.extend;\nexports.isObject = util_2.isObject;\nexports.isArray = util_2.isArray;\nfunction contains(array, item) {\n return array.indexOf(item) !== -1;\n}\nexports.contains = contains;\n;\nfunction every(arr, f) {\n var i = 0, k;\n for (k in arr) {\n if (!f(arr[k], k, i++)) {\n return false;\n }\n }\n return true;\n}\nexports.every = every;\n;\nfunction forEach(obj, f, thisArg) {\n if (obj.forEach) {\n obj.forEach.call(thisArg, f);\n }\n else {\n for (var k in obj) {\n f.call(thisArg, obj[k], k, obj);\n }\n }\n}\nexports.forEach = forEach;\n;\nfunction some(arr, f) {\n var i = 0, k;\n for (k in arr) {\n if (f(arr[k], k, i++)) {\n return true;\n }\n }\n return false;\n}\nexports.some = some;\n;\nfunction nestedMap(array, f) {\n return array.map(function (a) {\n if (util_1.isArray(a)) {\n return nestedMap(a, f);\n }\n return f(a);\n });\n}\nexports.nestedMap = nestedMap;\n/** Returns the array without the elements in item */\nfunction without(array, excludedItems) {\n return array.filter(function (item) {\n return !contains(excludedItems, item);\n });\n}\nexports.without = without;\n//# sourceMappingURL=util.js.map", + "var u = module.exports;\n\n// utility functions\n\nvar FNAME = '__name__';\n\nu.namedfunc = function(name, f) { return (f[FNAME] = name, f); };\n\nu.name = function(f) { return f==null ? null : f[FNAME]; };\n\nu.identity = function(x) { return x; };\n\nu.true = u.namedfunc('true', function() { return true; });\n\nu.false = u.namedfunc('false', function() { return false; });\n\nu.duplicate = function(obj) {\n return JSON.parse(JSON.stringify(obj));\n};\n\nu.equal = function(a, b) {\n return JSON.stringify(a) === JSON.stringify(b);\n};\n\nu.extend = function(obj) {\n for (var x, name, i=1, len=arguments.length; i 1 ?\n function(x, v) {\n for (var i=0; i b || b == null) && a != null ? 1 :\n ((b = b instanceof Date ? +b : b),\n (a = a instanceof Date ? +a : a)) !== a && b === b ? -1 :\n b !== b && a === a ? 1 : 0;\n};\n\nu.numcmp = function(a, b) { return a - b; };\n\nu.stablesort = function(array, sortBy, keyFn) {\n var indices = array.reduce(function(idx, v, i) {\n return (idx[keyFn(v)] = i, idx);\n }, {});\n\n array.sort(function(a, b) {\n var sa = sortBy(a),\n sb = sortBy(b);\n return sa < sb ? -1 : sa > sb ? 1\n : (indices[keyFn(a)] - indices[keyFn(b)]);\n });\n\n return array;\n};\n\n// permutes an array using a Knuth shuffle\nu.permute = function(a) {\n var m = a.length,\n swap,\n i;\n\n while (m) {\n i = Math.floor(Math.random() * m--);\n swap = a[m];\n a[m] = a[i];\n a[i] = swap;\n }\n};\n\n// string functions\n\nu.pad = function(s, length, pos, padchar) {\n padchar = padchar || \" \";\n var d = length - s.length;\n if (d <= 0) return s;\n switch (pos) {\n case 'left':\n return strrep(d, padchar) + s;\n case 'middle':\n case 'center':\n return strrep(Math.floor(d/2), padchar) +\n s + strrep(Math.ceil(d/2), padchar);\n default:\n return s + strrep(d, padchar);\n }\n};\n\nfunction strrep(n, str) {\n var s = \"\", i;\n for (i=0; i= '0' && ch <= '9') {\n string += ch;\n next();\n }\n if (ch === '.') {\n string += '.';\n while (next() && ch >= '0' && ch <= '9') {\n string += ch;\n }\n }\n if (ch === 'e' || ch === 'E') {\n string += ch;\n next();\n if (ch === '-' || ch === '+') {\n string += ch;\n next();\n }\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n }\n number = +string;\n if (!isFinite(number)) {\n error(\"Bad number\");\n } else {\n return number;\n }\n },\n \n string = function () {\n // Parse a string value.\n var hex,\n i,\n string = '',\n uffff;\n \n // When parsing for string values, we must look for \" and \\ characters.\n if (ch === '\"') {\n while (next()) {\n if (ch === '\"') {\n next();\n return string;\n } else if (ch === '\\\\') {\n next();\n if (ch === 'u') {\n uffff = 0;\n for (i = 0; i < 4; i += 1) {\n hex = parseInt(next(), 16);\n if (!isFinite(hex)) {\n break;\n }\n uffff = uffff * 16 + hex;\n }\n string += String.fromCharCode(uffff);\n } else if (typeof escapee[ch] === 'string') {\n string += escapee[ch];\n } else {\n break;\n }\n } else {\n string += ch;\n }\n }\n }\n error(\"Bad string\");\n },\n\n white = function () {\n\n// Skip whitespace.\n\n while (ch && ch <= ' ') {\n next();\n }\n },\n\n word = function () {\n\n// true, false, or null.\n\n switch (ch) {\n case 't':\n next('t');\n next('r');\n next('u');\n next('e');\n return true;\n case 'f':\n next('f');\n next('a');\n next('l');\n next('s');\n next('e');\n return false;\n case 'n':\n next('n');\n next('u');\n next('l');\n next('l');\n return null;\n }\n error(\"Unexpected '\" + ch + \"'\");\n },\n\n value, // Place holder for the value function.\n\n array = function () {\n\n// Parse an array value.\n\n var array = [];\n\n if (ch === '[') {\n next('[');\n white();\n if (ch === ']') {\n next(']');\n return array; // empty array\n }\n while (ch) {\n array.push(value());\n white();\n if (ch === ']') {\n next(']');\n return array;\n }\n next(',');\n white();\n }\n }\n error(\"Bad array\");\n },\n\n object = function () {\n\n// Parse an object value.\n\n var key,\n object = {};\n\n if (ch === '{') {\n next('{');\n white();\n if (ch === '}') {\n next('}');\n return object; // empty object\n }\n while (ch) {\n key = string();\n white();\n next(':');\n if (Object.hasOwnProperty.call(object, key)) {\n error('Duplicate key \"' + key + '\"');\n }\n object[key] = value();\n white();\n if (ch === '}') {\n next('}');\n return object;\n }\n next(',');\n white();\n }\n }\n error(\"Bad object\");\n };\n\nvalue = function () {\n\n// Parse a JSON value. It could be an object, an array, a string, a number,\n// or a word.\n\n white();\n switch (ch) {\n case '{':\n return object();\n case '[':\n return array();\n case '\"':\n return string();\n case '-':\n return number();\n default:\n return ch >= '0' && ch <= '9' ? number() : word();\n }\n};\n\n// Return the json_parse function. It will have access to all of the above\n// functions and variables.\n\nmodule.exports = function (source, reviver) {\n var result;\n \n text = source;\n at = 0;\n ch = ' ';\n result = value();\n white();\n if (ch) {\n error(\"Syntax error\");\n }\n\n // If there is a reviver function, we recursively walk the new structure,\n // passing each name/value pair to the reviver function for possible\n // transformation, starting with a temporary root object that holds the result\n // in an empty key. If there is not a reviver function, we simply return the\n // result.\n\n return typeof reviver === 'function' ? (function walk(holder, key) {\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }({'': result}, '')) : result;\n};\n", + "var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\nfunction quote(string) {\n // If the string contains no control characters, no quote characters, and no\n // backslash characters, then we can safely slap some quotes around it.\n // Otherwise we must also replace the offending characters with safe escape\n // sequences.\n \n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n}\n\nfunction str(key, holder) {\n // Produce a string from holder[key].\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n \n // If the value has a toJSON method, call it to obtain a replacement value.\n if (value && typeof value === 'object' &&\n typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n \n // If we were called with a replacer function, then call the replacer to\n // obtain a replacement value.\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n \n // What happens next depends on the value's type.\n switch (typeof value) {\n case 'string':\n return quote(value);\n \n case 'number':\n // JSON numbers must be finite. Encode non-finite numbers as null.\n return isFinite(value) ? String(value) : 'null';\n \n case 'boolean':\n case 'null':\n // If the value is a boolean or null, convert it to a string. Note:\n // typeof null does not produce 'null'. The case is included here in\n // the remote chance that this gets fixed someday.\n return String(value);\n \n case 'object':\n if (!value) return 'null';\n gap += indent;\n partial = [];\n \n // Array.isArray\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n \n // Join all of the elements together, separated with commas, and\n // wrap them in brackets.\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n \n // If the replacer is an array, use it to select the members to be\n // stringified.\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n else {\n // Otherwise, iterate through all of the keys in the object.\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n \n // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n}\n\nmodule.exports = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n \n // If the space parameter is a number, make an indent string containing that\n // many spaces.\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n }\n // If the space parameter is a string, it will be used as the indent string.\n else if (typeof space === 'string') {\n indent = space;\n }\n\n // If there is a replacer, it must be a function or an array.\n // Otherwise, throw an error.\n rep = replacer;\n if (replacer && typeof replacer !== 'function'\n && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n \n // Make a fake root object containing our value under the key of ''.\n // Return the result of stringifying the value.\n return str('', {'': value});\n};\n", + "\"use strict\";\n(function (AggregateOp) {\n AggregateOp[AggregateOp[\"VALUES\"] = 'values'] = \"VALUES\";\n AggregateOp[AggregateOp[\"COUNT\"] = 'count'] = \"COUNT\";\n AggregateOp[AggregateOp[\"VALID\"] = 'valid'] = \"VALID\";\n AggregateOp[AggregateOp[\"MISSING\"] = 'missing'] = \"MISSING\";\n AggregateOp[AggregateOp[\"DISTINCT\"] = 'distinct'] = \"DISTINCT\";\n AggregateOp[AggregateOp[\"SUM\"] = 'sum'] = \"SUM\";\n AggregateOp[AggregateOp[\"MEAN\"] = 'mean'] = \"MEAN\";\n AggregateOp[AggregateOp[\"AVERAGE\"] = 'average'] = \"AVERAGE\";\n AggregateOp[AggregateOp[\"VARIANCE\"] = 'variance'] = \"VARIANCE\";\n AggregateOp[AggregateOp[\"VARIANCEP\"] = 'variancep'] = \"VARIANCEP\";\n AggregateOp[AggregateOp[\"STDEV\"] = 'stdev'] = \"STDEV\";\n AggregateOp[AggregateOp[\"STDEVP\"] = 'stdevp'] = \"STDEVP\";\n AggregateOp[AggregateOp[\"MEDIAN\"] = 'median'] = \"MEDIAN\";\n AggregateOp[AggregateOp[\"Q1\"] = 'q1'] = \"Q1\";\n AggregateOp[AggregateOp[\"Q3\"] = 'q3'] = \"Q3\";\n AggregateOp[AggregateOp[\"MODESKEW\"] = 'modeskew'] = \"MODESKEW\";\n AggregateOp[AggregateOp[\"MIN\"] = 'min'] = \"MIN\";\n AggregateOp[AggregateOp[\"MAX\"] = 'max'] = \"MAX\";\n AggregateOp[AggregateOp[\"ARGMIN\"] = 'argmin'] = \"ARGMIN\";\n AggregateOp[AggregateOp[\"ARGMAX\"] = 'argmax'] = \"ARGMAX\";\n})(exports.AggregateOp || (exports.AggregateOp = {}));\nvar AggregateOp = exports.AggregateOp;\nexports.AGGREGATE_OPS = [\n AggregateOp.VALUES,\n AggregateOp.COUNT,\n AggregateOp.VALID,\n AggregateOp.MISSING,\n AggregateOp.DISTINCT,\n AggregateOp.SUM,\n AggregateOp.MEAN,\n AggregateOp.AVERAGE,\n AggregateOp.VARIANCE,\n AggregateOp.VARIANCEP,\n AggregateOp.STDEV,\n AggregateOp.STDEVP,\n AggregateOp.MEDIAN,\n AggregateOp.Q1,\n AggregateOp.Q3,\n AggregateOp.MODESKEW,\n AggregateOp.MIN,\n AggregateOp.MAX,\n AggregateOp.ARGMIN,\n AggregateOp.ARGMAX,\n];\n/** Additive-based aggregation operations. These can be applied to stack. */\nexports.SUM_OPS = [\n AggregateOp.COUNT,\n AggregateOp.SUM,\n AggregateOp.DISTINCT\n];\nexports.SHARED_DOMAIN_OPS = [\n AggregateOp.MEAN,\n AggregateOp.AVERAGE,\n AggregateOp.STDEV,\n AggregateOp.STDEVP,\n AggregateOp.MEDIAN,\n AggregateOp.Q1,\n AggregateOp.Q3,\n AggregateOp.MIN,\n AggregateOp.MAX,\n];\n// TODO: move supportedTypes, supportedEnums from schema to here\n//# sourceMappingURL=aggregate.js.map", + "\"use strict\";\nvar channel_1 = require('./channel');\nfunction autoMaxBins(channel) {\n switch (channel) {\n case channel_1.ROW:\n case channel_1.COLUMN:\n case channel_1.SIZE:\n // Facets and Size shouldn't have too many bins\n // We choose 6 like shape to simplify the rule\n case channel_1.SHAPE:\n return 6; // Vega's \"shape\" has 6 distinct values\n default:\n return 10;\n }\n}\nexports.autoMaxBins = autoMaxBins;\n//# sourceMappingURL=bin.js.map", + "/*\n * Constants and utilities for encoding channels (Visual variables)\n * such as 'x', 'y', 'color'.\n */\n\"use strict\";\nvar util_1 = require('./util');\n(function (Channel) {\n Channel[Channel[\"X\"] = 'x'] = \"X\";\n Channel[Channel[\"Y\"] = 'y'] = \"Y\";\n Channel[Channel[\"X2\"] = 'x2'] = \"X2\";\n Channel[Channel[\"Y2\"] = 'y2'] = \"Y2\";\n Channel[Channel[\"ROW\"] = 'row'] = \"ROW\";\n Channel[Channel[\"COLUMN\"] = 'column'] = \"COLUMN\";\n Channel[Channel[\"SHAPE\"] = 'shape'] = \"SHAPE\";\n Channel[Channel[\"SIZE\"] = 'size'] = \"SIZE\";\n Channel[Channel[\"COLOR\"] = 'color'] = \"COLOR\";\n Channel[Channel[\"TEXT\"] = 'text'] = \"TEXT\";\n Channel[Channel[\"DETAIL\"] = 'detail'] = \"DETAIL\";\n Channel[Channel[\"LABEL\"] = 'label'] = \"LABEL\";\n Channel[Channel[\"PATH\"] = 'path'] = \"PATH\";\n Channel[Channel[\"ORDER\"] = 'order'] = \"ORDER\";\n Channel[Channel[\"OPACITY\"] = 'opacity'] = \"OPACITY\";\n})(exports.Channel || (exports.Channel = {}));\nvar Channel = exports.Channel;\nexports.X = Channel.X;\nexports.Y = Channel.Y;\nexports.X2 = Channel.X2;\nexports.Y2 = Channel.Y2;\nexports.ROW = Channel.ROW;\nexports.COLUMN = Channel.COLUMN;\nexports.SHAPE = Channel.SHAPE;\nexports.SIZE = Channel.SIZE;\nexports.COLOR = Channel.COLOR;\nexports.TEXT = Channel.TEXT;\nexports.DETAIL = Channel.DETAIL;\nexports.LABEL = Channel.LABEL;\nexports.PATH = Channel.PATH;\nexports.ORDER = Channel.ORDER;\nexports.OPACITY = Channel.OPACITY;\nexports.CHANNELS = [exports.X, exports.Y, exports.X2, exports.Y2, exports.ROW, exports.COLUMN, exports.SIZE, exports.SHAPE, exports.COLOR, exports.PATH, exports.ORDER, exports.OPACITY, exports.TEXT, exports.DETAIL, exports.LABEL];\nexports.UNIT_CHANNELS = util_1.without(exports.CHANNELS, [exports.ROW, exports.COLUMN]);\nexports.UNIT_SCALE_CHANNELS = util_1.without(exports.UNIT_CHANNELS, [exports.PATH, exports.ORDER, exports.DETAIL, exports.TEXT, exports.LABEL, exports.X2, exports.Y2]);\nexports.NONSPATIAL_CHANNELS = util_1.without(exports.UNIT_CHANNELS, [exports.X, exports.Y, exports.X2, exports.Y2]);\nexports.NONSPATIAL_SCALE_CHANNELS = util_1.without(exports.UNIT_SCALE_CHANNELS, [exports.X, exports.Y, exports.X2, exports.Y2]);\n/** Channels that can serve as groupings for stacked charts. */\nexports.STACK_GROUP_CHANNELS = [exports.COLOR, exports.DETAIL, exports.ORDER, exports.OPACITY, exports.SIZE];\n;\n/**\n * Return whether a channel supports a particular mark type.\n * @param channel channel name\n * @param mark the mark type\n * @return whether the mark supports the channel\n */\nfunction supportMark(channel, mark) {\n return !!getSupportedMark(channel)[mark];\n}\nexports.supportMark = supportMark;\n/**\n * Return a dictionary showing whether a channel supports mark type.\n * @param channel\n * @return A dictionary mapping mark types to boolean values.\n */\nfunction getSupportedMark(channel) {\n switch (channel) {\n case exports.X:\n case exports.Y:\n case exports.COLOR:\n case exports.DETAIL:\n case exports.ORDER:\n case exports.OPACITY:\n case exports.ROW:\n case exports.COLUMN:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, line: true, area: true, text: true\n };\n case exports.X2:\n case exports.Y2:\n return {\n rule: true, bar: true, area: true\n };\n case exports.SIZE:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, text: true\n };\n case exports.SHAPE:\n return { point: true };\n case exports.TEXT:\n return { text: true };\n case exports.PATH:\n return { line: true };\n }\n return {};\n}\nexports.getSupportedMark = getSupportedMark;\n;\n/**\n * Return whether a channel supports dimension / measure role\n * @param channel\n * @return A dictionary mapping role to boolean values.\n */\nfunction getSupportedRole(channel) {\n switch (channel) {\n case exports.X:\n case exports.Y:\n case exports.COLOR:\n case exports.OPACITY:\n case exports.LABEL:\n case exports.DETAIL:\n return {\n measure: true,\n dimension: true\n };\n case exports.ROW:\n case exports.COLUMN:\n case exports.SHAPE:\n return {\n measure: false,\n dimension: true\n };\n case exports.X2:\n case exports.Y2:\n case exports.SIZE:\n case exports.TEXT:\n return {\n measure: true,\n dimension: false\n };\n case exports.PATH:\n return {\n measure: false,\n dimension: true\n };\n }\n throw new Error('Invalid encoding channel' + channel);\n}\nexports.getSupportedRole = getSupportedRole;\nfunction hasScale(channel) {\n return !util_1.contains([exports.DETAIL, exports.PATH, exports.TEXT, exports.LABEL, exports.ORDER], channel);\n}\nexports.hasScale = hasScale;\n//# sourceMappingURL=channel.js.map", + "// DateTime definition object\n\"use strict\";\nvar util_1 = require('./util');\nfunction isDateTime(o) {\n return !!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day ||\n !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds;\n}\nexports.isDateTime = isDateTime;\nexports.MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\nexports.SHORT_MONTHS = exports.MONTHS.map(function (m) { return m.substr(0, 3); });\nexports.DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nexports.SHORT_DAYS = exports.DAYS.map(function (d) { return d.substr(0, 3); });\nfunction normalizeQuarter(q) {\n if (util_1.isNumber(q)) {\n // We accept 1-based quarter, so need to readjust to 0-based quarter\n return (q - 1) + '';\n }\n else {\n // Simply an expression string, but normalize should not be called in this case.\n console.warn('Potentially invalid quarter', q);\n return q;\n }\n}\nfunction normalizeMonth(m) {\n if (util_1.isNumber(m)) {\n // We accept 1-based month, so need to readjust to 0-based month\n return (m - 1) + '';\n }\n else {\n var lowerM = m.toLowerCase();\n var monthIndex = exports.MONTHS.indexOf(lowerM);\n if (monthIndex !== -1) {\n return monthIndex + ''; // 0 for january, ...\n }\n var shortM = lowerM.substr(0, 3);\n var shortMonthIndex = exports.SHORT_MONTHS.indexOf(shortM);\n if (shortMonthIndex !== -1) {\n return shortMonthIndex + '';\n }\n // Simply an expression string, but normalize should not be called in this case.\n console.warn('Potentially invalid month', m);\n return m;\n }\n}\nfunction normalizeDay(d) {\n if (util_1.isNumber(d)) {\n // mod so that this can be both 0-based where 0 = sunday\n // and 1-based where 7=sunday\n return (d % 7) + '';\n }\n else {\n var lowerD = d.toLowerCase();\n var dayIndex = exports.DAYS.indexOf(lowerD);\n if (dayIndex !== -1) {\n return dayIndex + ''; // 0 for january, ...\n }\n var shortD = lowerD.substr(0, 3);\n var shortDayIndex = exports.SHORT_DAYS.indexOf(shortD);\n if (shortDayIndex !== -1) {\n return shortDayIndex + '';\n }\n // Simply an expression string, but normalize should not be called in this case.\n console.warn('Potentially invalid day', d);\n return d;\n }\n}\n/**\n * Return Vega Expression for a particular date time.\n * @param d\n * @param normalize whether to normalize quarter, month, day.\n */\nfunction dateTimeExpr(d, normalize) {\n if (normalize === void 0) { normalize = false; }\n var units = [];\n if (normalize && d.day !== undefined) {\n for (var _i = 0, _a = ['year', 'quarter', 'month', 'date']; _i < _a.length; _i++) {\n var unit = _a[_i];\n if (d[unit] !== undefined) {\n console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with', unit);\n d = util_1.duplicate(d);\n delete d.day;\n break;\n }\n }\n }\n if (d.year !== undefined) {\n units.push(d.year);\n }\n else if (d.day !== undefined) {\n // Set year to 2006 for working with day since January 1 2006 is a Sunday\n units.push(2006);\n }\n else {\n units.push(0);\n }\n if (d.month !== undefined) {\n var month = normalize ? normalizeMonth(d.month) : d.month;\n units.push(month);\n }\n else if (d.quarter !== undefined) {\n var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter;\n units.push(quarter + '*3');\n }\n else {\n units.push(0); // months start at zero in JS\n }\n if (d.date !== undefined) {\n units.push(d.date);\n }\n else if (d.day !== undefined) {\n // HACK: Day only works as a standalone unit\n // This is only correct because we always set year to 2006 for day\n var day = normalize ? normalizeDay(d.day) : d.day;\n units.push(day + '+1');\n }\n else {\n units.push(1); // Date starts at 1 in JS\n }\n // Note: can't use TimeUnit enum here as importing it will create\n // circular dependency problem!\n for (var _b = 0, _c = ['hours', 'minutes', 'seconds', 'milliseconds']; _b < _c.length; _b++) {\n var timeUnit = _c[_b];\n if (d[timeUnit] !== undefined) {\n units.push(d[timeUnit]);\n }\n else {\n units.push(0);\n }\n }\n return 'datetime(' + units.join(', ') + ')';\n}\nexports.dateTimeExpr = dateTimeExpr;\n//# sourceMappingURL=datetime.js.map", + "\"use strict\";\nvar channel_1 = require('./channel');\nvar util_1 = require('./util');\nfunction countRetinal(encoding) {\n var count = 0;\n if (encoding.color) {\n count++;\n }\n if (encoding.opacity) {\n count++;\n }\n if (encoding.size) {\n count++;\n }\n if (encoding.shape) {\n count++;\n }\n return count;\n}\nexports.countRetinal = countRetinal;\nfunction channels(encoding) {\n return channel_1.CHANNELS.filter(function (channel) {\n return has(encoding, channel);\n });\n}\nexports.channels = channels;\n// TOD: rename this to hasChannelField and only use we really want it.\nfunction has(encoding, channel) {\n var channelEncoding = encoding && encoding[channel];\n return channelEncoding && (channelEncoding.field !== undefined ||\n // TODO: check that we have field in the array\n (util_1.isArray(channelEncoding) && channelEncoding.length > 0));\n}\nexports.has = has;\nfunction isAggregate(encoding) {\n return util_1.some(channel_1.CHANNELS, function (channel) {\n if (has(encoding, channel) && encoding[channel].aggregate) {\n return true;\n }\n return false;\n });\n}\nexports.isAggregate = isAggregate;\nfunction isRanged(encoding) {\n return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2));\n}\nexports.isRanged = isRanged;\nfunction fieldDefs(encoding) {\n var arr = [];\n channel_1.CHANNELS.forEach(function (channel) {\n if (has(encoding, channel)) {\n if (util_1.isArray(encoding[channel])) {\n encoding[channel].forEach(function (fieldDef) {\n arr.push(fieldDef);\n });\n }\n else {\n arr.push(encoding[channel]);\n }\n }\n });\n return arr;\n}\nexports.fieldDefs = fieldDefs;\n;\nfunction forEach(encoding, f, thisArg) {\n channelMappingForEach(channel_1.CHANNELS, encoding, f, thisArg);\n}\nexports.forEach = forEach;\nfunction channelMappingForEach(channels, mapping, f, thisArg) {\n var i = 0;\n channels.forEach(function (channel) {\n if (has(mapping, channel)) {\n if (util_1.isArray(mapping[channel])) {\n mapping[channel].forEach(function (fieldDef) {\n f.call(thisArg, fieldDef, channel, i++);\n });\n }\n else {\n f.call(thisArg, mapping[channel], channel, i++);\n }\n }\n });\n}\nexports.channelMappingForEach = channelMappingForEach;\nfunction map(encoding, f, thisArg) {\n return channelMappingMap(channel_1.CHANNELS, encoding, f, thisArg);\n}\nexports.map = map;\nfunction channelMappingMap(channels, mapping, f, thisArg) {\n var arr = [];\n channels.forEach(function (channel) {\n if (has(mapping, channel)) {\n if (util_1.isArray(mapping[channel])) {\n mapping[channel].forEach(function (fieldDef) {\n arr.push(f.call(thisArg, fieldDef, channel));\n });\n }\n else {\n arr.push(f.call(thisArg, mapping[channel], channel));\n }\n }\n });\n return arr;\n}\nexports.channelMappingMap = channelMappingMap;\nfunction reduce(encoding, f, init, thisArg) {\n return channelMappingReduce(channel_1.CHANNELS, encoding, f, init, thisArg);\n}\nexports.reduce = reduce;\nfunction channelMappingReduce(channels, mapping, f, init, thisArg) {\n var r = init;\n channel_1.CHANNELS.forEach(function (channel) {\n if (has(mapping, channel)) {\n if (util_1.isArray(mapping[channel])) {\n mapping[channel].forEach(function (fieldDef) {\n r = f.call(thisArg, r, fieldDef, channel);\n });\n }\n else {\n r = f.call(thisArg, r, mapping[channel], channel);\n }\n }\n });\n return r;\n}\nexports.channelMappingReduce = channelMappingReduce;\n//# sourceMappingURL=encoding.js.map", + "\"use strict\";\n(function (Mark) {\n Mark[Mark[\"AREA\"] = 'area'] = \"AREA\";\n Mark[Mark[\"BAR\"] = 'bar'] = \"BAR\";\n Mark[Mark[\"LINE\"] = 'line'] = \"LINE\";\n Mark[Mark[\"POINT\"] = 'point'] = \"POINT\";\n Mark[Mark[\"TEXT\"] = 'text'] = \"TEXT\";\n Mark[Mark[\"TICK\"] = 'tick'] = \"TICK\";\n Mark[Mark[\"RULE\"] = 'rule'] = \"RULE\";\n Mark[Mark[\"CIRCLE\"] = 'circle'] = \"CIRCLE\";\n Mark[Mark[\"SQUARE\"] = 'square'] = \"SQUARE\";\n Mark[Mark[\"ERRORBAR\"] = 'errorBar'] = \"ERRORBAR\";\n})(exports.Mark || (exports.Mark = {}));\nvar Mark = exports.Mark;\nexports.AREA = Mark.AREA;\nexports.BAR = Mark.BAR;\nexports.LINE = Mark.LINE;\nexports.POINT = Mark.POINT;\nexports.TEXT = Mark.TEXT;\nexports.TICK = Mark.TICK;\nexports.RULE = Mark.RULE;\nexports.CIRCLE = Mark.CIRCLE;\nexports.SQUARE = Mark.SQUARE;\nexports.ERRORBAR = Mark.ERRORBAR;\nexports.PRIMITIVE_MARKS = [exports.AREA, exports.BAR, exports.LINE, exports.POINT, exports.TEXT, exports.TICK, exports.RULE, exports.CIRCLE, exports.SQUARE];\n//# sourceMappingURL=mark.js.map", + "\"use strict\";\n(function (ScaleType) {\n ScaleType[ScaleType[\"LINEAR\"] = 'linear'] = \"LINEAR\";\n ScaleType[ScaleType[\"LOG\"] = 'log'] = \"LOG\";\n ScaleType[ScaleType[\"POW\"] = 'pow'] = \"POW\";\n ScaleType[ScaleType[\"SQRT\"] = 'sqrt'] = \"SQRT\";\n ScaleType[ScaleType[\"QUANTILE\"] = 'quantile'] = \"QUANTILE\";\n ScaleType[ScaleType[\"QUANTIZE\"] = 'quantize'] = \"QUANTIZE\";\n ScaleType[ScaleType[\"ORDINAL\"] = 'ordinal'] = \"ORDINAL\";\n ScaleType[ScaleType[\"TIME\"] = 'time'] = \"TIME\";\n ScaleType[ScaleType[\"UTC\"] = 'utc'] = \"UTC\";\n})(exports.ScaleType || (exports.ScaleType = {}));\nvar ScaleType = exports.ScaleType;\n(function (NiceTime) {\n NiceTime[NiceTime[\"SECOND\"] = 'second'] = \"SECOND\";\n NiceTime[NiceTime[\"MINUTE\"] = 'minute'] = \"MINUTE\";\n NiceTime[NiceTime[\"HOUR\"] = 'hour'] = \"HOUR\";\n NiceTime[NiceTime[\"DAY\"] = 'day'] = \"DAY\";\n NiceTime[NiceTime[\"WEEK\"] = 'week'] = \"WEEK\";\n NiceTime[NiceTime[\"MONTH\"] = 'month'] = \"MONTH\";\n NiceTime[NiceTime[\"YEAR\"] = 'year'] = \"YEAR\";\n})(exports.NiceTime || (exports.NiceTime = {}));\nvar NiceTime = exports.NiceTime;\n(function (BandSize) {\n BandSize[BandSize[\"FIT\"] = 'fit'] = \"FIT\";\n})(exports.BandSize || (exports.BandSize = {}));\nvar BandSize = exports.BandSize;\nexports.BANDSIZE_FIT = BandSize.FIT;\nexports.defaultScaleConfig = {\n round: true,\n textBandWidth: 90,\n bandSize: 21,\n padding: 0.1,\n useRawDomain: false,\n opacity: [0.3, 0.8],\n nominalColorRange: 'category10',\n sequentialColorRange: ['#AFC6A3', '#09622A'],\n shapeRange: 'shapes',\n fontSizeRange: [8, 40],\n ruleSizeRange: [1, 5],\n tickSizeRange: [1, 20]\n};\nexports.defaultFacetScaleConfig = {\n round: true,\n padding: 16\n};\n//# sourceMappingURL=scale.js.map", + "\"use strict\";\n(function (SortOrder) {\n SortOrder[SortOrder[\"ASCENDING\"] = 'ascending'] = \"ASCENDING\";\n SortOrder[SortOrder[\"DESCENDING\"] = 'descending'] = \"DESCENDING\";\n SortOrder[SortOrder[\"NONE\"] = 'none'] = \"NONE\";\n})(exports.SortOrder || (exports.SortOrder = {}));\nvar SortOrder = exports.SortOrder;\nfunction isSortField(sort) {\n return !!sort && !!sort['field'] && !!sort['op'];\n}\nexports.isSortField = isSortField;\n//# sourceMappingURL=sort.js.map", + "\"use strict\";\nvar channel_1 = require('./channel');\nvar encoding_1 = require('./encoding');\nvar mark_1 = require('./mark');\nvar util_1 = require('./util');\n(function (StackOffset) {\n StackOffset[StackOffset[\"ZERO\"] = 'zero'] = \"ZERO\";\n StackOffset[StackOffset[\"CENTER\"] = 'center'] = \"CENTER\";\n StackOffset[StackOffset[\"NORMALIZE\"] = 'normalize'] = \"NORMALIZE\";\n StackOffset[StackOffset[\"NONE\"] = 'none'] = \"NONE\";\n})(exports.StackOffset || (exports.StackOffset = {}));\nvar StackOffset = exports.StackOffset;\nfunction stack(mark, encoding, config) {\n var stacked = (config && config.mark) ? config.mark.stacked : undefined;\n // Should not have stack explicitly disabled\n if (util_1.contains([StackOffset.NONE, null, false], stacked)) {\n return null;\n }\n // Should have stackable mark\n if (!util_1.contains([mark_1.BAR, mark_1.AREA], mark)) {\n return null;\n }\n // Should be aggregate plot\n if (!encoding_1.isAggregate(encoding)) {\n return null;\n }\n // Should have grouping level of detail\n var stackByChannels = channel_1.STACK_GROUP_CHANNELS.reduce(function (sc, channel) {\n if (encoding_1.has(encoding, channel) && !encoding[channel].aggregate) {\n sc.push(channel);\n }\n return sc;\n }, []);\n if (stackByChannels.length === 0) {\n return null;\n }\n // Has only one aggregate axis\n var hasXField = encoding_1.has(encoding, channel_1.X);\n var hasYField = encoding_1.has(encoding, channel_1.Y);\n var xIsAggregate = hasXField && !!encoding.x.aggregate;\n var yIsAggregate = hasYField && !!encoding.y.aggregate;\n if (xIsAggregate !== yIsAggregate) {\n return {\n groupbyChannel: xIsAggregate ? (hasYField ? channel_1.Y : null) : (hasXField ? channel_1.X : null),\n fieldChannel: xIsAggregate ? channel_1.X : channel_1.Y,\n stackByChannels: stackByChannels,\n offset: stacked || StackOffset.ZERO\n };\n }\n return null;\n}\nexports.stack = stack;\n//# sourceMappingURL=stack.js.map", + "\"use strict\";\nvar channel_1 = require('./channel');\nvar datetime_1 = require('./datetime');\nvar scale_1 = require('./scale');\nvar util_1 = require('./util');\n(function (TimeUnit) {\n TimeUnit[TimeUnit[\"YEAR\"] = 'year'] = \"YEAR\";\n TimeUnit[TimeUnit[\"MONTH\"] = 'month'] = \"MONTH\";\n TimeUnit[TimeUnit[\"DAY\"] = 'day'] = \"DAY\";\n TimeUnit[TimeUnit[\"DATE\"] = 'date'] = \"DATE\";\n TimeUnit[TimeUnit[\"HOURS\"] = 'hours'] = \"HOURS\";\n TimeUnit[TimeUnit[\"MINUTES\"] = 'minutes'] = \"MINUTES\";\n TimeUnit[TimeUnit[\"SECONDS\"] = 'seconds'] = \"SECONDS\";\n TimeUnit[TimeUnit[\"MILLISECONDS\"] = 'milliseconds'] = \"MILLISECONDS\";\n TimeUnit[TimeUnit[\"YEARMONTH\"] = 'yearmonth'] = \"YEARMONTH\";\n // Note: don't add MONTH DATE because it will be incorrect\n // since days on a leap year will be shifted by one if\n // we only add\n TimeUnit[TimeUnit[\"YEARMONTHDATE\"] = 'yearmonthdate'] = \"YEARMONTHDATE\";\n TimeUnit[TimeUnit[\"YEARMONTHDATEHOURS\"] = 'yearmonthdatehours'] = \"YEARMONTHDATEHOURS\";\n TimeUnit[TimeUnit[\"YEARMONTHDATEHOURSMINUTES\"] = 'yearmonthdatehoursminutes'] = \"YEARMONTHDATEHOURSMINUTES\";\n TimeUnit[TimeUnit[\"YEARMONTHDATEHOURSMINUTESSECONDS\"] = 'yearmonthdatehoursminutesseconds'] = \"YEARMONTHDATEHOURSMINUTESSECONDS\";\n TimeUnit[TimeUnit[\"HOURSMINUTES\"] = 'hoursminutes'] = \"HOURSMINUTES\";\n TimeUnit[TimeUnit[\"HOURSMINUTESSECONDS\"] = 'hoursminutesseconds'] = \"HOURSMINUTESSECONDS\";\n TimeUnit[TimeUnit[\"MINUTESSECONDS\"] = 'minutesseconds'] = \"MINUTESSECONDS\";\n TimeUnit[TimeUnit[\"SECONDSMILLISECONDS\"] = 'secondsmilliseconds'] = \"SECONDSMILLISECONDS\";\n TimeUnit[TimeUnit[\"QUARTER\"] = 'quarter'] = \"QUARTER\";\n TimeUnit[TimeUnit[\"YEARQUARTER\"] = 'yearquarter'] = \"YEARQUARTER\";\n TimeUnit[TimeUnit[\"QUARTERMONTH\"] = 'quartermonth'] = \"QUARTERMONTH\";\n TimeUnit[TimeUnit[\"YEARQUARTERMONTH\"] = 'yearquartermonth'] = \"YEARQUARTERMONTH\";\n})(exports.TimeUnit || (exports.TimeUnit = {}));\nvar TimeUnit = exports.TimeUnit;\n/** Time Unit that only corresponds to only one part of Date objects. */\nexports.SINGLE_TIMEUNITS = [\n TimeUnit.YEAR,\n TimeUnit.QUARTER,\n TimeUnit.MONTH,\n TimeUnit.DAY,\n TimeUnit.DATE,\n TimeUnit.HOURS,\n TimeUnit.MINUTES,\n TimeUnit.SECONDS,\n TimeUnit.MILLISECONDS,\n];\nvar SINGLE_TIMEUNIT_INDEX = exports.SINGLE_TIMEUNITS.reduce(function (d, timeUnit) {\n d[timeUnit] = true;\n return d;\n}, {});\nfunction isSingleTimeUnit(timeUnit) {\n return !!SINGLE_TIMEUNIT_INDEX[timeUnit];\n}\nexports.isSingleTimeUnit = isSingleTimeUnit;\n/**\n * Converts a date to only have the measurements relevant to the specified unit\n * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00'\n * Note: the base date is Jan 01 1900 00:00:00\n */\nfunction convert(unit, date) {\n var result = new Date(0, 0, 1, 0, 0, 0, 0); // start with uniform date\n exports.SINGLE_TIMEUNITS.forEach(function (singleUnit) {\n if (containsTimeUnit(unit, singleUnit)) {\n switch (singleUnit) {\n case TimeUnit.DAY:\n throw new Error('Cannot convert to TimeUnits containing \\'day\\'');\n case TimeUnit.YEAR:\n result.setFullYear(date.getFullYear());\n break;\n case TimeUnit.QUARTER:\n // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3)\n result.setMonth((Math.floor(date.getMonth() / 3)) * 3);\n break;\n case TimeUnit.MONTH:\n result.setMonth(date.getMonth());\n break;\n case TimeUnit.DATE:\n result.setDate(date.getDate());\n break;\n case TimeUnit.HOURS:\n result.setHours(date.getHours());\n break;\n case TimeUnit.MINUTES:\n result.setMinutes(date.getMinutes());\n break;\n case TimeUnit.SECONDS:\n result.setSeconds(date.getSeconds());\n break;\n case TimeUnit.MILLISECONDS:\n result.setMilliseconds(date.getMilliseconds());\n break;\n }\n }\n });\n return result;\n}\nexports.convert = convert;\nexports.MULTI_TIMEUNITS = [\n TimeUnit.YEARQUARTER,\n TimeUnit.YEARQUARTERMONTH,\n TimeUnit.YEARMONTH,\n TimeUnit.YEARMONTHDATE,\n TimeUnit.YEARMONTHDATEHOURS,\n TimeUnit.YEARMONTHDATEHOURSMINUTES,\n TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS,\n TimeUnit.QUARTERMONTH,\n TimeUnit.HOURSMINUTES,\n TimeUnit.HOURSMINUTESSECONDS,\n TimeUnit.MINUTESSECONDS,\n TimeUnit.SECONDSMILLISECONDS,\n];\nvar MULTI_TIMEUNIT_INDEX = exports.MULTI_TIMEUNITS.reduce(function (d, timeUnit) {\n d[timeUnit] = true;\n return d;\n}, {});\nfunction isMultiTimeUnit(timeUnit) {\n return !!MULTI_TIMEUNIT_INDEX[timeUnit];\n}\nexports.isMultiTimeUnit = isMultiTimeUnit;\nexports.TIMEUNITS = exports.SINGLE_TIMEUNITS.concat(exports.MULTI_TIMEUNITS);\n/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */\nfunction containsTimeUnit(fullTimeUnit, timeUnit) {\n var fullTimeUnitStr = fullTimeUnit.toString();\n var timeUnitStr = timeUnit.toString();\n var index = fullTimeUnitStr.indexOf(timeUnitStr);\n return index > -1 &&\n (timeUnit !== TimeUnit.SECONDS ||\n index === 0 ||\n fullTimeUnitStr.charAt(index - 1) !== 'i' // exclude milliseconds\n );\n}\nexports.containsTimeUnit = containsTimeUnit;\nfunction defaultScaleType(timeUnit) {\n switch (timeUnit) {\n case TimeUnit.HOURS:\n case TimeUnit.DAY:\n case TimeUnit.MONTH:\n case TimeUnit.QUARTER:\n return scale_1.ScaleType.ORDINAL;\n }\n // date, year, minute, second, yearmonth, monthday, ...\n return scale_1.ScaleType.TIME;\n}\nexports.defaultScaleType = defaultScaleType;\n/**\n * Returns Vega expresssion for a given timeUnit and fieldRef\n */\nfunction fieldExpr(fullTimeUnit, field) {\n var fieldRef = 'datum[\"' + field + '\"]';\n function func(timeUnit) {\n if (timeUnit === TimeUnit.QUARTER) {\n // Divide by 3 to get the corresponding quarter number, multiply by 3\n // to scale to the first month of the corresponding quarter(0,3,6,9).\n return 'floor(month(' + fieldRef + ')' + '/3)';\n }\n else {\n return timeUnit + '(' + fieldRef + ')';\n }\n }\n var d = exports.SINGLE_TIMEUNITS.reduce(function (_d, tu) {\n if (containsTimeUnit(fullTimeUnit, tu)) {\n _d[tu] = func(tu);\n }\n return _d;\n }, {});\n if (d.day && util_1.keys(d).length > 1) {\n console.warn('Time unit \"' + fullTimeUnit + '\" is not supported. We are replacing it with ', (fullTimeUnit + '').replace('day', 'date') + '.');\n delete d.day;\n d.date = func(TimeUnit.DATE);\n }\n return datetime_1.dateTimeExpr(d);\n}\nexports.fieldExpr = fieldExpr;\n/** Generate the complete raw domain. */\nfunction rawDomain(timeUnit, channel) {\n if (util_1.contains([channel_1.ROW, channel_1.COLUMN, channel_1.SHAPE, channel_1.COLOR], channel)) {\n return null;\n }\n switch (timeUnit) {\n case TimeUnit.SECONDS:\n return util_1.range(0, 60);\n case TimeUnit.MINUTES:\n return util_1.range(0, 60);\n case TimeUnit.HOURS:\n return util_1.range(0, 24);\n case TimeUnit.DAY:\n return util_1.range(0, 7);\n case TimeUnit.DATE:\n return util_1.range(1, 32);\n case TimeUnit.MONTH:\n return util_1.range(0, 12);\n case TimeUnit.QUARTER:\n return [0, 3, 6, 9];\n }\n return null;\n}\nexports.rawDomain = rawDomain;\n/** returns the smallest nice unit for scale.nice */\nfunction smallestUnit(timeUnit) {\n if (!timeUnit) {\n return undefined;\n }\n if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {\n return 'second';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {\n return 'minute';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {\n return 'hour';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.DAY) ||\n containsTimeUnit(timeUnit, TimeUnit.DATE)) {\n return 'day';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n return 'month';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) {\n return 'year';\n }\n return undefined;\n}\nexports.smallestUnit = smallestUnit;\n/** returns the template name used for axis labels for a time unit */\nfunction template(timeUnit, field, shortTimeLabels) {\n if (!timeUnit) {\n return undefined;\n }\n var dateComponents = [];\n if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) {\n dateComponents.push(shortTimeLabels ? '%y' : '%Y');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) {\n // special template for quarter\n dateComponents.push('\\'}}Q{{' + field + ' | quarter}}{{' + field + ' | time:\\'');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n dateComponents.push(shortTimeLabels ? '%b' : '%B');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.DAY)) {\n dateComponents.push(shortTimeLabels ? '%a' : '%A');\n }\n else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) {\n dateComponents.push('%d');\n }\n var timeComponents = [];\n if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {\n timeComponents.push('%H');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {\n timeComponents.push('%M');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {\n timeComponents.push('%S');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) {\n timeComponents.push('%L');\n }\n var out = [];\n if (dateComponents.length > 0) {\n out.push(dateComponents.join('-'));\n }\n if (timeComponents.length > 0) {\n out.push(timeComponents.join(':'));\n }\n if (out.length > 0) {\n // clean up empty formatting expressions that may have been generated by the quarter time unit\n var template_1 = '{{' + field + ' | time:\\'' + out.join(' ') + '\\'}}';\n // FIXME: Remove these RegExp Hacks!!!\n var escapedField = field.replace(/(\\[|\\])/g, '\\\\$1'); // excape field for use in Regex\n return template_1.replace(new RegExp('{{' + escapedField + ' \\\\| time:\\'\\'}}', 'g'), ''); // remove empty templates with Regex\n }\n else {\n return undefined;\n }\n}\nexports.template = template;\n//# sourceMappingURL=timeunit.js.map", + "/** Constants and utilities for data type */\n\"use strict\";\n(function (Type) {\n Type[Type[\"QUANTITATIVE\"] = 'quantitative'] = \"QUANTITATIVE\";\n Type[Type[\"ORDINAL\"] = 'ordinal'] = \"ORDINAL\";\n Type[Type[\"TEMPORAL\"] = 'temporal'] = \"TEMPORAL\";\n Type[Type[\"NOMINAL\"] = 'nominal'] = \"NOMINAL\";\n})(exports.Type || (exports.Type = {}));\nvar Type = exports.Type;\nexports.QUANTITATIVE = Type.QUANTITATIVE;\nexports.ORDINAL = Type.ORDINAL;\nexports.TEMPORAL = Type.TEMPORAL;\nexports.NOMINAL = Type.NOMINAL;\n/**\n * Mapping from full type names to short type names.\n * @type {Object}\n */\nexports.SHORT_TYPE = {\n quantitative: 'Q',\n temporal: 'T',\n nominal: 'N',\n ordinal: 'O'\n};\n/**\n * Mapping from short type names to full type names.\n * @type {Object}\n */\nexports.TYPE_FROM_SHORT_TYPE = {\n Q: exports.QUANTITATIVE,\n T: exports.TEMPORAL,\n O: exports.ORDINAL,\n N: exports.NOMINAL\n};\n/**\n * Get full, lowercase type name for a given type.\n * @param type\n * @return Full type name.\n */\nfunction getFullName(type) {\n var typeString = type; // force type as string so we can translate short types\n return exports.TYPE_FROM_SHORT_TYPE[typeString.toUpperCase()] ||\n typeString.toLowerCase();\n}\nexports.getFullName = getFullName;\n//# sourceMappingURL=type.js.map", + "/// \n/// \n\"use strict\";\nvar stringify = require('json-stable-stringify');\nvar util_1 = require('datalib/src/util');\nexports.keys = util_1.keys;\nexports.extend = util_1.extend;\nexports.duplicate = util_1.duplicate;\nexports.isArray = util_1.isArray;\nexports.vals = util_1.vals;\nexports.truncate = util_1.truncate;\nexports.toMap = util_1.toMap;\nexports.isObject = util_1.isObject;\nexports.isString = util_1.isString;\nexports.isNumber = util_1.isNumber;\nexports.isBoolean = util_1.isBoolean;\nvar util_2 = require('datalib/src/util');\nvar generate_1 = require('datalib/src/generate');\nexports.range = generate_1.range;\nvar util_3 = require('datalib/src/util');\n/**\n * Creates an object composed of the picked object properties.\n *\n * Example: (from lodash)\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n * pick(object, ['a', 'c']);\n * // → { 'a': 1, 'c': 3 }\n *\n */\nfunction pick(obj, props) {\n var copy = {};\n props.forEach(function (prop) {\n if (obj.hasOwnProperty(prop)) {\n copy[prop] = obj[prop];\n }\n });\n return copy;\n}\nexports.pick = pick;\n/**\n * The opposite of _.pick; this method creates an object composed of the own\n * and inherited enumerable string keyed properties of object that are not omitted.\n */\nfunction omit(obj, props) {\n var copy = util_2.duplicate(obj);\n props.forEach(function (prop) {\n delete copy[prop];\n });\n return copy;\n}\nexports.omit = omit;\nfunction hash(a) {\n if (util_3.isString(a) || util_3.isNumber(a) || util_3.isBoolean(a)) {\n return String(a);\n }\n return stringify(a);\n}\nexports.hash = hash;\nfunction contains(array, item) {\n return array.indexOf(item) > -1;\n}\nexports.contains = contains;\n/** Returns the array without the elements in item */\nfunction without(array, excludedItems) {\n return array.filter(function (item) {\n return !contains(excludedItems, item);\n });\n}\nexports.without = without;\nfunction union(array, other) {\n return array.concat(without(other, array));\n}\nexports.union = union;\nfunction forEach(obj, f, thisArg) {\n if (obj.forEach) {\n obj.forEach.call(thisArg, f);\n }\n else {\n for (var k in obj) {\n if (obj.hasOwnProperty(k)) {\n f.call(thisArg, obj[k], k, obj);\n }\n }\n }\n}\nexports.forEach = forEach;\nfunction reduce(obj, f, init, thisArg) {\n if (obj.reduce) {\n return obj.reduce.call(thisArg, f, init);\n }\n else {\n for (var k in obj) {\n if (obj.hasOwnProperty(k)) {\n init = f.call(thisArg, init, obj[k], k, obj);\n }\n }\n return init;\n }\n}\nexports.reduce = reduce;\nfunction map(obj, f, thisArg) {\n if (obj.map) {\n return obj.map.call(thisArg, f);\n }\n else {\n var output = [];\n for (var k in obj) {\n if (obj.hasOwnProperty(k)) {\n output.push(f.call(thisArg, obj[k], k, obj));\n }\n }\n return output;\n }\n}\nexports.map = map;\nfunction some(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (f(arr[k], k, i++)) {\n return true;\n }\n }\n return false;\n}\nexports.some = some;\nfunction every(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (!f(arr[k], k, i++)) {\n return false;\n }\n }\n return true;\n}\nexports.every = every;\nfunction flatten(arrays) {\n return [].concat.apply([], arrays);\n}\nexports.flatten = flatten;\nfunction mergeDeep(dest) {\n var src = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n src[_i - 1] = arguments[_i];\n }\n for (var i = 0; i < src.length; i++) {\n dest = deepMerge_(dest, src[i]);\n }\n return dest;\n}\nexports.mergeDeep = mergeDeep;\n;\n// recursively merges src into dest\nfunction deepMerge_(dest, src) {\n if (typeof src !== 'object' || src === null) {\n return dest;\n }\n for (var p in src) {\n if (!src.hasOwnProperty(p)) {\n continue;\n }\n if (src[p] === undefined) {\n continue;\n }\n if (typeof src[p] !== 'object' || src[p] === null) {\n dest[p] = src[p];\n }\n else if (typeof dest[p] !== 'object' || dest[p] === null) {\n dest[p] = mergeDeep(src[p].constructor === Array ? [] : {}, src[p]);\n }\n else {\n mergeDeep(dest[p], src[p]);\n }\n }\n return dest;\n}\n// FIXME remove this\nvar dlBin = require('datalib/src/bins/bins');\nfunction getbins(stats, maxbins) {\n return dlBin({\n min: stats.min,\n max: stats.max,\n maxbins: maxbins\n });\n}\nexports.getbins = getbins;\nfunction unique(values, f) {\n var results = [];\n var u = {}, v, i, n;\n for (i = 0, n = values.length; i < n; ++i) {\n v = f ? f(values[i]) : values[i];\n if (v in u) {\n continue;\n }\n u[v] = 1;\n results.push(values[i]);\n }\n return results;\n}\nexports.unique = unique;\n;\nfunction warning(message) {\n console.warn('[VL Warning]', message);\n}\nexports.warning = warning;\nfunction error(message) {\n console.error('[VL Error]', message);\n}\nexports.error = error;\n/**\n * Returns true if the two dicitonaries disagree. Applies only to defioned values.\n */\nfunction differ(dict, other) {\n for (var key in dict) {\n if (dict.hasOwnProperty(key)) {\n if (other[key] && dict[key] && other[key] !== dict[key]) {\n return true;\n }\n }\n }\n return false;\n}\nexports.differ = differ;\n//# sourceMappingURL=util.js.map" + ] +} \ No newline at end of file diff --git a/compassql.min.js b/compassql.min.js new file mode 100644 index 00000000..219fd933 --- /dev/null +++ b/compassql.min.js @@ -0,0 +1,5 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n;n="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,n.cql=e()}}(function(){var e;return function n(e,t,r){function i(o,u){if(!t[o]){if(!e[o]){var c="function"==typeof require&&require;if(!u&&c)return c(o,!0);if(a)return a(o,!0);var s=new Error("Cannot find module '"+o+"'");throw s.code="MODULE_NOT_FOUND",s}var l=t[o]={exports:{}};e[o][0].call(l.exports,function(n){var t=e[o][1][n];return i(t?t:n)},l,l.exports,n,e,t,r)}return t[o].exports}for(var a="function"==typeof require&&require,o=0;on-r?r:i},u.ceil=function(n){return e(n=new Date(n-1)),t(n,1),n},u.offset=function(e,n){return t(e=new Date(+e),null==n?1:Math.floor(n)),e},u.range=function(n,r,i){var a=[];if(n=new Date(n-1),r=new Date(+r),i=null==i?1:Math.floor(i),!(r>n&&i>0))return a;for(t(n,1),e(n),r>n&&a.push(new Date(+n));t(n,i),e(n),r>n;)a.push(new Date(+n));return a},u.filter=function(r){return n(function(n){for(;e(n),!r(n);)n.setTime(n-1)},function(e,n){for(;--n>=0;)for(;t(e,1),!r(e););})},r&&(u.count=function(n,t){return i.setTime(+n),a.setTime(+t),e(i),e(a),Math.floor(r(i,a))},u.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?u.filter(o?function(n){return o(n)%e===0}:function(n){return u.count(0,n)%e===0}):u:null}),u}function t(e){return n(function(n){n.setHours(0,0,0,0),n.setDate(n.getDate()-(n.getDay()+7-e)%7)},function(e,n){e.setDate(e.getDate()+7*n)},function(e,n){return(n-e-6e4*(n.getTimezoneOffset()-e.getTimezoneOffset()))/6048e5})}function r(e){return n(function(n){n.setUTCHours(0,0,0,0),n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-e)%7)},function(e,n){e.setUTCDate(e.getUTCDate()+7*n)},function(e,n){return(n-e)/6048e5})}var i=new Date,a=new Date,o=n(function(){},function(e,n){e.setTime(+e+n)},function(e,n){return n-e});o.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?n(function(n){n.setTime(Math.floor(n/e)*e)},function(n,t){n.setTime(+n+t*e)},function(n,t){return(t-n)/e}):o:null};var u=n(function(e){e.setMilliseconds(0)},function(e,n){e.setTime(+e+1e3*n)},function(e,n){return(n-e)/1e3},function(e){return e.getSeconds()}),c=n(function(e){e.setSeconds(0,0)},function(e,n){e.setTime(+e+6e4*n)},function(e,n){return(n-e)/6e4},function(e){return e.getMinutes()}),s=n(function(e){e.setMinutes(0,0,0)},function(e,n){e.setTime(+e+36e5*n)},function(e,n){return(n-e)/36e5},function(e){return e.getHours()}),l=n(function(e){e.setHours(0,0,0,0)},function(e,n){e.setDate(e.getDate()+n)},function(e,n){return(n-e-6e4*(n.getTimezoneOffset()-e.getTimezoneOffset()))/864e5},function(e){return e.getDate()-1}),p=t(0),f=t(1),E=t(2),d=t(3),y=t(4),g=t(5),h=t(6),T=n(function(e){e.setHours(0,0,0,0),e.setDate(1)},function(e,n){e.setMonth(e.getMonth()+n)},function(e,n){return n.getMonth()-e.getMonth()+12*(n.getFullYear()-e.getFullYear())},function(e){return e.getMonth()}),m=n(function(e){e.setHours(0,0,0,0),e.setMonth(0,1)},function(e,n){e.setFullYear(e.getFullYear()+n)},function(e,n){return n.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()}),S=n(function(e){e.setUTCMilliseconds(0)},function(e,n){e.setTime(+e+1e3*n)},function(e,n){return(n-e)/1e3},function(e){return e.getUTCSeconds()}),A=n(function(e){e.setUTCSeconds(0,0)},function(e,n){e.setTime(+e+6e4*n)},function(e,n){return(n-e)/6e4},function(e){return e.getUTCMinutes()}),N=n(function(e){e.setUTCMinutes(0,0,0)},function(e,n){e.setTime(+e+36e5*n)},function(e,n){return(n-e)/36e5},function(e){return e.getUTCHours()}),v=n(function(e){e.setUTCHours(0,0,0,0)},function(e,n){e.setUTCDate(e.getUTCDate()+n)},function(e,n){return(n-e)/864e5},function(e){return e.getUTCDate()-1}),C=r(0),O=r(1),I=r(2),R=r(3),P=r(4),M=r(5),L=r(6),U=n(function(e){e.setUTCHours(0,0,0,0),e.setUTCDate(1)},function(e,n){e.setUTCMonth(e.getUTCMonth()+n)},function(e,n){return n.getUTCMonth()-e.getUTCMonth()+12*(n.getUTCFullYear()-e.getUTCFullYear())},function(e){return e.getUTCMonth()}),D=n(function(e){e.setUTCHours(0,0,0,0),e.setUTCMonth(0,1)},function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n)},function(e,n){return n.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()}),_=o.range,b=u.range,k=c.range,w=s.range,F=l.range,x=p.range,B=f.range,H=E.range,Y=d.range,G=y.range,Q=g.range,q=h.range,X=p.range,j=T.range,V=m.range,z=o,$=_,W=S.range,K=A.range,Z=N.range,J=v.range,ee=C.range,ne=O.range,te=I.range,re=R.range,ie=P.range,ae=M.range,oe=L.range,ue=C.range,ce=U.range,se=D.range,le="0.1.1";e.version=le,e.milliseconds=_,e.seconds=b,e.minutes=k,e.hours=w,e.days=F,e.sundays=x,e.mondays=B,e.tuesdays=H,e.wednesdays=Y,e.thursdays=G,e.fridays=Q,e.saturdays=q,e.weeks=X,e.months=j,e.years=V,e.utcMillisecond=z,e.utcMilliseconds=$,e.utcSeconds=W,e.utcMinutes=K,e.utcHours=Z,e.utcDays=J,e.utcSundays=ee,e.utcMondays=ne,e.utcTuesdays=te,e.utcWednesdays=re,e.utcThursdays=ie,e.utcFridays=ae,e.utcSaturdays=oe,e.utcWeeks=ue,e.utcMonths=ce,e.utcYears=se,e.millisecond=o,e.second=u,e.minute=c,e.hour=s,e.day=l,e.sunday=p,e.monday=f,e.tuesday=E,e.wednesday=d,e.thursday=y,e.friday=g,e.saturday=h,e.week=p,e.month=T,e.year=m,e.utcSecond=S,e.utcMinute=A,e.utcHour=N,e.utcDay=v,e.utcSunday=C,e.utcMonday=O,e.utcTuesday=I,e.utcWednesday=R,e.utcThursday=P,e.utcFriday=M,e.utcSaturday=L,e.utcWeek=C,e.utcMonth=U,e.utcYear=D,e.interval=n})},{}],3:[function(e,n,t){function r(e){if(!e)throw Error("Missing binning options.");var n,t,r,u,c,s,l,p=e.maxbins||15,f=e.base||10,E=Math.log(f),d=e.div||[5,2],y=e.min,g=e.max,h=g-y;if(e.step)n=e.step;else if(e.steps)n=e.steps[Math.min(e.steps.length-1,i(e.steps,h/p,0,e.steps.length))];else{for(t=Math.ceil(Math.log(p)/E),r=e.minstep||0,n=Math.max(r,Math.pow(f,Math.round(Math.log(h)/E)-t));Math.ceil(h/n)>p;)n*=f;for(s=0;s=r&&p>=h/c&&(n=c)}return c=Math.log(n),u=c>=0?0:~~(-c/E)+1,l=Math.pow(f,-u-1),y=Math.min(y,Math.floor(y/n+l)*n),g=Math.ceil(g/n)*n,{start:y,stop:g,step:n,unit:{precision:u},value:a,index:o}}function i(e,n,t,r){for(;r>t;){var i=t+r>>>1;s.cmp(e[i],n)<0?t=i+1:r=i}return t}function a(e){return this.step*Math.floor(e/this.step+p)}function o(e){return Math.floor((e-this.start)/this.step+p)}function u(e){return this.unit.date(a.call(this,e))}function c(e){return o.call(this,this.unit.unit(e))}var s=e("../util"),l=e("../time"),p=1e-15;r.date=function(e){if(!e)throw Error("Missing date binning options.");var n=e.utc?l.utc:l,t=e.min,i=e.max,a=e.maxbins||20,o=e.minbins||4,s=+i-+t,p=e.unit?n[e.unit]:n.find(s,o,a),f=r({min:null!=p.min?p.min:p.unit(t),max:null!=p.max?p.max:p.unit(i),maxbins:a,minstep:p.minstep,steps:p.step});return f.unit=p,f.index=c,e.raw||(f.value=u),f},n.exports=r},{"../time":7,"../util":8}],4:[function(e,n,t){var r=e("./util"),i=n.exports;i.repeat=function(e,n){var t,r=Array(n);for(t=0;n>t;++t)r[t]=e;return r},i.zeros=function(e){return i.repeat(0,e)},i.range=function(e,n,t){if(arguments.length<3&&(t=1,arguments.length<2&&(n=e,e=0)),(n-e)/t==1/0)throw new Error("Infinite range");var r,i=[],a=-1;if(0>t)for(;(r=e+t*++a)>n;)i.push(r);else for(;(r=e+t*++a)=e&&n>=r?1/t:0},r.cdf=function(r){return e>r?0:r>n?1:(r-e)/t},r.icdf=function(n){return n>=0&&1>=n?e+n*t:NaN},r},i.random.integer=function(e,n){void 0===n&&(n=e,e=0);var t=n-e,r=function(){return e+Math.floor(t*Math.random())};return r.samples=function(e){return i.zeros(e).map(r)},r.pdf=function(r){return r===Math.floor(r)&&r>=e&&n>r?1/t:0},r.cdf=function(r){var i=Math.floor(r);return e>i?0:i>=n?1:(i-e+1)/t},r.icdf=function(n){return n>=0&&1>=n?e-1+Math.floor(n*t):NaN},r},i.random.normal=function(e,n){e=e||0,n=n||1;var t,r=function(){var r,i,a=0,o=0;if(void 0!==t)return a=t,t=void 0,a;do a=2*Math.random()-1,o=2*Math.random()-1,r=a*a+o*o;while(0===r||r>1);return i=Math.sqrt(-2*Math.log(r)/r),t=e+o*i*n,e+a*i*n};return r.samples=function(e){return i.zeros(e).map(r)},r.pdf=function(t){var r=Math.exp(Math.pow(t-e,2)/(-2*Math.pow(n,2)));return 1/(n*Math.sqrt(2*Math.PI))*r},r.cdf=function(t){var r,i=(t-e)/n,a=Math.abs(i);if(a>37)r=0;else{var o,u=Math.exp(-a*a/2);7.07106781186547>a?(o=.0352624965998911*a+.700383064443688,o=o*a+6.37396220353165,o=o*a+33.912866078383,o=o*a+112.079291497871,o=o*a+221.213596169931,o=o*a+220.206867912376,r=u*o,o=.0883883476483184*a+1.75566716318264,o=o*a+16.064177579207,o=o*a+86.7807322029461,o=o*a+296.564248779674,o=o*a+637.333633378831,o=o*a+793.826512519948,o=o*a+440.413735824752,r/=o):(o=a+.65,o=a+4/o,o=a+3/o,o=a+2/o,o=a+1/o,r=u/o/2.506628274631)}return i>0?1-r:r},r.icdf=function(t){if(0>=t||t>=1)return NaN;var r=2*t-1,i=8*(Math.PI-3)/(3*Math.PI*(4-Math.PI)),a=2/(Math.PI*i)+Math.log(1-Math.pow(r,2))/2,o=Math.log(1-r*r)/i,u=(r>0?1:-1)*Math.sqrt(Math.sqrt(a*a-o)-a);return e+n*Math.SQRT2*u},r},i.random.bootstrap=function(e,n){var t=e.filter(r.isValid),a=t.length,o=n?i.random.normal(0,n):null,u=function(){return t[~~(Math.random()*a)]+(o?o():0)};return u.samples=function(e){return i.zeros(e).map(u)},u}},{"./util":8}],5:[function(e,n,t){function r(e,n){return n?void(e[s]=n):e&&e[s]||null}function i(e,n){e=c.array(e),n=c.$(n);var t,r,i;if(e[s]&&(t=n(e[s]),c.isString(t)))return t;for(r=0,i=e.length;!c.isValid(t)&&i>r;++r)t=n?n(e[r]):e[r];return c.isDate(t)?"date":c.isNumber(t)?"number":c.isBoolean(t)?"boolean":c.isString(t)?"string":null}function a(e,n){return e.length?(n=n||c.keys(e[0]),n.reduce(function(n,t){return n[t]=i(e,t),n},{})):void 0}function o(e,n){e=c.array(e),n=c.$(n);var t,r,i,a=["boolean","integer","number","date"];for(t=0;ti;++i)o.isValid(a[i])&&o.isValid(u[i])&&p.push(a[i]-u[i]);return s.z.test(p,e&&e.nullh||0)}function a(e,n,t,r){var i=r?n.map(o.$(t)):n,a=r?n.map(o.$(r)):t,u=s.count.valid(i),l=s.count.valid(a),p=c.random.normal(0,1),f=s.mean(i)-s.mean(a)-(e&&e.nullh||0),E=Math.sqrt(s.variance(i)/u+s.variance(a)/l);if(0===E)return 0===f?1:0;var d=f/E;return 2*p.cdf(-Math.abs(d))}var o=e("./util"),u=e("./import/type"),c=e("./generate"),s=n.exports;s.unique=function(e,n,t){n=o.$(n),t=t||[];var r,i,a,u={};for(i=0,a=e.length;a>i;++i)r=n?n(e[i]):e[i],r in u||(u[r]=1,t.push(r));return t},s.count=function(e){return e&&e.length||0},s.count.valid=function(e,n){n=o.$(n);var t,r,i,a=0;for(r=0,i=e.length;i>r;++r)t=n?n(e[r]):e[r],o.isValid(t)&&(a+=1);return a},s.count.missing=function(e,n){n=o.$(n);var t,r,i,a=0;for(r=0,i=e.length;i>r;++r)t=n?n(e[r]):e[r],null==t&&(a+=1);return a},s.count.distinct=function(e,n){n=o.$(n);var t,r,i,a={},u=0;for(r=0,i=e.length;i>r;++r)t=n?n(e[r]):e[r],t in a||(a[t]=1,u+=1);return u},s.count.map=function(e,n){n=o.$(n);var t,r,i,a={};for(r=0,i=e.length;i>r;++r)t=n?n(e[r]):e[r],a[t]=t in a?a[t]+1:1;return a},s.median=function(e,n){return n&&(e=e.map(o.$(n))),e=e.filter(o.isValid).sort(o.cmp),s.quantile(e,.5)},s.quartile=function(e,n){n&&(e=e.map(o.$(n))),e=e.filter(o.isValid).sort(o.cmp);var t=s.quantile;return[t(e,.25),t(e,.5),t(e,.75)]},s.quantile=function(e,n,t){void 0===t&&(t=n,n=o.identity),n=o.$(n);var r=(e.length-1)*t+1,i=Math.floor(r),a=+n(e[i-1]),u=r-i;return u?a+u*(n(e[i])-a):a},s.sum=function(e,n){n=o.$(n);for(var t,r=0,i=0,a=e.length;a>i;++i)t=n?n(e[i]):e[i],o.isValid(t)&&(r+=t);return r},s.mean=function(e,n){n=o.$(n);var t,r,i,a,u,c=0;for(r=0,a=0,i=e.length;i>r;++r)u=n?n(e[r]):e[r],o.isValid(u)&&(t=u-c,c+=t/++a);return c},s.mean.geometric=function(e,n){n=o.$(n);var t,r,i,a,u=1;for(a=0,t=0,r=e.length;r>a;++a)if(i=n?n(e[a]):e[a],o.isValid(i)){if(0>=i)throw Error("Geometric mean only defined for positive values.");u*=i,++t}return u=t>0?Math.pow(u,1/t):0},s.mean.harmonic=function(e,n){n=o.$(n);var t,r,i,a,u=0;for(a=0,t=0,r=e.length;r>a;++a)i=n?n(e[a]):e[a],o.isValid(i)&&(u+=1/i,++t);return t/u},s.variance=function(e,n){if(n=o.$(n),!o.isArray(e)||e.length<2)return 0;var t,r,i,a,u=0,c=0;for(r=0,i=0;ra;++a)if(i=n?n(e[a]):e[a],o.isValid(i)){t=r=i;break}for(;u>a;++a)i=n?n(e[a]):e[a],o.isValid(i)&&(t>i&&(t=i),i>r&&(r=i));return[t,r]},s.extent.index=function(e,n){n=o.$(n);var t,r,i,a,u=-1,c=-1,s=e.length;for(a=0;s>a;++a)if(i=n?n(e[a]):e[a],o.isValid(i)){t=r=i,u=c=a;break}for(;s>a;++a)i=n?n(e[a]):e[a],o.isValid(i)&&(t>i&&(t=i,u=a),i>r&&(r=i,c=a));return[u,c]},s.dot=function(e,n,t){var r,i,a=0;if(t)for(n=o.$(n),t=o.$(t),r=0;ra;++a)i=u?n(c[a])-t(s[a]):c[a]-s[a],E+=p?i*i:Math.pow(Math.abs(i),l);return p?Math.sqrt(E):Math.pow(E,1/l)},s.cohensd=function(e,n,t){var r=t?e.map(o.$(n)):e,i=t?e.map(o.$(t)):n,a=s.mean(r),u=s.mean(i),c=s.count.valid(r),l=s.count.valid(i);if(0>=c+l-2)return 0;var p=s.variance(r),f=s.variance(i),E=Math.sqrt(((c-1)*p+(l-1)*f)/(c+l-2));return 0===E?0:(a-u)/E},s.covariance=function(e,n,t){var r,i,a,u,c,l=t?e.map(o.$(n)):e,p=t?e.map(o.$(t)):n,f=l.length,E=s.mean(l),d=s.mean(p),y=0,g=0;if(f!==p.length)throw Error("Input lengths must match.");for(r=0;f>r;++r)if(i=l[r],u=o.isValid(i),a=p[r],c=o.isValid(a),u&&c)y+=(i-E)*(a-d),++g;else if(u||c)throw Error("Valid values must align.");return y/(g-1)},s.rank=function(e,n){n=o.$(n)||o.identity;var t,r,i,a=e.map(function(e,t){return{idx:t,val:n(e)}}).sort(o.comparator("val")),u=e.length,c=Array(u),s=-1,l={};for(t=0;u>t;++t){if(r=a[t].val,0>s&&l===r)s=t-1;else if(s>-1&&l!==r){for(i=1+(t-1+s)/2;t>s;++s)c[a[s].idx]=i;s=-1}c[a[t].idx]=t+1,l=r}if(s>-1)for(i=1+(u-1+s)/2;u>s;++s)c[a[s].idx]=i;return c},s.cor=function(e,n,t){var r=t;t=r?e.map(o.$(t)):n,n=r?e.map(o.$(n)):e;var i=s.dot(n,t),a=s.mean(n),u=s.mean(t),c=s.stdev(n),l=s.stdev(t),p=e.length;return(i-p*a*u)/((p-1)*c*l)},s.cor.rank=function(e,n,t){var r,i,a,o=t?s.rank(e,n):s.rank(e),u=t?s.rank(e,t):s.rank(n),c=e.length;for(r=0,i=0;c>r;++r)a=o[r]-u[r],i+=a*a;return 1-6*i/(c*(c*c-1))},s.cor.dist=function(e,n,t){var r,i,a,u,c=t?e.map(o.$(n)):e,l=t?e.map(o.$(t)):n,p=s.dist.mat(c),f=s.dist.mat(l),E=p.length;for(r=0,i=0,a=0,u=0;E>r;++r)i+=p[r]*p[r],a+=f[r]*f[r],u+=p[r]*f[r];return Math.sqrt(u/Math.sqrt(i*a))},s.linearRegression=function(e,n,t){var r,i,a=t?e.map(o.$(n)):e,u=t?e.map(o.$(t)):n,c=a.length,l=s.covariance(a,u),p=s.stdev(a),f=s.stdev(u),E=l/(p*p),d=s.mean(u)-E*s.mean(a),y={slope:E,intercept:d,R:l/(p*f),rss:0};for(i=0;c>i;++i)o.isValid(a[i])&&o.isValid(u[i])&&(r=E*a[i]+d-u[i],y.rss+=r*r);return y},s.bootstrap={},s.bootstrap.ci=function(e,n,t,r,i){var a,u,l,p,f,E,d;for(o.isFunction(n)||o.isString(n)?(a=e.map(o.$(n)),u=t,l=r,p=i):(a=e,u=n,l=t,p=r),u=u?+u:1e3,l=l||.05,f=c.random.bootstrap(a,p),d=0,E=Array(u);u>d;++d)E[d]=s.mean(f.samples(a.length));return E.sort(o.numcmp),[s.quantile(E,l/2),s.quantile(E,1-l/2)]},s.z={},s.z.ci=function(e,n,t){var r=e,i=n;(o.isFunction(n)||o.isString(n))&&(r=e.map(o.$(n)),i=t),i=i||.05;var a=.05===i?1.96:c.random.normal(0,1).icdf(1-i/2),u=s.mean(r),l=s.stdev(r)/Math.sqrt(s.count.valid(r));return[u-a*l,u+a*l]},s.z.test=function(e,n,t,u){return o.isFunction(t)||o.isString(t)?(u&&u.paired?i:a)(u,e,n,t):o.isArray(n)?(t&&t.paired?i:a)(t,e,n):o.isFunction(n)||o.isString(n)?r(t,e,n):r(n,e)},s.dist.mat=function(e){var n,t,r,i=e.length,a=i*i,o=Array(a),u=c.zeros(i),s=0;for(t=0;i>t;++t)for(o[t*i+t]=0,r=t+1;i>r;++r)o[t*i+r]=n=Math.abs(e[t]-e[r]),o[r*i+t]=n,u[t]+=n,u[r]+=n;for(t=0;i>t;++t)s+=u[t],u[t]/=i;for(s/=a,t=0;i>t;++t)for(r=t;i>r;++r)o[t*i+r]+=s-u[t]-u[r],o[r*i+t]=o[t*i+r];return o},s.entropy=function(e,n){n=o.$(n);var t,r,i=0,a=0,u=e.length;for(t=0;u>t;++t)i+=n?n(e[t]):e[t];if(0===i)return 0;for(t=0;u>t;++t)r=(n?n(e[t]):e[t])/i,r&&(a+=r*Math.log(r));return-a/Math.LN2},s.mutual=function(e,n,t,r){var i,a,u,c=r?e.map(o.$(n)):e,s=r?e.map(o.$(t)):n,l=r?e.map(o.$(r)):t,p={},f={},E=l.length,d=0,y=0,g=0;for(u=0;E>u;++u)p[c[u]]=0,f[s[u]]=0;for(u=0;E>u;++u)p[c[u]]+=l[u],f[s[u]]+=l[u],d+=l[u];for(a=1/(d*Math.LN2),u=0;E>u;++u)0!==l[u]&&(i=d*l[u]/(p[c[u]]*f[s[u]]),y+=l[u]*a*Math.log(i),g+=l[u]*a*Math.log(l[u]/d));return[y,1+y/g]},s.mutual.info=function(e,n,t,r){return s.mutual(e,n,t,r)[0]},s.mutual.dist=function(e,n,t,r){return s.mutual(e,n,t,r)[1]},s.profile=function(e,n){var t,r,i,a,c,l=0,p=0,f=0,E=0,d=null,y=null,g=0,h=[],T={};for(i=0;ic)&&(d=c),(null===y||c>y)&&(y=c),t=c-l,l+=t/++p,g+=t*(c-l),h.push(c));return g/=p-1,r=Math.sqrt(g),h.sort(o.cmp),{type:u(e,n),unique:T,count:e.length,valid:p,missing:f,distinct:E,min:d,max:y,mean:l,stdev:r,median:a=s.quantile(h,.5),q1:s.quantile(h,.25),q3:s.quantile(h,.75),modeskew:0===r?0:(l-a)/r}},s.summary=function(e,n){n=n||o.keys(e[0]);var t=n.map(function(n){var t=s.profile(e,o.$(n));return t.field=n,t});return t.__summary__=!0,t}},{"./generate":4,"./import/type":5,"./util":8}],7:[function(e,n,t){function r(e){return s.setTime(+e),s}function i(e,n,t,r,i,a){var o={type:e,date:n,unit:t};return r?o.step=r:o.minstep=1,null!=i&&(o.min=i),null!=a&&(o.max=a),o}function a(e,n,t,r,a,o){return i(e,function(e){return n.offset(t,e)},function(e){return n.count(t,e)},r,a,o)}function o(e,n,t,r){var i,a,o,u=d[0];for(i=1,a=d.length;a>i;++i)if(u=d[i],n>u[0]){if(o=n/u[0],o>r)return e[d[i-1][1]];if(o>=t)return e[u[1]]}return e[d[a-1][1]]}function u(e){var n,t,r={};for(n=0,t=e.length;t>n;++n)r[e[n].type]=e[n];return r.find=function(n,t,r){return o(e,n,t,r)},r}var c=e("d3-time"),s=new Date,l=new Date(0,0,1).setFullYear(0),p=new Date(Date.UTC(0,0,1)).setUTCFullYear(0),f=[a("second",c.second,l),a("minute",c.minute,l),a("hour",c.hour,l),a("day",c.day,l,[1,7]),a("month",c.month,l,[1,3,6]),a("year",c.year,l),i("seconds",function(e){return new Date(1970,0,1,0,0,e)},function(e){return r(e).getSeconds()},null,0,59),i("minutes",function(e){return new Date(1970,0,1,0,e)},function(e){return r(e).getMinutes()},null,0,59),i("hours",function(e){return new Date(1970,0,1,e)},function(e){return r(e).getHours()},null,0,23),i("weekdays",function(e){return new Date(1970,0,4+e)},function(e){return r(e).getDay()},[1],0,6),i("dates",function(e){return new Date(1970,0,e)},function(e){return r(e).getDate()},[1],1,31),i("months",function(e){return new Date(1970,e%12,1)},function(e){return r(e).getMonth()},[1],0,11)],E=[a("second",c.utcSecond,p),a("minute",c.utcMinute,p),a("hour",c.utcHour,p),a("day",c.utcDay,p,[1,7]),a("month",c.utcMonth,p,[1,3,6]),a("year",c.utcYear,p),i("seconds",function(e){return new Date(Date.UTC(1970,0,1,0,0,e))},function(e){return r(e).getUTCSeconds()},null,0,59),i("minutes",function(e){return new Date(Date.UTC(1970,0,1,0,e))},function(e){return r(e).getUTCMinutes()},null,0,59),i("hours",function(e){return new Date(Date.UTC(1970,0,1,e))},function(e){return r(e).getUTCHours()},null,0,23),i("weekdays",function(e){return new Date(Date.UTC(1970,0,4+e))},function(e){return r(e).getUTCDay()},[1],0,6),i("dates",function(e){return new Date(Date.UTC(1970,0,e))},function(e){return r(e).getUTCDate()},[1],1,31),i("months",function(e){return new Date(Date.UTC(1970,e%12,1))},function(e){return r(e).getUTCMonth()},[1],0,11)],d=[[31536e6,5],[7776e6,4],[2592e6,4],[12096e5,3],[6048e5,3],[1728e5,3],[864e5,3],[432e5,2],[216e5,2],[108e5,2],[36e5,2],[18e5,1],[9e5,1],[3e5,1],[6e4,1],[3e4,0],[15e3,0],[5e3,0],[1e3,0]];n.exports=u(f),n.exports.utc=u(E)},{"d3-time":2}],8:[function(e,n,t){(function(e){function t(e,n){var t,r="";for(t=0;e>t;++t)r+=n;return r}function r(e,n,t){var r=0,i=e.split(c);return e=t?(i=i.reverse()).filter(function(e){return r+=e.length,n>=r}).reverse():i.filter(function(e){return r+=e.length,n>=r}),e.length?e.join("").trim():i[0].slice(0,n)}var i=n.exports,a="__name__";i.namedfunc=function(e,n){return n[a]=e,n},i.name=function(e){return null==e?null:e[a]},i.identity=function(e){return e},i["true"]=i.namedfunc("true",function(){return!0}),i["false"]=i.namedfunc("false",function(){return!1}),i.duplicate=function(e){return JSON.parse(JSON.stringify(e))},i.equal=function(e,n){return JSON.stringify(e)===JSON.stringify(n)},i.extend=function(e){for(var n,t,r=1,i=arguments.length;i>r;++r){n=arguments[r];for(t in n)e[t]=n[t]}return e},i.length=function(e){return null!=e&&null!=e.length?e.length:null},i.keys=function(e){var n,t=[];for(n in e)t.push(n);return t},i.vals=function(e){var n,t=[];for(n in e)t.push(e[n]);return t},i.toMap=function(e,n){return(n=i.$(n))?e.reduce(function(e,t){return e[n(t)]=1,e},{}):e.reduce(function(e,n){return e[n]=1,e},{})},i.keystr=function(e){var n=e.length;if(!n)return"";for(var t=String(e[0]),r=1;n>r;++r)t+="|"+String(e[r]);return t};var o=Object.prototype.toString;i.isObject=function(e){return e===Object(e)},i.isFunction=function(e){return"[object Function]"===o.call(e)},i.isString=function(e){return"string"==typeof value||"[object String]"===o.call(e)},i.isArray=Array.isArray||function(e){return"[object Array]"===o.call(e)},i.isNumber=function(e){return"number"==typeof e||"[object Number]"===o.call(e)},i.isBoolean=function(e){return e===!0||e===!1||"[object Boolean]"==o.call(e)},i.isDate=function(e){return"[object Date]"===o.call(e)},i.isValid=function(e){return null!=e&&e===e},i.isBuffer="function"==typeof e&&e.isBuffer||i["false"],i.number=function(e){return null==e||""===e?null:+e},i["boolean"]=function(e){return null==e||""===e?null:"false"===e?!1:!!e},i.date=function(e,n){var t=n?n:Date;return null==e||""===e?null:t.parse(e)},i.array=function(e){return null!=e?i.isArray(e)?e:[e]:[]},i.str=function(e){return i.isArray(e)?"["+e.map(i.str)+"]":i.isObject(e)||i.isString(e)?JSON.stringify(e).replace("\u2028","\\u2028").replace("\u2029","\\u2029"):e};var u=/\[(.*?)\]|[^.\[]+/g;i.field=function(e){return String(e).match(u).map(function(e){return"["!==e[0]?e:"'"!==e[1]&&'"'!==e[1]?e.slice(1,-1):e.slice(2,-2).replace(/\\(["'])/g,"$1")})},i.accessor=function(e){return null==e||i.isFunction(e)?e:i.namedfunc(e,Function("x","return x["+i.field(e).map(i.str).join("][")+"];"))},i.$=i.accessor,i.mutator=function(e){var n;return i.isString(e)&&(n=i.field(e)).length>1?function(e,t){for(var r=0;ri;++i){if(o=e[i],u=o(t),c=o(r),c>u)return-1*n[i];if(u>c)return n[i]}return 0}},i.cmp=function(e,n){return n>e?-1:e>n?1:e>=n?0:null===e?-1:null===n?1:NaN},i.numcmp=function(e,n){return e-n},i.stablesort=function(e,n,t){var r=e.reduce(function(e,n,r){return e[t(n)]=r,e},{});return e.sort(function(e,i){var a=n(e),o=n(i);return o>a?-1:a>o?1:r[t(e)]-r[t(i)]}),e},i.permute=function(e){for(var n,t,r=e.length;r;)t=Math.floor(Math.random()*r--),n=e[r],e[r]=e[t],e[t]=n},i.pad=function(e,n,r,i){i=i||" ";var a=n-e.length;if(0>=a)return e;switch(r){case"left":return t(a,i)+e;case"middle":case"center":return t(Math.floor(a/2),i)+e+t(Math.ceil(a/2),i);default:return e+t(a,i)}},i.truncate=function(e,n,t,i,a){var o=e.length;if(n>=o)return e;a=void 0!==a?String(a):"…";var u=Math.max(0,n-a.length);switch(t){case"left":return a+(i?r(e,u,1):e.slice(o-u));case"middle":case"center":var c=Math.ceil(u/2),s=Math.floor(u/2);return(i?r(e,c):e.slice(0,c))+a+(i?r(e,s,1):e.slice(o-s));default:return(i?r(e,u):e.slice(0,u))+a}};var c=/([\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF])/}).call(this,e("buffer").Buffer)},{buffer:1}],9:[function(e,n,t){"use strict";var r=e("vega-lite/src/channel"),i=e("vega-lite/src/aggregate"),a=e("vega-lite/src/mark"),o=e("vega-lite/src/scale"),u=e("vega-lite/src/sort"),c=e("vega-lite/src/timeunit"),s=e("vega-lite/src/type"),l=e("./property");t.DEFAULT_QUERY_CONFIG={verbose:!1,defaultSpecConfig:{overlay:{line:!0},scale:{useRawDomain:!0}},propertyPrecedence:l.DEFAULT_PROPERTY_PRECEDENCE,marks:[a.Mark.POINT,a.Mark.BAR,a.Mark.LINE,a.Mark.AREA,a.Mark.TICK],channels:[r.X,r.Y,r.ROW,r.COLUMN,r.SIZE,r.COLOR],aggregates:[void 0,i.AggregateOp.MEAN],timeUnits:[void 0,c.TimeUnit.YEAR,c.TimeUnit.MONTH,c.TimeUnit.DAY,c.TimeUnit.DATE],types:[s.Type.NOMINAL,s.Type.ORDINAL,s.Type.QUANTITATIVE,s.Type.TEMPORAL],maxBinsList:[5,10,20],sorts:[u.SortOrder.ASCENDING,u.SortOrder.DESCENDING],sortOps:[i.AggregateOp.MIN,i.AggregateOp.MEAN],sortOrders:[u.SortOrder.ASCENDING,u.SortOrder.DESCENDING],scaleBandSizes:[17,21],scaleDomains:[void 0],scaleExponents:[1],scaleRanges:[void 0],scaleTypes:[o.ScaleType.LINEAR,o.ScaleType.LOG],numberOrdinalProportion:.05,autoAddCount:!1,hasAppropriateGraphicTypeForMark:!0,omitAggregate:!1,omitAggregatePlotWithDimensionOnlyOnFacet:!0,omitAggregatePlotWithoutDimension:!1,omitBarLineAreaWithOcclusion:!0,omitBarTickWithSize:!0,omitFacetOverPositionalChannels:!0,omitMultipleNonPositionalChannels:!0,omitNonSumStack:!0,omitRaw:!1,omitRawContinuousFieldForAggregatePlot:!0,omitRepeatedField:!0,omitNonPositionalOverPositionalChannels:!0,omitTableWithOcclusionIfAutoAddCount:!0,omitVerticalDotPlot:!1,preferredBinAxis:r.Channel.X,preferredTemporalAxis:r.Channel.X,preferredOrdinalAxis:r.Channel.Y,preferredNominalAxis:r.Channel.Y,preferredFacet:r.Channel.ROW,maxCardinalityForCategoricalColor:20,maxCardinalityForFacet:10,maxCardinalityForShape:6,typeMatchesSchemaType:!0,smallBandSizeForHighCardinalityOrFacet:{maxCardinality:10,bandSize:12},nominalColorScaleForHighCardinality:{maxCardinality:10,palette:"category20"},maxGoodCardinalityForFacet:5,maxGoodCardinalityForColor:7}},{"./property":22,"vega-lite/src/aggregate":47,"vega-lite/src/channel":49,"vega-lite/src/mark":52,"vega-lite/src/scale":53,"vega-lite/src/sort":54,"vega-lite/src/timeunit":56,"vega-lite/src/type":57}],10:[function(e,n,t){"use strict";var r=function(){function e(e){this.constraint=e}return e.prototype.name=function(){return this.constraint.name},e.prototype.description=function(){return this.constraint.description},e.prototype.properties=function(){return this.constraint.properties},e.prototype.strict=function(){return this.constraint.strict},e}();t.AbstractConstraintModel=r},{}],11:[function(e,n,t){"use strict";var r=e("./encoding"),i=e("./spec");t.encoding=r,t.spec=i},{"./encoding":12,"./spec":13}],12:[function(e,n,t){"use strict";function r(e,n,r,i,a,o){for(var u=t.ENCODING_CONSTRAINTS_BY_PROPERTY[e]||[],c=i.getEncodingQueryByIndex(r),s=0;s=r}},{name:"timeUnitAppliedForTemporal",description:"Time unit should be applied to temporal field only.",properties:[s.Property.TYPE,s.Property.TIMEUNIT],allowEnumSpecForProperties:!1,strict:!0,satisfy:function(e,n,t){return!e.timeUnit||e.type===u.Type.TEMPORAL}},{name:"scalePropertiesSupportedByScaleType",description:"Scale properties must be supported by correct scale type", +properties:s.SCALE_PROPERTIES.concat([s.Property.SCALE,s.Property.TYPE]),allowEnumSpecForProperties:!0,strict:!0,satisfy:function(e,n,t){if(e.scale){var r=e.scale;if(void 0===r.type&&l.isEnumSpec(e.type)||l.isEnumSpec(r.type))return!0;var i=E.scaleType(r.type,e.timeUnit,e.type);for(var a in r)if(s.SUPPORTED_SCALE_PROPERTY_INDEX[a]&&!f.contains(s.SUPPORTED_SCALE_PROPERTY_INDEX[a],i))return!1}return!0}},{name:"typeMatchesPrimitiveType",description:"Data type should be supported by field's primitive type.",properties:[s.Property.FIELD,s.Property.TYPE],allowEnumSpecForProperties:!1,strict:!0,satisfy:function(e,n,t){var r=n.primitiveType(e.field),i=e.type;switch(r){case p.PrimitiveType.BOOLEAN:case p.PrimitiveType.STRING:return i!==u.Type.QUANTITATIVE&&i!==u.Type.TEMPORAL;case p.PrimitiveType.NUMBER:case p.PrimitiveType.INTEGER:return i!==u.Type.TEMPORAL;case p.PrimitiveType.DATE:return i===u.Type.TEMPORAL;case null:return!1}throw new Error("Not implemented")}},{name:"typeMatchesSchemaType",description:"Enumerated data type of a field should match the field's type in the schema.",properties:[s.Property.FIELD,s.Property.TYPE],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return n.type(e.field)===e.type}},{name:"maxCardinalityForCategoricalColor",description:"Categorical channel should not have too high cardinality",properties:[s.Property.CHANNEL,s.Property.FIELD],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return e.channel===a.Channel.COLOR&&e.type===u.Type.NOMINAL?n.cardinality(e)<=t.maxCardinalityForCategoricalColor:!0}},{name:"maxCardinalityForFacet",description:"Row/column channel should not have too high cardinality",properties:[s.Property.CHANNEL,s.Property.FIELD,s.Property.BIN,s.Property.TIMEUNIT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return e.channel===a.Channel.ROW||e.channel===a.Channel.COLUMN?n.cardinality(e)<=t.maxCardinalityForFacet:!0}},{name:"maxCardinalityForShape",description:"Shape channel should not have too high cardinality",properties:[s.Property.CHANNEL,s.Property.FIELD,s.Property.BIN,s.Property.TIMEUNIT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return e.channel===a.Channel.SHAPE?n.cardinality(e)<=t.maxCardinalityForShape:!0}},{name:"dataTypeAndFunctionMatchScaleType",description:"Scale type must match data type",properties:[s.Property.TYPE,s.Property.SCALE,s.Property.SCALE_TYPE,s.Property.TIMEUNIT,s.Property.BIN],allowEnumSpecForProperties:!1,strict:!0,satisfy:function(e,n,t){if(e.scale){var r=e.type,i=E.scaleType(e.scale.type,e.timeUnit,r);if(f.contains([u.Type.ORDINAL,u.Type.NOMINAL],r))return f.contains([o.ScaleType.ORDINAL,void 0],i);if(r===u.Type.TEMPORAL)return e.timeUnit?f.contains([o.ScaleType.TIME,o.ScaleType.UTC,o.ScaleType.ORDINAL,void 0],i):f.contains([o.ScaleType.TIME,o.ScaleType.UTC,void 0],i);if(r===u.Type.QUANTITATIVE)return e.bin?f.contains([o.ScaleType.LINEAR,void 0],i):f.contains([o.ScaleType.LOG,o.ScaleType.POW,o.ScaleType.SQRT,o.ScaleType.QUANTILE,o.ScaleType.QUANTIZE,o.ScaleType.LINEAR,void 0],i)}return!0}}].map(function(e){return new d(e)}),t.ENCODING_CONSTRAINT_INDEX=t.ENCODING_CONSTRAINTS.reduce(function(e,n){return e[n.name()]=n,e},{}),t.ENCODING_CONSTRAINTS_BY_PROPERTY=t.ENCODING_CONSTRAINTS.reduce(function(e,n){return n.properties().forEach(function(t){e[t]=e[t]||[],e[t].push(n)}),e},{}),t.checkEncoding=r},{"../enumspec":16,"../property":22,"../query/encoding":23,"../schema":35,"../util":37,"./base":10,"vega-lite/src/channel":49,"vega-lite/src/scale":53,"vega-lite/src/type":57}],13:[function(e,n,t){"use strict";function r(e,n,r,i,a){for(var o=t.SPEC_CONSTRAINTS_BY_PROPERTY[e]||[],u=0;u1))return!1}return!0}},{name:"omitNonPositionalOverPositionalChannels",description:"Do not use non-positional channels unless all positional channels are used",properties:[f.Property.CHANNEL],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return d.some(o.NONSPATIAL_CHANNELS,function(n){return e.channelUsed(n)})?e.channelUsed(o.Channel.X)&&e.channelUsed(o.Channel.Y):!0}},{name:"omitRaw",description:"Omit raw plots.",properties:[f.Property.AGGREGATE,f.Property.AUTOCOUNT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return!!e.isAggregate()}},{name:"omitRawContinuousFieldForAggregatePlot",description:"Aggregate plot should not use raw continuous field as group by values. (Quantitative should be binned. Temporal should have time unit.)",properties:[f.Property.AGGREGATE,f.Property.AUTOCOUNT,f.Property.TIMEUNIT,f.Property.BIN,f.Property.TYPE],allowEnumSpecForProperties:!0,strict:!1,satisfy:function(e,n,t){return e.isAggregate()?d.every(e.getEncodings(),function(e){return e.type===s.Type.TEMPORAL?!!e.timeUnit:e.type===s.Type.QUANTITATIVE?!!e.bin||!!e.aggregate||!!e.autoCount:!0}):!0}},{name:"omitRawDetail",description:"Do not use detail channel with raw plot.",properties:[f.Property.CHANNEL,f.Property.AGGREGATE,f.Property.AUTOCOUNT],allowEnumSpecForProperties:!1,strict:!0,satisfy:function(e,n,t){return e.isAggregate()?!0:d.every(e.getEncodings(),function(e){return e.channel!==o.Channel.DETAIL})}},{name:"omitRepeatedField",description:"Each field should be mapped to only one channel",properties:[f.Property.FIELD],allowEnumSpecForProperties:!0,strict:!1,satisfy:function(e,n,t){var r={};return d.every(e.getEncodings(),function(e){return e.field&&!p.isEnumSpec(e.field)?r[e.field]?!1:(r[e.field]=!0,!0):!0})}},{name:"omitVerticalDotPlot",description:"Do not output vertical dot plot.",properties:[f.Property.CHANNEL],allowEnumSpecForProperties:!0,strict:!1,satisfy:function(e,n,t){var r=e.getEncodings();return 1!==r.length||r[0].channel!==o.Channel.Y}},{name:"hasAppropriateGraphicTypeForMark",description:"Has appropriate graphic type for mark",properties:[f.Property.CHANNEL,f.Property.MARK,f.Property.TYPE,f.Property.TIMEUNIT,f.Property.BIN,f.Property.AGGREGATE,f.Property.AUTOCOUNT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){var r=e.getMark();switch(r){case u.Mark.AREA:case u.Mark.LINE:if(e.isAggregate()){var i=e.getEncodingQueryByChannel(o.Channel.X),a=e.getEncodingQueryByChannel(o.Channel.Y),c=i&&y.isMeasure(i),l=a&&y.isMeasure(a);return i&&a&&c!==l&&!(!c&&i.type===s.Type.NOMINAL)&&!(!l&&a.type===s.Type.NOMINAL)}return!0;case u.Mark.TEXT:return!0;case u.Mark.BAR:case u.Mark.TICK:return e.channelUsed(o.Channel.SIZE)?!1:e.isMeasure(o.Channel.X)!==e.isMeasure(o.Channel.Y);case u.Mark.CIRCLE:case u.Mark.POINT:case u.Mark.SQUARE:case u.Mark.RULE:return!0}throw new Error("hasAllRequiredChannelsForMark not implemented for mark"+r)}},{name:"omitNonSumStack",description:"Stacked plot should use summative aggregation such as sum, count, or distinct",properties:[f.Property.CHANNEL,f.Property.MARK,f.Property.AGGREGATE,f.Property.AUTOCOUNT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){var r=e.stack();if(r){var i=e.getEncodingQueryByChannel(r.fieldChannel);return d.contains(a.SUM_OPS,i.aggregate)||!!i.autoCount}return!0}},{name:"omitTableWithOcclusionIfAutoAddCount",description:"Plots without aggregation or autocount where x and y are both dimensions should be omitted if autoAddCount is enabled as they often lead to occlusion",properties:[f.Property.CHANNEL,f.Property.TYPE,f.Property.TIMEUNIT,f.Property.BIN,f.Property.AGGREGATE,f.Property.AUTOCOUNT],allowEnumSpecForProperties:!1,strict:!1,satisfy:function(e,n,t){return!(t.autoAddCount&&e.isDimension(o.Channel.X)&&e.isDimension(o.Channel.Y))||e.isAggregate()}}].map(function(e){return new g(e)}),t.SPEC_CONSTRAINT_INDEX=t.SPEC_CONSTRAINTS.reduce(function(e,n){return e[n.name()]=n,e},{}),t.SPEC_CONSTRAINTS_BY_PROPERTY=t.SPEC_CONSTRAINTS.reduce(function(e,n){return n.properties().forEach(function(t){e[t]=e[t]||[],e[t].push(n)}),e},{}),t.checkSpec=r},{"../enumspec":16,"../property":22,"../query/encoding":23,"../util":37,"./base":10,"vega-lite/src/aggregate":47,"vega-lite/src/channel":49,"vega-lite/src/mark":52,"vega-lite/src/scale":53,"vega-lite/src/type":57}],14:[function(e,n,t){"use strict";t.version="0.3.3";var r=e("./util");t.constraint=e("./constraint/constraint"),t.enumerate=e("./enumerator"),t.enumSpec=e("./enumspec");var i=e("./generate");t.generate=i.generate,t.model=e("./model"),t.modelGroup=e("./modelgroup"),t.nest=e("./nest"),t.property=e("./property");var a=e("./query/query"),o=e("./query/query");t.query=r.extend(o.query,a),t.ranking=e("./ranking/ranking"),t.schema=e("./schema"),t.util=e("./util")},{"./constraint/constraint":11,"./enumerator":15,"./enumspec":16,"./generate":18,"./model":19,"./modelgroup":20,"./nest":21,"./property":22,"./query/query":25,"./ranking/ranking":34,"./schema":35,"./util":37}],15:[function(e,n,t){"use strict";function r(e){return function(n,t,r){return function(o,u){function c(l){if(l===s.length)return void o.push(u.duplicate());var p=s[l],f=n.encodings[p][e],E=u.getEncodingQueryByIndex(p),d=u.getEncodingProperty(p,e);E.autoCount!==!1&&d?(f.values.forEach(function(n){null===n&&(n=void 0),u.setEncodingProperty(p,e,n,f);var o=i.checkEncoding(e,f,p,u,t,r);if(!o){var s=a.checkSpec(e,f,u,t,r);s||c(l+1)}}),u.resetEncodingProperty(p,e,f)):c(l+1)}var s=n.encodingIndicesByProperty[e];return c(0),o}}}var i=e("./constraint/encoding"),a=e("./constraint/spec"),o=e("./property");t.ENUMERATOR_INDEX={},t.ENUMERATOR_INDEX[o.Property.MARK]=function(e,n,t){return function(r,i){var u=i.getMark();return u.values.forEach(function(u){i.setMark(u);var c=a.checkSpec(o.Property.MARK,e.mark,i,n,t);c||r.push(i.duplicate())}),i.resetMark(),r}},o.ENCODING_PROPERTIES.forEach(function(e){t.ENUMERATOR_INDEX[e]=r(e)}),o.NESTED_ENCODING_PROPERTIES.forEach(function(e){t.ENUMERATOR_INDEX[e.property]=r(e.property)}),t.EncodingPropertyGeneratorFactory=r},{"./constraint/encoding":12,"./constraint/spec":13,"./property":22}],16:[function(e,n,t){"use strict";function r(e){return e===t.SHORT_ENUM_SPEC||void 0!==e&&(!!e.values||!!e.name)&&!a.isArray(e)}function i(e,n,r){return a.extend({},{name:n,values:r},e===t.SHORT_ENUM_SPEC?{}:e)}var a=e("./util");!function(e){e[e.ENUMSPEC="?"]="ENUMSPEC"}(t.ShortEnumSpec||(t.ShortEnumSpec={}));var o=t.ShortEnumSpec;t.SHORT_ENUM_SPEC=o.ENUMSPEC,t.isEnumSpec=r,t.initEnumSpec=i},{"./util":37}],17:[function(e,n,t){"use strict";var r=e("./property"),i=e("./util"),a=function(){function e(){this._mark=void 0,this._encodings={},this._encodingIndicesByProperty={}}return e.prototype.setEncodingProperty=function(e,n,t){var r=this._encodings,i=r[e]=r[e]||{};i[n]=t;var a=this._encodingIndicesByProperty;return(a[n]=a[n]||[]).push(e),this},e.prototype.hasProperty=function(e){if(r.isEncodingProperty(e))return!!this.encodingIndicesByProperty[e];if(e===r.Property.MARK)return!!this.mark;throw new Error("Unimplemented for property "+e)},e.prototype.isEmpty=function(){return!this.mark&&0===i.keys(this.encodingIndicesByProperty).length},e.prototype.setMark=function(e){return this._mark=e,this},Object.defineProperty(e.prototype,"mark",{get:function(){return this._mark},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"encodings",{get:function(){return this._encodings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"encodingIndicesByProperty",{get:function(){return this._encodingIndicesByProperty},enumerable:!0,configurable:!0}),e}();t.EnumSpecIndex=a},{"./property":22,"./util":37}],18:[function(e,n,t){"use strict";function r(e,n,t){void 0===t&&(t=a.DEFAULT_QUERY_CONFIG);var r=o.SpecQueryModel.build(e,n,t),c=r.enumSpecIndex,s=[r];return t.propertyPrecedence.forEach(function(e){if(c.hasProperty(e)){var r=i.ENUMERATOR_INDEX[e](c,n,t);s=s.reduce(r,[])}}),null!==t.nominalColorScaleForHighCardinality||null!==t.smallBandSizeForHighCardinalityOrFacet?u.stylize(s,n,t):s}var i=e("../src/enumerator"),a=e("./config"),o=e("./model"),u=e("./stylize");t.generate=r},{"../src/enumerator":15,"./config":9,"./model":19,"./stylize":36}],19:[function(e,n,t){"use strict";function r(e){switch(e){case u.Property.MARK:return"m";case u.Property.CHANNEL:return"c";case u.Property.AGGREGATE:return"a";case u.Property.AUTOCOUNT:return"#";case u.Property.BIN:return"b";case u.Property.BIN_MAXBINS:return"b-mb";case u.Property.SORT:return"so";case u.Property.SORT_FIELD:return"so-f";case u.Property.SORT_OP:return"so-op";case u.Property.SORT_ORDER:return"so-or";case u.Property.SCALE:return"s";case u.Property.SCALE_BANDSIZE:return"s-bs";case u.Property.SCALE_CLAMP:return"s-c";case u.Property.SCALE_DOMAIN:return"s-d";case u.Property.SCALE_EXPONENT:return"s-e";case u.Property.SCALE_NICE:return"s-n";case u.Property.SCALE_RANGE:return"s-ra";case u.Property.SCALE_ROUND:return"s-r";case u.Property.SCALE_TYPE:return"s-t";case u.Property.SCALE_USERAWDOMAIN:return"s-u";case u.Property.SCALE_ZERO:return"s-z";case u.Property.TIMEUNIT:return"tu";case u.Property.FIELD:return"f";case u.Property.TYPE:return"t"}throw new Error("Default name undefined")}function i(e,n,t){switch(e){case u.Property.FIELD:case u.Property.SORT_FIELD:return n.fields();case u.Property.BIN:case u.Property.SCALE:case u.Property.SCALE_CLAMP:case u.Property.SCALE_NICE:case u.Property.SCALE_ROUND:case u.Property.SCALE_USERAWDOMAIN:case u.Property.SCALE_ZERO:case u.Property.AUTOCOUNT:return[!1,!0];case u.Property.AGGREGATE:return t.aggregates;case u.Property.BIN_MAXBINS:return t.maxBinsList;case u.Property.CHANNEL:return t.channels;case u.Property.MARK:return t.marks;case u.Property.SORT:return t.sorts;case u.Property.SORT_OP:return t.sortOps;case u.Property.SORT_ORDER:return t.sortOrders;case u.Property.SCALE_BANDSIZE:return t.scaleBandSizes;case u.Property.SCALE_DOMAIN:return t.scaleDomains;case u.Property.SCALE_EXPONENT:return t.scaleExponents;case u.Property.SCALE_RANGE:return t.scaleRanges;case u.Property.SCALE_TYPE:return t.scaleTypes;case u.Property.TIMEUNIT:return t.timeUnits;case u.Property.TYPE:return t.types}throw new Error("No default enumValues for "+e)}var a=e("vega-lite/src/aggregate"),o=e("vega-lite/src/type"),u=e("./property"),c=e("./enumspec"),s=e("./enumspecindex"),l=e("./query/spec"),p=e("./query/encoding"),f=e("./query/shorthand"),E=e("./util");t.getDefaultName=r,t.getDefaultEnumValues=i;var d=function(){function e(e,n,t,r,i){this._rankingScore={},this._spec=e,this._channelCount=e.encodings.reduce(function(e,n){return c.isEnumSpec(n.channel)||n.autoCount===!1||(e[n.channel]=1),e},{}),this._enumSpecIndex=n,this._enumSpecAssignment=i,this._opt=r,this._schema=t}return e.build=function(n,t,a){var l=new s.EnumSpecIndex;if(c.isEnumSpec(n.mark)){var p=r(u.Property.MARK);n.mark=c.initEnumSpec(n.mark,p,a.marks),l.setMark(n.mark)}if(n.encodings.forEach(function(e,n){void 0!==e.autoCount&&(console.warn("A field with autoCount should not be included as autoCount meant to be an internal object."),e.type=o.Type.QUANTITATIVE),void 0===e.type&&(e.type=c.SHORT_ENUM_SPEC),u.ENCODING_PROPERTIES.forEach(function(o){if(c.isEnumSpec(e[o])){var u=r(o)+n,s=i(o,t,a),p=e[o]=c.initEnumSpec(e[o],u,s);l.setEncodingProperty(n,o,p)}}),u.NESTED_ENCODING_PROPERTIES.forEach(function(o){var u=e[o.parent];if(u){var s=o.property,p=o.child;if(c.isEnumSpec(u[p])){var f=r(s)+n,E=i(s,t,a),d=u[p]=c.initEnumSpec(u[p],f,E);l.setEncodingProperty(n,s,d)}}})}),a.autoAddCount){var f={channel:{name:r(u.Property.CHANNEL)+n.encodings.length,values:i(u.Property.CHANNEL,t,a)},autoCount:{name:r(u.Property.AUTOCOUNT)+n.encodings.length,values:[!1,!0]},type:o.Type.QUANTITATIVE};n.encodings.push(f);var E=n.encodings.length-1;l.setEncodingProperty(E,u.Property.CHANNEL,f.channel),l.setEncodingProperty(E,u.Property.AUTOCOUNT,f.autoCount)}return new e(n,l,t,a,{})},Object.defineProperty(e.prototype,"enumSpecIndex",{get:function(){return this._enumSpecIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"schema",{get:function(){return this._schema},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"specQuery",{get:function(){return this._spec},enumerable:!0,configurable:!0}),e.prototype.duplicate=function(){return new e(E.duplicate(this._spec),this._enumSpecIndex,this._schema,this._opt,E.duplicate(this._enumSpecAssignment))},e.prototype.setMark=function(e){var n=this._spec.mark.name;this._enumSpecAssignment[n]=this._spec.mark=e},e.prototype.resetMark=function(){var e=this._spec.mark=this._enumSpecIndex.mark;delete this._enumSpecAssignment[e.name]},e.prototype.getMark=function(){return this._spec.mark},e.prototype.getEncodingProperty=function(e,n){var t=this._spec.encodings[e],r=u.getNestedEncodingProperty(n);return r?t[r.parent][r.child]:t[n]},e.prototype.setEncodingProperty=function(e,n,t,r){var i=this._spec.encodings[e],a=u.getNestedEncodingProperty(n);n===u.Property.CHANNEL&&i.channel&&!c.isEnumSpec(i.channel)&&this._channelCount[i.channel]--,a?i[a.parent][a.child]=t:u.hasNestedProperty(n)&&t===!0?i[n]=E.extend({},i[n],{values:void 0,name:void 0}):i[n]=t,this._enumSpecAssignment[r.name]=t,n===u.Property.CHANNEL&&(this._channelCount[t]=(this._channelCount[t]||0)+1)},e.prototype.resetEncodingProperty=function(e,n,t){var r=this._spec.encodings[e],i=u.getNestedEncodingProperty(n);n===u.Property.CHANNEL&&this._channelCount[r.channel]--,i?r[i.parent][i.child]=t:r[n]=t,delete this._enumSpecAssignment[t.name]},e.prototype.channelUsed=function(e){return this._channelCount[e]>0},e.prototype.stack=function(){return l.stack(this._spec)},e.prototype.getEncodings=function(){return this._spec.encodings.filter(function(e){return e.autoCount!==!1})},e.prototype.getEncodingQueryByChannel=function(e){for(var n=0;n0?l.duplicate(i[e-1]):{}),a.push(e>0?l.duplicate(a[e-1]):{});var t=n.nest[e].groupBy;if(c.isArray(t)){t.forEach(function(n){p.isExtendedGroupBy(n)?(i[e][n.property]=!0,a[e][n.property]=n.replace):i[e][n]=!0});var r=l.keys(a[e]).reduce(function(n,t){return n[t]=f.getReplacer(a[e][t]),n},{});o.push(r)}},s=0;s"+e}).join(";")+"]"}return e.property}return e}).join(","):e}var a=e("datalib/src/util"),o=e("../util");t.REPLACE_BLANK_FIELDS={"*":""},t.REPLACE_XY_CHANNELS={x:"xy",y:"xy"},t.REPLACE_FACET_CHANNELS={row:"facet",column:"facet"},t.REPLACE_MARK_STYLE_CHANNELS={color:"style",opacity:"style",shape:"style",size:"style"},t.isExtendedGroupBy=r,t.toString=i},{"../util":37,"datalib/src/util":8}],25:[function(e,n,t){"use strict";function r(e,n,t){e=s.extend({},i(e),{config:s.extend({},a.DEFAULT_QUERY_CONFIG,t,e.config)});var r=o.generate(e.spec,n,e.config),l=u.nest(r,e),p=c.rank(l,e,n,0);return{query:e,result:p}}function i(e){if(e.groupBy){var n={groupBy:e.groupBy};e.orderBy&&(n.orderGroupBy=e.orderBy);var t={spec:s.duplicate(e.spec),nest:[n]};return e.chooseBy&&(t.chooseBy=e.chooseBy),e.config&&(t.config=e.config),t}return s.duplicate(e)}var a=e("../config"),o=e("../generate"),u=e("../nest"),c=e("../ranking/ranking"),s=e("../util");t.encoding=e("./encoding"),t.groupBy=e("./groupby"),t.shorthand=e("./shorthand"),t.spec=e("./spec"),t.transform=e("./transform"),t.query=r,t.normalize=i},{"../config":9,"../generate":18,"../nest":21,"../ranking/ranking":34,"../util":37,"./encoding":23,"./groupby":24,"./shorthand":26,"./spec":27,"./transform":28}],26:[function(e,n,t){"use strict";function r(e){return function(n){return void 0!==e[n]?e[n]:n}}function i(e,n){return p.isEnumSpec(e)?p.SHORT_ENUM_SPEC:n?n(e):e}function a(e,n,r){void 0===n&&(n=t.INCLUDE_ALL),void 0===r&&(r={});var a=[];if(n[f.Property.MARK]&&a.push(i(e.mark,r[f.Property.MARK])),n[f.Property.STACK]){var c=l.stack(e);if(c){var s=E.extend({},n,{type:!1}),p=u(c.fieldEncQ,s,r),d=u(c.groupByEncQ,s,r);a.push("stack={field:"+p+","+(d?"by:"+d+",":"")+("offset:"+c.offset+"}"))}}return a.push(e.encodings.reduce(function(e,t){if(t.autoCount!==!1){var i=o(t,n,r);i&&e.push(i)}return e},[]).sort().join("|")),a.join("|")}function o(e,n,r){void 0===n&&(n=t.INCLUDE_ALL),void 0===r&&(r={});var a=[];n[f.Property.CHANNEL]&&a.push(i(e.channel,r[f.Property.CHANNEL]));var o=u(e,n,r);return o&&a.push(o),a.join(":")}function u(e,n,r){void 0===n&&(n=t.INCLUDE_ALL),void 0===r&&(r={});var a=null,o=[];if(n[f.Property.AGGREGATE]&&e.autoCount===!1)return"-";if(n[f.Property.AGGREGATE]&&e.aggregate&&!p.isEnumSpec(e.aggregate))a=i(e.aggregate,r[f.Property.AGGREGATE]);else if(n[f.Property.AGGREGATE]&&e.autoCount&&!p.isEnumSpec(e.autoCount))a=i("count",r[f.Property.AGGREGATE]);else if(n[f.Property.TIMEUNIT]&&e.timeUnit&&!p.isEnumSpec(e.timeUnit))a=i(e.timeUnit,r[f.Property.TIMEUNIT]);else if(n[f.Property.BIN]&&e.bin&&!p.isEnumSpec(e.bin))a="bin",n[f.Property.BIN_MAXBINS]&&e.bin.maxbins&&o.push({key:"maxbins",value:i(e.bin.maxbins,r[f.Property.BIN_MAXBINS])});else for(var u=0,l=[f.Property.AGGREGATE,f.Property.AUTOCOUNT,f.Property.TIMEUNIT,f.Property.BIN];u0&&o.push({key:t+"",value:JSON.stringify(u)})}else e[t]!==!1&&null!==e[t]||o.push({key:t+"",value:!1})},g=0,h=[f.Property.SCALE,f.Property.SORT];gn.score?o:n},null);s.push(r)}),s}e.TYPE_CHANNEL="typeChannel",e.init=n,e.featurize=t,e.getScore=r}(r=t.TypeChannelScore||(t.TypeChannelScore={}));var l;!function(e){function n(e){void 0===e&&(e={}),e=u.extend({},a.DEFAULT_QUERY_CONFIG,e);var n={},t=[{feature:s.BIN_Q,opt:"preferredBinAxis"},{feature:s.T,opt:"preferredTemporalAxis"},{feature:s.TIMEUNIT_T,opt:"preferredTemporalAxis"},{feature:s.O,opt:"preferredOrdinalAxis"},{feature:s.N,opt:"preferredNominalAxis"}];return t.forEach(function(t){e[t.opt]===i.Channel.X?n[t.feature+"_"+i.Channel.Y]=-.01:e[t.opt]===i.Channel.Y&&(n[t.feature+"_"+i.Channel.X]=-.01)}),n}function t(e,n){return e+"_"+n}function r(n,r,i){return n.getEncodings().reduce(function(n,r){var i=c.getExtendedType(r),a=t(i,r.channel),o=c.getFeatureScore(e.PREFERRED_AXIS,a);return o&&n.push(o),n},[])}e.PREFERRED_AXIS="preferredAxis",e.init=n,e.featurize=t,e.getScore=r}(l=t.PreferredAxisScore||(t.PreferredAxisScore={}));var p;!function(e){function n(e){e=u.extend({},a.DEFAULT_QUERY_CONFIG,e);var n={};return e.preferredFacet===i.Channel.ROW?n[i.Channel.COLUMN]=-.01:e.preferredFacet===i.Channel.COLUMN&&(n[i.Channel.ROW]=-.01),n}function t(n,t,r){return n.getEncodings().reduce(function(n,t){var r=c.getFeatureScore(e.PREFERRED_FACET,t.channel);return r&&n.push(r),n},[])}e.PREFERRED_FACET="preferredFacet",e.init=n,e.getScore=t}(p=t.PreferredFacetScore||(t.PreferredFacetScore={}));var f;!function(e){function n(){return{bar_size:-2,tick_size:-2}}function t(n,t,r){var i=n.getMark();return n.getEncodings().reduce(function(n,t){var r=i+"_"+t.channel,a=c.getFeatureScore(e.MARK_CHANNEL,r);return a&&n.push(a),n},[])}e.MARK_CHANNEL="markChannel",e.init=n,e.getScore=t}(f=t.MarkChannelScore||(t.MarkChannelScore={}));var E;!function(e){function n(){return{row:-2,column:-2,color:0,opacity:0,size:0,shape:0}}function t(n,t,r){return n.isAggregate()&&n.getEncodings().reduce(function(n,t){if(!t.aggregate&&!t.autoCount){var r=c.getFeatureScore(e.DIMENSION,t.channel+"");if(r.score>n.score)return r}return n},{type:e.DIMENSION,feature:"No Dimension",score:-5}),[]}e.DIMENSION="dimension",e.init=n,e.getScore=t}(E=t.DimensionScore||(t.DimensionScore={}))},{"../../config":9,"../../query/shorthand":26,"../../util":37,"./effectiveness":31,"./type":33,"vega-lite/src/channel":49}],31:[function(e,n,t){"use strict";function r(e,n){var r=t.FEATURE_INDEX[e][n];return void 0!==r?{score:r,type:e,feature:n}:null}function i(e){s.push(e),t.FEATURE_INDEX[e.type]=e.init()}function a(e){return(e.bin?"bin_":e.timeUnit?"timeUnit_":"")+e.type}function o(e,n,t){var r=s.reduce(function(r,i){var a=i.getScore(e,n,t);return r.concat(a)},[]);return{score:r.reduce(function(e,n){return e+n.score},0),features:r}}var u=e("./channel"),c=e("./mark");t.FEATURE_INDEX={};var s=[];t.getFeatureScore=r,t.addFeatureFactory=i,i({type:u.TypeChannelScore.TYPE_CHANNEL,init:u.TypeChannelScore.init,getScore:u.TypeChannelScore.getScore}),i({type:u.PreferredAxisScore.PREFERRED_AXIS,init:u.PreferredAxisScore.init,getScore:u.PreferredAxisScore.getScore}),i({type:u.PreferredFacetScore.PREFERRED_FACET,init:u.PreferredFacetScore.init,getScore:u.PreferredFacetScore.getScore}),i({type:u.MarkChannelScore.MARK_CHANNEL,init:u.MarkChannelScore.init,getScore:u.MarkChannelScore.getScore}),i({type:c.MarkScore.MARK_SCORE,init:c.MarkScore.init,getScore:c.MarkScore.getScore}),t.getExtendedType=a,Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o},{"./channel":30,"./mark":32}],32:[function(e,n,t){"use strict";var r,i=e("vega-lite/src/channel"),a=e("vega-lite/src/mark"),o=e("../../util"),u=e("./effectiveness"),c=e("./type");!function(e){function n(e,n,t,r){return e+"_"+n+"_"+t+"_"+r}function t(){var e=[c.Q,c.T],t=[c.BIN_Q,c.TIMEUNIT_T,c.O,c.N],r=t.concat([c.NONE]),i={};return e.forEach(function(t){e.forEach(function(e){var r={point:0,text:-.2,tick:-.5,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(r,function(r,a){var o=n(t,e,!0,a);i[o]=r});var a={point:0,text:-.2,tick:-.5,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(a,function(r,a){var o=n(t,e,!1,a);i[o]=r})})}),e.forEach(function(e){r.forEach(function(t){var r={tick:0,point:-.2,text:-.5,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(r,function(r,a){var o=n(e,t,!0,a);i[o]=r;var u=n(t,e,!0,a);i[u]=r})}),[c.NONE,c.N].forEach(function(t){var r={bar:0,point:-.2,tick:-.25,text:-.3,line:-2,area:-2,rule:-2.5};o.forEach(r,function(r,a){var o=n(e,t,!1,a);i[o]=r;var u=n(t,e,!1,a);i[u]=r})}),[c.BIN_Q].forEach(function(t){var r={bar:0,point:-.2,tick:-.25,text:-.3,line:-.5,area:-.5,rule:-2.5};o.forEach(r,function(r,a){var o=n(e,t,!1,a);i[o]=r;var u=n(t,e,!1,a);i[u]=r})}),[c.TIMEUNIT_T,c.O].forEach(function(t){var r={line:0,area:-.1,bar:-.2,point:-.3,tick:-.35,text:-.4,rule:-2.5};o.forEach(r,function(r,a){var o=n(e,t,!1,a);i[o]=r;var u=n(t,e,!1,a);i[u]=r})})}),r.forEach(function(e){r.forEach(function(t){var r={point:0,rect:0,text:-.1,tick:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(r,function(r,a){var o=n(e,t,!0,a);i[o]=r}),o.forEach(r,function(r,a){var o=n(e,t,!1,a);i[o]=r})})}),i}function r(n,t,r){var o=n.getMark();o!==a.Mark.CIRCLE&&o!==a.Mark.SQUARE||(o=a.Mark.POINT);var c=n.getEncodingQueryByChannel(i.Channel.X),s=c?u.getExtendedType(c):"-",l=n.getEncodingQueryByChannel(i.Channel.Y),p=l?u.getExtendedType(l):"-",f=!n.isAggregate(),E=s+"_"+p+"_"+f+"_"+o,d=u.getFeatureScore(e.MARK_SCORE,E);return[d]}e.MARK_SCORE="markScore",e.featurize=n,e.init=t,e.getScore=r}(r=t.MarkScore||(t.MarkScore={}))},{"../../util":37,"./effectiveness":31,"./type":33,"vega-lite/src/channel":49,"vega-lite/src/mark":52}],33:[function(e,n,t){"use strict";var r=e("vega-lite/src/type");!function(e){e[e.Q=r.Type.QUANTITATIVE]="Q",e[e.BIN_Q="bin_"+r.Type.QUANTITATIVE]="BIN_Q",e[e.T=r.Type.TEMPORAL]="T",e[e.TIMEUNIT_T="timeUnit_"+r.Type.TEMPORAL]="TIMEUNIT_T",e[e.O=r.Type.ORDINAL]="O",e[e.N=r.Type.NOMINAL]="N",e[e.NONE="-"]="NONE"}(t.ExtendedType||(t.ExtendedType={}));var i=t.ExtendedType;t.Q=i.Q,t.BIN_Q=i.BIN_Q,t.T=i.T,t.TIMEUNIT_T=i.TIMEUNIT_T,t.O=i.O,t.N=i.N,t.NONE=i.NONE},{"vega-lite/src/type":57}],34:[function(e,n,t){"use strict";function r(e,n){l[e]=n}function i(e){return l[e]}function a(e,n,t,r){return n.nest&&r!==n.nest.length?(e.items.forEach(function(e){a(e,n,t,r+1)}),n.nest[r].orderGroupBy&&e.items.sort(c(n.nest[r].orderGroupBy,t,n.config))):(n.orderBy||n.chooseBy)&&(e.items.sort(u(n.orderBy||n.chooseBy,t,n.config)),n.chooseBy&&(e.items.length>0?e.items=[e.items[0]]:e.items=[])),e}function o(e,n,t,r){if(void 0!==e.getRankingScore(n))return e.getRankingScore(n);var a=i(n),o=a(e,t,r);return e.setRankingScore(n,o),o}function u(e,n,t){return function(r,i){return o(i,e,n,t).score-o(r,e,n,t).score}}function c(e,n,t){return function(r,i){var a=s.getTopItem(r),u=s.getTopItem(i);return o(u,e,n,t).score-o(a,e,n,t).score}}var s=e("../modelgroup");t.effectiveness=e("./effectiveness/effectiveness"),t.aggregation=e("./aggregation");var l={};t.register=r,t.get=i,t.rank=a,t.comparator=u,t.groupComparator=c,t.EFFECTIVENESS="effectiveness",r(t.EFFECTIVENESS,t.effectiveness["default"]),r(t.aggregation.name,t.aggregation.score)},{"../modelgroup":20,"./aggregation":29,"./effectiveness/effectiveness":31}],35:[function(e,n,t){"use strict";function r(e,n){var t=p({min:n.min,max:n.max,maxbins:e}),r=E.extend({},n);return r.unique=a(t,n.unique),r.distinct=(t.stop-t.start)/t.step,r.min=t.start,r.max=t.stop,r}function i(e,n){var t=E.extend({},n),r={};return E.keys(n.unique).forEach(function(t){var i=new Date(t),a=(e===c.TimeUnit.DAY?i.getDay():c.convert(e,new Date(t))).toString();r[a]=r[a]?r[a]+n.unique[t]:n.unique[t]}),t.unique=r,t.distinct=E.keys(r).length,t}function a(e,n){var t={};for(var r in n){var i=e.value(Number(r));t[i]?t[i]+=n[r]:t[i]=n[r]}return t}var o=e("vega-lite/src/type"),u=e("vega-lite/src/bin"),c=e("vega-lite/src/timeunit"),s=e("datalib/src/stats"),l=e("datalib/src/import/type"),p=e("datalib/src/bins/bins"),f=e("./config"),E=e("./util"),d=function(){function e(e){this.fieldSchemas=e,this.fieldSchemaIndex=e.reduce(function(e,n){return e[n.field]=n,e},{})}return e.build=function(n,t){void 0===t&&(t={}),t=E.extend({},f.DEFAULT_QUERY_CONFIG,t);var a=s.summary(n),u=l.inferAll(n),c=a.map(function(e){var r,i=e.field,a=u[i],c=e.distinct;if(a===y.NUMBER)r=o.Type.QUANTITATIVE;else if(a===y.INTEGER)r=c/e.counte.max.getTime()&&(e.max=new Date(l))}}else r=o.Type.NOMINAL;return{field:i,type:r,primitiveType:a,stats:e,timeStats:{},binStats:{}}}),p={nominal:0,ordinal:1,temporal:2,quantitative:3};c.sort(function(e,n){return p[e.type]p[n.type]?1:e.field.localeCompare(n.field)});for(var d=0,g=c;ds.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality)&&(void 0===t.scale&&(t.scale={}),t.scale&&p.contains([u.ScaleType.ORDINAL,void 0],l.scaleType(t.scale.type,t.timeUnit,t.type))&&(t.scale.bandSize||(t.scale.bandSize=12)));var r=f[o.Channel.X];return void 0!==r&&(f[o.Channel.COLUMN]||n.cardinality(r)>s.DEFAULT_QUERY_CONFIG.smallBandSizeForHighCardinalityOrFacet.maxCardinality)&&(void 0===r.scale&&(r.scale={}),r.scale&&p.contains([u.ScaleType.ORDINAL,void 0],l.scaleType(r.scale.type,r.timeUnit,r.type))&&(r.scale.bandSize||(r.scale.bandSize=12))),e}function a(e,n){f[o.Channel.COLOR]=e.getEncodingQueryByChannel(o.Channel.COLOR);var t=f[o.Channel.COLOR];return void 0!==t&&t.type===c.Type.NOMINAL&&n.cardinality(t)>s.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.maxCardinality&&(void 0===t.scale&&(t.scale={}),t.scale&&(t.scale.range||(t.scale.range=s.DEFAULT_QUERY_CONFIG.nominalColorScaleForHighCardinality.palette))),e}var o=e("vega-lite/src/channel"),u=e("vega-lite/src/scale"),c=e("vega-lite/src/type"),s=e("./config"),l=e("./query/encoding"),p=e("./util");t.stylize=r;var f={};t.smallBandSizeForHighCardinalityOrFacet=i,t.nominalColorScaleForHighCardinality=a},{"./config":9,"./query/encoding":23,"./util":37,"vega-lite/src/channel":49,"vega-lite/src/scale":53,"vega-lite/src/type":57}],37:[function(e,n,t){"use strict";function r(e,n){return-1!==e.indexOf(n)}function i(e,n){var t,r=0;for(t in e)if(!n(e[t],t,r++))return!1;return!0}function a(e,n,t){if(e.forEach)e.forEach.call(t,n);else for(var r in e)n.call(t,e[r],r,e)}function o(e,n){var t,r=0;for(t in e)if(n(e[t],t,r++))return!0;return!1}function u(e,n){return e.map(function(e){return s.isArray(e)?u(e,n):n(e)})}function c(e,n){return e.filter(function(e){return!r(n,e)})}var s=e("datalib/src/util"),l=e("datalib/src/util");t.keys=l.keys,t.duplicate=l.duplicate,t.extend=l.extend,t.isObject=l.isObject,t.isArray=l.isArray,t.contains=r,t.every=i,t.forEach=a,t.some=o,t.nestedMap=u,t.without=c},{"datalib/src/util":8}],38:[function(e,n,t){arguments[4][2][0].apply(t,arguments)},{dup:2}],39:[function(e,n,t){arguments[4][3][0].apply(t,arguments)},{"../time":41,"../util":42,dup:3}],40:[function(e,n,t){arguments[4][4][0].apply(t,arguments)},{"./util":42,dup:4}],41:[function(e,n,t){arguments[4][7][0].apply(t,arguments)},{"d3-time":38,dup:7}],42:[function(e,n,t){(function(e){function t(e,n){var t,r="";for(t=0;e>t;++t)r+=n;return r}function r(e,n,t){var r=0,i=e.split(c);return e=t?(i=i.reverse()).filter(function(e){return r+=e.length,n>=r}).reverse():i.filter(function(e){return r+=e.length,n>=r}),e.length?e.join("").trim():i[0].slice(0,n)}var i=n.exports,a="__name__";i.namedfunc=function(e,n){return n[a]=e,n},i.name=function(e){return null==e?null:e[a]},i.identity=function(e){return e},i["true"]=i.namedfunc("true",function(){return!0}),i["false"]=i.namedfunc("false",function(){return!1}),i.duplicate=function(e){return JSON.parse(JSON.stringify(e))},i.equal=function(e,n){return JSON.stringify(e)===JSON.stringify(n)},i.extend=function(e){for(var n,t,r=1,i=arguments.length;i>r;++r){n=arguments[r];for(t in n)e[t]=n[t]}return e},i.length=function(e){return null!=e&&null!=e.length?e.length:null},i.keys=function(e){var n,t=[];for(n in e)t.push(n);return t},i.vals=function(e){var n,t=[];for(n in e)t.push(e[n]);return t},i.toMap=function(e,n){return(n=i.$(n))?e.reduce(function(e,t){return e[n(t)]=1,e},{}):e.reduce(function(e,n){return e[n]=1,e},{})},i.keystr=function(e){var n=e.length;if(!n)return"";for(var t=String(e[0]),r=1;n>r;++r)t+="|"+String(e[r]);return t};var o=Object.prototype.toString;i.isObject=function(e){return e===Object(e)},i.isFunction=function(e){return"[object Function]"===o.call(e)},i.isString=function(e){return"string"==typeof value||"[object String]"===o.call(e)},i.isArray=Array.isArray||function(e){return"[object Array]"===o.call(e)},i.isNumber=function(e){return"number"==typeof e||"[object Number]"===o.call(e)},i.isBoolean=function(e){return e===!0||e===!1||"[object Boolean]"==o.call(e)},i.isDate=function(e){return"[object Date]"===o.call(e)},i.isValid=function(e){return null!=e&&e===e},i.isBuffer="function"==typeof e&&e.isBuffer||i["false"],i.number=function(e){return null==e||""===e?null:+e},i["boolean"]=function(e){return null==e||""===e?null:"false"===e?!1:!!e},i.date=function(e,n){var t=n?n:Date;return null==e||""===e?null:t.parse(e)},i.array=function(e){return null!=e?i.isArray(e)?e:[e]:[]},i.str=function(e){return i.isArray(e)?"["+e.map(i.str)+"]":i.isObject(e)||i.isString(e)?JSON.stringify(e).replace("\u2028","\\u2028").replace("\u2029","\\u2029"):e};var u=/\[(.*?)\]|[^.\[]+/g;i.field=function(e){return String(e).match(u).map(function(e){return"["!==e[0]?e:"'"!==e[1]&&'"'!==e[1]?e.slice(1,-1):e.slice(2,-2).replace(/\\(["'])/g,"$1")})},i.accessor=function(e){return null==e||i.isFunction(e)?e:i.namedfunc(e,Function("x","return x["+i.field(e).map(i.str).join("][")+"];"))},i.$=i.accessor,i.mutator=function(e){var n;return i.isString(e)&&(n=i.field(e)).length>1?function(e,t){for(var r=0;ra;++a)if(u=e[a],c=i.cmp(u(t),u(r)))return c*n[a];return 0}},i.cmp=function(e,n){return(n>e||null==e)&&null!=n?-1:(e>n||null==n)&&null!=e?1:(n=n instanceof Date?+n:n,(e=e instanceof Date?+e:e)!==e&&n===n?-1:n!==n&&e===e?1:0)},i.numcmp=function(e,n){return e-n},i.stablesort=function(e,n,t){var r=e.reduce(function(e,n,r){return e[t(n)]=r,e},{});return e.sort(function(e,i){var a=n(e),o=n(i);return o>a?-1:a>o?1:r[t(e)]-r[t(i)]}),e},i.permute=function(e){for(var n,t,r=e.length;r;)t=Math.floor(Math.random()*r--),n=e[r],e[r]=e[t],e[t]=n},i.pad=function(e,n,r,i){i=i||" ";var a=n-e.length;if(0>=a)return e;switch(r){case"left":return t(a,i)+e;case"middle":case"center":return t(Math.floor(a/2),i)+e+t(Math.ceil(a/2),i);default:return e+t(a,i)}},i.truncate=function(e,n,t,i,a){var o=e.length;if(n>=o)return e;a=void 0!==a?String(a):"…";var u=Math.max(0,n-a.length);switch(t){case"left":return a+(i?r(e,u,1):e.slice(o-u));case"middle":case"center":var c=Math.ceil(u/2),s=Math.floor(u/2);return(i?r(e,c):e.slice(0,c))+a+(i?r(e,s,1):e.slice(o-s));default:return(i?r(e,u):e.slice(0,u))+a}};var c=/([\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF])/}).call(this,e("buffer").Buffer)},{buffer:1}],43:[function(e,n,t){var r="undefined"!=typeof JSON?JSON:e("jsonify");n.exports=function(e,n){n||(n={}),"function"==typeof n&&(n={cmp:n});var t=n.space||"";"number"==typeof t&&(t=Array(t+1).join(" "));var o="boolean"==typeof n.cycles?n.cycles:!1,u=n.replacer||function(e,n){return n},c=n.cmp&&function(e){return function(n){return function(t,r){var i={key:t,value:n[t]},a={key:r,value:n[r]};return e(i,a)}}}(n.cmp),s=[];return function l(e,n,p,f){var E=t?"\n"+new Array(f+1).join(t):"",d=t?": ":":";if(p&&p.toJSON&&"function"==typeof p.toJSON&&(p=p.toJSON()),p=u.call(e,n,p),void 0!==p){if("object"!=typeof p||null===p)return r.stringify(p);if(i(p)){for(var y=[],g=0;g="0"&&"9">=i;)n+=i,s();if("."===i)for(n+=".";s()&&i>="0"&&"9">=i;)n+=i;if("e"===i||"E"===i)for(n+=i,s(),"-"!==i&&"+"!==i||(n+=i,s());i>="0"&&"9">=i;)n+=i,s();return e=+n,isFinite(e)?e:void c("Bad number")},p=function(){var e,n,t,r="";if('"'===i)for(;s();){if('"'===i)return s(),r;if("\\"===i)if(s(),"u"===i){for(t=0,n=0;4>n&&(e=parseInt(s(),16),isFinite(e));n+=1)t=16*t+e;r+=String.fromCharCode(t)}else{if("string"!=typeof u[i])break;r+=u[i]}else r+=i}c("Bad string")},f=function(){for(;i&&" ">=i;)s()},E=function(){switch(i){case"t":return s("t"),s("r"),s("u"),s("e"),!0;case"f":return s("f"),s("a"),s("l"),s("s"),s("e"),!1;case"n":return s("n"),s("u"),s("l"),s("l"),null}c("Unexpected '"+i+"'")},d=function(){var e=[];if("["===i){ +if(s("["),f(),"]"===i)return s("]"),e;for(;i;){if(e.push(o()),f(),"]"===i)return s("]"),e;s(","),f()}}c("Bad array")},y=function(){var e,n={};if("{"===i){if(s("{"),f(),"}"===i)return s("}"),n;for(;i;){if(e=p(),f(),s(":"),Object.hasOwnProperty.call(n,e)&&c('Duplicate key "'+e+'"'),n[e]=o(),f(),"}"===i)return s("}"),n;s(","),f()}}c("Bad object")};o=function(){switch(f(),i){case"{":return y();case"[":return d();case'"':return p();case"-":return l();default:return i>="0"&&"9">=i?l():E()}},n.exports=function(e,n){var t;return a=e,r=0,i=" ",t=o(),f(),i&&c("Syntax error"),"function"==typeof n?function u(e,t){var r,i,a=e[t];if(a&&"object"==typeof a)for(r in a)Object.prototype.hasOwnProperty.call(a,r)&&(i=u(a,r),void 0!==i?a[r]=i:delete a[r]);return n.call(e,t,a)}({"":t},""):t}},{}],46:[function(e,n,t){function r(e){return c.lastIndex=0,c.test(e)?'"'+e.replace(c,function(e){var n=s[e];return"string"==typeof n?n:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function i(e,n){var t,c,s,l,p,f=a,E=n[e];switch(E&&"object"==typeof E&&"function"==typeof E.toJSON&&(E=E.toJSON(e)),"function"==typeof u&&(E=u.call(n,e,E)),typeof E){case"string":return r(E);case"number":return isFinite(E)?String(E):"null";case"boolean":case"null":return String(E);case"object":if(!E)return"null";if(a+=o,p=[],"[object Array]"===Object.prototype.toString.apply(E)){for(l=E.length,t=0;l>t;t+=1)p[t]=i(t,E)||"null";return s=0===p.length?"[]":a?"[\n"+a+p.join(",\n"+a)+"\n"+f+"]":"["+p.join(",")+"]",a=f,s}if(u&&"object"==typeof u)for(l=u.length,t=0;l>t;t+=1)c=u[t],"string"==typeof c&&(s=i(c,E),s&&p.push(r(c)+(a?": ":":")+s));else for(c in E)Object.prototype.hasOwnProperty.call(E,c)&&(s=i(c,E),s&&p.push(r(c)+(a?": ":":")+s));return s=0===p.length?"{}":a?"{\n"+a+p.join(",\n"+a)+"\n"+f+"}":"{"+p.join(",")+"}",a=f,s}}var a,o,u,c=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,s={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};n.exports=function(e,n,t){var r;if(a="",o="","number"==typeof t)for(r=0;t>r;r+=1)o+=" ";else"string"==typeof t&&(o=t);if(u=n,n&&"function"!=typeof n&&("object"!=typeof n||"number"!=typeof n.length))throw new Error("JSON.stringify");return i("",{"":e})}},{}],47:[function(e,n,t){"use strict";!function(e){e[e.VALUES="values"]="VALUES",e[e.COUNT="count"]="COUNT",e[e.VALID="valid"]="VALID",e[e.MISSING="missing"]="MISSING",e[e.DISTINCT="distinct"]="DISTINCT",e[e.SUM="sum"]="SUM",e[e.MEAN="mean"]="MEAN",e[e.AVERAGE="average"]="AVERAGE",e[e.VARIANCE="variance"]="VARIANCE",e[e.VARIANCEP="variancep"]="VARIANCEP",e[e.STDEV="stdev"]="STDEV",e[e.STDEVP="stdevp"]="STDEVP",e[e.MEDIAN="median"]="MEDIAN",e[e.Q1="q1"]="Q1",e[e.Q3="q3"]="Q3",e[e.MODESKEW="modeskew"]="MODESKEW",e[e.MIN="min"]="MIN",e[e.MAX="max"]="MAX",e[e.ARGMIN="argmin"]="ARGMIN",e[e.ARGMAX="argmax"]="ARGMAX"}(t.AggregateOp||(t.AggregateOp={}));var r=t.AggregateOp;t.AGGREGATE_OPS=[r.VALUES,r.COUNT,r.VALID,r.MISSING,r.DISTINCT,r.SUM,r.MEAN,r.AVERAGE,r.VARIANCE,r.VARIANCEP,r.STDEV,r.STDEVP,r.MEDIAN,r.Q1,r.Q3,r.MODESKEW,r.MIN,r.MAX,r.ARGMIN,r.ARGMAX],t.SUM_OPS=[r.COUNT,r.SUM,r.DISTINCT],t.SHARED_DOMAIN_OPS=[r.MEAN,r.AVERAGE,r.STDEV,r.STDEVP,r.MEDIAN,r.Q1,r.Q3,r.MIN,r.MAX]},{}],48:[function(e,n,t){"use strict";function r(e){switch(e){case i.ROW:case i.COLUMN:case i.SIZE:case i.SHAPE:return 6;default:return 10}}var i=e("./channel");t.autoMaxBins=r},{"./channel":49}],49:[function(e,n,t){"use strict";function r(e,n){return!!i(e)[n]}function i(e){switch(e){case t.X:case t.Y:case t.COLOR:case t.DETAIL:case t.ORDER:case t.OPACITY:case t.ROW:case t.COLUMN:return{point:!0,tick:!0,rule:!0,circle:!0,square:!0,bar:!0,line:!0,area:!0,text:!0};case t.X2:case t.Y2:return{rule:!0,bar:!0,area:!0};case t.SIZE:return{point:!0,tick:!0,rule:!0,circle:!0,square:!0,bar:!0,text:!0};case t.SHAPE:return{point:!0};case t.TEXT:return{text:!0};case t.PATH:return{line:!0}}return{}}function a(e){switch(e){case t.X:case t.Y:case t.COLOR:case t.OPACITY:case t.LABEL:case t.DETAIL:return{measure:!0,dimension:!0};case t.ROW:case t.COLUMN:case t.SHAPE:return{measure:!1,dimension:!0};case t.X2:case t.Y2:case t.SIZE:case t.TEXT:return{measure:!0,dimension:!1};case t.PATH:return{measure:!1,dimension:!0}}throw new Error("Invalid encoding channel"+e)}function o(e){return!u.contains([t.DETAIL,t.PATH,t.TEXT,t.LABEL,t.ORDER],e)}var u=e("./util");!function(e){e[e.X="x"]="X",e[e.Y="y"]="Y",e[e.X2="x2"]="X2",e[e.Y2="y2"]="Y2",e[e.ROW="row"]="ROW",e[e.COLUMN="column"]="COLUMN",e[e.SHAPE="shape"]="SHAPE",e[e.SIZE="size"]="SIZE",e[e.COLOR="color"]="COLOR",e[e.TEXT="text"]="TEXT",e[e.DETAIL="detail"]="DETAIL",e[e.LABEL="label"]="LABEL",e[e.PATH="path"]="PATH",e[e.ORDER="order"]="ORDER",e[e.OPACITY="opacity"]="OPACITY"}(t.Channel||(t.Channel={}));var c=t.Channel;t.X=c.X,t.Y=c.Y,t.X2=c.X2,t.Y2=c.Y2,t.ROW=c.ROW,t.COLUMN=c.COLUMN,t.SHAPE=c.SHAPE,t.SIZE=c.SIZE,t.COLOR=c.COLOR,t.TEXT=c.TEXT,t.DETAIL=c.DETAIL,t.LABEL=c.LABEL,t.PATH=c.PATH,t.ORDER=c.ORDER,t.OPACITY=c.OPACITY,t.CHANNELS=[t.X,t.Y,t.X2,t.Y2,t.ROW,t.COLUMN,t.SIZE,t.SHAPE,t.COLOR,t.PATH,t.ORDER,t.OPACITY,t.TEXT,t.DETAIL,t.LABEL],t.UNIT_CHANNELS=u.without(t.CHANNELS,[t.ROW,t.COLUMN]),t.UNIT_SCALE_CHANNELS=u.without(t.UNIT_CHANNELS,[t.PATH,t.ORDER,t.DETAIL,t.TEXT,t.LABEL,t.X2,t.Y2]),t.NONSPATIAL_CHANNELS=u.without(t.UNIT_CHANNELS,[t.X,t.Y,t.X2,t.Y2]),t.NONSPATIAL_SCALE_CHANNELS=u.without(t.UNIT_SCALE_CHANNELS,[t.X,t.Y,t.X2,t.Y2]),t.STACK_GROUP_CHANNELS=[t.COLOR,t.DETAIL,t.ORDER,t.OPACITY,t.SIZE],t.supportMark=r,t.getSupportedMark=i,t.getSupportedRole=a,t.hasScale=o},{"./util":58}],50:[function(e,n,t){"use strict";function r(e){return!!(e.year||e.quarter||e.month||e.date||e.day||e.hours||e.minutes||e.seconds||e.milliseconds)}function i(e){return c.isNumber(e)?e-1+"":(console.warn("Potentially invalid quarter",e),e)}function a(e){if(c.isNumber(e))return e-1+"";var n=e.toLowerCase(),r=t.MONTHS.indexOf(n);if(-1!==r)return r+"";var i=n.substr(0,3),a=t.SHORT_MONTHS.indexOf(i);return-1!==a?a+"":(console.warn("Potentially invalid month",e),e)}function o(e){if(c.isNumber(e))return e%7+"";var n=e.toLowerCase(),r=t.DAYS.indexOf(n);if(-1!==r)return r+"";var i=n.substr(0,3),a=t.SHORT_DAYS.indexOf(i);return-1!==a?a+"":(console.warn("Potentially invalid day",e),e)}function u(e,n){void 0===n&&(n=!1);var t=[];if(n&&void 0!==e.day)for(var r=0,u=["year","quarter","month","date"];r0)}function o(e){return g.some(y.CHANNELS,function(n){return!(!a(e,n)||!e[n].aggregate)})}function u(e){return e&&(!!e.x&&!!e.x2||!!e.y&&!!e.y2)}function c(e){var n=[];return y.CHANNELS.forEach(function(t){a(e,t)&&(g.isArray(e[t])?e[t].forEach(function(e){n.push(e)}):n.push(e[t]))}),n}function s(e,n,t){l(y.CHANNELS,e,n,t)}function l(e,n,t,r){var i=0;e.forEach(function(e){a(n,e)&&(g.isArray(n[e])?n[e].forEach(function(n){t.call(r,n,e,i++)}):t.call(r,n[e],e,i++))})}function p(e,n,t){return f(y.CHANNELS,e,n,t)}function f(e,n,t,r){var i=[];return e.forEach(function(e){a(n,e)&&(g.isArray(n[e])?n[e].forEach(function(n){i.push(t.call(r,n,e))}):i.push(t.call(r,n[e],e)))}),i}function E(e,n,t,r){return d(y.CHANNELS,e,n,t,r)}function d(e,n,t,r,i){var o=r;return y.CHANNELS.forEach(function(e){a(n,e)&&(g.isArray(n[e])?n[e].forEach(function(n){o=t.call(i,o,n,e)}):o=t.call(i,o,n[e],e))}),o}var y=e("./channel"),g=e("./util");t.countRetinal=r,t.channels=i,t.has=a,t.isAggregate=o,t.isRanged=u,t.fieldDefs=c,t.forEach=s,t.channelMappingForEach=l,t.map=p,t.channelMappingMap=f,t.reduce=E,t.channelMappingReduce=d},{"./channel":49,"./util":58}],52:[function(e,n,t){"use strict";!function(e){e[e.AREA="area"]="AREA",e[e.BAR="bar"]="BAR",e[e.LINE="line"]="LINE",e[e.POINT="point"]="POINT",e[e.TEXT="text"]="TEXT",e[e.TICK="tick"]="TICK",e[e.RULE="rule"]="RULE",e[e.CIRCLE="circle"]="CIRCLE",e[e.SQUARE="square"]="SQUARE",e[e.ERRORBAR="errorBar"]="ERRORBAR"}(t.Mark||(t.Mark={}));var r=t.Mark;t.AREA=r.AREA,t.BAR=r.BAR,t.LINE=r.LINE,t.POINT=r.POINT,t.TEXT=r.TEXT,t.TICK=r.TICK,t.RULE=r.RULE,t.CIRCLE=r.CIRCLE,t.SQUARE=r.SQUARE,t.ERRORBAR=r.ERRORBAR,t.PRIMITIVE_MARKS=[t.AREA,t.BAR,t.LINE,t.POINT,t.TEXT,t.TICK,t.RULE,t.CIRCLE,t.SQUARE]},{}],53:[function(e,n,t){"use strict";!function(e){e[e.LINEAR="linear"]="LINEAR",e[e.LOG="log"]="LOG",e[e.POW="pow"]="POW",e[e.SQRT="sqrt"]="SQRT",e[e.QUANTILE="quantile"]="QUANTILE",e[e.QUANTIZE="quantize"]="QUANTIZE",e[e.ORDINAL="ordinal"]="ORDINAL",e[e.TIME="time"]="TIME",e[e.UTC="utc"]="UTC"}(t.ScaleType||(t.ScaleType={}));t.ScaleType;!function(e){e[e.SECOND="second"]="SECOND",e[e.MINUTE="minute"]="MINUTE",e[e.HOUR="hour"]="HOUR",e[e.DAY="day"]="DAY",e[e.WEEK="week"]="WEEK",e[e.MONTH="month"]="MONTH",e[e.YEAR="year"]="YEAR"}(t.NiceTime||(t.NiceTime={}));t.NiceTime;!function(e){e[e.FIT="fit"]="FIT"}(t.BandSize||(t.BandSize={}));var r=t.BandSize;t.BANDSIZE_FIT=r.FIT,t.defaultScaleConfig={round:!0,textBandWidth:90,bandSize:21,padding:.1,useRawDomain:!1,opacity:[.3,.8],nominalColorRange:"category10",sequentialColorRange:["#AFC6A3","#09622A"],shapeRange:"shapes",fontSizeRange:[8,40],ruleSizeRange:[1,5],tickSizeRange:[1,20]},t.defaultFacetScaleConfig={round:!0,padding:16}},{}],54:[function(e,n,t){"use strict";function r(e){return!!e&&!!e.field&&!!e.op}!function(e){e[e.ASCENDING="ascending"]="ASCENDING",e[e.DESCENDING="descending"]="DESCENDING",e[e.NONE="none"]="NONE"}(t.SortOrder||(t.SortOrder={}));t.SortOrder;t.isSortField=r},{}],55:[function(e,n,t){"use strict";function r(e,n,t){var r=t&&t.mark?t.mark.stacked:void 0;if(u.contains([c.NONE,null,!1],r))return null;if(!u.contains([o.BAR,o.AREA],e))return null;if(!a.isAggregate(n))return null;var s=i.STACK_GROUP_CHANNELS.reduce(function(e,t){return a.has(n,t)&&!n[t].aggregate&&e.push(t),e},[]);if(0===s.length)return null;var l=a.has(n,i.X),p=a.has(n,i.Y),f=l&&!!n.x.aggregate,E=p&&!!n.y.aggregate;return f!==E?{groupbyChannel:f?p?i.Y:null:l?i.X:null,fieldChannel:f?i.X:i.Y,stackByChannels:s,offset:r||c.ZERO}:null}var i=e("./channel"),a=e("./encoding"),o=e("./mark"),u=e("./util");!function(e){e[e.ZERO="zero"]="ZERO",e[e.CENTER="center"]="CENTER",e[e.NORMALIZE="normalize"]="NORMALIZE",e[e.NONE="none"]="NONE"}(t.StackOffset||(t.StackOffset={}));var c=t.StackOffset;t.stack=r},{"./channel":49,"./encoding":51,"./mark":52,"./util":58}],56:[function(e,n,t){"use strict";function r(e){return!!h[e]}function i(e,n){var r=new Date(0,0,1,0,0,0,0);return t.SINGLE_TIMEUNITS.forEach(function(t){if(o(e,t))switch(t){case g.DAY:throw new Error("Cannot convert to TimeUnits containing 'day'");case g.YEAR:r.setFullYear(n.getFullYear());break;case g.QUARTER:r.setMonth(3*Math.floor(n.getMonth()/3));break;case g.MONTH:r.setMonth(n.getMonth());break;case g.DATE:r.setDate(n.getDate());break;case g.HOURS:r.setHours(n.getHours());break;case g.MINUTES:r.setMinutes(n.getMinutes());break;case g.SECONDS:r.setSeconds(n.getSeconds());break;case g.MILLISECONDS:r.setMilliseconds(n.getMilliseconds())}}),r}function a(e){return!!T[e]}function o(e,n){var t=e.toString(),r=n.toString(),i=t.indexOf(r);return i>-1&&(n!==g.SECONDS||0===i||"i"!==t.charAt(i-1))}function u(e){switch(e){case g.HOURS:case g.DAY:case g.MONTH:case g.QUARTER:return d.ScaleType.ORDINAL}return d.ScaleType.TIME}function c(e,n){function r(e){return e===g.QUARTER?"floor(month("+i+")/3)":e+"("+i+")"}var i='datum["'+n+'"]',a=t.SINGLE_TIMEUNITS.reduce(function(n,t){return o(e,t)&&(n[t]=r(t)),n},{});return a.day&&y.keys(a).length>1&&(console.warn('Time unit "'+e+'" is not supported. We are replacing it with ',(e+"").replace("day","date")+"."),delete a.day,a.date=r(g.DATE)),E.dateTimeExpr(a)}function s(e,n){if(y.contains([f.ROW,f.COLUMN,f.SHAPE,f.COLOR],n))return null;switch(e){case g.SECONDS:return y.range(0,60);case g.MINUTES:return y.range(0,60);case g.HOURS:return y.range(0,24);case g.DAY:return y.range(0,7);case g.DATE:return y.range(1,32);case g.MONTH:return y.range(0,12);case g.QUARTER:return[0,3,6,9]}return null}function l(e){return e?o(e,g.SECONDS)?"second":o(e,g.MINUTES)?"minute":o(e,g.HOURS)?"hour":o(e,g.DAY)||o(e,g.DATE)?"day":o(e,g.MONTH)?"month":o(e,g.YEAR)?"year":void 0:void 0}function p(e,n,t){if(e){var r=[];o(e,g.YEAR)&&r.push(t?"%y":"%Y"),o(e,g.QUARTER)&&r.push("'}}Q{{"+n+" | quarter}}{{"+n+" | time:'"),o(e,g.MONTH)&&r.push(t?"%b":"%B"),o(e,g.DAY)?r.push(t?"%a":"%A"):o(e,g.DATE)&&r.push("%d");var i=[];o(e,g.HOURS)&&i.push("%H"),o(e,g.MINUTES)&&i.push("%M"),o(e,g.SECONDS)&&i.push("%S"),o(e,g.MILLISECONDS)&&i.push("%L");var a=[];if(r.length>0&&a.push(r.join("-")),i.length>0&&a.push(i.join(":")),a.length>0){var u="{{"+n+" | time:'"+a.join(" ")+"'}}",c=n.replace(/(\[|\])/g,"\\$1");return u.replace(new RegExp("{{"+c+" \\| time:''}}","g"),"")}}}var f=e("./channel"),E=e("./datetime"),d=e("./scale"),y=e("./util");!function(e){e[e.YEAR="year"]="YEAR",e[e.MONTH="month"]="MONTH",e[e.DAY="day"]="DAY",e[e.DATE="date"]="DATE",e[e.HOURS="hours"]="HOURS",e[e.MINUTES="minutes"]="MINUTES",e[e.SECONDS="seconds"]="SECONDS",e[e.MILLISECONDS="milliseconds"]="MILLISECONDS",e[e.YEARMONTH="yearmonth"]="YEARMONTH",e[e.YEARMONTHDATE="yearmonthdate"]="YEARMONTHDATE",e[e.YEARMONTHDATEHOURS="yearmonthdatehours"]="YEARMONTHDATEHOURS",e[e.YEARMONTHDATEHOURSMINUTES="yearmonthdatehoursminutes"]="YEARMONTHDATEHOURSMINUTES",e[e.YEARMONTHDATEHOURSMINUTESSECONDS="yearmonthdatehoursminutesseconds"]="YEARMONTHDATEHOURSMINUTESSECONDS",e[e.HOURSMINUTES="hoursminutes"]="HOURSMINUTES",e[e.HOURSMINUTESSECONDS="hoursminutesseconds"]="HOURSMINUTESSECONDS",e[e.MINUTESSECONDS="minutesseconds"]="MINUTESSECONDS",e[e.SECONDSMILLISECONDS="secondsmilliseconds"]="SECONDSMILLISECONDS",e[e.QUARTER="quarter"]="QUARTER",e[e.YEARQUARTER="yearquarter"]="YEARQUARTER",e[e.QUARTERMONTH="quartermonth"]="QUARTERMONTH",e[e.YEARQUARTERMONTH="yearquartermonth"]="YEARQUARTERMONTH"}(t.TimeUnit||(t.TimeUnit={}));var g=t.TimeUnit;t.SINGLE_TIMEUNITS=[g.YEAR,g.QUARTER,g.MONTH,g.DAY,g.DATE,g.HOURS,g.MINUTES,g.SECONDS,g.MILLISECONDS];var h=t.SINGLE_TIMEUNITS.reduce(function(e,n){return e[n]=!0,e},{});t.isSingleTimeUnit=r,t.convert=i,t.MULTI_TIMEUNITS=[g.YEARQUARTER,g.YEARQUARTERMONTH,g.YEARMONTH,g.YEARMONTHDATE,g.YEARMONTHDATEHOURS,g.YEARMONTHDATEHOURSMINUTES,g.YEARMONTHDATEHOURSMINUTESSECONDS,g.QUARTERMONTH,g.HOURSMINUTES,g.HOURSMINUTESSECONDS,g.MINUTESSECONDS,g.SECONDSMILLISECONDS];var T=t.MULTI_TIMEUNITS.reduce(function(e,n){return e[n]=!0,e},{});t.isMultiTimeUnit=a,t.TIMEUNITS=t.SINGLE_TIMEUNITS.concat(t.MULTI_TIMEUNITS),t.containsTimeUnit=o,t.defaultScaleType=u,t.fieldExpr=c,t.rawDomain=s,t.smallestUnit=l,t.template=p},{"./channel":49,"./datetime":50,"./scale":53,"./util":58}],57:[function(e,n,t){"use strict";function r(e){var n=e;return t.TYPE_FROM_SHORT_TYPE[n.toUpperCase()]||n.toLowerCase()}!function(e){e[e.QUANTITATIVE="quantitative"]="QUANTITATIVE",e[e.ORDINAL="ordinal"]="ORDINAL",e[e.TEMPORAL="temporal"]="TEMPORAL",e[e.NOMINAL="nominal"]="NOMINAL"}(t.Type||(t.Type={}));var i=t.Type;t.QUANTITATIVE=i.QUANTITATIVE,t.ORDINAL=i.ORDINAL,t.TEMPORAL=i.TEMPORAL,t.NOMINAL=i.NOMINAL,t.SHORT_TYPE={quantitative:"Q",temporal:"T",nominal:"N",ordinal:"O"},t.TYPE_FROM_SHORT_TYPE={Q:t.QUANTITATIVE,T:t.TEMPORAL,O:t.ORDINAL,N:t.NOMINAL},t.getFullName=r},{}],58:[function(e,n,t){"use strict";function r(e,n){var t={};return n.forEach(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t}function i(e,n){var t=C.duplicate(e);return n.forEach(function(e){delete t[e]}),t}function a(e){return I.isString(e)||I.isNumber(e)||I.isBoolean(e)?String(e):N(e)}function o(e,n){return e.indexOf(n)>-1}function u(e,n){return e.filter(function(e){return!o(n,e)})}function c(e,n){return e.concat(u(n,e))}function s(e,n,t){if(e.forEach)e.forEach.call(t,n);else for(var r in e)e.hasOwnProperty(r)&&n.call(t,e[r],r,e)}function l(e,n,t,r){if(e.reduce)return e.reduce.call(r,n,t);for(var i in e)e.hasOwnProperty(i)&&(t=n.call(r,t,e[i],i,e));return t}function p(e,n,t){if(e.map)return e.map.call(t,n);var r=[];for(var i in e)e.hasOwnProperty(i)&&r.push(n.call(t,e[i],i,e));return r}function f(e,n){for(var t=0,r=0;rr;++r)t=n?n(e[r]):e[r],t in o||(o[t]=1,a.push(e[r]));return a}function m(e){console.warn("[VL Warning]",e)}function S(e){console.error("[VL Error]",e)}function A(e,n){for(var t in e)if(e.hasOwnProperty(t)&&n[t]&&e[t]&&n[t]!==e[t])return!0;return!1}var N=e("json-stable-stringify"),v=e("datalib/src/util");t.keys=v.keys,t.extend=v.extend,t.duplicate=v.duplicate,t.isArray=v.isArray,t.vals=v.vals,t.truncate=v.truncate,t.toMap=v.toMap,t.isObject=v.isObject,t.isString=v.isString,t.isNumber=v.isNumber,t.isBoolean=v.isBoolean;var C=e("datalib/src/util"),O=e("datalib/src/generate");t.range=O.range;var I=e("datalib/src/util");t.pick=r,t.omit=i,t.hash=a,t.contains=o,t.without=u,t.union=c,t.forEach=s,t.reduce=l,t.map=p,t.some=f,t.every=E,t.flatten=d,t.mergeDeep=y;var R=e("datalib/src/bins/bins");t.getbins=h,t.unique=T,t.warning=m,t.error=S,t.differ=A},{"datalib/src/bins/bins":39,"datalib/src/generate":40,"datalib/src/util":42,"json-stable-stringify":43}]},{},[14])(14)}); +//# sourceMappingURL=compassql.min.js.map diff --git a/compassql.min.js.map b/compassql.min.js.map new file mode 100644 index 00000000..f53938b3 --- /dev/null +++ b/compassql.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["compassql.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","cql","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","2","factory","d3_time","newInterval","floori","offseti","count","field","interval","date","Date","floor","round","d0","d1","ceil","offset","step","Math","range","start","stop","push","filter","test","setTime","end","t0","t1","every","isFinite","d","weekday","setHours","setDate","getDate","getDay","getTimezoneOffset","utcWeekday","setUTCHours","setUTCDate","getUTCDate","getUTCDay","millisecond","k","second","setMilliseconds","getSeconds","minute","setSeconds","getMinutes","hour","setMinutes","getHours","day","sunday","monday","tuesday","wednesday","thursday","friday","saturday","month","setMonth","getMonth","getFullYear","year","setFullYear","utcSecond","setUTCMilliseconds","getUTCSeconds","utcMinute","setUTCSeconds","getUTCMinutes","utcHour","setUTCMinutes","getUTCHours","utcDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcMonth","setUTCMonth","getUTCMonth","getUTCFullYear","utcYear","setUTCFullYear","milliseconds","seconds","minutes","hours","days","sundays","mondays","tuesdays","wednesdays","thursdays","fridays","saturdays","weeks","months","years","utcMillisecond","utcMilliseconds","utcSeconds","utcMinutes","utcHours","utcDays","utcSundays","utcMondays","utcTuesdays","utcWednesdays","utcThursdays","utcFridays","utcSaturdays","utcWeeks","utcMonths","utcYears","version","week","utcWeek","3","bins","opt","level","minstep","precision","v","eps","maxb","maxbins","base","logb","log","div","min","max","span","steps","bisect","pow","unit","value","index","x","lo","hi","mid","util","cmp","EPSILON","date_value","date_index","time","units","utc","dmin","dmax","minb","minbins","find","spec","raw","../time","../util","4","gen","repeat","val","Array","zeros","arguments","Infinity","j","random","uniform","undefined","samples","map","pdf","cdf","icdf","p","NaN","integer","b","normal","mean","stdev","next","rds","c","y","sqrt","exp","PI","cd","z","Z","abs","sum","SQRT2","bootstrap","domain","smooth","isValid","len","err","./util","5","annotation","data","types","TYPES","type","values","array","$","isString","isDate","isNumber","isBoolean","typeAll","fields","keys","reduce","infer","TESTS","splice","inferAll","PARSERS","boolean","number","string","isNaN","parse","all","parsers","6","ztest1","X","nullH","nullh","gaussian","mu","stats","SE","valid","ztestP","Y","n1","n2","diffs","ztest2","meanDiff","variance","unique","results","missing","distinct","median","sort","quantile","quartile","q","identity","H","h","delta","geometric","harmonic","isArray","M2","modeskew","avg","med","std","extent","dot","dist","isFunction","L2","cohensd","x1","x2","s1","s2","covariance","vx","vy","xm","ym","rank","idx","comparator","tie","cor","fn","mua","mub","sda","sdb","ra","rb","aa","bb","ab","A","mat","B","linearRegression","res","xy","sx","sy","slope","icept","fit","intercept","R","rss","ci","N","alpha","bs","means","numcmp","paired","m","M","entropy","counts","LN2","mutual","px","py","I","info","profile","sd","vals","q1","q3","summary","__summary__","./generate","./import/type","7","tempDate","entry","create","STEPS","toUnitMap","baseDate","utcBaseDate","UTC","locale","d3-time","8","Buffer","strrep","str","truncateOnWord","rev","cnt","tok","split","truncate_word_re","reverse","w","join","trim","slice","FNAME","namedfunc","name","duplicate","obj","JSON","stringify","equal","extend","toMap","list","keystr","String","toString","Object","prototype","isObject","isBuffer","format","replace","field_re","match","accessor","Function","mutator","$func","op","$valid","$length","$in","sign","stablesort","sortBy","keyFn","indices","sa","sb","permute","swap","pad","pos","padchar","truncate","word","ellipsis","l1","l2","buffer","9","channel_1","aggregate_1","mark_1","scale_1","sort_1","timeunit_1","type_1","property_1","DEFAULT_QUERY_CONFIG","verbose","defaultSpecConfig","overlay","line","scale","useRawDomain","propertyPrecedence","DEFAULT_PROPERTY_PRECEDENCE","marks","Mark","POINT","BAR","LINE","AREA","TICK","channels","ROW","COLUMN","SIZE","COLOR","aggregates","AggregateOp","MEAN","timeUnits","TimeUnit","YEAR","MONTH","DAY","DATE","Type","NOMINAL","ORDINAL","QUANTITATIVE","TEMPORAL","maxBinsList","sorts","SortOrder","ASCENDING","DESCENDING","sortOps","MIN","sortOrders","scaleBandSizes","scaleDomains","scaleExponents","scaleRanges","scaleTypes","ScaleType","LINEAR","LOG","numberOrdinalProportion","autoAddCount","hasAppropriateGraphicTypeForMark","omitAggregate","omitAggregatePlotWithDimensionOnlyOnFacet","omitAggregatePlotWithoutDimension","omitBarLineAreaWithOcclusion","omitBarTickWithSize","omitFacetOverPositionalChannels","omitMultipleNonPositionalChannels","omitNonSumStack","omitRaw","omitRawContinuousFieldForAggregatePlot","omitRepeatedField","omitNonPositionalOverPositionalChannels","omitTableWithOcclusionIfAutoAddCount","omitVerticalDotPlot","preferredBinAxis","Channel","preferredTemporalAxis","preferredOrdinalAxis","preferredNominalAxis","preferredFacet","maxCardinalityForCategoricalColor","maxCardinalityForFacet","maxCardinalityForShape","typeMatchesSchemaType","smallBandSizeForHighCardinalityOrFacet","maxCardinality","bandSize","nominalColorScaleForHighCardinality","palette","maxGoodCardinalityForFacet","maxGoodCardinalityForColor","./property","vega-lite/src/aggregate","vega-lite/src/channel","vega-lite/src/mark","vega-lite/src/scale","vega-lite/src/sort","vega-lite/src/timeunit","vega-lite/src/type","10","AbstractConstraintModel","constraint","description","properties","strict","11","_encoding","_spec","encoding","./encoding","./spec","12","checkEncoding","prop","enumSpec","specM","schema","encodingConstraints","ENCODING_CONSTRAINTS_BY_PROPERTY","encQ","getEncodingQueryByIndex","satisfy","violatedConstraint","console","toShorthand","__extends","__","constructor","hasOwnProperty","base_1","enumspec_1","schema_1","util_1","encoding_1","EncodingConstraintModel","_super","hasAllRequiredPropertiesSpecific","nestedEncProp","getNestedEncodingProperty","parent_1","parent","child","isEnumSpec","allowEnumSpecForProperties","ENCODING_CONSTRAINTS","Property","TYPE","AGGREGATE","aggregate","BIN","bin","CHANNEL","TIMEUNIT","channel","supportedRole","getSupportedRole","isDimension","dimension","isMeasure","measure","SCALE","SCALE_ZERO","zero","AUTOCOUNT","numFn","autoCount","timeUnit","SCALE_PROPERTIES","concat","sType","scaleType","scaleProp","SUPPORTED_SCALE_PROPERTY_INDEX","contains","FIELD","primitiveType","PrimitiveType","BOOLEAN","STRING","NUMBER","INTEGER","cardinality","SHAPE","SCALE_TYPE","TIME","POW","SQRT","QUANTILE","QUANTIZE","ec","ENCODING_CONSTRAINT_INDEX","forEach","../enumspec","../property","../query/encoding","../schema","./base","13","checkSpec","specConstraints","SPEC_CONSTRAINTS_BY_PROPERTY","encoding_2","SpecConstraintModel","specConstraint","MARK","getMark","child_1","getEncodings","isEncodingProperty","SPEC_CONSTRAINTS","usedChannel","mark","encodings","_i","encodings_1","hasAutoCount","some","neverHaveAutoCount","enumSpecIndex","encodingIndicesByProperty","supportMark","channelUsed","TEXT","CIRCLE","SQUARE","RULE","isAggregate","hasNonFacetDim_1","hasDim_1","encodings_2","nonPositionChannelCount","NONSPATIAL_CHANNELS","DETAIL","usedField","xEncQ","getEncodingQueryByChannel","yEncQ","xIsMeasure","yIsMeasure","stack","measureEncQ","fieldChannel","SUM_OPS","sc","SPEC_CONSTRAINT_INDEX","14","enumerate","generate_1","generate","model","modelGroup","nest","property","cqlQuery","query_1","query","ranking","./constraint/constraint","./enumerator","./enumspec","./model","./modelgroup","./nest","./query/query","./ranking/ranking","./schema","15","EncodingPropertyGeneratorFactory","answerSet","jobIndex","propEnumSpec","getEncodingProperty","propVal","setEncodingProperty","violatedEncodingConstraint","violatedSpecConstraint","spec_1","resetEncodingProperty","ENUMERATOR_INDEX","markEnumSpec","setMark","resetMark","ENCODING_PROPERTIES","NESTED_ENCODING_PROPERTIES","nestedProp","./constraint/encoding","./constraint/spec","16","SHORT_ENUM_SPEC","initEnumSpec","defaultName","defaultEnumValues","ShortEnumSpec","ENUMSPEC","17","EnumSpecIndex","_mark","_encodings","_encodingIndicesByProperty","encodingsIndex","encIndex","hasProperty","isEmpty","defineProperty","get","enumerable","configurable","18","specQ","config_1","model_1","SpecQueryModel","build","reducer","enumerator_1","stylize_1","stylize","../src/enumerator","./config","./stylize","19","getDefaultName","BIN_MAXBINS","SORT","SORT_FIELD","SORT_OP","SORT_ORDER","SCALE_BANDSIZE","SCALE_CLAMP","SCALE_DOMAIN","SCALE_EXPONENT","SCALE_NICE","SCALE_RANGE","SCALE_ROUND","SCALE_USERAWDOMAIN","getDefaultEnumValues","enumspecindex_1","shorthand_1","enumSpecAssignment","_rankingScore","_channelCount","_enumSpecIndex","_enumSpecAssignment","_opt","_schema","name_1","warn","defaultEnumSpecName","propObj","countEncQ","hasNestedProperty","fieldDef","COUNT","PROPERTIES","toSpec","transform","config","getRankingScore","rankingName","setRankingScore","score","./enumspecindex","./query/encoding","./query/shorthand","./query/spec","20","isSpecQueryModelGroup","item","getTopItem","topItem","items","21","registerKeyFn","groupRegistry","specModels","rootGroup","path","groupIndex","includes_1","replaces_1","replacers_1","_loop_1","util_2","groupBy","grpBy","groupby_1","isExtendedGroupBy","replaceFnIndex","fnIndex","getReplacer","group","orderGroupBy","key","specQuery","channelType","OPACITY","PATH","ORDER","stringifyStack","_stack","FIELD_TRANSFORM","ENCODING","TRANSPOSE","SPEC","./query/groupby","datalib/src/util","22","STACK","ENCODING_INDEX","NESTED_ENCODING_INDEX","getNestedEncodingPropertyChildren","NESTED_ENCODING_PROPERTY_PARENT_INDEX","isNestedEncodingProperty","SUPPORTED_SCALE_PROPERTY","supportedScaleType","23","defaultScaleType","24","replaceIndex","valFrom","valTo","valsFrom","REPLACE_BLANK_FIELDS","*","REPLACE_XY_CHANNELS","REPLACE_FACET_CHANNELS","row","column","REPLACE_MARK_STYLE_CHANNELS","color","opacity","shape","size","25","normalize","nestedAnswerSet","nest_1","result","ranking_1","nest_2","orderBy","normalizedQ","chooseBy","shorthand","../config","../generate","../nest","../ranking/ranking","./groupby","./shorthand","./transform","26","include","INCLUDE_ALL","parts","includeExceptType","fieldEncQ","groupby","groupByEncQ","encQs","fieldDefStr","props","_a","nestedPropParent","nestedProps","nestedPropChildren","_b","_c","fieldAndParams","typeShort","substr","27","fromSpec","channelDef","ENCODING_PROPERTIES_1","AXIS","LEGEND","stacked","stack_1","StackOffset","NONE","stackByChannels","STACK_GROUP_CHANNELS","xIsAggregate","yIsAggregate","groupbyChannel","ZERO","vega-lite/src/stack","28","29","feature","aggregationQualityFeature","features","isRawContinuous","30","TypeChannelScore","effectiveness_1","init","SCORE","ORDERED_TYPE_CHANNEL_SCORE","text","detail","Q","BIN_Q","T","TIMEUNIT_T","O","featurize","NOMINAL_TYPE_CHANNEL_SCORE","getScore","encodingQueryByField","fieldKey","bestFieldFeature","best","getExtendedType","featureScore","getFeatureScore","TYPE_CHANNEL","PreferredAxisScore","preferredAxes","preferredAxis","PREFERRED_AXIS","PreferredFacetScore","PREFERRED_FACET","MarkChannelScore","bar_size","tick_size","featureScores","MARK_CHANNEL","DimensionScore","maxFScore","DIMENSION","../../config","../../query/shorthand","../../util","./effectiveness","./type","31","FEATURE_INDEX","addFeatureFactory","FEATURE_FACTORIES","default_1","scores","MarkScore","MARK_SCORE","./channel","./mark","32","xType","yType","hasOcclusion","MEASURES","DIMENSIONS","DIMENSIONS_OR_NONE","occludedQQMark","point","tick","bar","area","rule","noOccludedQQMark","occludedDimensionMeasureMark","feature2","noOccludedQxN","noOccludedQxBinQ","ddMark","rect","isOccluded","33","ExtendedType","34","register","rankingRegistry","subgroup","groupComparator","m1","m2","g1","g2","modelgroup_1","effectiveness","aggregation","EFFECTIVENESS","../modelgroup","./aggregation","./effectiveness/effectiveness","35","binSummary","dlBin","binUnique","timeSummary","timeunit","dateString","convert","oldUnique","newUnique","bucket","Number","bin_1","stats_1","type_2","Schema","fieldSchemas","fieldSchemaIndex","fieldSchema","summaries","getTime","timeStats","binStats","order","nominal","ordinal","temporal","quantitative","localeCompare","fieldSchemas_1","_d","augmentTimeUnitDomain","autoMaxBins","SECONDS","MINUTES","HOURS","QUARTER","MILLISECONDS","datalib/src/bins/bins","datalib/src/import/type","datalib/src/stats","vega-lite/src/bin","36","encQIndex","colorEncQ","37","indexOf","arr","thisArg","nestedMap","without","excludedItems","38","apply","dup","39","40","41","42","43","json","opts","space","cycles","replacer","node","aobj","bobj","seen","indent","colonSeparator","toJSON","out","TypeError","objectKeys","keyValue","","has","jsonify","44","./lib/parse","./lib/stringify","45","at","ch","escapee","\"","\\","/","error","message","charAt","hex","uffff","parseInt","fromCharCode","white","object","source","reviver","walk","holder","46","quote","escapable","lastIndex","meta","charCodeAt","partial","mind","gap","rep","\b","\t","\n","\f","\r","47","AGGREGATE_OPS","VALUES","VALID","MISSING","DISTINCT","SUM","AVERAGE","VARIANCE","VARIANCEP","STDEV","STDEVP","MEDIAN","Q1","Q3","MODESKEW","MAX","ARGMIN","ARGMAX","SHARED_DOMAIN_OPS","48","49","getSupportedMark","circle","square","X2","Y2","LABEL","hasScale","CHANNELS","UNIT_CHANNELS","UNIT_SCALE_CHANNELS","NONSPATIAL_SCALE_CHANNELS","50","isDateTime","quarter","normalizeQuarter","normalizeMonth","lowerM","toLowerCase","monthIndex","MONTHS","shortM","shortMonthIndex","SHORT_MONTHS","normalizeDay","lowerD","dayIndex","DAYS","shortD","shortDayIndex","SHORT_DAYS","dateTimeExpr","51","countRetinal","channelEncoding","isRanged","y2","fieldDefs","channelMappingForEach","mapping","channelMappingMap","channelMappingReduce","52","ERRORBAR","PRIMITIVE_MARKS","53","NiceTime","BandSize","BANDSIZE_FIT","FIT","defaultScaleConfig","textBandWidth","padding","nominalColorRange","sequentialColorRange","shapeRange","fontSizeRange","ruleSizeRange","tickSizeRange","defaultFacetScaleConfig","54","isSortField","55","hasXField","hasYField","56","isSingleTimeUnit","SINGLE_TIMEUNIT_INDEX","SINGLE_TIMEUNITS","singleUnit","containsTimeUnit","getMilliseconds","isMultiTimeUnit","MULTI_TIMEUNIT_INDEX","fullTimeUnit","fullTimeUnitStr","timeUnitStr","fieldExpr","func","fieldRef","tu","datetime_1","rawDomain","smallestUnit","template","shortTimeLabels","dateComponents","timeComponents","template_1","escapedField","RegExp","MULTI_TIMEUNITS","YEARQUARTER","YEARQUARTERMONTH","YEARMONTH","YEARMONTHDATE","YEARMONTHDATEHOURS","YEARMONTHDATEHOURSMINUTES","YEARMONTHDATEHOURSMINUTESSECONDS","QUARTERMONTH","HOURSMINUTES","HOURSMINUTESSECONDS","MINUTESSECONDS","SECONDSMILLISECONDS","TIMEUNITS","./datetime","./scale","57","getFullName","typeString","TYPE_FROM_SHORT_TYPE","toUpperCase","SHORT_TYPE","58","pick","copy","omit","hash","util_3","union","other","output","flatten","arrays","mergeDeep","dest","src","deepMerge_","getbins","warning","differ","dict","datalib/src/generate","json-stable-stringify"],"mappings":"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"} \ No newline at end of file