From 87b4a44efca54710a806e932bf18c0927cc80744 Mon Sep 17 00:00:00 2001 From: Kanit Wongsuphasawat Date: Mon, 30 Jan 2017 16:30:56 -0800 Subject: [PATCH] release 0.7.0 769a0bcc7789fcf19f02b881dc3298005dd8c4fd --- compassql-schema.json | 1 + compassql.js | 8557 +++++++++++++++++++++++++++++++++++++++++ compassql.js.map | 121 + compassql.min.js | 6 + compassql.min.js.map | 1 + 5 files changed, 8686 insertions(+) create mode 100644 compassql-schema.json create mode 100644 compassql.js create mode 100644 compassql.js.map create mode 100644 compassql.min.js create mode 100644 compassql.min.js.map diff --git a/compassql-schema.json b/compassql-schema.json new file mode 100644 index 00000000..417b7b53 --- /dev/null +++ b/compassql-schema.json @@ -0,0 +1 @@ +undefined diff --git a/compassql.js b/compassql.js new file mode 100644 index 00000000..bb4d03bf --- /dev/null +++ b/compassql.js @@ -0,0 +1,8557 @@ +(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 === '' ? 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 fieldNames(datum) { + return util.keys(datum); +} + +function bracket(fieldName) { + return '[' + fieldName + ']'; +} + +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 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; +}; + +},{}],12:[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}); +}; + +},{}],13:[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, +]; +exports.SUM_OPS = [ + AggregateOp.COUNT, + AggregateOp.SUM, + AggregateOp.DISTINCT, + AggregateOp.VALID, + AggregateOp.MISSING +]; +exports.SHARED_DOMAIN_OPS = [ + AggregateOp.MEAN, + AggregateOp.AVERAGE, + AggregateOp.STDEV, + AggregateOp.STDEVP, + AggregateOp.MEDIAN, + AggregateOp.Q1, + AggregateOp.Q3, + AggregateOp.MIN, + AggregateOp.MAX, +]; + +},{}],14:[function(require,module,exports){ +"use strict"; +(function (AxisOrient) { + AxisOrient[AxisOrient["TOP"] = 'top'] = "TOP"; + AxisOrient[AxisOrient["RIGHT"] = 'right'] = "RIGHT"; + AxisOrient[AxisOrient["LEFT"] = 'left'] = "LEFT"; + AxisOrient[AxisOrient["BOTTOM"] = 'bottom'] = "BOTTOM"; +})(exports.AxisOrient || (exports.AxisOrient = {})); +var AxisOrient = exports.AxisOrient; +exports.defaultAxisConfig = { + offset: undefined, + grid: undefined, + labels: true, + labelMaxLength: 25, + tickSize: undefined, + characterWidth: 6 +}; +exports.defaultFacetAxisConfig = { + axisWidth: 0, + labels: true, + grid: false, + tickSize: 0 +}; + +},{}],15:[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: + case channel_1.SHAPE: + return 6; + default: + return 10; + } +} +exports.autoMaxBins = autoMaxBins; + +},{"./channel":16}],16:[function(require,module,exports){ +"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]); +exports.STACK_GROUP_CHANNELS = [exports.COLOR, exports.DETAIL, exports.ORDER, exports.OPACITY, exports.SIZE]; +; +function supportMark(channel, mark) { + return !!getSupportedMark(channel)[mark]; +} +exports.supportMark = supportMark; +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; +; +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":25}],17:[function(require,module,exports){ +"use strict"; +var util_1 = require('./util'); +var SUNDAY_YEAR = 2006; +function isDateTime(o) { + return !!o && (!!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)) { + return (q - 1) + ''; + } + else { + console.warn('Potentially invalid quarter', q); + return q; + } +} +function normalizeMonth(m) { + if (util_1.isNumber(m)) { + return (m - 1) + ''; + } + else { + var lowerM = m.toLowerCase(); + var monthIndex = exports.MONTHS.indexOf(lowerM); + if (monthIndex !== -1) { + return monthIndex + ''; + } + var shortM = lowerM.substr(0, 3); + var shortMonthIndex = exports.SHORT_MONTHS.indexOf(shortM); + if (shortMonthIndex !== -1) { + return shortMonthIndex + ''; + } + console.warn('Potentially invalid month', m); + return m; + } +} +function normalizeDay(d) { + if (util_1.isNumber(d)) { + return (d % 7) + ''; + } + else { + var lowerD = d.toLowerCase(); + var dayIndex = exports.DAYS.indexOf(lowerD); + if (dayIndex !== -1) { + return dayIndex + ''; + } + var shortD = lowerD.substr(0, 3); + var shortDayIndex = exports.SHORT_DAYS.indexOf(shortD); + if (shortDayIndex !== -1) { + return shortDayIndex + ''; + } + console.warn('Potentially invalid day', d); + return d; + } +} +function timestamp(d, normalize) { + var date = new Date(0, 0, 1, 0, 0, 0, 0); + if (d.day !== undefined) { + if (util_1.keys(d).length > 1) { + console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with other units.'); + d = util_1.duplicate(d); + delete d.day; + } + else { + date.setFullYear(SUNDAY_YEAR); + var day = normalize ? normalizeDay(d.day) : d.day; + date.setDate(+day + 1); + } + } + if (d.year !== undefined) { + date.setFullYear(d.year); + } + if (d.quarter !== undefined) { + var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter; + date.setMonth(+quarter * 3); + } + if (d.month !== undefined) { + var month = normalize ? normalizeMonth(d.month) : d.month; + date.setMonth(+month); + } + if (d.date !== undefined) { + date.setDate(d.date); + } + if (d.hours !== undefined) { + date.setHours(d.hours); + } + if (d.minutes !== undefined) { + date.setMinutes(d.minutes); + } + if (d.seconds !== undefined) { + date.setSeconds(d.seconds); + } + if (d.milliseconds !== undefined) { + date.setMilliseconds(d.milliseconds); + } + return date.getTime(); +} +exports.timestamp = timestamp; +function dateTimeExpr(d, normalize) { + if (normalize === void 0) { normalize = false; } + var units = []; + if (normalize && d.day !== undefined) { + if (util_1.keys(d).length > 1) { + console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with other units.'); + d = util_1.duplicate(d); + delete d.day; + } + } + if (d.year !== undefined) { + units.push(d.year); + } + else if (d.day !== undefined) { + units.push(SUNDAY_YEAR); + } + 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); + } + if (d.date !== undefined) { + units.push(d.date); + } + else if (d.day !== undefined) { + var day = normalize ? normalizeDay(d.day) : d.day; + units.push(day + '+1'); + } + else { + units.push(1); + } + for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) { + var timeUnit = _a[_i]; + if (d[timeUnit] !== undefined) { + units.push(d[timeUnit]); + } + else { + units.push(0); + } + } + return 'datetime(' + units.join(', ') + ')'; +} +exports.dateTimeExpr = dateTimeExpr; + +},{"./util":25}],18:[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; +function has(encoding, channel) { + var channelEncoding = encoding && encoding[channel]; + return channelEncoding && (channelEncoding.field !== undefined || + (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":16,"./util":25}],19:[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]; + +},{}],20:[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 +}; + +},{}],21:[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; + +},{}],22:[function(require,module,exports){ +"use strict"; +var aggregate_1 = require('./aggregate'); +var channel_1 = require('./channel'); +var encoding_1 = require('./encoding'); +var mark_1 = require('./mark'); +var scale_1 = require('./scale'); +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, stacked) { + if (util_1.contains([StackOffset.NONE, null, false], stacked)) { + return null; + } + if (!util_1.contains([mark_1.BAR, mark_1.AREA, mark_1.POINT, mark_1.CIRCLE, mark_1.SQUARE, mark_1.LINE, mark_1.TEXT, mark_1.TICK], mark)) { + return null; + } + if (!encoding_1.isAggregate(encoding)) { + return null; + } + 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; + } + 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) { + var fieldChannel = xIsAggregate ? channel_1.X : channel_1.Y; + var fieldChannelAggregate = encoding[fieldChannel].aggregate; + var fieldChannelScale = encoding[fieldChannel].scale; + if (fieldChannelScale && fieldChannelScale.type && fieldChannelScale.type !== scale_1.ScaleType.LINEAR) { + console.warn('Cannot stack non-linear (' + fieldChannelScale.type + ') scale'); + return null; + } + if (util_1.contains(aggregate_1.SUM_OPS, fieldChannelAggregate)) { + if (util_1.contains([mark_1.BAR, mark_1.AREA], mark)) { + stacked = stacked === undefined ? StackOffset.ZERO : stacked; + } + } + else { + console.warn('Cannot stack when the aggregate function is ' + fieldChannelAggregate + '(non-summative).'); + return null; + } + if (!stacked) { + return null; + } + return { + groupbyChannel: xIsAggregate ? (hasYField ? channel_1.Y : null) : (hasXField ? channel_1.X : null), + fieldChannel: fieldChannel, + stackByChannels: stackByChannels, + offset: stacked + }; + } + return null; +} +exports.stack = stack; + +},{"./aggregate":13,"./channel":16,"./encoding":18,"./mark":19,"./scale":20,"./util":25}],23:[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"; + TimeUnit[TimeUnit["YEARMONTHDATE"] = 'yearmonthdate'] = "YEARMONTHDATE"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURS"] = 'yearmonthdatehours'] = "YEARMONTHDATEHOURS"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTES"] = 'yearmonthdatehoursminutes'] = "YEARMONTHDATEHOURSMINUTES"; + TimeUnit[TimeUnit["YEARMONTHDATEHOURSMINUTESSECONDS"] = 'yearmonthdatehoursminutesseconds'] = "YEARMONTHDATEHOURSMINUTESSECONDS"; + TimeUnit[TimeUnit["MONTHDATE"] = 'monthdate'] = "MONTHDATE"; + 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; +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; +function convert(unit, date) { + var result = new Date(0, 0, 1, 0, 0, 0, 0); + 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: + 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); +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'); +} +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; + } + return scale_1.ScaleType.TIME; +} +exports.defaultScaleType = defaultScaleType; +function fieldExpr(fullTimeUnit, field) { + var fieldRef = 'datum["' + field + '"]'; + function func(timeUnit) { + if (timeUnit === TimeUnit.QUARTER) { + 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; +function imputedDomain(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, 1, 2, 3]; + } + return null; +} +exports.imputedDomain = imputedDomain; +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; +function template(timeUnit, field, shortTimeLabels) { + if (!timeUnit) { + return undefined; + } + var dateComponents = []; + var template = ''; + var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR); + if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) { + template = 'Q{{' + field + ' | quarter}}'; + } + if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) { + dateComponents.push(shortTimeLabels !== false ? '%b' : '%B'); + } + if (containsTimeUnit(timeUnit, TimeUnit.DAY)) { + dateComponents.push(shortTimeLabels ? '%a' : '%A'); + } + else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) { + dateComponents.push('%d' + (hasYear ? ',' : '')); + } + if (hasYear) { + dateComponents.push(shortTimeLabels ? '%y' : '%Y'); + } + 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 dateTimeComponents = []; + if (dateComponents.length > 0) { + dateTimeComponents.push(dateComponents.join(' ')); + } + if (timeComponents.length > 0) { + dateTimeComponents.push(timeComponents.join(':')); + } + if (dateTimeComponents.length > 0) { + if (template) { + template += ' '; + } + template += '{{' + field + ' | time:\'' + dateTimeComponents.join(' ') + '\'}}'; + } + return template || undefined; +} +exports.template = template; + +},{"./channel":16,"./datetime":17,"./scale":20,"./util":25}],24:[function(require,module,exports){ +"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; +exports.SHORT_TYPE = { + quantitative: 'Q', + temporal: 'T', + nominal: 'N', + ordinal: 'O' +}; +exports.TYPE_FROM_SHORT_TYPE = { + Q: exports.QUANTITATIVE, + T: exports.TEMPORAL, + O: exports.ORDINAL, + N: exports.NOMINAL +}; +function getFullName(type) { + var typeString = type; + return exports.TYPE_FROM_SHORT_TYPE[typeString.toUpperCase()] || + typeString.toLowerCase(); +} +exports.getFullName = getFullName; + +},{}],25:[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 util_3 = require('datalib/src/util'); +function pick(obj, props) { + var copy = {}; + props.forEach(function (prop) { + if (obj.hasOwnProperty(prop)) { + copy[prop] = obj[prop]; + } + }); + return copy; +} +exports.pick = pick; +function range(start, stop, step) { + if (arguments.length < 3) { + step = 1; + if (arguments.length < 2) { + stop = start; + start = 0; + } + } + if ((stop - start) / step === Infinity) { + throw new Error('Infinite range'); + } + var range = [], i = -1, j; + if (step < 0) { + while ((j = start + step * ++i) > stop) { + range.push(j); + } + } + else { + while ((j = start + step * ++i) < stop) { + range.push(j); + } + } + return range; +} +exports.range = range; +; +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; +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; +; +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; +} +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; +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/util":8,"json-stable-stringify":9}],26:[function(require,module,exports){ +"use strict"; +var channel_1 = require("vega-lite/src/channel"); +var aggregate_1 = require("vega-lite/src/aggregate"); +var mark_1 = require("vega-lite/src/mark"); +var scale_1 = require("vega-lite/src/scale"); +var sort_1 = require("vega-lite/src/sort"); +var timeunit_1 = require("vega-lite/src/timeunit"); +var type_1 = require("vega-lite/src/type"); +var property_1 = require("./property"); +exports.DEFAULT_QUERY_CONFIG = { + verbose: false, + defaultSpecConfig: { + overlay: { line: true }, + scale: { useRawDomain: true } + }, + propertyPrecedence: property_1.DEFAULT_PROPERTY_PRECEDENCE, + marks: [mark_1.Mark.POINT, mark_1.Mark.BAR, mark_1.Mark.LINE, mark_1.Mark.AREA, mark_1.Mark.TICK], + channels: [channel_1.X, channel_1.Y, channel_1.ROW, channel_1.COLUMN, channel_1.SIZE, channel_1.COLOR], + aggregates: [undefined, aggregate_1.AggregateOp.MEAN], + timeUnits: [undefined, timeunit_1.TimeUnit.YEAR, timeunit_1.TimeUnit.MONTH, timeunit_1.TimeUnit.MINUTES, timeunit_1.TimeUnit.SECONDS], + types: [type_1.Type.NOMINAL, type_1.Type.ORDINAL, type_1.Type.QUANTITATIVE, type_1.Type.TEMPORAL], + maxBinsList: [5, 10, 20], + binMinList: [undefined], + binMaxList: [undefined], + binBaseList: [10], + binStepList: [undefined], + binStepsList: [undefined], + binMinstepList: [undefined], + binDivList: [5, 2], + axisAxisColors: [undefined], + axisAxisWidths: [undefined], + axisLayers: ['front', 'back'], + axisOffsets: [undefined], + axisOrients: [undefined], + axisGridColors: [undefined], + axisGridDashes: [undefined], + axisGridOpacities: [undefined], + axisGridWidths: [undefined], + axisFormats: [undefined], + axisLabelAngles: [undefined], + axisLabelMaxLengths: [undefined], + axisSubDivides: [undefined], + axisTicks: [undefined], + axisTickColors: [undefined], + axisTickLabelColors: [undefined], + axisTickLabelFonts: [undefined], + axisTickLabelFontSizes: [undefined], + axisTickPaddings: [undefined], + axisTickSizes: [undefined], + axisTickSizeMajors: [undefined], + axisTickSizeMinors: [undefined], + axisTickSizeEnds: [undefined], + axisTickWidths: [undefined], + axisValuesList: [undefined], + axisTitles: [undefined], + axisTitleColors: [undefined], + axisTitleFonts: [undefined], + axisTitleFontWeights: [undefined], + axisTitleFontSizes: [undefined], + axisTitleOffsets: [undefined], + axisTitleMaxLengths: [undefined], + axisCharacterWidths: [undefined], + legendOrients: ['left', 'right'], + legendOffsets: [undefined], + legendValuesList: [undefined], + legendFormats: [undefined], + legendLabelAligns: [undefined], + legendLabelBaselines: [undefined], + legendLabelColors: [undefined], + legendLabelFonts: [undefined], + legendLabelFontSizes: [undefined], + legendSymbolColors: [undefined], + legendSymbolShapes: [undefined], + legendSymbolSizes: [undefined], + legendSymbolStrokeWidths: [undefined], + legendTitles: [undefined], + legendTitleColors: [undefined], + legendTitleFonts: [undefined], + legendTitleFontSizes: [undefined], + legendTitleFontWeights: [undefined], + // TODO: Come back and implement correctly when designing sort enumeration. + sorts: [sort_1.SortOrder.ASCENDING, sort_1.SortOrder.DESCENDING], + sortOps: [aggregate_1.AggregateOp.MIN, aggregate_1.AggregateOp.MEAN], + sortOrders: [sort_1.SortOrder.ASCENDING, sort_1.SortOrder.DESCENDING], + scaleBandSizes: [17, 21], + scaleDomains: [undefined], + scaleExponents: [1], + scaleRanges: [undefined], + scaleTypes: [undefined, scale_1.ScaleType.LOG], + numberNominalProportion: 0.05, + numberNominalLimit: 40, + // CONSTRAINTS + constraintManuallySpecifiedValue: false, + // Spec Constraints -- See description inside src/constraints/spec.ts + autoAddCount: false, + hasAppropriateGraphicTypeForMark: true, + omitAggregate: false, + omitAggregatePlotWithDimensionOnlyOnFacet: true, + omitAggregatePlotWithoutDimension: false, + omitBarLineAreaWithOcclusion: true, + omitBarTickWithSize: true, + omitMultipleNonPositionalChannels: true, + omitNonSumStack: true, + omitRaw: false, + omitRawContinuousFieldForAggregatePlot: true, + omitRepeatedField: true, + omitNonPositionalOrFacetOverPositionalChannels: true, + omitTableWithOcclusionIfAutoAddCount: true, + omitVerticalDotPlot: false, + preferredBinAxis: channel_1.Channel.X, + preferredTemporalAxis: channel_1.Channel.X, + preferredOrdinalAxis: channel_1.Channel.Y, + preferredNominalAxis: channel_1.Channel.Y, + preferredFacet: channel_1.Channel.ROW, + // Encoding Constraints -- See description inside src/constraints/encoding.ts + maxCardinalityForCategoricalColor: 20, + maxCardinalityForFacet: 20, + maxCardinalityForShape: 6, + timeUnitShouldHaveVariation: true, + typeMatchesSchemaType: true, + // STYLIZE + stylize: true, + smallBandSizeForHighCardinalityOrFacet: { maxCardinality: 10, bandSize: 12 }, + nominalColorScaleForHighCardinality: { maxCardinality: 10, palette: 'category20' }, + xAxisOnTopForHighYCardinalityWithoutColumn: { maxCardinality: 30 }, + // RANKING PREFERENCE + maxGoodCardinalityForFacet: 5, + maxGoodCardinalityForColor: 7, +}; + +},{"./property":36,"vega-lite/src/aggregate":13,"vega-lite/src/channel":16,"vega-lite/src/mark":19,"vega-lite/src/scale":20,"vega-lite/src/sort":21,"vega-lite/src/timeunit":23,"vega-lite/src/type":24}],27:[function(require,module,exports){ +"use strict"; +/** + * Abstract model for a constraint. + */ +var AbstractConstraintModel = (function () { + function AbstractConstraintModel(constraint) { + this.constraint = constraint; + } + AbstractConstraintModel.prototype.name = function () { + return this.constraint.name; + }; + AbstractConstraintModel.prototype.description = function () { + return this.constraint.description; + }; + AbstractConstraintModel.prototype.properties = function () { + return this.constraint.properties; + }; + AbstractConstraintModel.prototype.strict = function () { + return this.constraint.strict; + }; + return AbstractConstraintModel; +}()); +exports.AbstractConstraintModel = AbstractConstraintModel; + +},{}],28:[function(require,module,exports){ +"use strict"; +var _encoding = require("./encoding"); +var _spec = require("./spec"); +exports.encoding = _encoding; +exports.spec = _spec; + +},{"./encoding":29,"./spec":30}],29:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var aggregate_1 = require("vega-lite/src/aggregate"); +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 base_1 = require("./base"); +var property_1 = require("../property"); +var wildcard_1 = require("../wildcard"); +var schema_1 = require("../schema"); +var util_1 = require("../util"); +var encoding_1 = require("../query/encoding"); +var EncodingConstraintModel = (function (_super) { + __extends(EncodingConstraintModel, _super); + function EncodingConstraintModel(constraint) { + return _super.call(this, constraint) || this; + } + EncodingConstraintModel.prototype.hasAllRequiredPropertiesSpecific = function (encQ) { + return util_1.every(this.constraint.properties, function (prop) { + var nestedEncProp = property_1.getNestedEncodingProperty(prop); + if (nestedEncProp) { + var parent_1 = nestedEncProp.parent; + var child = nestedEncProp.child; + if (!encQ[parent_1]) { + return true; + } + return !wildcard_1.isWildcard(encQ[parent_1][child]); + } + if (!encQ[prop]) { + return true; + } + return !wildcard_1.isWildcard(encQ[prop]); + }); + }; + EncodingConstraintModel.prototype.satisfy = function (encQ, schema, encWildcardIndex, opt) { + // TODO: Re-order logic to optimize the "allowWildcardForProperties" check + if (!this.constraint.allowWildcardForProperties) { + // TODO: extract as a method and do unit test + if (!this.hasAllRequiredPropertiesSpecific(encQ)) { + return true; + } + } + return this.constraint.satisfy(encQ, schema, encWildcardIndex, opt); + }; + return EncodingConstraintModel; +}(base_1.AbstractConstraintModel)); +exports.EncodingConstraintModel = EncodingConstraintModel; +exports.ENCODING_CONSTRAINTS = [ + { + name: 'aggregateOpSupportedByType', + description: 'Aggregate function should be supported by data type.', + properties: [property_1.Property.TYPE, property_1.Property.AGGREGATE], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.aggregate) { + return encQ.type !== type_1.Type.ORDINAL && encQ.type !== type_1.Type.NOMINAL; + } + // TODO: some aggregate function are actually supported by ordinal + return true; // no aggregate is okay with any type. + } + }, { + name: 'asteriskFieldWithCountOnly', + description: 'Field="*" should be disallowed except aggregate="count"', + properties: [property_1.Property.FIELD, property_1.Property.AGGREGATE], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + return (encQ.field === '*') === (encQ.aggregate === aggregate_1.AggregateOp.COUNT); + } + }, { + name: 'binAppliedForQuantitative', + description: 'bin should be applied to quantitative field only.', + properties: [property_1.Property.TYPE, property_1.Property.BIN], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.bin) { + // If binned, the type must be quantitative + return encQ.type === type_1.Type.QUANTITATIVE; + } + return true; + } + }, { + // FIXME(#301) revise this + name: 'channelSupportsRole', + description: 'encoding channel should support the role of the field', + properties: [property_1.Property.CHANNEL, property_1.Property.TYPE, property_1.Property.BIN, property_1.Property.TIMEUNIT], + allowWildcardForProperties: true, + strict: true, + satisfy: function (encQ, _, encWildcardIndex, opt) { + if (wildcard_1.isWildcard(encQ.channel)) + return true; // not ready for checking yet! + if (!encWildcardIndex.channel && !opt.constraintManuallySpecifiedValue) { + // Do not have to check this as this is manually specified by users. + return true; + } + var supportedRole = channel_1.getSupportedRole(encQ.channel); + if (encoding_1.isDimension(encQ)) { + return supportedRole.dimension; + } + else if (encoding_1.isMeasure(encQ)) { + return supportedRole.measure; + } + return true; + } + }, { + name: 'hasFn', + description: 'A field with as hasFn flag should have one of aggregate, timeUnit, or bin.', + properties: [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT], + allowWildcardForProperties: true, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.hasFn) { + return !!encQ.aggregate || !!encQ.bin || !!encQ.timeUnit; + } + return true; + } + }, { + name: 'omitScaleZeroWithBinnedField', + description: 'Do not use scale zero with binned field', + properties: [property_1.Property.SCALE, property_1.Property.SCALE_ZERO, property_1.Property.BIN], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.bin && encQ.scale) { + if (encQ.scale.zero === true) { + return false; + } + } + return true; + } + }, { + name: 'onlyOneTypeOfFunction', + description: 'Only of of aggregate, autoCount, timeUnit, or bin should be applied at the same time.', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN], + allowWildcardForProperties: true, + strict: true, + satisfy: function (encQ, _, __, ___) { + var numFn = (!wildcard_1.isWildcard(encQ.aggregate) && !!encQ.aggregate ? 1 : 0) + + (!wildcard_1.isWildcard(encQ.autoCount) && !!encQ.autoCount ? 1 : 0) + + (!wildcard_1.isWildcard(encQ.bin) && !!encQ.bin ? 1 : 0) + + (!wildcard_1.isWildcard(encQ.timeUnit) && !!encQ.timeUnit ? 1 : 0); + return numFn <= 1; + } + }, { + name: 'timeUnitAppliedForTemporal', + description: 'Time unit should be applied to temporal field only.', + properties: [property_1.Property.TYPE, property_1.Property.TIMEUNIT], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.timeUnit && encQ.type !== type_1.Type.TEMPORAL) { + return false; + } + return true; + } + }, { + name: 'timeUnitShouldHaveVariation', + description: 'A particular time unit should be applied only if they produce unique values.', + properties: [property_1.Property.TIMEUNIT, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: false, + satisfy: function (encQ, schema, encWildcardIndex, opt) { + if (encQ.timeUnit && encQ.type === type_1.Type.TEMPORAL) { + if (!encWildcardIndex.timeUnit && !opt.constraintManuallySpecifiedValue) { + // Do not have to check this as this is manually specified by users. + return true; + } + return schema.timeUnitHasVariation(encQ); + } + return true; + } + }, { + name: 'scalePropertiesSupportedByScaleType', + description: 'Scale properties must be supported by correct scale type', + properties: property_1.SCALE_PROPERTIES.concat([property_1.Property.SCALE, property_1.Property.TYPE]), + allowWildcardForProperties: true, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.scale) { + var scale = encQ.scale; + // If encQ.type is an Wildcard and scale.type is undefined, it is equivalent + // to scale type is Wildcard. If scale type is an Wildcard, we do not yet know + // what the scale type is, and thus can ignore the constraint. + var sType = encoding_1.scaleType(encQ); + if (sType === undefined) { + // If still ambiguous, doesn't check the constraint + return true; + } + for (var scaleProp in scale) { + if (property_1.SUPPORTED_SCALE_PROPERTY_INDEX[scaleProp]) { + if (!util_1.contains(property_1.SUPPORTED_SCALE_PROPERTY_INDEX[scaleProp], sType)) { + return false; + } + } + } + } + return true; + } + }, { + name: 'typeMatchesPrimitiveType', + description: 'Data type should be supported by field\'s primitive type.', + properties: [property_1.Property.FIELD, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, schema, encWildcardIndex, opt) { + if (encQ.field === '*') { + return true; + } + var primitiveType = schema.primitiveType(encQ.field); + var type = encQ.type; + if (!encWildcardIndex.field && !encWildcardIndex.type && !opt.constraintManuallySpecifiedValue) { + // Do not have to check this as this is manually specified by users. + return true; + } + switch (primitiveType) { + case schema_1.PrimitiveType.BOOLEAN: + case schema_1.PrimitiveType.STRING: + return type !== type_1.Type.QUANTITATIVE && type !== type_1.Type.TEMPORAL; + case schema_1.PrimitiveType.NUMBER: + case schema_1.PrimitiveType.INTEGER: + return type !== type_1.Type.TEMPORAL; + case schema_1.PrimitiveType.DATE: + // TODO: add NOMINAL, ORDINAL support after we support this in Vega-Lite + return type === type_1.Type.TEMPORAL; + case null: + // field does not exist in the schema + return false; + } + throw new Error('Not implemented'); + } + }, + { + name: 'typeMatchesSchemaType', + description: 'Enumerated data type of a field should match the field\'s type in the schema.', + properties: [property_1.Property.FIELD, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: false, + satisfy: function (encQ, schema, encWildcardIndex, opt) { + if (!encWildcardIndex.field && !encWildcardIndex.type && !opt.constraintManuallySpecifiedValue) { + // Do not have to check this as this is manually specified by users. + return true; + } + if (encQ.field === '*') { + return encQ.type === type_1.Type.QUANTITATIVE; + } + return schema.type(encQ.field) === encQ.type; + } + }, { + name: 'maxCardinalityForCategoricalColor', + description: 'Categorical channel should not have too high cardinality', + properties: [property_1.Property.CHANNEL, property_1.Property.FIELD], + allowWildcardForProperties: false, + strict: false, + satisfy: function (encQ, schema, _, opt) { + // TODO: missing case where ordinal / temporal use categorical color + // (once we do so, need to add Property.BIN, Property.TIMEUNIT) + if (encQ.channel === channel_1.Channel.COLOR && encQ.type === type_1.Type.NOMINAL) { + return schema.cardinality(encQ) <= opt.maxCardinalityForCategoricalColor; + } + return true; // other channel is irrelevant to this constraint + } + }, { + name: 'maxCardinalityForFacet', + description: 'Row/column channel should not have too high cardinality', + properties: [property_1.Property.CHANNEL, property_1.Property.FIELD, property_1.Property.BIN, property_1.Property.TIMEUNIT], + allowWildcardForProperties: false, + strict: false, + satisfy: function (encQ, schema, _, opt) { + if (encQ.channel === channel_1.Channel.ROW || encQ.channel === channel_1.Channel.COLUMN) { + return schema.cardinality(encQ) <= opt.maxCardinalityForFacet; + } + return true; // other channel is irrelevant to this constraint + } + }, { + name: 'maxCardinalityForShape', + description: 'Shape channel should not have too high cardinality', + properties: [property_1.Property.CHANNEL, property_1.Property.FIELD, property_1.Property.BIN, property_1.Property.TIMEUNIT], + allowWildcardForProperties: false, + strict: false, + satisfy: function (encQ, schema, _, opt) { + if (encQ.channel === channel_1.Channel.SHAPE) { + return schema.cardinality(encQ) <= opt.maxCardinalityForShape; + } + return true; // other channel is irrelevant to this constraint + } + }, { + name: 'dataTypeAndFunctionMatchScaleType', + description: 'Scale type must match data type', + properties: [property_1.Property.TYPE, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN], + allowWildcardForProperties: false, + strict: true, + satisfy: function (encQ, _, __, ___) { + if (encQ.scale) { + var type = encQ.type; + var sType = encoding_1.scaleType(encQ); + if (util_1.contains([type_1.Type.ORDINAL, type_1.Type.NOMINAL], type)) { + return util_1.contains([scale_1.ScaleType.ORDINAL, undefined], sType); + } + else if (type === type_1.Type.TEMPORAL) { + if (!encQ.timeUnit) { + return util_1.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC, undefined], sType); + } + else { + return util_1.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC, scale_1.ScaleType.ORDINAL, undefined], sType); + } + } + else if (type === type_1.Type.QUANTITATIVE) { + if (encQ.bin) { + return util_1.contains([scale_1.ScaleType.LINEAR, undefined], sType); + } + else { + return util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.POW, scale_1.ScaleType.SQRT, scale_1.ScaleType.QUANTILE, scale_1.ScaleType.QUANTIZE, scale_1.ScaleType.LINEAR, undefined], sType); + } + } + } + return true; + } + } +].map(function (ec) { return new EncodingConstraintModel(ec); }); +exports.ENCODING_CONSTRAINT_INDEX = exports.ENCODING_CONSTRAINTS.reduce(function (m, ec) { + m[ec.name()] = ec; + return m; +}, {}); +exports.ENCODING_CONSTRAINTS_BY_PROPERTY = exports.ENCODING_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 checkEncoding(prop, wildcard, index, specM, schema, opt) { + // Check encoding constraint + var encodingConstraints = exports.ENCODING_CONSTRAINTS_BY_PROPERTY[prop] || []; + var encQ = specM.getEncodingQueryByIndex(index); + for (var _i = 0, encodingConstraints_1 = encodingConstraints; _i < encodingConstraints_1.length; _i++) { + var c = encodingConstraints_1[_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(encQ, schema, specM.wildcardIndex.encodings[index], opt); + if (!satisfy) { + var violatedConstraint = '(enc) ' + c.name(); + /* istanbul ignore if */ + if (opt.verbose) { + console.log(violatedConstraint + ' failed with ' + specM.toShorthand() + ' for ' + wildcard.name); + } + return violatedConstraint; + } + } + } + return null; +} +exports.checkEncoding = checkEncoding; + +},{"../property":36,"../query/encoding":37,"../schema":50,"../util":52,"../wildcard":53,"./base":27,"vega-lite/src/aggregate":13,"vega-lite/src/channel":16,"vega-lite/src/scale":20,"vega-lite/src/type":24}],30:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var aggregate_1 = require("vega-lite/src/aggregate"); +var channel_1 = require("vega-lite/src/channel"); +var mark_1 = require("vega-lite/src/mark"); +var scale_1 = require("vega-lite/src/scale"); +var type_1 = require("vega-lite/src/type"); +var base_1 = require("./base"); +var wildcard_1 = require("../wildcard"); +var property_1 = require("../property"); +var encoding_1 = require("../query/encoding"); +var util_1 = require("../util"); +var encoding_2 = require("../query/encoding"); +var NONSPATIAL_CHANNELS_INDEX = channel_1.NONSPATIAL_CHANNELS.reduce(function (m, channel) { + m[channel] = true; + return m; +}, {}); +var SpecConstraintModel = (function (_super) { + __extends(SpecConstraintModel, _super); + function SpecConstraintModel(specConstraint) { + return _super.call(this, specConstraint) || this; + } + SpecConstraintModel.prototype.hasAllRequiredPropertiesSpecific = function (specM) { + return util_1.every(this.constraint.properties, function (prop) { + if (prop === property_1.Property.MARK) { + return !wildcard_1.isWildcard(specM.getMark()); + } + // TODO: transform + var nestedEncProp = property_1.getNestedEncodingProperty(prop); + if (nestedEncProp) { + var parent_1 = nestedEncProp.parent; + var child_1 = nestedEncProp.child; + return util_1.every(specM.getEncodings(), function (encQ) { + if (!encQ[parent_1]) { + return true; + } + return !wildcard_1.isWildcard(encQ[parent_1][child_1]); + }); + } + if (!property_1.isEncodingProperty(prop)) { + throw new Error('UNIMPLEMENTED'); + } + return util_1.every(specM.getEncodings(), function (encQ) { + if (!encQ[prop]) { + return true; + } + return !wildcard_1.isWildcard(encQ[prop]); + }); + }); + }; + SpecConstraintModel.prototype.satisfy = function (specM, schema, opt) { + // TODO: Re-order logic to optimize the "allowWildcardForProperties" check + if (!this.constraint.allowWildcardForProperties) { + if (!this.hasAllRequiredPropertiesSpecific(specM)) { + return true; + } + } + return this.constraint.satisfy(specM, schema, opt); + }; + return SpecConstraintModel; +}(base_1.AbstractConstraintModel)); +exports.SpecConstraintModel = SpecConstraintModel; +exports.SPEC_CONSTRAINTS = [ + { + name: 'noRepeatedChannel', + description: 'Each encoding channel should only be used once.', + properties: [property_1.Property.CHANNEL], + allowWildcardForProperties: true, + strict: true, + satisfy: function (specM, _, __) { + var usedChannel = {}; + // channel for all encodings should be valid + return util_1.every(specM.getEncodings(), function (encQ) { + if (!wildcard_1.isWildcard(encQ.channel)) { + // If channel is specified, it should no be used already + if (usedChannel[encQ.channel]) { + return false; + } + usedChannel[encQ.channel] = true; + return true; + } + return true; // unspecified channel is valid + }); + } + }, + { + name: 'alwaysIncludeZeroInScaleWithBarMark', + description: 'Do not recommend bar mark if scale does not start at zero', + properties: [property_1.Property.MARK, property_1.Property.SCALE, property_1.Property.SCALE_ZERO, property_1.Property.CHANNEL, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: true, + satisfy: function (specM, _, __) { + var mark = specM.getMark(); + var encodings = specM.getEncodings(); + if (mark === mark_1.Mark.BAR) { + for (var _i = 0, encodings_1 = encodings; _i < encodings_1.length; _i++) { + var encQ = encodings_1[_i]; + if ((encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) && + (encQ.type === type_1.Type.QUANTITATIVE) && + (encQ.scale && encQ.scale.zero === false)) { + // TODO: zero shouldn't be manually specified + return false; + } + } + } + return true; + } + }, + { + name: 'autoAddCount', + description: 'Automatically adding count only for plots with only ordinal, binned quantitative, or temporal with timeunit fields.', + properties: [property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.TYPE, property_1.Property.AUTOCOUNT], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, __) { + var hasAutoCount = util_1.some(specM.getEncodings(), function (encQ) { return encQ.autoCount === true; }); + if (hasAutoCount) { + // Auto count should only be applied if all fields are nominal, ordinal, temporal with timeUnit, binned quantitative, or autoCount + return util_1.every(specM.getEncodings(), function (encQ) { + if (encQ.autoCount !== undefined) { + return true; + } + switch (encQ.type) { + case type_1.Type.QUANTITATIVE: + return !!encQ.bin; + case type_1.Type.TEMPORAL: + return !!encQ.timeUnit; + case type_1.Type.ORDINAL: + case type_1.Type.NOMINAL: + return true; + } + /* istanbul ignore next */ + throw new Error('Unsupported Type'); + }); + } + else { + var neverHaveAutoCount = util_1.every(specM.wildcardIndex.encodingIndicesByProperty['autoCount'], function (index) { + return !wildcard_1.isWildcard(specM.getEncodingQueryByIndex(index).autoCount); + }); + if (neverHaveAutoCount) { + // If the query surely does not have autoCount + // then one of the field should be + // (1) unbinned quantitative + // (2) temporal without time unit + // (3) nominal or ordinal field + // or at least have potential to be (still ambiguous). + return util_1.some(specM.getEncodings(), function (encQ) { + if (encQ.type === type_1.Type.QUANTITATIVE) { + if (encQ.autoCount === false) { + return false; + } + else { + return !encQ.bin || wildcard_1.isWildcard(encQ.bin); + } + } + else if (encQ.type === type_1.Type.TEMPORAL) { + return !encQ.timeUnit || wildcard_1.isWildcard(encQ.timeUnit); + } + return false; // nominal or ordinal + }); + } + } + return true; // no auto count, no constraint + } + }, + { + name: 'channelPermittedByMarkType', + description: 'Each encoding channel should be supported by the mark type', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK], + allowWildcardForProperties: true, + strict: true, + satisfy: function (specM, _, __) { + var mark = specM.getMark(); + // if mark is unspecified, no need to check + if (wildcard_1.isWildcard(mark)) + return true; + // TODO: can optimize this to detect only what's the changed property if needed. + return util_1.every(specM.getEncodings(), function (encQ) { + // channel unspecified, no need to check + if (wildcard_1.isWildcard(encQ.channel)) + return true; + return channel_1.supportMark(encQ.channel, mark); + }); + } + }, + { + name: 'hasAllRequiredChannelsForMark', + description: 'All required channels for the specified mark should be specified', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK], + allowWildcardForProperties: false, + strict: true, + satisfy: function (specM, _, __) { + var mark = specM.getMark(); + switch (mark) { + case mark_1.Mark.AREA: + case mark_1.Mark.LINE: + return specM.channelUsed(channel_1.Channel.X) && specM.channelUsed(channel_1.Channel.Y); + case mark_1.Mark.TEXT: + return specM.channelUsed(channel_1.Channel.TEXT); + case mark_1.Mark.BAR: + case mark_1.Mark.CIRCLE: + case mark_1.Mark.SQUARE: + case mark_1.Mark.TICK: + case mark_1.Mark.RULE: + return specM.channelUsed(channel_1.Channel.X) || specM.channelUsed(channel_1.Channel.Y); + case mark_1.Mark.POINT: + // This allows generating a point plot if channel was not a wildcard. + return !specM.wildcardIndex.hasProperty(property_1.Property.CHANNEL) || + specM.channelUsed(channel_1.Channel.X) || specM.channelUsed(channel_1.Channel.Y); + } + /* istanbul ignore next */ + throw new Error('hasAllRequiredChannelsForMark not implemented for mark' + mark); + } + }, + { + name: 'omitAggregate', + description: 'Omit aggregate plots.', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, __) { + if (specM.isAggregate()) { + return false; + } + return true; + } + }, + { + name: 'omitAggregatePlotWithDimensionOnlyOnFacet', + description: 'All required channels for the specified mark should be specified', + properties: [property_1.Property.CHANNEL, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, opt) { + if (specM.isAggregate()) { + var hasNonFacetDim_1 = false, hasDim_1 = false, hasEnumeratedFacetDim_1 = false; + specM.specQuery.encodings.forEach(function (encQ, index) { + if (encQ.autoCount === false) + return; // skip unused field + if (!encQ.aggregate && !encQ.autoCount) { + hasDim_1 = true; + if (util_1.contains([channel_1.Channel.ROW, channel_1.Channel.COLUMN], encQ.channel)) { + if (specM.wildcardIndex.hasEncodingProperty(index, property_1.Property.CHANNEL)) { + hasEnumeratedFacetDim_1 = true; + } + } + else { + hasNonFacetDim_1 = true; + } + } + }); + if (hasDim_1 && !hasNonFacetDim_1) { + if (hasEnumeratedFacetDim_1 || opt.constraintManuallySpecifiedValue) { + return false; + } + } + } + return true; + } + }, + { + name: 'omitAggregatePlotWithoutDimension', + description: 'Aggregate plots without dimension should be omitted', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, __) { + if (specM.isAggregate()) { + // TODO relax + return util_1.some(specM.getEncodings(), function (encQ) { + if (encoding_1.isDimension(encQ)) { + return true; + } + return false; + }); + } + return true; + } + }, + { + // TODO: we can be smarter and check if bar has occlusion based on profiling statistics + name: 'omitBarLineAreaWithOcclusion', + description: 'Don\'t use bar, line or area to visualize raw plot as they often lead to occlusion.', + properties: [property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, __) { + if (util_1.contains([mark_1.Mark.BAR, mark_1.Mark.LINE, mark_1.Mark.AREA], specM.getMark())) { + return specM.isAggregate(); + } + return true; + } + }, + { + name: 'omitBarTickWithSize', + description: 'Do not map field to size channel with bar and tick mark', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, opt) { + var mark = specM.getMark(); + if (util_1.contains([mark_1.Mark.TICK, mark_1.Mark.BAR], mark)) { + if (specM.channelUsed(channel_1.Channel.SIZE)) { + if (opt.constraintManuallySpecifiedValue) { + // If size is used and we constraintManuallySpecifiedValue, + // then the spec violates this constraint. + return false; + } + else { + // Otherwise have to search for the size channel and check if it is enumerated + var encodings = specM.specQuery.encodings; + for (var i = 0; i < encodings.length; i++) { + var encQ = encodings[i]; + if (encQ.channel === channel_1.Channel.SIZE) { + if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) { + // If enumerated, then this is bad + return false; + } + else { + // If it's manually specified, no need to continue searching, just return. + return true; + } + } + } + } + } + } + return true; // skip + } + }, + { + name: 'omitBarAreaForLogScale', + description: 'Do not use bar and area mark for x and y\'s log scale', + properties: [property_1.Property.MARK, property_1.Property.CHANNEL, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TYPE], + allowWildcardForProperties: false, + strict: true, + satisfy: function (specM, _, __) { + var mark = specM.getMark(); + var encodings = specM.getEncodings(); + // TODO: mark or scale type should be enumerated + if (mark === mark_1.Mark.AREA || mark === mark_1.Mark.BAR) { + for (var _i = 0, encodings_2 = encodings; _i < encodings_2.length; _i++) { + var encQ = encodings_2[_i]; + if ((encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) && encQ.scale) { + var sType = encoding_2.scaleType(encQ); + if (sType === scale_1.ScaleType.LOG) { + return false; + } + } + } + } + return true; + } + }, + { + name: 'omitMultipleNonPositionalChannels', + description: 'Unless manually specified, do not use multiple non-positional encoding channel to avoid over-encoding.', + properties: [property_1.Property.CHANNEL], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, opt) { + // have to use specM.specQuery.encodings insetad of specM.getEncodings() + // since specM.getEncodings() remove encQ with autoCount===false from the array + // and thus might shift the index + var encodings = specM.specQuery.encodings; + var nonPositionChannelCount = 0; + var hasEnumeratedNonPositionChannel = false; + for (var i = 0; i < encodings.length; i++) { + var encQ = encodings[i]; + if (encQ.autoCount === false) + continue; // ignore skipped encoding + var channel = encQ.channel; + if (!wildcard_1.isWildcard(channel)) { + if (NONSPATIAL_CHANNELS_INDEX[channel + '']) { + nonPositionChannelCount += 1; + if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) { + hasEnumeratedNonPositionChannel = true; + } + if (nonPositionChannelCount > 1 && + (hasEnumeratedNonPositionChannel || opt.constraintManuallySpecifiedValue)) { + return false; + } + } + } + } + return true; + } + }, + { + name: 'omitNonPositionalOrFacetOverPositionalChannels', + description: 'Do not use non-positional channels unless all positional channels are used', + properties: [property_1.Property.CHANNEL], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, opt) { + var encodings = specM.specQuery.encodings; + var hasNonPositionalChannelOrFacet = false; + var hasEnumeratedNonPositionOrFacetChannel = false; + var hasX = false, hasY = false; + for (var i = 0; i < encodings.length; i++) { + var encQ = encodings[i]; + if (encQ.autoCount === false) + continue; // ignore skipped encoding + var channel = encQ.channel; + if (channel === channel_1.Channel.X) { + hasX = true; + } + else if (channel === channel_1.Channel.Y) { + hasY = true; + } + else if (!wildcard_1.isWildcard(channel)) { + // All non positional channel / Facet + hasNonPositionalChannelOrFacet = true; + if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) { + hasEnumeratedNonPositionOrFacetChannel = true; + } + } + } + if (hasEnumeratedNonPositionOrFacetChannel || + (opt.constraintManuallySpecifiedValue && hasNonPositionalChannelOrFacet)) { + return hasX && hasY; + } + return true; + } + }, + { + name: 'omitRaw', + description: 'Omit raw plots.', + properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, __) { + 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], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, opt) { + if (specM.isAggregate()) { + var encodings = specM.specQuery.encodings; + for (var i = 0; i < encodings.length; i++) { + var encQ = encodings[i]; + if (encQ.autoCount === false) + continue; // skip unused encoding + // TODO: aggregate for ordinal and temporal + if (encQ.type === type_1.Type.TEMPORAL) { + // Temporal fields should have timeUnit or is still a wildcard + if (!encQ.timeUnit && (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.TIMEUNIT) || + opt.constraintManuallySpecifiedValue)) { + return false; + } + } + if (encQ.type === type_1.Type.QUANTITATIVE) { + if (!encQ.bin && !encQ.aggregate && !encQ.autoCount) { + // If Raw Q + if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.BIN) || + specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.AGGREGATE) || + specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.AUTOCOUNT)) { + // and it's raw from enumeration + return false; + } + if (opt.constraintManuallySpecifiedValue) { + // or if we constraintManuallySpecifiedValue + return false; + } + } + } + } + } + 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], + allowWildcardForProperties: false, + strict: true, + satisfy: function (specM, _, opt) { + if (specM.isAggregate()) { + return true; + } + return util_1.every(specM.specQuery.encodings, function (encQ, index) { + if (encQ.autoCount === false) + return true; // ignore autoCount field + if (encQ.channel === channel_1.Channel.DETAIL) { + // Detail channel for raw plot is not good, except when its enumerated + // or when it's manually specified but we constraintManuallySpecifiedValue. + if (specM.wildcardIndex.hasEncodingProperty(index, property_1.Property.CHANNEL) || + opt.constraintManuallySpecifiedValue) { + return false; + } + } + return true; + }); + } + }, + { + name: 'omitRepeatedField', + description: 'Each field should be mapped to only one channel', + properties: [property_1.Property.FIELD], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, opt) { + var fieldUsed = {}; + var fieldEnumerated = {}; + var encodings = specM.specQuery.encodings; + for (var i = 0; i < encodings.length; i++) { + var encQ = encodings[i]; + if (encQ.field && !wildcard_1.isWildcard(encQ.field)) { + var field = encQ.field; + if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.FIELD)) { + fieldEnumerated[field] = true; + } + // When the field is specified previously, + // if it is enumerated (either previously or in this encQ) + // or if the opt.constraintManuallySpecifiedValue is true, + // then it violates the constraint. + if (fieldUsed[field]) { + if (fieldEnumerated[field] || opt.constraintManuallySpecifiedValue) { + return false; + } + } + fieldUsed[field] = true; + } + } + return true; + } + }, + // TODO: omitShapeWithBin + { + name: 'omitVerticalDotPlot', + description: 'Do not output vertical dot plot.', + properties: [property_1.Property.CHANNEL], + allowWildcardForProperties: true, + strict: false, + satisfy: function (specM, _, __) { + 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], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, __) { + 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: 'omitNonLinearScaleTypeWithStack', + description: 'Stacked plot should only use linear scale', + properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TYPE], + // TODO: Property.STACK + allowWildcardForProperties: false, + strict: true, + satisfy: function (specM, _, __) { + var stack = specM.stack(); + if (stack) { + for (var _i = 0, _a = specM.getEncodings(); _i < _a.length; _i++) { + var encQ = _a[_i]; + if ((!!encQ.aggregate || encQ.autoCount === true) && + encQ.type === type_1.Type.QUANTITATIVE && + util_1.contains([channel_1.Channel.X, channel_1.Channel.Y], encQ.channel)) { + if (encoding_2.scaleType(encQ) !== scale_1.ScaleType.LINEAR) { + return false; + } + } + } + } + return true; + } + }, + { + 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], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, __) { + 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], + allowWildcardForProperties: false, + strict: false, + satisfy: function (specM, _, 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, wildcard, specM, schema, opt) { + // Check encoding constraint + var specConstraints = exports.SPEC_CONSTRAINTS_BY_PROPERTY[prop] || []; + for (var _i = 0, specConstraints_1 = specConstraints; _i < specConstraints_1.length; _i++) { + var c = specConstraints_1[_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 ' + wildcard.name); + } + return violatedConstraint; + } + } + } + return null; +} +exports.checkSpec = checkSpec; + +},{"../property":36,"../query/encoding":37,"../util":52,"../wildcard":53,"./base":27,"vega-lite/src/aggregate":13,"vega-lite/src/channel":16,"vega-lite/src/mark":19,"vega-lite/src/scale":20,"vega-lite/src/type":24}],31:[function(require,module,exports){ +"use strict"; +exports.version = '0.7.0'; +var util_1 = require("./util"); +exports.config = require("./config"); +exports.constraint = require("./constraint/constraint"); +exports.enumerate = require("./enumerator"); +exports.wildcard = require("./wildcard"); +var generate_1 = require("./generate"); +exports.generate = generate_1.generate; +exports.model = require("./model"); +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"); + +},{"./config":26,"./constraint/constraint":28,"./enumerator":32,"./generate":33,"./model":34,"./nest":35,"./property":36,"./query/query":39,"./ranking/ranking":49,"./schema":50,"./util":52,"./wildcard":53}],32:[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 (wildcardIndex, schema, opt) { + return function (answerSet, specM) { + var markWildcard = specM.getMark(); + // enumerate the value + markWildcard.enum.forEach(function (mark) { + specM.setMark(mark); + // Check spec constraint + var violatedSpecConstraint = spec_1.checkSpec(property_1.Property.MARK, wildcardIndex.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 (wildcardIndex, schema, opt) { + return function (answerSet, specM) { + // index of encoding mappings that require enumeration + var indices = wildcardIndex.encodingIndicesByProperty[prop]; + function enumerate(jobIndex) { + if (jobIndex === indices.length) { + // emit and terminate + answerSet.push(specM.duplicate()); + return; + } + var index = indices[jobIndex]; + var wildcard = wildcardIndex.encodings[index][prop]; + var encQ = specM.getEncodingQueryByIndex(index); + var propWildcard = 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 + !propWildcard) { + enumerate(jobIndex + 1); + } + else { + wildcard.enum.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, wildcard); + // Check encoding constraint + var violatedEncodingConstraint = encoding_1.checkEncoding(prop, wildcard, index, specM, schema, opt); + if (violatedEncodingConstraint) { + return; // do not keep searching + } + // Check spec constraint + var violatedSpecConstraint = spec_1.checkSpec(prop, wildcard, 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, wildcard); + } + } + // start enumerating from 0 + enumerate(0); + return answerSet; + }; + }; +} +exports.EncodingPropertyGeneratorFactory = EncodingPropertyGeneratorFactory; + +},{"./constraint/encoding":29,"./constraint/spec":30,"./property":36}],33:[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 wildcardIndex + var specM = model_1.SpecQueryModel.build(specQ, schema, opt); + var wildcardIndex = specM.wildcardIndex; + // 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 wildcard for this prop + if (wildcardIndex.hasProperty(prop)) { + // update answerset + var reducer = enumerator_1.ENUMERATOR_INDEX[prop](wildcardIndex, schema, opt); + answerSet = answerSet.reduce(reducer, []); + } + }); + if (opt.stylize) { + if ((opt.nominalColorScaleForHighCardinality !== null) || + (opt.smallBandSizeForHighCardinalityOrFacet !== null) || + (opt.xAxisOnTopForHighYCardinalityWithoutColumn !== null)) { + return stylize_1.stylize(answerSet, schema, opt); + } + } + return answerSet; +} +exports.generate = generate; + +},{"../src/enumerator":32,"./config":26,"./model":34,"./stylize":51}],34:[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 wildcard_1 = require("./wildcard"); +var wildcardindex_1 = require("./wildcardindex"); +var spec_1 = require("./query/spec"); +var encoding_1 = require("./query/encoding"); +var groupby_1 = require("./query/groupby"); +var shorthand_1 = require("./query/shorthand"); +var util_1 = require("./util"); +/** + * Internal class for specQuery that provides helper for the enumeration process. + */ +var SpecQueryModel = (function () { + function SpecQueryModel(spec, wildcardIndex, schema, opt, wildcardAssignment) { + this._rankingScore = {}; + this._spec = spec; + this._channelCount = spec.encodings.reduce(function (m, encQ) { + if (!wildcard_1.isWildcard(encQ.channel) && encQ.autoCount !== false) { + m[encQ.channel + ''] = 1; + } + return m; + }, {}); + this._wildcardIndex = wildcardIndex; + this._wildcardAssignment = wildcardAssignment; + this._opt = opt; + this._schema = schema; + } + /** + * Build an WildcardIndex by detecting enumeration specifiers + * in the input specQuery and replace short wildcards with + * full ones that includes both names and enumValues. + * + * @return a SpecQueryModel that wraps the specQuery and the WildcardIndex. + */ + SpecQueryModel.build = function (specQ, schema, opt) { + var wildcardIndex = new wildcardindex_1.WildcardIndex(); + // mark + if (wildcard_1.isWildcard(specQ.mark)) { + var name_1 = wildcard_1.getDefaultName(property_1.Property.MARK); + specQ.mark = wildcard_1.initWildcard(specQ.mark, name_1, opt.marks); + wildcardIndex.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 wildcard if not specified + encQ.type = wildcard_1.SHORT_WILDCARD; + } + // For each property of the encodingQuery, enumerate + property_1.ENCODING_PROPERTIES.forEach(function (prop) { + if (wildcard_1.isWildcard(encQ[prop])) { + // Assign default wildcard name and enum values. + var defaultWildcardName = wildcard_1.getDefaultName(prop) + index; + var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt); + var wildcard = encQ[prop] = wildcard_1.initWildcard(encQ[prop], defaultWildcardName, defaultEnumValues); + // Add index of the encoding mapping to the property's wildcard index. + wildcardIndex.setEncodingProperty(index, prop, wildcard); + } + }); + // 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 (wildcard_1.isWildcard(propObj[child])) { + // Assign default wildcard name and enum values. + var defaultWildcardName = wildcard_1.getDefaultName(prop) + index; + var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt); + var wildcard = propObj[child] = wildcard_1.initWildcard(propObj[child], defaultWildcardName, defaultEnumValues); + // Add index of the encoding mapping to the property's wildcard index. + wildcardIndex.setEncodingProperty(index, prop, wildcard); + } + } + }); + }); + // AUTO COUNT + // Add Auto Count Field + if (opt.autoAddCount) { + var countEncQ = { + channel: { + name: wildcard_1.getDefaultName(property_1.Property.CHANNEL) + specQ.encodings.length, + enum: wildcard_1.getDefaultEnumValues(property_1.Property.CHANNEL, schema, opt) + }, + autoCount: { + name: wildcard_1.getDefaultName(property_1.Property.AUTOCOUNT) + specQ.encodings.length, + enum: [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 wildcard index. + wildcardIndex.setEncodingProperty(index, property_1.Property.CHANNEL, countEncQ.channel); + wildcardIndex.setEncodingProperty(index, property_1.Property.AUTOCOUNT, countEncQ.autoCount); + } + return new SpecQueryModel(specQ, wildcardIndex, schema, opt, {}); + }; + Object.defineProperty(SpecQueryModel.prototype, "wildcardIndex", { + get: function () { + return this._wildcardIndex; + }, + 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._wildcardIndex, this._schema, this._opt, util_1.duplicate(this._wildcardAssignment)); + }; + SpecQueryModel.prototype.setMark = function (mark) { + var name = this._spec.mark.name; + this._wildcardAssignment[name] = this._spec.mark = mark; + }; + SpecQueryModel.prototype.resetMark = function () { + var wildcard = this._spec.mark = this._wildcardIndex.mark; + delete this._wildcardAssignment[wildcard.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, wildcard) { + var encQ = this._spec.encodings[index]; + var nestedProp = property_1.getNestedEncodingProperty(prop); + if (prop === property_1.Property.CHANNEL && encQ.channel && !wildcard_1.isWildcard(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 + { enum: undefined, name: undefined } // except name and values to it no longer an wildcard + ); + } + else { + encQ[prop] = value; + } + this._wildcardAssignment[wildcard.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, wildcard) { + 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 wildcard + if (nestedProp) { + encQ[nestedProp.parent][nestedProp.child] = wildcard; + } + else { + encQ[prop] = wildcard; + } + // add remove value that is reset from the assignment map + delete this._wildcardAssignment[wildcard.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, _a = this._spec.encodings; _i < _a.length; _i++) { + var specEncoding = _a[_i]; + if (specEncoding.channel === channel) { + return specEncoding; + } + } + 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 (groupBy) { + if (groupBy) { + var include = {}, replace = {}; + var parsedGroupBy = groupby_1.parse(groupBy, include, replace); + return shorthand_1.spec(this._spec, include, parsedGroupBy.replacer); + } + return shorthand_1.spec(this._spec); + }; + SpecQueryModel.prototype._encoding = function () { + var encoding = {}; + for (var _i = 0, _a = this._spec.encodings; _i < _a.length; _i++) { + var encQ = _a[_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 a wildcard, return null + if (wildcard_1.isWildcard(encQ.channel)) + return null; + // assemble other property into a field def. + var PROPERTIES = [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.FIELD, property_1.Property.TYPE, property_1.Property.SCALE, property_1.Property.SORT, property_1.Property.AXIS, property_1.Property.LEGEND]; + // TODO(#226): + // write toSpec() and toShorthand() in a way that prevents outputting inapplicable scale, sort, axis / legend + for (var _b = 0, PROPERTIES_1 = PROPERTIES; _b < PROPERTIES_1.length; _b++) { + var prop = PROPERTIES_1[_b]; + // if the property is a wildcard, return null + if (wildcard_1.isWildcard(encQ[prop])) + return null; + // otherwise, assign the proper to the field def + if (encQ[prop] !== undefined) { + if (!shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop] || + shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop][encQ.channel]) { + fieldDef[prop] = encQ[prop]; + } + } + } + if (fieldDef.bin === false) { + // exclude bin false + delete fieldDef.bin; + } + 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 (wildcard_1.isWildcard(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; +var SpecQueryModelGroup = (function () { + function SpecQueryModelGroup(name, path, items, groupBy, orderGroupBy) { + if (name === void 0) { name = ''; } + if (path === void 0) { path = ''; } + if (items === void 0) { items = []; } + if (groupBy === void 0) { groupBy = undefined; } + if (orderGroupBy === void 0) { orderGroupBy = undefined; } + this._name = name; + this._path = path; + this._items = items; + this._groupBy = groupBy; + this._orderGroupBy = orderGroupBy; + } + SpecQueryModelGroup.prototype.getTopSpecQueryModel = function () { + var topItem = this._items[0]; + if (topItem instanceof SpecQueryModelGroup) { + return topItem.getTopSpecQueryModel(); + } + else { + return topItem; + } + }; + Object.defineProperty(SpecQueryModelGroup.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpecQueryModelGroup.prototype, "items", { + get: function () { + return this._items; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpecQueryModelGroup.prototype, "groupBy", { + get: function () { + return this._groupBy; + }, + set: function (groupBy) { + this._groupBy = groupBy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpecQueryModelGroup.prototype, "orderGroupBy", { + get: function () { + return this._orderGroupBy; + }, + set: function (orderGroupBy) { + this._orderGroupBy = orderGroupBy; + }, + enumerable: true, + configurable: true + }); + return SpecQueryModelGroup; +}()); +exports.SpecQueryModelGroup = SpecQueryModelGroup; + +},{"./property":36,"./query/encoding":37,"./query/groupby":38,"./query/shorthand":40,"./query/spec":41,"./util":52,"./wildcard":53,"./wildcardindex":54,"vega-lite/src/aggregate":13,"vega-lite/src/type":24}],35:[function(require,module,exports){ +"use strict"; +var channel_1 = require("vega-lite/src/channel"); +var util_1 = require("datalib/src/util"); +var model_1 = require("./model"); +var property_1 = require("./property"); +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) { + if (query.nest) { + var rootGroup_1 = new model_1.SpecQueryModelGroup(); + var groupIndex_1 = {}; + // 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 = []; + var replacers_1 = []; + for (var l = 0; l < query.nest.length; l++) { + includes_1.push(l > 0 ? util_2.duplicate(includes_1[l - 1]) : {}); + replaces.push(l > 0 ? util_2.duplicate(replaces[l - 1]) : {}); + var groupBy = query.nest[l].groupBy; + if (util_1.isArray(groupBy)) { + var parsedGroupBy = groupby_1.parse(groupBy, includes_1[l], replaces[l]); + replacers_1.push(parsedGroupBy.replacer); + } + } + // With includes and replacers, now we can construct the nesting tree + specModels.forEach(function (specM) { + var path = ''; + var group = rootGroup_1; + 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_1[path]) { + groupIndex_1[path] = new model_1.SpecQueryModelGroup(key, path, []); + group.items.push(groupIndex_1[path]); + } + group = groupIndex_1[path]; + } + group.items.push(specM); + }); + return rootGroup_1; + } + else { + // no nesting, just return a flat group + return new model_1.SpecQueryModelGroup('', '', specModels); + } +} +exports.nest = nest; +// TODO: move this to groupBy, rename properly, and export +var GROUP_BY_FIELD = [property_1.Property.FIELD]; +var PARSED_GROUP_BY_FIELD = groupby_1.parse(GROUP_BY_FIELD, {}, {}); +registerKeyFn(exports.FIELD, function (specM) { + return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_FIELD.include, PARSED_GROUP_BY_FIELD.replacer); +}); +// TODO: move this to groupBy, rename properly, and export +var GROUP_BY_FIELD_TRANSFORM = [ + property_1.Property.FIELD, property_1.Property.TYPE, + property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.STACK +]; +var PARSED_GROUP_BY_FIELD_TRANSFORM = groupby_1.parse(GROUP_BY_FIELD_TRANSFORM, {}, {}); +registerKeyFn(exports.FIELD_TRANSFORM, function (specM) { + return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_FIELD_TRANSFORM.include, PARSED_GROUP_BY_FIELD_TRANSFORM.replacer); +}); +// TODO: move this to groupBy, rename properly, and export +var GROUP_BY_ENCODING = GROUP_BY_FIELD_TRANSFORM.concat([ + { + property: property_1.Property.CHANNEL, + replace: { + 'x': 'xy', 'y': 'xy', + 'color': 'style', 'size': 'style', 'shape': 'style', 'opacity': 'style', + 'row': 'facet', 'column': 'facet' + } + } +]); +var PARSED_GROUP_BY_ENCODING = groupby_1.parse(GROUP_BY_ENCODING, {}, {}); +function stringifyStack(specM) { + var _stack = spec_1.stack(specM.specQuery); + return (!!_stack ? 'stack=' + _stack.offset + '|' : ''); +} +registerKeyFn(exports.ENCODING, function (specM) { + return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_ENCODING.include, PARSED_GROUP_BY_ENCODING.replacer); +}); +// TODO: rename, provide similar format +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); }); + +},{"./model":34,"./property":36,"./query/groupby":38,"./query/shorthand":40,"./query/spec":41,"./util":52,"datalib/src/util":8,"vega-lite/src/channel":16}],36:[function(require,module,exports){ +"use strict"; +var util_1 = require("./util"); +var scale_1 = require("vega-lite/src/scale"); +var Property; +(function (Property) { + Property.MARK = 'mark'; + Property.FILTER = 'filter'; + // TODO: Sub-properties for filter + Property.CALCULATE = 'calculate'; + // TODO: Sub-properties for calculate + Property.FILTERINVALID = 'filterInvalid'; + // Layout + Property.STACK = 'stack'; + // TODO: sub parts of stack + // Encoding Properties + Property.CHANNEL = 'channel'; + Property.AGGREGATE = 'aggregate'; + Property.AUTOCOUNT = 'autoCount'; + Property.BIN = 'bin'; + Property.BIN_MAXBINS = 'binMaxbins'; + Property.BIN_MIN = 'binMin'; + Property.BIN_MAX = 'binMax'; + Property.BIN_BASE = 'binBase'; + Property.BIN_STEP = 'binStep'; + Property.BIN_STEPS = 'binSteps'; + Property.BIN_MINSTEP = 'binMinstep'; + Property.BIN_DIV = 'binDiv'; + Property.HAS_FN = 'hasFn'; + Property.TIMEUNIT = 'timeUnit'; + Property.FIELD = 'field'; + Property.TYPE = 'type'; + // - Sort + Property.SORT = 'sort'; + Property.SORT_FIELD = 'sortField'; + Property.SORT_OP = 'sortOp'; + Property.SORT_ORDER = 'sortOrder'; + // - Scale + Property.SCALE = 'scale'; + Property.SCALE_BANDSIZE = 'scaleBandSize'; + Property.SCALE_CLAMP = 'scaleClamp'; + Property.SCALE_DOMAIN = 'scaleDomain'; + Property.SCALE_EXPONENT = 'scaleExponent'; + Property.SCALE_NICE = 'scaleNice'; + Property.SCALE_RANGE = 'scaleRange'; + Property.SCALE_ROUND = 'scaleRound'; + Property.SCALE_TYPE = 'scaleType'; + Property.SCALE_USERAWDOMAIN = 'scaleUseRawDomain'; + Property.SCALE_ZERO = 'scaleZero'; + // - Axis + Property.AXIS = 'axis'; + // General Axis Properties + Property.AXIS_AXISCOLOR = 'axisAxisColor'; + Property.AXIS_AXISWIDTH = 'axisAxisWidth'; + Property.AXIS_LAYER = 'axisLayer'; + Property.AXIS_OFFSET = 'axisOffset'; + Property.AXIS_ORIENT = 'axisOrient'; + // Axis_Grid Properties + Property.AXIS_GRID = 'axisGrid'; + Property.AXIS_GRIDCOLOR = 'axisGridColor'; + Property.AXIS_GRIDDASH = 'axisGridDash'; + Property.AXIS_GRIDOPACITY = 'axisGridOpacity'; + Property.AXIS_GRIDWIDTH = 'axisGridWidth'; + // Axis Properties + Property.AXIS_LABELS = 'axisLabels'; + Property.AXIS_FORMAT = 'axisFormat'; + Property.AXIS_LABELANGLE = 'axisLabelAngle'; + Property.AXIS_LABELMAXLENGTH = 'axisLabelMaxLength'; + Property.AXIS_SHORTTIMELABELS = 'axisShortTimeLabels'; + // Axis_Tick Properties + Property.AXIS_SUBDIVIDE = 'axisSubdivide'; + Property.AXIS_TICKS = 'axisTicks'; + Property.AXIS_TICKCOLOR = 'axisTickColor'; + Property.AXIS_TICKLABELCOLOR = 'axisTickLabelColor'; + Property.AXIS_TICKLABELFONT = 'axisTickLabelFont'; + Property.AXIS_TICKLABELFONTSIZE = 'axisTickLabelFontSize'; + Property.AXIS_TICKPADDING = 'axisTickPadding'; + Property.AXIS_TICKSIZE = 'axisTickSize'; + Property.AXIS_TICKSIZEMAJOR = 'axisTickSizeMajor'; + Property.AXIS_TICKSIZEMINOR = 'axisTickSizeMinor'; + Property.AXIS_TICKSIZEEND = 'axisTickSizeEnd'; + Property.AXIS_TICKWIDTH = 'axisTickWidth'; + Property.AXIS_VALUES = 'axisValues'; + // Axis_Title Properties + Property.AXIS_TITLE = 'axisTitle'; + Property.AXIS_TITLECOLOR = 'axisTitleColor'; + Property.AXIS_TITLEFONT = 'axisTitleFont'; + Property.AXIS_TITLEFONTSIZE = 'axisTitleFontSize'; + Property.AXIS_TITLEFONTWEIGHT = 'axisTitleFontWeight'; + Property.AXIS_TITLEOFFSET = 'axisTitleOffset'; + Property.AXIS_TITLEMAXLENGTH = 'axisTitleMaxLength'; + Property.AXIS_CHARACTERWIDTH = 'axisCharacterWidth'; + // - Legend + Property.LEGEND = 'legend'; + // General Legend Properties + Property.LEGEND_ORIENT = 'legendOrient'; + Property.LEGEND_OFFSET = 'legendOffset'; + Property.LEGEND_VALUES = 'legendValues'; + // Legend_Label Properties + Property.LEGEND_FORMAT = 'legendFormat'; + Property.LEGEND_LABELALIGN = 'legendLabelAlign'; + Property.LEGEND_LABELBASELINE = 'legendLabelBaseline'; + Property.LEGEND_LABELCOLOR = 'legendLabelColor'; + Property.LEGEND_LABELFONT = 'legendLabelFont'; + Property.LEGEND_LABELFONTSIZE = 'legendLabelFontSize'; + Property.LEGEND_SHORTTIMELABELS = 'legendShortTimeLabels'; + // Legend_Symbol Properties + Property.LEGEND_SYMBOLCOLOR = 'legendSymbolColor'; + Property.LEGEND_SYMBOLSHAPE = 'legendSymbolShape'; + Property.LEGEND_SYMBOLSIZE = 'legendSymbolSize'; + Property.LEGEND_SYMBOLSTROKEWIDTH = 'legendSymbolStrokeWidth'; + // Legend_Title Properties + Property.LEGEND_TITLE = 'legendTitle'; + Property.LEGEND_TITLECOLOR = 'legendTitleColor'; + Property.LEGEND_TITLEFONT = 'legendTitleFont'; + Property.LEGEND_TITLEFONTSIZE = 'legendTitleFontSize'; + Property.LEGEND_TITLEFONTWEIGHT = 'legendTitleFontWeight'; +})(Property = exports.Property || (exports.Property = {})); +exports.NESTED_ENCODING_PROPERTIES_PARENT = [ + 'bin', 'scale', 'sort', 'axis', 'legend' +]; +var NESTED_ENCODING_PROPERTIES_PARENT_INDEX = util_1.toMap(exports.NESTED_ENCODING_PROPERTIES_PARENT); +function hasNestedProperty(prop) { + return NESTED_ENCODING_PROPERTIES_PARENT_INDEX[prop]; +} +exports.hasNestedProperty = hasNestedProperty; +exports.ENCODING_PROPERTIES = [ + Property.CHANNEL, + Property.BIN, + Property.BIN_MAXBINS, + Property.BIN_MIN, + Property.BIN_MAX, + Property.BIN_BASE, + Property.BIN_STEP, + Property.BIN_STEPS, + Property.BIN_MINSTEP, + Property.BIN_DIV, + 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, + Property.AXIS, + Property.AXIS_AXISCOLOR, + Property.AXIS_AXISWIDTH, + Property.AXIS_CHARACTERWIDTH, + Property.AXIS_FORMAT, + Property.AXIS_GRID, + Property.AXIS_GRIDCOLOR, + Property.AXIS_GRIDDASH, + Property.AXIS_GRIDOPACITY, + Property.AXIS_GRIDWIDTH, + Property.AXIS_LABELANGLE, + Property.AXIS_LABELMAXLENGTH, + Property.AXIS_LABELS, + Property.AXIS_LAYER, + Property.AXIS_OFFSET, + Property.AXIS_ORIENT, + Property.AXIS_SHORTTIMELABELS, + Property.AXIS_SUBDIVIDE, + Property.AXIS_TICKCOLOR, + Property.AXIS_TICKLABELCOLOR, + Property.AXIS_TICKLABELFONT, + Property.AXIS_TICKLABELFONTSIZE, + Property.AXIS_TICKPADDING, + Property.AXIS_TICKS, + Property.AXIS_TICKSIZE, + Property.AXIS_TICKSIZEEND, + Property.AXIS_TICKSIZEMAJOR, + Property.AXIS_TICKSIZEMINOR, + Property.AXIS_TICKWIDTH, + Property.AXIS_TITLE, + Property.AXIS_TITLECOLOR, + Property.AXIS_TITLEFONT, + Property.AXIS_TITLEFONTSIZE, + Property.AXIS_TITLEFONTWEIGHT, + Property.AXIS_TITLEMAXLENGTH, + Property.AXIS_TITLEOFFSET, + Property.AXIS_VALUES, + Property.LEGEND, + Property.LEGEND_ORIENT, + Property.LEGEND_OFFSET, + Property.LEGEND_VALUES, + Property.LEGEND_FORMAT, + Property.LEGEND_LABELALIGN, + Property.LEGEND_LABELBASELINE, + Property.LEGEND_LABELCOLOR, + Property.LEGEND_LABELFONT, + Property.LEGEND_LABELFONTSIZE, + Property.LEGEND_SHORTTIMELABELS, + Property.LEGEND_SYMBOLCOLOR, + Property.LEGEND_SYMBOLSHAPE, + Property.LEGEND_SYMBOLSIZE, + Property.LEGEND_SYMBOLSTROKEWIDTH, + Property.LEGEND_TITLE, + Property.LEGEND_TITLECOLOR, + Property.LEGEND_TITLEFONT, + Property.LEGEND_TITLEFONTSIZE, + Property.LEGEND_TITLEFONTWEIGHT +]; +exports.DEFAULT_PROPERTY_PRECEDENCE = [ + // Projection + Property.TYPE, + Property.FIELD, + // TODO: Add stack and remove it from INCLUDE_ALL in shorthand + // TODO: Add filter and remove it from INCLUDE_ALL in shorthand + // TODO: Add calculate and remove it from INCLUDE_ALL in shorthand + // TODO: Add filterInvalid 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, + Property.BIN_MIN, + Property.BIN_MAX, + Property.BIN_BASE, + Property.BIN_STEP, + Property.BIN_STEPS, + Property.BIN_MINSTEP, + Property.BIN_DIV, + // Encoding + Property.CHANNEL, + Property.MARK, + Property.SCALE, + Property.AXIS, + Property.LEGEND, + // Nested Encoding 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, + // - Axis + Property.AXIS_AXISCOLOR, + Property.AXIS_AXISWIDTH, + Property.AXIS_CHARACTERWIDTH, + Property.AXIS_FORMAT, + Property.AXIS_GRID, + Property.AXIS_GRIDCOLOR, + Property.AXIS_GRIDDASH, + Property.AXIS_GRIDOPACITY, + Property.AXIS_GRIDWIDTH, + Property.AXIS_LABELANGLE, + Property.AXIS_LABELMAXLENGTH, + Property.AXIS_LABELS, + Property.AXIS_LAYER, + Property.AXIS_OFFSET, + Property.AXIS_ORIENT, + Property.AXIS_SHORTTIMELABELS, + Property.AXIS_SUBDIVIDE, + Property.AXIS_TICKCOLOR, + Property.AXIS_TICKLABELCOLOR, + Property.AXIS_TICKLABELFONT, + Property.AXIS_TICKLABELFONTSIZE, + Property.AXIS_TICKPADDING, + Property.AXIS_TICKS, + Property.AXIS_TICKSIZE, + Property.AXIS_TICKSIZEEND, + Property.AXIS_TICKSIZEMAJOR, + Property.AXIS_TICKSIZEMINOR, + Property.AXIS_TICKWIDTH, + Property.AXIS_TITLE, + Property.AXIS_TITLECOLOR, + Property.AXIS_TITLEFONT, + Property.AXIS_TITLEFONTSIZE, + Property.AXIS_TITLEFONTWEIGHT, + Property.AXIS_TITLEMAXLENGTH, + Property.AXIS_TITLEOFFSET, + Property.AXIS_VALUES, + // - Legend + Property.LEGEND_ORIENT, + Property.LEGEND_OFFSET, + Property.LEGEND_VALUES, + Property.LEGEND_FORMAT, + Property.LEGEND_LABELALIGN, + Property.LEGEND_LABELBASELINE, + Property.LEGEND_LABELCOLOR, + Property.LEGEND_LABELFONT, + Property.LEGEND_LABELFONTSIZE, + Property.LEGEND_SHORTTIMELABELS, + Property.LEGEND_SYMBOLCOLOR, + Property.LEGEND_SYMBOLSHAPE, + Property.LEGEND_SYMBOLSIZE, + Property.LEGEND_SYMBOLSTROKEWIDTH, + Property.LEGEND_TITLE, + Property.LEGEND_TITLECOLOR, + Property.LEGEND_TITLEFONT, + Property.LEGEND_TITLEFONTSIZE, + Property.LEGEND_TITLEFONTWEIGHT +]; +/** + * Collection of nested encoding properties. + * + * [ + * { + * property: Property.BIN_MAXBINS, + * parent: 'bin', + * child: 'maxbins' + * }, + * ... + * ] + */ +exports.NESTED_ENCODING_PROPERTIES = exports.ENCODING_PROPERTIES.reduce(function (nestedEncodingProperties, prop) { + var p = prop + ''; + // Check if it's a child property of any of the nested encoding property parent + for (var _i = 0, NESTED_ENCODING_PROPERTIES_PARENT_1 = exports.NESTED_ENCODING_PROPERTIES_PARENT; _i < NESTED_ENCODING_PROPERTIES_PARENT_1.length; _i++) { + var parent_1 = NESTED_ENCODING_PROPERTIES_PARENT_1[_i]; + if (p.length > parent_1.length && p.substr(0, parent_1.length) === parent_1) { + // Convert PascalCase to camelCase + var child = (p[parent_1.length] + '').toLowerCase() + p.substr(parent_1.length + 1); + nestedEncodingProperties.push({ + property: prop, + parent: parent_1, + child: child + }); + break; + } + } + return nestedEncodingProperties; +}, []); +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; +}, {}); + +},{"./util":52,"vega-lite/src/scale":20}],37:[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 wildcard_1 = require("../wildcard"); +var util_1 = require("../util"); +function isDimension(encQ) { + return util_1.contains([type_1.Type.NOMINAL, type_1.Type.ORDINAL], encQ.type) || + (!wildcard_1.isWildcard(encQ.bin) && !!encQ.bin) || + (!wildcard_1.isWildcard(encQ.timeUnit) && !!encQ.timeUnit); // surely T type +} +exports.isDimension = isDimension; +function isMeasure(encQ) { + return (encQ.type === type_1.Type.QUANTITATIVE && !encQ.bin) || + (encQ.type === type_1.Type.TEMPORAL && !encQ.timeUnit); +} +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 a Wildcard, there is no clear scale type + */ +function scaleType(encQ) { + var scale = encQ.scale === true || encQ.scale === wildcard_1.SHORT_WILDCARD ? {} : encQ.scale; + var type = encQ.type; + var timeUnit = encQ.timeUnit; + if (scale && scale.type !== undefined) { + return scale.type; + } + if (wildcard_1.isWildcard(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 (wildcard_1.isWildcard(timeUnit)) { + return undefined; + } + return timeunit_1.defaultScaleType(timeUnit); + } + else { + return scale_1.ScaleType.TIME; + } + } + else { + throw new Error('Unsupported type: ' + type + ' in scaleType'); + } +} +exports.scaleType = scaleType; + +},{"../util":52,"../wildcard":53,"vega-lite/src/scale":20,"vega-lite/src/timeunit":23,"vega-lite/src/type":24}],38:[function(require,module,exports){ +"use strict"; +var util_1 = require("datalib/src/util"); +var shorthand_1 = require("./shorthand"); +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 parse(groupBy, include, replaceIndex) { + groupBy.forEach(function (grpBy) { + if (isExtendedGroupBy(grpBy)) { + include[grpBy.property] = true; + replaceIndex[grpBy.property] = grpBy.replace; + } + else { + include[grpBy] = true; + } + }); + return { + include: include, + replaceIndex: replaceIndex, + replacer: shorthand_1.getReplacerIndex(replaceIndex) + }; +} +exports.parse = parse; +function toString(groupBy) { + if (util_1.isArray(groupBy)) { + return groupBy.map(function (g) { + if (isExtendedGroupBy(g)) { + if (g.replace) { + var replaceIndex_1 = 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_1).map(function (valTo) { + var valsFrom = replaceIndex_1[valTo].sort(); + return valsFrom.join(',') + '=>' + valTo; + }).join(';') + ']'; + } + return g.property; + } + return g; + }).join(','); + } + else { + return groupBy; + } +} +exports.toString = toString; + +},{"../util":52,"./shorthand":40,"datalib/src/util":8}],39:[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":26,"../generate":33,"../nest":35,"../ranking/ranking":49,"../util":52,"./encoding":37,"./groupby":38,"./shorthand":40,"./spec":41,"./transform":42}],40:[function(require,module,exports){ +"use strict"; +var aggregate_1 = require("vega-lite/src/aggregate"); +var channel_1 = require("vega-lite/src/channel"); +var timeunit_1 = require("vega-lite/src/timeunit"); +var type_1 = require("vega-lite/src/type"); +var util_1 = require("datalib/src/util"); +var property_1 = require("../property"); +var spec_1 = require("./spec"); +var wildcard_1 = require("../wildcard"); +var property_2 = require("../property"); +var util_2 = require("../util"); +function getReplacerIndex(replaceIndex) { + return util_2.keys(replaceIndex).reduce(function (fnIndex, prop) { + fnIndex[prop] = getReplacer(replaceIndex[prop]); + return fnIndex; + }, {}); +} +exports.getReplacerIndex = getReplacerIndex; +function getReplacer(replace) { + return function (s) { + if (replace[s] !== undefined) { + return replace[s]; + } + return s; + }; +} +exports.getReplacer = getReplacer; +function value(v, replacer) { + if (wildcard_1.isWildcard(v)) { + // Return the enum array if it's a full wildcard, or just return SHORT_WILDCARD for short ones. + if (!wildcard_1.isShortWildcard(v) && v.enum) { + return wildcard_1.SHORT_WILDCARD + JSON.stringify(v.enum); + } + else { + return wildcard_1.SHORT_WILDCARD; + } + } + if (replacer) { + return replacer(v); + } + return v; +} +exports.value = value; +function replace(v, replacer) { + if (replacer) { + return replacer(v); + } + return v; +} +exports.replace = replace; +exports.INCLUDE_ALL = +// TODO: remove manual STACK, FILTER, CALCULATE concat once we really support enumerating it. +property_2.DEFAULT_PROPERTY_PRECEDENCE.concat([property_2.Property.CALCULATE, property_2.Property.FILTER, property_2.Property.FILTERINVALID, property_2.Property.STACK]) + .reduce(function (m, prop) { + m[prop] = true; + return m; +}, {}); +function vlSpec(vlspec, _, __) { + if (_ === void 0) { _ = exports.INCLUDE_ALL; } + if (__ === void 0) { __ = {}; } + var specQ = spec_1.fromSpec(vlspec); + return spec(specQ); +} +exports.vlSpec = vlSpec; +exports.PROPERTY_SUPPORTED_CHANNELS = { + axis: { x: true, y: true, row: true, column: true }, + legend: { color: true, opacity: true, size: true, shape: true }, + scale: { x: true, y: true, color: true, opacity: true, row: true, column: true, size: true, shape: true }, + sort: { x: true, y: true, path: true, order: true } +}; +/** + * 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_2.Property.MARK]) { + parts.push(value(specQ.mark, replace[property_2.Property.MARK])); + } + if (specQ.transform) { + if (include[property_2.Property.CALCULATE]) { + if (specQ.transform.calculate !== undefined) { + parts.push('calculate:' + calculate(specQ.transform.calculate)); + } + } + if (include[property_2.Property.FILTER]) { + if (specQ.transform.filter !== undefined) { + parts.push('filter:' + JSON.stringify(specQ.transform.filter)); + } + } + if (include[property_2.Property.FILTERINVALID]) { + if (specQ.transform.filterInvalid !== undefined) { + parts.push('filterInvalid:' + specQ.transform.filterInvalid); + } + } + } + // TODO: extract this to its own stack method + if (include[property_2.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 + '}'); + } + } + if (specQ.encodings) { + var encodings = 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('|'); + if (encodings) { + parts.push(encodings); + } + } + return parts.join('|'); +} +exports.spec = spec; +function calculate(formulaArr) { + return JSON.stringify(formulaArr.reduce(function (m, calculateItem) { + m[calculateItem.field] = calculateItem.expr; + return m; + }, {})); +} +exports.calculate = calculate; +/** + * 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_2.Property.CHANNEL]) { + parts.push(value(encQ.channel, replace[property_2.Property.CHANNEL])); + } + var fieldDefStr = fieldDef(encQ, include, replace); + if (fieldDefStr) { + parts.push(fieldDefStr); + } + return parts.join(':'); +} +exports.encoding = encoding; +/** + * Returns a field definition 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, replacer) { + if (include === void 0) { include = exports.INCLUDE_ALL; } + if (replacer === void 0) { replacer = {}; } + var fn = null, fnEnumIndex = null; + /** Encoding properties e.g., Scale, Axis, Legend */ + var props = []; + if (include[property_2.Property.AGGREGATE] && encQ.autoCount === false) { + return '-'; + } + else if (include[property_2.Property.AGGREGATE] && encQ.aggregate && !wildcard_1.isWildcard(encQ.aggregate)) { + fn = replace(encQ.aggregate, replacer[property_2.Property.AGGREGATE]); + } + else if (include[property_2.Property.AGGREGATE] && encQ.autoCount && !wildcard_1.isWildcard(encQ.autoCount)) { + fn = replace('count', replacer[property_2.Property.AGGREGATE]); + ; + } + else if (include[property_2.Property.TIMEUNIT] && encQ.timeUnit && !wildcard_1.isWildcard(encQ.timeUnit)) { + fn = replace(encQ.timeUnit, replacer[property_2.Property.TIMEUNIT]); + } + else if (include[property_2.Property.BIN] && encQ.bin && !wildcard_1.isWildcard(encQ.bin)) { + fn = 'bin'; + property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) { + if (nestedProp && nestedProp.parent === fn) { + var binTypeProp = nestedProp.property; + var binTypeStr = nestedProp.child; + if (include[binTypeProp] && encQ.bin[binTypeStr]) { + props.push({ + key: binTypeStr, + value: value(encQ.bin[binTypeStr], replacer[binTypeProp]) + }); + } + } + }); + } + else { + for (var _i = 0, _a = [property_2.Property.AGGREGATE, property_2.Property.AUTOCOUNT, property_2.Property.TIMEUNIT, property_2.Property.BIN]; _i < _a.length; _i++) { + var prop = _a[_i]; + var val = encQ[prop]; + if (include[prop] && encQ[prop] && wildcard_1.isWildcard(val)) { + fn = wildcard_1.SHORT_WILDCARD + ''; + // assign fnEnumIndex[prop] = array of enum values or just "?" if it is SHORT_WILDCARD + fnEnumIndex = fnEnumIndex || {}; + fnEnumIndex[prop] = wildcard_1.isShortWildcard(val) ? val : val.enum; + if (prop === property_2.Property.BIN) { + property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) { + var binTypeProp = nestedProp.property; + var binTypeStr = nestedProp.child; + if (include[binTypeProp] && encQ.bin[binTypeStr]) { + props.push({ + key: binTypeStr, + value: value(encQ.bin[binTypeStr], replacer[binTypeProp]) + }); + } + }); + } + } + } + if (fnEnumIndex && encQ.hasFn) { + fnEnumIndex.hasFn = true; + } + } + var _loop_1 = function (nestedPropParent) { + if (!wildcard_1.isWildcard(encQ.channel) && !exports.PROPERTY_SUPPORTED_CHANNELS[nestedPropParent][encQ.channel]) { + return "continue"; + } + if (include[nestedPropParent]) { + if (encQ[nestedPropParent] && !wildcard_1.isWildcard(encQ[nestedPropParent])) { + // `sort` can be a string (ascending/descending). + if (util_1.isString(encQ[nestedPropParent])) { + props.push({ + key: nestedPropParent + '', + value: JSON.stringify(encQ[nestedPropParent]) + }); + } + else { + var nestedProps = property_2.getNestedEncodingPropertyChildren(nestedPropParent); + var nestedPropChildren = nestedProps.reduce(function (p, nestedProp) { + if (include[nestedProp.property] && encQ[nestedPropParent][nestedProp.child] !== undefined) { + p[nestedProp.child] = replace(encQ[nestedPropParent][nestedProp.child], replacer[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_2.Property.SCALE, property_2.Property.SORT, property_2.Property.AXIS, property_2.Property.LEGEND]; _b < _c.length; _b++) { + var nestedPropParent = _c[_b]; + _loop_1(nestedPropParent); + } + // field + var fieldAndParams = include[property_2.Property.FIELD] ? value(encQ.field || '*', replacer[property_2.Property.FIELD]) : '...'; + // type + if (include[property_2.Property.TYPE]) { + if (wildcard_1.isWildcard(encQ.type)) { + fieldAndParams += ',' + value(encQ.type, replacer[property_2.Property.TYPE]); + } + else { + var typeShort = ((encQ.type || type_1.Type.QUANTITATIVE) + '').substr(0, 1); + fieldAndParams += ',' + value(typeShort, replacer[property_2.Property.TYPE]); + } + } + // encoding properties + fieldAndParams += props.map(function (p) { + var val = p.value instanceof Array ? '[' + p.value + ']' : p.value; + return ',' + p.key + '=' + val; + }).join(''); + if (fn) { + return fn + (fnEnumIndex ? JSON.stringify(fnEnumIndex) : '') + '(' + fieldAndParams + ')'; + } + return fieldAndParams; +} +exports.fieldDef = fieldDef; +var CHANNEL_INDEX = util_1.toMap(channel_1.CHANNELS); +var AGGREGATE_OP_INDEX = util_1.toMap(aggregate_1.AGGREGATE_OPS); +var SINGLE_TIMEUNIT_INDEX = util_1.toMap(timeunit_1.SINGLE_TIMEUNITS); +var MULTI_TIMEUNIT_INDEX = util_1.toMap(timeunit_1.MULTI_TIMEUNITS); +function parse(shorthand) { + // TODO(https://github.com/uwdata/compassql/issues/259): + // Do not split directly, but use an upgraded version of `getClosingBraceIndex()` + var splitShorthand = shorthand.split('|'); + var specQ = { mark: splitShorthand[0], encodings: [] }; + for (var i = 1; i < splitShorthand.length; i++) { + var part = splitShorthand[i]; + var splitPart = splitWithTail(part, ':', 1); + var splitPartKey = splitPart[0]; + var splitPartValue = splitPart[1]; + if (CHANNEL_INDEX[splitPartKey] || splitPartKey === '?') { + var encQ = shorthandParser.encoding(splitPartKey, splitPartValue); + specQ.encodings.push(encQ); + continue; + } + if (splitPartKey === 'calculate') { + specQ.transform = specQ.transform || {}; + var calculate_1 = []; + var fieldExprMapping = JSON.parse(splitPartValue); + for (var field in fieldExprMapping) { + calculate_1.push({ field: field, expr: fieldExprMapping[field] }); + } + specQ.transform.calculate = calculate_1; + continue; + } + if (splitPartKey === 'filter') { + specQ.transform = specQ.transform || {}; + specQ.transform.filter = JSON.parse(splitPartValue); + continue; + } + if (splitPartKey === 'filterInvalid') { + specQ.transform = specQ.transform || {}; + specQ.transform.filterInvalid = JSON.parse(splitPartValue); + continue; + } + } + return specQ; +} +exports.parse = parse; +/** + * Split a string n times into substrings with the specified delimiter and return them as an array. + * @param str The string to be split + * @param delim The delimiter string used to separate the string + * @param number The value used to determine how many times the string is split + */ +function splitWithTail(str, delim, count) { + var result = []; + var lastIndex = 0; + for (var i = 0; i < count; i++) { + var indexOfDelim = str.indexOf(delim, lastIndex); + if (indexOfDelim !== -1) { + result.push(str.substring(lastIndex, indexOfDelim)); + lastIndex = indexOfDelim + 1; + } + else { + break; + } + } + result.push(str.substr(lastIndex)); + // If the specified count is greater than the number of delimiters that exist in the string, + // an empty string will be pushed count minus number of delimiter occurence times. + if (result.length !== count + 1) { + while (result.length !== count + 1) { + result.push(''); + } + } + return result; +} +exports.splitWithTail = splitWithTail; +var shorthandParser; +(function (shorthandParser) { + function encoding(channel, fieldDefShorthand) { + var encQ = { channel: channel }; + if (fieldDefShorthand.indexOf('(') !== -1) { + encQ = fn(encQ, fieldDefShorthand); + } + else { + encQ = rawFieldDef(encQ, splitWithTail(fieldDefShorthand, ',', 2)); + } + return encQ; + } + shorthandParser.encoding = encoding; + function rawFieldDef(encQ, fieldDefPart) { + encQ.field = fieldDefPart[0]; + encQ.type = type_1.TYPE_FROM_SHORT_TYPE[fieldDefPart[1].toUpperCase()] || '?'; + var partParams = fieldDefPart[2]; + var closingBraceIndex = 0; + var i = 0; + while (i < partParams.length) { + var propEqualSignIndex = partParams.indexOf('=', i); + var parsedValue = void 0; + if (propEqualSignIndex !== -1) { + var prop = partParams.substring(i, propEqualSignIndex); + if (partParams[i + prop.length + 1] === '{') { + var openingBraceIndex = i + prop.length + 1; + closingBraceIndex = getClosingIndex(openingBraceIndex, partParams, '}'); + var value_1 = partParams.substring(openingBraceIndex, closingBraceIndex + 1); + parsedValue = JSON.parse(value_1); + // index after next comma + i = closingBraceIndex + 2; + } + else if (partParams[i + prop.length + 1] === '[') { + // find closing square bracket + var openingBracketIndex = i + prop.length + 1; + var closingBracketIndex = getClosingIndex(openingBracketIndex, partParams, ']'); + var value_2 = partParams.substring(openingBracketIndex, closingBracketIndex + 1); + parsedValue = JSON.parse(value_2); + // index after next comma + i = closingBracketIndex + 2; + } + else { + var propIndex = i; + // Substring until the next comma (or end of the string) + var nextCommaIndex = partParams.indexOf(',', i + prop.length); + if (nextCommaIndex === -1) { + nextCommaIndex = partParams.length; + } + // index after next comma + i = nextCommaIndex + 1; + parsedValue = JSON.parse(partParams.substring(propIndex + prop.length + 1, nextCommaIndex)); + } + if (property_1.hasNestedProperty(prop)) { + encQ[prop] = parsedValue; + } + else { + // prop is a property of the aggregation function such as bin + encQ.bin[prop] = parsedValue; + } + } + else { + // something is wrong with the format of the partParams + // exits loop if don't have then infintie loop + break; + } + } + return encQ; + } + shorthandParser.rawFieldDef = rawFieldDef; + function getClosingIndex(openingBraceIndex, str, closingChar) { + for (var i = openingBraceIndex; i < str.length; i++) { + if (str[i] === closingChar) { + return i; + } + } + } + shorthandParser.getClosingIndex = getClosingIndex; + function fn(encQ, fieldDefShorthand) { + // Aggregate, Bin, TimeUnit as wildcard case + if (fieldDefShorthand[0] === '?') { + var closingBraceIndex = getClosingIndex(1, fieldDefShorthand, '}'); + var fnEnumIndex = JSON.parse(fieldDefShorthand.substring(1, closingBraceIndex + 1)); + for (var encodingProperty in fnEnumIndex) { + if (util_2.isArray(fnEnumIndex[encodingProperty])) { + encQ[encodingProperty] = { enum: fnEnumIndex[encodingProperty] }; + } + else { + encQ[encodingProperty] = fnEnumIndex[encodingProperty]; + } + } + return rawFieldDef(encQ, splitWithTail(fieldDefShorthand.substring(closingBraceIndex + 2, fieldDefShorthand.length - 1), ',', 2)); + } + else { + var func = fieldDefShorthand.substring(0, fieldDefShorthand.indexOf('(')); + var insideFn = fieldDefShorthand.substring(func.length + 1, fieldDefShorthand.length - 1); + var insideFnParts = splitWithTail(insideFn, ',', 2); + if (AGGREGATE_OP_INDEX[func]) { + encQ.aggregate = func; + return rawFieldDef(encQ, insideFnParts); + } + else if (MULTI_TIMEUNIT_INDEX[func] || SINGLE_TIMEUNIT_INDEX[func]) { + encQ.timeUnit = func; + return rawFieldDef(encQ, insideFnParts); + } + else if (func === 'bin') { + encQ.bin = {}; + return rawFieldDef(encQ, insideFnParts); + } + } + } + shorthandParser.fn = fn; +})(shorthandParser = exports.shorthandParser || (exports.shorthandParser = {})); + +},{"../property":36,"../util":52,"../wildcard":53,"./spec":41,"datalib/src/util":8,"vega-lite/src/aggregate":13,"vega-lite/src/channel":16,"vega-lite/src/timeunit":23,"vega-lite/src/type":24}],41:[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 wildcard_1 = require("../wildcard"); +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 (!wildcard_1.isWildcard(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; + +},{"../property":36,"../util":52,"../wildcard":53,"vega-lite/src/channel":16,"vega-lite/src/mark":19,"vega-lite/src/stack":22}],42:[function(require,module,exports){ +"use strict"; + +},{}],43:[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, _, __) { + 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)) { + var hasCount = util_1.some(encodings, function (encQ) { + return encQ.aggregate === aggregate_1.AggregateOp.COUNT || encQ.autoCount === true; + }); + var hasBin = util_1.some(encodings, function (encQ) { + return !!encQ.bin; + }); + if (hasCount) { + // 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' + }; + } + else if (hasBin) { + // This is not as good as binning all the Q and show heatmap + return { + type: exports.name, + score: 0.7, + feature: 'Aggregate with bin but without count' + }; + } + else { + return { + type: exports.name, + score: 0.9, + feature: 'Aggregate without count and without bin' + }; + } + } + // 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":37,"../util":52,"vega-lite/src/aggregate":13,"vega-lite/src/type":24}],44:[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'; + TypeChannelScore.TERRIBLE = -10; + function init() { + var SCORE = {}; + // Continuous Quantitative / Temporal Fields + var CONTINUOUS_TYPE_CHANNEL_SCORE = { + x: 0, + y: 0, + size: -0.575, + color: -0.725, + text: -2, + opacity: -3, + shape: TypeChannelScore.TERRIBLE, + row: TypeChannelScore.TERRIBLE, + column: TypeChannelScore.TERRIBLE, + detail: 2 * TypeChannelScore.TERRIBLE + }; + [type_1.Q, type_1.T, type_1.TIMEUNIT_T].forEach(function (type) { + util_1.keys(CONTINUOUS_TYPE_CHANNEL_SCORE).forEach(function (channel) { + SCORE[featurize(type, channel)] = CONTINUOUS_TYPE_CHANNEL_SCORE[channel]; + }); + }); + // Discretized Quantitative / Temporal Fields / Ordinal + var ORDERED_TYPE_CHANNEL_SCORE = util_1.extend({}, CONTINUOUS_TYPE_CHANNEL_SCORE, { + row: -0.75, + column: -0.75, + shape: -3.1, + text: -3.2, + detail: -4 + }); + [type_1.BIN_Q, type_1.TIMEUNIT_O, 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]; + }); + }); + var NOMINAL_TYPE_CHANNEL_SCORE = { + x: 0, + y: 0, + color: -0.6, + shape: -0.65, + row: -0.7, + column: -0.7, + text: -0.8, + detail: -2, + size: -3, + opacity: -3.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, _, __) { + 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 = type_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.TIMEUNIT_O, + 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, _, __) { + return specM.getEncodings().reduce(function (features, encQ) { + var type = type_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, _, __) { + 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, _, __) { + 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, _, __) { + 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":26,"../../query/shorthand":40,"../../util":52,"./effectiveness":45,"./type":47,"vega-lite/src/channel":16}],45:[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 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":44,"./mark":46}],46:[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 DISCRETE = [type_1.BIN_Q, type_1.TIMEUNIT_O, type_1.O, type_1.N]; + var DISCRETE_OR_NONE = DISCRETE.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, + rect: -1, + 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 + DISCRETE_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; + }); + }); + [type_1.TIMEUNIT_T].forEach(function (yType) { + var occludedDimensionMeasureMark = { + // For Time Dimension with time scale, tick is not good + point: 0, + text: -0.5, + tick: -1, + 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, type_1.O].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.TIMEUNIT_O].forEach(function (yType) { + // For aggregate / surely no occlusion plot, Temporal with time or ordinal + // are not that different. + 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; + }); + }); + }); + [type_1.TIMEUNIT_T].forEach(function (xType) { + [type_1.TIMEUNIT_T].forEach(function (yType) { + // has occlusion + var ttMark = { + point: 0, + rect: -0.1, + text: -0.5, + tick: -1, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + // No difference between has occlusion and no occlusion + // as most of the time, it will be the occluded case. + util_1.forEach(ttMark, function (score, mark) { + var feature = featurize(xType, yType, true, mark); + SCORE[feature] = score; + }); + util_1.forEach(ttMark, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + }); + }); + DISCRETE_OR_NONE.forEach(function (yType) { + // has occlusion + var tdMark = { + tick: 0, + point: -0.2, + text: -0.5, + rect: -1, + bar: -2, + line: -2, + area: -2, + rule: -2.5 + }; + // No difference between has occlusion and no occlusion + // as most of the time, it will be the occluded case. + util_1.forEach(tdMark, function (score, mark) { + var feature = featurize(xType, yType, true, mark); + SCORE[feature] = score; + }); + util_1.forEach(tdMark, function (score, mark) { + var feature = featurize(yType, xType, true, mark); + SCORE[feature] = score; + }); + util_1.forEach(tdMark, function (score, mark) { + var feature = featurize(xType, yType, false, mark); + SCORE[feature] = score; + }); + util_1.forEach(tdMark, function (score, mark) { + var feature = featurize(yType, xType, false, mark); + SCORE[feature] = score; + }); + }); + }); + // DxD + DISCRETE_OR_NONE.forEach(function (xType) { + DISCRETE_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, _, __) { + 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 ? type_1.getExtendedType(xEncQ) : type_1.NONE; + var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y); + var yType = yEncQ ? type_1.getExtendedType(yEncQ) : type_1.NONE; + 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":52,"./effectiveness":45,"./type":47,"vega-lite/src/channel":16,"vega-lite/src/mark":19}],47:[function(require,module,exports){ +"use strict"; +var scale_1 = require("vega-lite/src/scale"); +var type_1 = require("vega-lite/src/type"); +var encoding_1 = require("../../query/encoding"); +/** + * Finer grained data types that takes binning and timeUnit into account. + */ +var ExtendedType; +(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"; + /** + * Time Unit Temporal Field with time scale. + */ + ExtendedType[ExtendedType["TIMEUNIT_T"] = 'timeUnit_time'] = "TIMEUNIT_T"; + /** + * Time Unit Temporal Field with ordinal scale. + */ + ExtendedType[ExtendedType["TIMEUNIT_O"] = 'timeUnit_' + type_1.Type.ORDINAL] = "TIMEUNIT_O"; + ExtendedType[ExtendedType["O"] = type_1.Type.ORDINAL] = "O"; + ExtendedType[ExtendedType["N"] = type_1.Type.NOMINAL] = "N"; + ExtendedType[ExtendedType["NONE"] = '-'] = "NONE"; +})(ExtendedType = exports.ExtendedType || (exports.ExtendedType = {})); +exports.Q = ExtendedType.Q; +exports.BIN_Q = ExtendedType.BIN_Q; +exports.T = ExtendedType.T; +exports.TIMEUNIT_T = ExtendedType.TIMEUNIT_T; +exports.TIMEUNIT_O = ExtendedType.TIMEUNIT_O; +exports.O = ExtendedType.O; +exports.N = ExtendedType.N; +exports.NONE = ExtendedType.NONE; +function getExtendedType(encQ) { + if (encQ.bin) { + return ExtendedType.BIN_Q; + } + else if (encQ.timeUnit) { + // FIXME fix scale type checking here + return encoding_1.scaleType(encQ) === scale_1.ScaleType.ORDINAL ? ExtendedType.TIMEUNIT_O : ExtendedType.TIMEUNIT_T; + } + return encQ.type; +} +exports.getExtendedType = getExtendedType; + +},{"../../query/encoding":37,"vega-lite/src/scale":20,"vega-lite/src/type":24}],48:[function(require,module,exports){ +"use strict"; +var property_1 = require("../property"); +exports.name = 'fieldOrder'; +/** + * Return ranking score based on indices of encoded fields in the schema. + * If there are multiple fields, prioritize field on the lower indices of encodings. + * + * For example, to compare two specs with two encodings each, + * first we compare the field on the 0-th index + * and only compare the field on the 1-th index only if the fields on the 0-th index are the same. + */ +function score(specM, schema, _) { + var fieldWildcardIndices = specM.wildcardIndex.encodingIndicesByProperty[property_1.Property.FIELD]; + if (!fieldWildcardIndices) { + return { + score: 0, + features: [] + }; + } + var encodings = specM.specQuery.encodings; + var numFields = schema.fieldSchemas.length; + var features = []; + var totalScore = 0, base = 1; + for (var i = fieldWildcardIndices.length - 1; i >= 0; i--) { + var index = fieldWildcardIndices[i]; + var field = encodings[index].field; + var fieldWildcard = specM.wildcardIndex.encodings[index].field; + var fieldIndex = schema.fieldSchema(field).index; + // reverse order field with lower index should get higher score and come first + var score_1 = -fieldIndex * base; + totalScore += score_1; + features.push({ + score: score_1, + type: 'fieldOrder', + feature: "field " + fieldWildcard.name + " is " + field + " (#" + fieldIndex + " in the schema)" + }); + base *= numFields; + } + return { + score: totalScore, + features: features + }; +} +exports.score = score; + +},{"../property":36}],49:[function(require,module,exports){ +"use strict"; +exports.effectiveness = require("./effectiveness/effectiveness"); +exports.aggregation = require("./aggregation"); +exports.fieldOrder = require("./fieldorder"); +/** + * 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(comparatorFactory(query.orderBy || query.chooseBy, schema, query.config)); + if (query.chooseBy) { + if (group.items.length > 0) { + // for chooseBy -- only keep the top-item + group.items.splice(1); + } + } + } + } + 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(groupComparatorFactory(query.nest[level].orderGroupBy, schema, query.config)); + } + } + return group; +} +exports.rank = rank; +function comparatorFactory(name, schema, opt) { + return function (m1, m2) { + if (name instanceof Array) { + return getScoreDifference(name, m1, m2, schema, opt); + } + else { + return getScoreDifference([name], m1, m2, schema, opt); + } + }; +} +exports.comparatorFactory = comparatorFactory; +function groupComparatorFactory(name, schema, opt) { + return function (g1, g2) { + var m1 = g1.getTopSpecQueryModel(); + var m2 = g2.getTopSpecQueryModel(); + if (name instanceof Array) { + return getScoreDifference(name, m1, m2, schema, opt); + } + else { + return getScoreDifference([name], m1, m2, schema, opt); + } + }; +} +exports.groupComparatorFactory = groupComparatorFactory; +function getScoreDifference(name, m1, m2, schema, opt) { + for (var _i = 0, name_1 = name; _i < name_1.length; _i++) { + var rankingName = name_1[_i]; + var scoreDifference = getScore(m2, rankingName, schema, opt).score - getScore(m1, rankingName, schema, opt).score; + if (scoreDifference !== 0) { + return scoreDifference; + } + } + return 0; +} +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; +} +exports.getScore = getScore; +exports.EFFECTIVENESS = 'effectiveness'; +register(exports.EFFECTIVENESS, exports.effectiveness.default); +register(exports.aggregation.name, exports.aggregation.score); +register(exports.fieldOrder.name, exports.fieldOrder.score); + +},{"./aggregation":43,"./effectiveness/effectiveness":45,"./fieldorder":48}],50:[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 and the distinct values are less than an amount specified in options + if ((distinct < opt.numberNominalLimit) && (distinct / summary.count < opt.numberNominalProportion)) { + type = type_1.Type.NOMINAL; + } + 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, data_1 = data; _i < data_1.length; _i++) { + var dataEntry = data_1[_i]; + var time = new Date(dataEntry[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); + } + }); + // Add index for sorting + fieldSchemas.forEach(function (fieldSchema, index) { return fieldSchema.index = index; }); + // 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); + }; + /** @return a list of the field names. */ + Schema.prototype.fields = function () { + return this._fieldSchemas.map(function (fieldSchema) { return fieldSchema.field; }); + }; + Object.defineProperty(Schema.prototype, "fieldSchemas", { + /** @return a list of FieldSchemas */ + get: function () { + return this._fieldSchemas; + }, + enumerable: true, + configurable: true + }); + Schema.prototype.fieldSchema = function (field) { + return this._fieldSchemaIndex[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, excludeInvalid) { + if (augmentTimeUnitDomain === void 0) { augmentTimeUnitDomain = true; } + if (excludeInvalid === void 0) { excludeInvalid = false; } + 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 = void 0; + if (typeof encQ.bin === 'boolean') { + // autoMaxBins defaults to 10 if channel is Wildcard + 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); + } + // don't need to worry about excludeInvalid here because invalid values don't affect linearly binned field's cardinality + 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; + } + } + var unit = encQ.timeUnit; + var timeStats = fieldSchema.timeStats; + // if the cardinality for the timeUnit is not cached, calculate it + if (!timeStats[unit]) { + timeStats[unit] = timeSummary(encQ.timeUnit, fieldSchema.stats); + } + if (excludeInvalid) { + return timeStats[unit].distinct - invalidCount(timeStats[unit].unique, ['Invalid Date', null]); + } + else { + return timeStats[unit].distinct; + } + } + else { + if (fieldSchema) { + if (excludeInvalid) { + return fieldSchema.stats.distinct - invalidCount(fieldSchema.stats.unique, [NaN, null]); + } + else { + return fieldSchema.stats.distinct; + } + } + else { + return null; + } + } + }; + /** + * Given an EncodingQuery with a timeUnit, returns true if the date field + * has multiple distinct values for all parts of the timeUnit. Returns undefined + * if the timeUnit is undefined. + * i.e. + * ('yearmonth', [Jan 1 2000, Feb 2 2000] returns false) + * ('yearmonth', [Jan 1 2000, Feb 2 2001] returns true) + */ + Schema.prototype.timeUnitHasVariation = function (encQ) { + if (!encQ.timeUnit) { + return; + } + // if there is no variation in `date`, there should not be variation in `day` + if (encQ.timeUnit === timeunit_1.TimeUnit.DAY) { + var dateEncQ = util_1.extend({}, encQ, { timeUnit: timeunit_1.TimeUnit.DATE }); + if (this.cardinality(dateEncQ, false, true) <= 1) { + return false; + } + } + var fullTimeUnit = encQ.timeUnit; + for (var _i = 0, SINGLE_TIMEUNITS_1 = timeunit_1.SINGLE_TIMEUNITS; _i < SINGLE_TIMEUNITS_1.length; _i++) { + var singleUnit = SINGLE_TIMEUNITS_1[_i]; + if (timeunit_1.containsTimeUnit(fullTimeUnit, singleUnit)) { + // Create a clone of encQ, but with singleTimeUnit + var singleUnitEncQ = util_1.extend({}, encQ, { timeUnit: singleUnit }); + if (this.cardinality(singleUnitEncQ, false, true) <= 1) { + return false; + } + } + } + return true; + }; + 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) { + // return [min, max], coerced into number types + return [+fieldSchema.stats.min, +fieldSchema.stats.max]; + } + else if (fieldSchema.primitiveType === PrimitiveType.DATE) { + // return [min, max] dates + return [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(util_1.cmp); + } + return domain.map(function (x) { + // Convert 'null' to null as it is encoded similarly in datalib. + // This is wrong when it is a string 'null' but that rarely happens. + return x === 'null' ? null : x; + }).sort(util_1.cmp); + }; + /** + * @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. + * Maps 'null' (string) keys to the null value and invalid dates to 'Invalid Date' in the unique dictionary. + */ +function timeSummary(timeunit, summary) { + var result = util_1.extend({}, summary); + var unique = {}; + util_1.keys(summary.unique).forEach(function (dateString) { + // don't convert null value because the Date constructor will actually convert it to a date + var date = (dateString === 'null') ? null : new Date(dateString); + // at this point, `date` is either the null value, a valid Date object, or "Invalid Date" which is a Date + var key; + if (date === null) { + key = null; + } + else if (isNaN(date.getTime())) { + key = 'Invalid Date'; + } + else { + key = ((timeunit === timeunit_1.TimeUnit.DAY) ? date.getDay() : timeunit_1.convert(timeunit, date)).toString(); + } + unique[key] = (unique[key] || 0) + 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 = void 0; + if (value === null) { + bucket = null; + } + else if (isNaN(Number(value))) { + bucket = NaN; + } + else { + bucket = bin.value(Number(value)); + } + newUnique[bucket] = (newUnique[bucket] || 0) + oldUnique[value]; + } + return newUnique; +} +/** @return the number of items in list that occur as keys of unique */ +function invalidCount(unique, list) { + return list.reduce(function (prev, cur) { + return unique[cur] ? prev + 1 : prev; + }, 0); +} +var PrimitiveType; +(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"; +})(PrimitiveType = exports.PrimitiveType || (exports.PrimitiveType = {})); + +},{"./config":26,"./util":52,"datalib/src/bins/bins":3,"datalib/src/import/type":5,"datalib/src/stats":6,"vega-lite/src/bin":15,"vega-lite/src/timeunit":23,"vega-lite/src/type":24}],51:[function(require,module,exports){ +"use strict"; +var axis_1 = require("vega-lite/src/axis"); +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 encoding_1 = require("./query/encoding"); +var util_1 = require("./util"); +function stylize(answerSet, schema, opt) { + var encQIndex = {}; + answerSet = answerSet.map(function (specM) { + if (opt.smallBandSizeForHighCardinalityOrFacet) { + specM = smallBandSizeForHighCardinalityOrFacet(specM, schema, encQIndex, opt); + } + if (opt.nominalColorScaleForHighCardinality) { + specM = nominalColorScaleForHighCardinality(specM, schema, encQIndex, opt); + } + if (opt.xAxisOnTopForHighYCardinalityWithoutColumn) { + specM = xAxisOnTopForHighYCardinalityWithoutColumn(specM, schema, encQIndex, opt); + } + return specM; + }); + return answerSet; +} +exports.stylize = stylize; +function smallBandSizeForHighCardinalityOrFacet(specM, schema, encQIndex, opt) { + [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) > opt.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))) { + 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) > opt.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))) { + if (!xEncQ.scale.bandSize) { + xEncQ.scale.bandSize = 12; + } + } + } + } + return specM; +} +exports.smallBandSizeForHighCardinalityOrFacet = smallBandSizeForHighCardinalityOrFacet; +function nominalColorScaleForHighCardinality(specM, schema, encQIndex, opt) { + 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) > opt.nominalColorScaleForHighCardinality.maxCardinality)) { + if (colorEncQ.scale === undefined) { + colorEncQ.scale = {}; + } + if (colorEncQ.scale) { + if (!colorEncQ.scale.range) { + colorEncQ.scale.range = opt.nominalColorScaleForHighCardinality.palette; + } + } + } + return specM; +} +exports.nominalColorScaleForHighCardinality = nominalColorScaleForHighCardinality; +function xAxisOnTopForHighYCardinalityWithoutColumn(specM, schema, encQIndex, opt) { + [channel_1.Channel.COLUMN, channel_1.Channel.X, channel_1.Channel.Y].forEach(function (channel) { + encQIndex[channel] = specM.getEncodingQueryByChannel(channel); + }); + if (encQIndex[channel_1.Channel.COLUMN] === undefined) { + var xEncQ = encQIndex[channel_1.Channel.X]; + var yEncQ = encQIndex[channel_1.Channel.Y]; + if (yEncQ !== undefined && yEncQ.field && encoding_1.scaleType(yEncQ) === scale_1.ScaleType.ORDINAL) { + if (xEncQ !== undefined) { + if (schema.cardinality(yEncQ) > opt.xAxisOnTopForHighYCardinalityWithoutColumn.maxCardinality) { + if (xEncQ.axis === undefined) { + xEncQ.axis = {}; + } + if (xEncQ.axis && !xEncQ.axis.orient) { + xEncQ.axis.orient = axis_1.AxisOrient.TOP; + } + } + } + } + } + return specM; +} +exports.xAxisOnTopForHighYCardinalityWithoutColumn = xAxisOnTopForHighYCardinalityWithoutColumn; + +},{"./query/encoding":37,"./util":52,"vega-lite/src/axis":14,"vega-lite/src/channel":16,"vega-lite/src/scale":20,"vega-lite/src/type":24}],52:[function(require,module,exports){ +"use strict"; +var util_1 = require("datalib/src/util"); +var util_2 = require("datalib/src/util"); +exports.cmp = util_2.cmp; +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; +exports.toMap = util_2.toMap; +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}],53:[function(require,module,exports){ +"use strict"; +var property_1 = require("./property"); +var util_1 = require("./util"); +exports.SHORT_WILDCARD = '?'; +function isWildcard(prop) { + return isShortWildcard(prop) || (prop !== undefined && (!!prop.enum || !!prop.name) && !util_1.isArray(prop)); +} +exports.isWildcard = isWildcard; +function isShortWildcard(prop) { + return prop === exports.SHORT_WILDCARD; +} +exports.isShortWildcard = isShortWildcard; +function initWildcard(prop, defaultName, defaultEnumValues) { + return util_1.extend({}, { + name: defaultName, + enum: defaultEnumValues + }, prop === exports.SHORT_WILDCARD ? {} : prop); +} +exports.initWildcard = initWildcard; +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.BIN_MIN: + return 'b-min'; + case property_1.Property.BIN_MAX: + return 'b-max'; + case property_1.Property.BIN_BASE: + return 'b-base'; + case property_1.Property.BIN_STEP: + return 'b-step'; + case property_1.Property.BIN_STEPS: + return 'b-steps'; + case property_1.Property.BIN_MINSTEP: + return 'b-mstep'; + case property_1.Property.BIN_DIV: + return 'b-div'; + 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.AXIS: + return 'ax'; + case property_1.Property.AXIS_AXISCOLOR: + return 'ax-ac'; + case property_1.Property.AXIS_AXISWIDTH: + return 'ax-aw'; + case property_1.Property.AXIS_LAYER: + return 'ax-lay'; + case property_1.Property.AXIS_OFFSET: + return 'ax-of'; + case property_1.Property.AXIS_ORIENT: + return 'ax-or'; + case property_1.Property.AXIS_GRID: + return 'ax-g'; + case property_1.Property.AXIS_GRIDCOLOR: + return 'ax-gc'; + case property_1.Property.AXIS_GRIDDASH: + return 'ax-gd'; + case property_1.Property.AXIS_GRIDOPACITY: + return 'ax-go'; + case property_1.Property.AXIS_GRIDWIDTH: + return 'ax-gw'; + case property_1.Property.AXIS_LABELS: + return 'ax-lab'; + case property_1.Property.AXIS_FORMAT: + return 'ax-f'; + case property_1.Property.AXIS_LABELANGLE: + return 'ax-laba'; + case property_1.Property.AXIS_LABELMAXLENGTH: + return 'ax-labm'; + case property_1.Property.AXIS_SHORTTIMELABELS: + return 'ax-stl'; + case property_1.Property.AXIS_SUBDIVIDE: + return 'ax-sub'; + case property_1.Property.AXIS_TICKS: + return 'ax-t'; + case property_1.Property.AXIS_TICKCOLOR: + return 'ax-tc'; + case property_1.Property.AXIS_TICKLABELCOLOR: + return 'ax-tlc'; + case property_1.Property.AXIS_TICKLABELFONT: + return 'ax-tlf'; + case property_1.Property.AXIS_TICKLABELFONTSIZE: + return 'ax-tlfs'; + case property_1.Property.AXIS_TICKPADDING: + return 'ax-tp'; + case property_1.Property.AXIS_TICKSIZE: + return 'ax-ts'; + case property_1.Property.AXIS_TICKSIZEMAJOR: + return 'ax-tsma'; + case property_1.Property.AXIS_TICKSIZEMINOR: + return 'ax-tsmi'; + case property_1.Property.AXIS_TICKSIZEEND: + return 'ax-tse'; + case property_1.Property.AXIS_TICKWIDTH: + return 'ax-tw'; + case property_1.Property.AXIS_VALUES: + return 'ax-v'; + case property_1.Property.AXIS_TITLE: + return 'ax-ti'; + case property_1.Property.AXIS_TITLECOLOR: + return 'ax-tic'; + case property_1.Property.AXIS_TITLEFONT: + return 'ax-tif'; + case property_1.Property.AXIS_TITLEFONTSIZE: + return 'ax-tifs'; + case property_1.Property.AXIS_TITLEFONTWEIGHT: + return 'ax-tifw'; + case property_1.Property.AXIS_TITLEOFFSET: + return 'ax-tio'; + case property_1.Property.AXIS_TITLEMAXLENGTH: + return 'ax-timl'; + case property_1.Property.AXIS_CHARACTERWIDTH: + return 'ax-cw'; + case property_1.Property.LEGEND: + return 'l'; + case property_1.Property.LEGEND_ORIENT: + return 'l-or'; + case property_1.Property.LEGEND_OFFSET: + return 'l-of'; + case property_1.Property.LEGEND_VALUES: + return 'l-v'; + case property_1.Property.LEGEND_FORMAT: + return 'l-f'; + case property_1.Property.LEGEND_LABELALIGN: + return 'l-la'; + case property_1.Property.LEGEND_LABELBASELINE: + return 'l-lb'; + case property_1.Property.LEGEND_LABELCOLOR: + return 'l-lc'; + case property_1.Property.LEGEND_LABELFONT: + return 'l-lf'; + case property_1.Property.LEGEND_LABELFONTSIZE: + return 'l-lfs'; + case property_1.Property.LEGEND_SHORTTIMELABELS: + return 'l-stl'; + case property_1.Property.LEGEND_SYMBOLCOLOR: + return 'l-syc'; + case property_1.Property.LEGEND_SYMBOLSHAPE: + return 'l-sysh'; + case property_1.Property.LEGEND_SYMBOLSIZE: + return 'l-sysi'; + case property_1.Property.LEGEND_SYMBOLSTROKEWIDTH: + return 'l-sysw'; + case property_1.Property.LEGEND_TITLE: + return 'l-ti'; + case property_1.Property.LEGEND_TITLECOLOR: + return 'l-tic'; + case property_1.Property.LEGEND_TITLEFONT: + return 'l-tif'; + case property_1.Property.LEGEND_TITLEFONTSIZE: + return 'l-tifs'; + case property_1.Property.LEGEND_TITLEFONTWEIGHT: + return 'l-tifw'; + 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.AXIS: + case property_1.Property.AXIS_GRID: + case property_1.Property.AXIS_LABELS: + case property_1.Property.AXIS_SHORTTIMELABELS: + case property_1.Property.BIN: + case property_1.Property.LEGEND: + case property_1.Property.LEGEND_SHORTTIMELABELS: + 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.AXIS_AXISCOLOR: + return opt.axisAxisColors; + case property_1.Property.AXIS_AXISWIDTH: + return opt.axisAxisWidths; + case property_1.Property.AXIS_LAYER: + return opt.axisLayers; + case property_1.Property.AXIS_OFFSET: + return opt.axisOffsets; + case property_1.Property.AXIS_ORIENT: + return opt.axisOrients; + case property_1.Property.AXIS_GRIDCOLOR: + return opt.axisGridColors; + case property_1.Property.AXIS_GRIDDASH: + return opt.axisGridDashes; + case property_1.Property.AXIS_GRIDOPACITY: + return opt.axisGridOpacities; + case property_1.Property.AXIS_GRIDWIDTH: + return opt.axisGridWidths; + case property_1.Property.AXIS_FORMAT: + return opt.axisFormats; + case property_1.Property.AXIS_LABELANGLE: + return opt.axisLabelAngles; + case property_1.Property.AXIS_LABELMAXLENGTH: + return opt.axisLabelMaxLengths; + case property_1.Property.AXIS_SUBDIVIDE: + return opt.axisSubDivides; + case property_1.Property.AXIS_TICKS: + return opt.axisTicks; + case property_1.Property.AXIS_TICKCOLOR: + return opt.axisTickColors; + case property_1.Property.AXIS_TICKLABELCOLOR: + return opt.axisTickLabelColors; + case property_1.Property.AXIS_TICKLABELFONT: + return opt.axisTickLabelFonts; + case property_1.Property.AXIS_TICKLABELFONTSIZE: + return opt.axisTickLabelFontSizes; + case property_1.Property.AXIS_TICKPADDING: + return opt.axisTickPaddings; + case property_1.Property.AXIS_TICKSIZE: + return opt.axisTickSizes; + case property_1.Property.AXIS_TICKSIZEMAJOR: + return opt.axisTickSizeMajors; + case property_1.Property.AXIS_TICKSIZEMINOR: + return opt.axisTickSizeMinors; + case property_1.Property.AXIS_TICKSIZEEND: + return opt.axisTickSizeEnds; + case property_1.Property.AXIS_TICKWIDTH: + return opt.axisTickWidths; + case property_1.Property.AXIS_VALUES: + return opt.axisValuesList; + case property_1.Property.AXIS_TITLE: + return opt.axisTitles; + case property_1.Property.AXIS_TITLECOLOR: + return opt.axisTitleColors; + case property_1.Property.AXIS_TITLEFONT: + return opt.axisTitleFonts; + case property_1.Property.AXIS_TITLEFONTWEIGHT: + return opt.axisTitleFontWeights; + case property_1.Property.AXIS_TITLEFONTSIZE: + return opt.axisTitleFontSizes; + case property_1.Property.AXIS_TITLEOFFSET: + return opt.axisTitleOffsets; + case property_1.Property.AXIS_TITLEMAXLENGTH: + return opt.axisTitleMaxLengths; + case property_1.Property.AXIS_CHARACTERWIDTH: + return opt.axisCharacterWidths; + case property_1.Property.BIN_MAXBINS: + return opt.maxBinsList; + case property_1.Property.BIN_MIN: + return opt.binMinList; + case property_1.Property.BIN_MAX: + return opt.binMaxList; + case property_1.Property.BIN_BASE: + return opt.binBaseList; + case property_1.Property.BIN_STEP: + return opt.binStepList; + case property_1.Property.BIN_STEPS: + return opt.binStepsList; + case property_1.Property.BIN_MINSTEP: + return opt.binMinstepList; + case property_1.Property.BIN_DIV: + return opt.binDivList; + case property_1.Property.CHANNEL: + return opt.channels; + case property_1.Property.MARK: + return opt.marks; + case property_1.Property.LEGEND_ORIENT: + return opt.legendOrients; + case property_1.Property.LEGEND_OFFSET: + return opt.legendOffsets; + case property_1.Property.LEGEND_VALUES: + return opt.legendValuesList; + case property_1.Property.LEGEND_FORMAT: + return opt.legendFormats; + case property_1.Property.LEGEND_LABELALIGN: + return opt.legendLabelAligns; + case property_1.Property.LEGEND_LABELBASELINE: + return opt.legendLabelBaselines; + case property_1.Property.LEGEND_LABELCOLOR: + return opt.legendLabelColors; + case property_1.Property.LEGEND_LABELFONT: + return opt.legendLabelFonts; + case property_1.Property.LEGEND_LABELFONTSIZE: + return opt.legendLabelFontSizes; + case property_1.Property.LEGEND_SYMBOLCOLOR: + return opt.legendSymbolColors; + case property_1.Property.LEGEND_SYMBOLSHAPE: + return opt.legendSymbolShapes; + case property_1.Property.LEGEND_SYMBOLSIZE: + return opt.legendSymbolSizes; + case property_1.Property.LEGEND_SYMBOLSTROKEWIDTH: + return opt.legendSymbolStrokeWidths; + case property_1.Property.LEGEND_TITLE: + return opt.legendTitles; + case property_1.Property.LEGEND_TITLECOLOR: + return opt.legendTitleColors; + case property_1.Property.LEGEND_TITLEFONT: + return opt.legendTitleFonts; + case property_1.Property.LEGEND_TITLEFONTSIZE: + return opt.legendTitleFontSizes; + case property_1.Property.LEGEND_TITLEFONTWEIGHT: + return opt.legendTitleFontWeights; + 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; + +},{"./property":36,"./util":52}],54:[function(require,module,exports){ +"use strict"; +var property_1 = require("./property"); +var util_1 = require("./util"); +var WildcardIndex = (function () { + function WildcardIndex() { + this._mark = undefined; + this._encodings = {}; + this._encodingIndicesByProperty = {}; + } + WildcardIndex.prototype.setEncodingProperty = function (index, prop, wildcard) { + var encodingsIndex = this._encodings; + // Init encoding index and set prop + var encIndex = encodingsIndex[index] = encodingsIndex[index] || {}; + encIndex[prop] = wildcard; + // Initialize indicesByProperty[prop] and add index + var encodingIndicesByProperty = this._encodingIndicesByProperty; + (encodingIndicesByProperty[prop] = encodingIndicesByProperty[prop] || []).push(index); + return this; + }; + WildcardIndex.prototype.hasEncodingProperty = function (index, prop) { + return !!(this._encodings[index] || {})[prop]; + }; + WildcardIndex.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); + }; + WildcardIndex.prototype.isEmpty = function () { + return !this.mark && util_1.keys(this.encodingIndicesByProperty).length === 0; + }; + WildcardIndex.prototype.setMark = function (mark) { + this._mark = mark; + return this; + }; + Object.defineProperty(WildcardIndex.prototype, "mark", { + get: function () { + return this._mark; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WildcardIndex.prototype, "encodings", { + get: function () { + return this._encodings; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WildcardIndex.prototype, "encodingIndicesByProperty", { + get: function () { + return this._encodingIndicesByProperty; + }, + enumerable: true, + configurable: true + }); + return WildcardIndex; +}()); +exports.WildcardIndex = WildcardIndex; + +},{"./property":36,"./util":52}]},{},[31])(31) +}); +//# sourceMappingURL=compassql.js.map diff --git a/compassql.js.map b/compassql.js.map new file mode 100644 index 00000000..613c0981 --- /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", + "node_modules/json-stable-stringify/index.js", + "node_modules/jsonify/index.js", + "node_modules/jsonify/lib/parse.js", + "node_modules/jsonify/lib/stringify.js", + "node_modules/vega-lite/src/aggregate.js", + "node_modules/vega-lite/src/axis.js", + "node_modules/vega-lite/src/bin.js", + "node_modules/vega-lite/src/channel.js", + "node_modules/vega-lite/src/datetime.js", + "node_modules/vega-lite/src/encoding.js", + "node_modules/vega-lite/src/mark.js", + "node_modules/vega-lite/src/scale.js", + "node_modules/vega-lite/src/sort.js", + "node_modules/vega-lite/src/stack.js", + "node_modules/vega-lite/src/timeunit.js", + "node_modules/vega-lite/src/type.js", + "node_modules/vega-lite/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/generate.js", + "src/model.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/fieldorder.js", + "src/ranking/ranking.js", + "src/schema.js", + "src/stylize.js", + "src/util.js", + "src/wildcard.js", + "src/wildcardindex.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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;;;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;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/rBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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 === '' ? 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 fieldNames(datum) {\n return util.keys(datum);\n}\n\nfunction bracket(fieldName) {\n return '[' + fieldName + ']';\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 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];\nexports.SUM_OPS = [\n AggregateOp.COUNT,\n AggregateOp.SUM,\n AggregateOp.DISTINCT,\n AggregateOp.VALID,\n AggregateOp.MISSING\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//# sourceMappingURL=aggregate.js.map", + "\"use strict\";\n(function (AxisOrient) {\n AxisOrient[AxisOrient[\"TOP\"] = 'top'] = \"TOP\";\n AxisOrient[AxisOrient[\"RIGHT\"] = 'right'] = \"RIGHT\";\n AxisOrient[AxisOrient[\"LEFT\"] = 'left'] = \"LEFT\";\n AxisOrient[AxisOrient[\"BOTTOM\"] = 'bottom'] = \"BOTTOM\";\n})(exports.AxisOrient || (exports.AxisOrient = {}));\nvar AxisOrient = exports.AxisOrient;\nexports.defaultAxisConfig = {\n offset: undefined,\n grid: undefined,\n labels: true,\n labelMaxLength: 25,\n tickSize: undefined,\n characterWidth: 6\n};\nexports.defaultFacetAxisConfig = {\n axisWidth: 0,\n labels: true,\n grid: false,\n tickSize: 0\n};\n//# sourceMappingURL=axis.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 case channel_1.SHAPE:\n return 6;\n default:\n return 10;\n }\n}\nexports.autoMaxBins = autoMaxBins;\n//# sourceMappingURL=bin.js.map", + "\"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]);\nexports.STACK_GROUP_CHANNELS = [exports.COLOR, exports.DETAIL, exports.ORDER, exports.OPACITY, exports.SIZE];\n;\nfunction supportMark(channel, mark) {\n return !!getSupportedMark(channel)[mark];\n}\nexports.supportMark = supportMark;\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;\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", + "\"use strict\";\nvar util_1 = require('./util');\nvar SUNDAY_YEAR = 2006;\nfunction isDateTime(o) {\n return !!o && (!!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 return (q - 1) + '';\n }\n else {\n console.warn('Potentially invalid quarter', q);\n return q;\n }\n}\nfunction normalizeMonth(m) {\n if (util_1.isNumber(m)) {\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 + '';\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 console.warn('Potentially invalid month', m);\n return m;\n }\n}\nfunction normalizeDay(d) {\n if (util_1.isNumber(d)) {\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 + '';\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 console.warn('Potentially invalid day', d);\n return d;\n }\n}\nfunction timestamp(d, normalize) {\n var date = new Date(0, 0, 1, 0, 0, 0, 0);\n if (d.day !== undefined) {\n if (util_1.keys(d).length > 1) {\n console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with other units.');\n d = util_1.duplicate(d);\n delete d.day;\n }\n else {\n date.setFullYear(SUNDAY_YEAR);\n var day = normalize ? normalizeDay(d.day) : d.day;\n date.setDate(+day + 1);\n }\n }\n if (d.year !== undefined) {\n date.setFullYear(d.year);\n }\n if (d.quarter !== undefined) {\n var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter;\n date.setMonth(+quarter * 3);\n }\n if (d.month !== undefined) {\n var month = normalize ? normalizeMonth(d.month) : d.month;\n date.setMonth(+month);\n }\n if (d.date !== undefined) {\n date.setDate(d.date);\n }\n if (d.hours !== undefined) {\n date.setHours(d.hours);\n }\n if (d.minutes !== undefined) {\n date.setMinutes(d.minutes);\n }\n if (d.seconds !== undefined) {\n date.setSeconds(d.seconds);\n }\n if (d.milliseconds !== undefined) {\n date.setMilliseconds(d.milliseconds);\n }\n return date.getTime();\n}\nexports.timestamp = timestamp;\nfunction dateTimeExpr(d, normalize) {\n if (normalize === void 0) { normalize = false; }\n var units = [];\n if (normalize && d.day !== undefined) {\n if (util_1.keys(d).length > 1) {\n console.warn('Dropping day from datetime', JSON.stringify(d), 'as day cannot be combined with other units.');\n d = util_1.duplicate(d);\n delete d.day;\n }\n }\n if (d.year !== undefined) {\n units.push(d.year);\n }\n else if (d.day !== undefined) {\n units.push(SUNDAY_YEAR);\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);\n }\n if (d.date !== undefined) {\n units.push(d.date);\n }\n else if (d.day !== undefined) {\n var day = normalize ? normalizeDay(d.day) : d.day;\n units.push(day + '+1');\n }\n else {\n units.push(1);\n }\n for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) {\n var timeUnit = _a[_i];\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;\nfunction has(encoding, channel) {\n var channelEncoding = encoding && encoding[channel];\n return channelEncoding && (channelEncoding.field !== undefined ||\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 aggregate_1 = require('./aggregate');\nvar channel_1 = require('./channel');\nvar encoding_1 = require('./encoding');\nvar mark_1 = require('./mark');\nvar scale_1 = require('./scale');\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, stacked) {\n if (util_1.contains([StackOffset.NONE, null, false], stacked)) {\n return null;\n }\n if (!util_1.contains([mark_1.BAR, mark_1.AREA, mark_1.POINT, mark_1.CIRCLE, mark_1.SQUARE, mark_1.LINE, mark_1.TEXT, mark_1.TICK], mark)) {\n return null;\n }\n if (!encoding_1.isAggregate(encoding)) {\n return null;\n }\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 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 var fieldChannel = xIsAggregate ? channel_1.X : channel_1.Y;\n var fieldChannelAggregate = encoding[fieldChannel].aggregate;\n var fieldChannelScale = encoding[fieldChannel].scale;\n if (fieldChannelScale && fieldChannelScale.type && fieldChannelScale.type !== scale_1.ScaleType.LINEAR) {\n console.warn('Cannot stack non-linear (' + fieldChannelScale.type + ') scale');\n return null;\n }\n if (util_1.contains(aggregate_1.SUM_OPS, fieldChannelAggregate)) {\n if (util_1.contains([mark_1.BAR, mark_1.AREA], mark)) {\n stacked = stacked === undefined ? StackOffset.ZERO : stacked;\n }\n }\n else {\n console.warn('Cannot stack when the aggregate function is ' + fieldChannelAggregate + '(non-summative).');\n return null;\n }\n if (!stacked) {\n return null;\n }\n return {\n groupbyChannel: xIsAggregate ? (hasYField ? channel_1.Y : null) : (hasXField ? channel_1.X : null),\n fieldChannel: fieldChannel,\n stackByChannels: stackByChannels,\n offset: stacked\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 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[\"MONTHDATE\"] = 'monthdate'] = \"MONTHDATE\";\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;\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;\nfunction convert(unit, date) {\n var result = new Date(0, 0, 1, 0, 0, 0, 0);\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 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);\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');\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 return scale_1.ScaleType.TIME;\n}\nexports.defaultScaleType = defaultScaleType;\nfunction fieldExpr(fullTimeUnit, field) {\n var fieldRef = 'datum[\"' + field + '\"]';\n function func(timeUnit) {\n if (timeUnit === TimeUnit.QUARTER) {\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;\nfunction imputedDomain(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, 1, 2, 3];\n }\n return null;\n}\nexports.imputedDomain = imputedDomain;\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;\nfunction template(timeUnit, field, shortTimeLabels) {\n if (!timeUnit) {\n return undefined;\n }\n var dateComponents = [];\n var template = '';\n var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR);\n if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) {\n template = 'Q{{' + field + ' | quarter}}';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n dateComponents.push(shortTimeLabels !== false ? '%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' + (hasYear ? ',' : ''));\n }\n if (hasYear) {\n dateComponents.push(shortTimeLabels ? '%y' : '%Y');\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 dateTimeComponents = [];\n if (dateComponents.length > 0) {\n dateTimeComponents.push(dateComponents.join(' '));\n }\n if (timeComponents.length > 0) {\n dateTimeComponents.push(timeComponents.join(':'));\n }\n if (dateTimeComponents.length > 0) {\n if (template) {\n template += ' ';\n }\n template += '{{' + field + ' | time:\\'' + dateTimeComponents.join(' ') + '\\'}}';\n }\n return template || undefined;\n}\nexports.template = template;\n//# sourceMappingURL=timeunit.js.map", + "\"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;\nexports.SHORT_TYPE = {\n quantitative: 'Q',\n temporal: 'T',\n nominal: 'N',\n ordinal: 'O'\n};\nexports.TYPE_FROM_SHORT_TYPE = {\n Q: exports.QUANTITATIVE,\n T: exports.TEMPORAL,\n O: exports.ORDINAL,\n N: exports.NOMINAL\n};\nfunction getFullName(type) {\n var typeString = type;\n return exports.TYPE_FROM_SHORT_TYPE[typeString.toUpperCase()] ||\n typeString.toLowerCase();\n}\nexports.getFullName = getFullName;\n//# sourceMappingURL=type.js.map", + "\"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 util_3 = require('datalib/src/util');\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;\nfunction range(start, stop, step) {\n if (arguments.length < 3) {\n step = 1;\n if (arguments.length < 2) {\n stop = start;\n start = 0;\n }\n }\n if ((stop - start) / step === Infinity) {\n throw new Error('Infinite range');\n }\n var range = [], i = -1, j;\n if (step < 0) {\n while ((j = start + step * ++i) > stop) {\n range.push(j);\n }\n }\n else {\n while ((j = start + step * ++i) < stop) {\n range.push(j);\n }\n }\n return range;\n}\nexports.range = range;\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;\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;\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}\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;\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", + "\"use strict\";\nvar channel_1 = require(\"vega-lite/src/channel\");\nvar aggregate_1 = require(\"vega-lite/src/aggregate\");\nvar mark_1 = require(\"vega-lite/src/mark\");\nvar scale_1 = require(\"vega-lite/src/scale\");\nvar sort_1 = require(\"vega-lite/src/sort\");\nvar timeunit_1 = require(\"vega-lite/src/timeunit\");\nvar type_1 = require(\"vega-lite/src/type\");\nvar property_1 = require(\"./property\");\nexports.DEFAULT_QUERY_CONFIG = {\n verbose: false,\n defaultSpecConfig: {\n overlay: { line: true },\n scale: { useRawDomain: true }\n },\n propertyPrecedence: property_1.DEFAULT_PROPERTY_PRECEDENCE,\n marks: [mark_1.Mark.POINT, mark_1.Mark.BAR, mark_1.Mark.LINE, mark_1.Mark.AREA, mark_1.Mark.TICK],\n channels: [channel_1.X, channel_1.Y, channel_1.ROW, channel_1.COLUMN, channel_1.SIZE, channel_1.COLOR],\n aggregates: [undefined, aggregate_1.AggregateOp.MEAN],\n timeUnits: [undefined, timeunit_1.TimeUnit.YEAR, timeunit_1.TimeUnit.MONTH, timeunit_1.TimeUnit.MINUTES, timeunit_1.TimeUnit.SECONDS],\n types: [type_1.Type.NOMINAL, type_1.Type.ORDINAL, type_1.Type.QUANTITATIVE, type_1.Type.TEMPORAL],\n maxBinsList: [5, 10, 20],\n binMinList: [undefined],\n binMaxList: [undefined],\n binBaseList: [10],\n binStepList: [undefined],\n binStepsList: [undefined],\n binMinstepList: [undefined],\n binDivList: [5, 2],\n axisAxisColors: [undefined],\n axisAxisWidths: [undefined],\n axisLayers: ['front', 'back'],\n axisOffsets: [undefined],\n axisOrients: [undefined],\n axisGridColors: [undefined],\n axisGridDashes: [undefined],\n axisGridOpacities: [undefined],\n axisGridWidths: [undefined],\n axisFormats: [undefined],\n axisLabelAngles: [undefined],\n axisLabelMaxLengths: [undefined],\n axisSubDivides: [undefined],\n axisTicks: [undefined],\n axisTickColors: [undefined],\n axisTickLabelColors: [undefined],\n axisTickLabelFonts: [undefined],\n axisTickLabelFontSizes: [undefined],\n axisTickPaddings: [undefined],\n axisTickSizes: [undefined],\n axisTickSizeMajors: [undefined],\n axisTickSizeMinors: [undefined],\n axisTickSizeEnds: [undefined],\n axisTickWidths: [undefined],\n axisValuesList: [undefined],\n axisTitles: [undefined],\n axisTitleColors: [undefined],\n axisTitleFonts: [undefined],\n axisTitleFontWeights: [undefined],\n axisTitleFontSizes: [undefined],\n axisTitleOffsets: [undefined],\n axisTitleMaxLengths: [undefined],\n axisCharacterWidths: [undefined],\n legendOrients: ['left', 'right'],\n legendOffsets: [undefined],\n legendValuesList: [undefined],\n legendFormats: [undefined],\n legendLabelAligns: [undefined],\n legendLabelBaselines: [undefined],\n legendLabelColors: [undefined],\n legendLabelFonts: [undefined],\n legendLabelFontSizes: [undefined],\n legendSymbolColors: [undefined],\n legendSymbolShapes: [undefined],\n legendSymbolSizes: [undefined],\n legendSymbolStrokeWidths: [undefined],\n legendTitles: [undefined],\n legendTitleColors: [undefined],\n legendTitleFonts: [undefined],\n legendTitleFontSizes: [undefined],\n legendTitleFontWeights: [undefined],\n // TODO: Come back and implement correctly when designing sort enumeration.\n sorts: [sort_1.SortOrder.ASCENDING, sort_1.SortOrder.DESCENDING],\n sortOps: [aggregate_1.AggregateOp.MIN, aggregate_1.AggregateOp.MEAN],\n sortOrders: [sort_1.SortOrder.ASCENDING, sort_1.SortOrder.DESCENDING],\n scaleBandSizes: [17, 21],\n scaleDomains: [undefined],\n scaleExponents: [1],\n scaleRanges: [undefined],\n scaleTypes: [undefined, scale_1.ScaleType.LOG],\n numberNominalProportion: 0.05,\n numberNominalLimit: 40,\n // CONSTRAINTS\n constraintManuallySpecifiedValue: false,\n // Spec Constraints -- See description inside src/constraints/spec.ts\n autoAddCount: false,\n hasAppropriateGraphicTypeForMark: true,\n omitAggregate: false,\n omitAggregatePlotWithDimensionOnlyOnFacet: true,\n omitAggregatePlotWithoutDimension: false,\n omitBarLineAreaWithOcclusion: true,\n omitBarTickWithSize: true,\n omitMultipleNonPositionalChannels: true,\n omitNonSumStack: true,\n omitRaw: false,\n omitRawContinuousFieldForAggregatePlot: true,\n omitRepeatedField: true,\n omitNonPositionalOrFacetOverPositionalChannels: true,\n omitTableWithOcclusionIfAutoAddCount: true,\n omitVerticalDotPlot: false,\n preferredBinAxis: channel_1.Channel.X,\n preferredTemporalAxis: channel_1.Channel.X,\n preferredOrdinalAxis: channel_1.Channel.Y,\n preferredNominalAxis: channel_1.Channel.Y,\n preferredFacet: channel_1.Channel.ROW,\n // Encoding Constraints -- See description inside src/constraints/encoding.ts\n maxCardinalityForCategoricalColor: 20,\n maxCardinalityForFacet: 20,\n maxCardinalityForShape: 6,\n timeUnitShouldHaveVariation: true,\n typeMatchesSchemaType: true,\n // STYLIZE\n stylize: true,\n smallBandSizeForHighCardinalityOrFacet: { maxCardinality: 10, bandSize: 12 },\n nominalColorScaleForHighCardinality: { maxCardinality: 10, palette: 'category20' },\n xAxisOnTopForHighYCardinalityWithoutColumn: { maxCardinality: 30 },\n // RANKING PREFERENCE\n maxGoodCardinalityForFacet: 5,\n maxGoodCardinalityForColor: 7,\n};\n//# sourceMappingURL=config.js.map", + "\"use strict\";\n/**\n * Abstract model for a constraint.\n */\nvar AbstractConstraintModel = (function () {\n function AbstractConstraintModel(constraint) {\n this.constraint = constraint;\n }\n AbstractConstraintModel.prototype.name = function () {\n return this.constraint.name;\n };\n AbstractConstraintModel.prototype.description = function () {\n return this.constraint.description;\n };\n AbstractConstraintModel.prototype.properties = function () {\n return this.constraint.properties;\n };\n AbstractConstraintModel.prototype.strict = function () {\n return this.constraint.strict;\n };\n return AbstractConstraintModel;\n}());\nexports.AbstractConstraintModel = AbstractConstraintModel;\n//# sourceMappingURL=base.js.map", + "\"use strict\";\nvar _encoding = require(\"./encoding\");\nvar _spec = require(\"./spec\");\nexports.encoding = _encoding;\nexports.spec = _spec;\n//# sourceMappingURL=constraint.js.map", + "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar aggregate_1 = require(\"vega-lite/src/aggregate\");\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 base_1 = require(\"./base\");\nvar property_1 = require(\"../property\");\nvar wildcard_1 = require(\"../wildcard\");\nvar schema_1 = require(\"../schema\");\nvar util_1 = require(\"../util\");\nvar encoding_1 = require(\"../query/encoding\");\nvar EncodingConstraintModel = (function (_super) {\n __extends(EncodingConstraintModel, _super);\n function EncodingConstraintModel(constraint) {\n return _super.call(this, constraint) || this;\n }\n EncodingConstraintModel.prototype.hasAllRequiredPropertiesSpecific = function (encQ) {\n return util_1.every(this.constraint.properties, function (prop) {\n var nestedEncProp = property_1.getNestedEncodingProperty(prop);\n if (nestedEncProp) {\n var parent_1 = nestedEncProp.parent;\n var child = nestedEncProp.child;\n if (!encQ[parent_1]) {\n return true;\n }\n return !wildcard_1.isWildcard(encQ[parent_1][child]);\n }\n if (!encQ[prop]) {\n return true;\n }\n return !wildcard_1.isWildcard(encQ[prop]);\n });\n };\n EncodingConstraintModel.prototype.satisfy = function (encQ, schema, encWildcardIndex, opt) {\n // TODO: Re-order logic to optimize the \"allowWildcardForProperties\" check\n if (!this.constraint.allowWildcardForProperties) {\n // TODO: extract as a method and do unit test\n if (!this.hasAllRequiredPropertiesSpecific(encQ)) {\n return true;\n }\n }\n return this.constraint.satisfy(encQ, schema, encWildcardIndex, opt);\n };\n return EncodingConstraintModel;\n}(base_1.AbstractConstraintModel));\nexports.EncodingConstraintModel = EncodingConstraintModel;\nexports.ENCODING_CONSTRAINTS = [\n {\n name: 'aggregateOpSupportedByType',\n description: 'Aggregate function should be supported by data type.',\n properties: [property_1.Property.TYPE, property_1.Property.AGGREGATE],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.aggregate) {\n return encQ.type !== type_1.Type.ORDINAL && encQ.type !== type_1.Type.NOMINAL;\n }\n // TODO: some aggregate function are actually supported by ordinal\n return true; // no aggregate is okay with any type.\n }\n }, {\n name: 'asteriskFieldWithCountOnly',\n description: 'Field=\"*\" should be disallowed except aggregate=\"count\"',\n properties: [property_1.Property.FIELD, property_1.Property.AGGREGATE],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n return (encQ.field === '*') === (encQ.aggregate === aggregate_1.AggregateOp.COUNT);\n }\n }, {\n name: 'binAppliedForQuantitative',\n description: 'bin should be applied to quantitative field only.',\n properties: [property_1.Property.TYPE, property_1.Property.BIN],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.bin) {\n // If binned, the type must be quantitative\n return encQ.type === type_1.Type.QUANTITATIVE;\n }\n return true;\n }\n }, {\n // FIXME(#301) revise this\n name: 'channelSupportsRole',\n description: 'encoding channel should support the role of the field',\n properties: [property_1.Property.CHANNEL, property_1.Property.TYPE, property_1.Property.BIN, property_1.Property.TIMEUNIT],\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (encQ, _, encWildcardIndex, opt) {\n if (wildcard_1.isWildcard(encQ.channel))\n return true; // not ready for checking yet!\n if (!encWildcardIndex.channel && !opt.constraintManuallySpecifiedValue) {\n // Do not have to check this as this is manually specified by users.\n return true;\n }\n var supportedRole = channel_1.getSupportedRole(encQ.channel);\n if (encoding_1.isDimension(encQ)) {\n return supportedRole.dimension;\n }\n else if (encoding_1.isMeasure(encQ)) {\n return supportedRole.measure;\n }\n return true;\n }\n }, {\n name: 'hasFn',\n description: 'A field with as hasFn flag should have one of aggregate, timeUnit, or bin.',\n properties: [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT],\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.hasFn) {\n return !!encQ.aggregate || !!encQ.bin || !!encQ.timeUnit;\n }\n return true;\n }\n }, {\n name: 'omitScaleZeroWithBinnedField',\n description: 'Do not use scale zero with binned field',\n properties: [property_1.Property.SCALE, property_1.Property.SCALE_ZERO, property_1.Property.BIN],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.bin && encQ.scale) {\n if (encQ.scale.zero === true) {\n return false;\n }\n }\n return true;\n }\n }, {\n name: 'onlyOneTypeOfFunction',\n description: 'Only of of aggregate, autoCount, timeUnit, or bin should be applied at the same time.',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN],\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n var numFn = (!wildcard_1.isWildcard(encQ.aggregate) && !!encQ.aggregate ? 1 : 0) +\n (!wildcard_1.isWildcard(encQ.autoCount) && !!encQ.autoCount ? 1 : 0) +\n (!wildcard_1.isWildcard(encQ.bin) && !!encQ.bin ? 1 : 0) +\n (!wildcard_1.isWildcard(encQ.timeUnit) && !!encQ.timeUnit ? 1 : 0);\n return numFn <= 1;\n }\n }, {\n name: 'timeUnitAppliedForTemporal',\n description: 'Time unit should be applied to temporal field only.',\n properties: [property_1.Property.TYPE, property_1.Property.TIMEUNIT],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.timeUnit && encQ.type !== type_1.Type.TEMPORAL) {\n return false;\n }\n return true;\n }\n }, {\n name: 'timeUnitShouldHaveVariation',\n description: 'A particular time unit should be applied only if they produce unique values.',\n properties: [property_1.Property.TIMEUNIT, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (encQ, schema, encWildcardIndex, opt) {\n if (encQ.timeUnit && encQ.type === type_1.Type.TEMPORAL) {\n if (!encWildcardIndex.timeUnit && !opt.constraintManuallySpecifiedValue) {\n // Do not have to check this as this is manually specified by users.\n return true;\n }\n return schema.timeUnitHasVariation(encQ);\n }\n return true;\n }\n }, {\n name: 'scalePropertiesSupportedByScaleType',\n description: 'Scale properties must be supported by correct scale type',\n properties: property_1.SCALE_PROPERTIES.concat([property_1.Property.SCALE, property_1.Property.TYPE]),\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.scale) {\n var scale = encQ.scale;\n // If encQ.type is an Wildcard and scale.type is undefined, it is equivalent\n // to scale type is Wildcard. If scale type is an Wildcard, we do not yet know\n // what the scale type is, and thus can ignore the constraint.\n var sType = encoding_1.scaleType(encQ);\n if (sType === undefined) {\n // If still ambiguous, doesn't check the constraint\n return true;\n }\n for (var scaleProp in scale) {\n if (property_1.SUPPORTED_SCALE_PROPERTY_INDEX[scaleProp]) {\n if (!util_1.contains(property_1.SUPPORTED_SCALE_PROPERTY_INDEX[scaleProp], sType)) {\n return false;\n }\n }\n }\n }\n return true;\n }\n }, {\n name: 'typeMatchesPrimitiveType',\n description: 'Data type should be supported by field\\'s primitive type.',\n properties: [property_1.Property.FIELD, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, schema, encWildcardIndex, opt) {\n if (encQ.field === '*') {\n return true;\n }\n var primitiveType = schema.primitiveType(encQ.field);\n var type = encQ.type;\n if (!encWildcardIndex.field && !encWildcardIndex.type && !opt.constraintManuallySpecifiedValue) {\n // Do not have to check this as this is manually specified by users.\n return true;\n }\n switch (primitiveType) {\n case schema_1.PrimitiveType.BOOLEAN:\n case schema_1.PrimitiveType.STRING:\n return type !== type_1.Type.QUANTITATIVE && type !== type_1.Type.TEMPORAL;\n case schema_1.PrimitiveType.NUMBER:\n case schema_1.PrimitiveType.INTEGER:\n return type !== type_1.Type.TEMPORAL;\n case schema_1.PrimitiveType.DATE:\n // TODO: add NOMINAL, ORDINAL support after we support this in Vega-Lite\n return type === type_1.Type.TEMPORAL;\n case null:\n // field does not exist in the schema\n return false;\n }\n throw new Error('Not implemented');\n }\n },\n {\n name: 'typeMatchesSchemaType',\n description: 'Enumerated data type of a field should match the field\\'s type in the schema.',\n properties: [property_1.Property.FIELD, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (encQ, schema, encWildcardIndex, opt) {\n if (!encWildcardIndex.field && !encWildcardIndex.type && !opt.constraintManuallySpecifiedValue) {\n // Do not have to check this as this is manually specified by users.\n return true;\n }\n if (encQ.field === '*') {\n return encQ.type === type_1.Type.QUANTITATIVE;\n }\n return schema.type(encQ.field) === encQ.type;\n }\n }, {\n name: 'maxCardinalityForCategoricalColor',\n description: 'Categorical channel should not have too high cardinality',\n properties: [property_1.Property.CHANNEL, property_1.Property.FIELD],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (encQ, schema, _, opt) {\n // TODO: missing case where ordinal / temporal use categorical color\n // (once we do so, need to add Property.BIN, Property.TIMEUNIT)\n if (encQ.channel === channel_1.Channel.COLOR && encQ.type === type_1.Type.NOMINAL) {\n return schema.cardinality(encQ) <= opt.maxCardinalityForCategoricalColor;\n }\n return true; // other channel is irrelevant to this constraint\n }\n }, {\n name: 'maxCardinalityForFacet',\n description: 'Row/column channel should not have too high cardinality',\n properties: [property_1.Property.CHANNEL, property_1.Property.FIELD, property_1.Property.BIN, property_1.Property.TIMEUNIT],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (encQ, schema, _, opt) {\n if (encQ.channel === channel_1.Channel.ROW || encQ.channel === channel_1.Channel.COLUMN) {\n return schema.cardinality(encQ) <= opt.maxCardinalityForFacet;\n }\n return true; // other channel is irrelevant to this constraint\n }\n }, {\n name: 'maxCardinalityForShape',\n description: 'Shape channel should not have too high cardinality',\n properties: [property_1.Property.CHANNEL, property_1.Property.FIELD, property_1.Property.BIN, property_1.Property.TIMEUNIT],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (encQ, schema, _, opt) {\n if (encQ.channel === channel_1.Channel.SHAPE) {\n return schema.cardinality(encQ) <= opt.maxCardinalityForShape;\n }\n return true; // other channel is irrelevant to this constraint\n }\n }, {\n name: 'dataTypeAndFunctionMatchScaleType',\n description: 'Scale type must match data type',\n properties: [property_1.Property.TYPE, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TIMEUNIT, property_1.Property.BIN],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (encQ, _, __, ___) {\n if (encQ.scale) {\n var type = encQ.type;\n var sType = encoding_1.scaleType(encQ);\n if (util_1.contains([type_1.Type.ORDINAL, type_1.Type.NOMINAL], type)) {\n return util_1.contains([scale_1.ScaleType.ORDINAL, undefined], sType);\n }\n else if (type === type_1.Type.TEMPORAL) {\n if (!encQ.timeUnit) {\n return util_1.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC, undefined], sType);\n }\n else {\n return util_1.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC, scale_1.ScaleType.ORDINAL, undefined], sType);\n }\n }\n else if (type === type_1.Type.QUANTITATIVE) {\n if (encQ.bin) {\n return util_1.contains([scale_1.ScaleType.LINEAR, undefined], sType);\n }\n else {\n return util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.POW, scale_1.ScaleType.SQRT, scale_1.ScaleType.QUANTILE, scale_1.ScaleType.QUANTIZE, scale_1.ScaleType.LINEAR, undefined], sType);\n }\n }\n }\n return true;\n }\n }\n].map(function (ec) { return new EncodingConstraintModel(ec); });\nexports.ENCODING_CONSTRAINT_INDEX = exports.ENCODING_CONSTRAINTS.reduce(function (m, ec) {\n m[ec.name()] = ec;\n return m;\n}, {});\nexports.ENCODING_CONSTRAINTS_BY_PROPERTY = exports.ENCODING_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 checkEncoding(prop, wildcard, index, specM, schema, opt) {\n // Check encoding constraint\n var encodingConstraints = exports.ENCODING_CONSTRAINTS_BY_PROPERTY[prop] || [];\n var encQ = specM.getEncodingQueryByIndex(index);\n for (var _i = 0, encodingConstraints_1 = encodingConstraints; _i < encodingConstraints_1.length; _i++) {\n var c = encodingConstraints_1[_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(encQ, schema, specM.wildcardIndex.encodings[index], opt);\n if (!satisfy) {\n var violatedConstraint = '(enc) ' + c.name();\n /* istanbul ignore if */\n if (opt.verbose) {\n console.log(violatedConstraint + ' failed with ' + specM.toShorthand() + ' for ' + wildcard.name);\n }\n return violatedConstraint;\n }\n }\n }\n return null;\n}\nexports.checkEncoding = checkEncoding;\n//# sourceMappingURL=encoding.js.map", + "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar aggregate_1 = require(\"vega-lite/src/aggregate\");\nvar channel_1 = require(\"vega-lite/src/channel\");\nvar mark_1 = require(\"vega-lite/src/mark\");\nvar scale_1 = require(\"vega-lite/src/scale\");\nvar type_1 = require(\"vega-lite/src/type\");\nvar base_1 = require(\"./base\");\nvar wildcard_1 = require(\"../wildcard\");\nvar property_1 = require(\"../property\");\nvar encoding_1 = require(\"../query/encoding\");\nvar util_1 = require(\"../util\");\nvar encoding_2 = require(\"../query/encoding\");\nvar NONSPATIAL_CHANNELS_INDEX = channel_1.NONSPATIAL_CHANNELS.reduce(function (m, channel) {\n m[channel] = true;\n return m;\n}, {});\nvar SpecConstraintModel = (function (_super) {\n __extends(SpecConstraintModel, _super);\n function SpecConstraintModel(specConstraint) {\n return _super.call(this, specConstraint) || this;\n }\n SpecConstraintModel.prototype.hasAllRequiredPropertiesSpecific = function (specM) {\n return util_1.every(this.constraint.properties, function (prop) {\n if (prop === property_1.Property.MARK) {\n return !wildcard_1.isWildcard(specM.getMark());\n }\n // TODO: transform\n var nestedEncProp = property_1.getNestedEncodingProperty(prop);\n if (nestedEncProp) {\n var parent_1 = nestedEncProp.parent;\n var child_1 = nestedEncProp.child;\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (!encQ[parent_1]) {\n return true;\n }\n return !wildcard_1.isWildcard(encQ[parent_1][child_1]);\n });\n }\n if (!property_1.isEncodingProperty(prop)) {\n throw new Error('UNIMPLEMENTED');\n }\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (!encQ[prop]) {\n return true;\n }\n return !wildcard_1.isWildcard(encQ[prop]);\n });\n });\n };\n SpecConstraintModel.prototype.satisfy = function (specM, schema, opt) {\n // TODO: Re-order logic to optimize the \"allowWildcardForProperties\" check\n if (!this.constraint.allowWildcardForProperties) {\n if (!this.hasAllRequiredPropertiesSpecific(specM)) {\n return true;\n }\n }\n return this.constraint.satisfy(specM, schema, opt);\n };\n return SpecConstraintModel;\n}(base_1.AbstractConstraintModel));\nexports.SpecConstraintModel = SpecConstraintModel;\nexports.SPEC_CONSTRAINTS = [\n {\n name: 'noRepeatedChannel',\n description: 'Each encoding channel should only be used once.',\n properties: [property_1.Property.CHANNEL],\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (specM, _, __) {\n var usedChannel = {};\n // channel for all encodings should be valid\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (!wildcard_1.isWildcard(encQ.channel)) {\n // If channel is specified, it should no be used already\n if (usedChannel[encQ.channel]) {\n return false;\n }\n usedChannel[encQ.channel] = true;\n return true;\n }\n return true; // unspecified channel is valid\n });\n }\n },\n {\n name: 'alwaysIncludeZeroInScaleWithBarMark',\n description: 'Do not recommend bar mark if scale does not start at zero',\n properties: [property_1.Property.MARK, property_1.Property.SCALE, property_1.Property.SCALE_ZERO, property_1.Property.CHANNEL, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (specM, _, __) {\n var mark = specM.getMark();\n var encodings = specM.getEncodings();\n if (mark === mark_1.Mark.BAR) {\n for (var _i = 0, encodings_1 = encodings; _i < encodings_1.length; _i++) {\n var encQ = encodings_1[_i];\n if ((encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) &&\n (encQ.type === type_1.Type.QUANTITATIVE) &&\n (encQ.scale && encQ.scale.zero === false)) {\n // TODO: zero shouldn't be manually specified\n return false;\n }\n }\n }\n return true;\n }\n },\n {\n name: 'autoAddCount',\n description: 'Automatically adding count only for plots with only ordinal, binned quantitative, or temporal with timeunit fields.',\n properties: [property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.TYPE, property_1.Property.AUTOCOUNT],\n allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, __) {\n var hasAutoCount = util_1.some(specM.getEncodings(), function (encQ) { return encQ.autoCount === true; });\n if (hasAutoCount) {\n // Auto count should only be applied if all fields are nominal, ordinal, temporal with timeUnit, binned quantitative, or autoCount\n return util_1.every(specM.getEncodings(), function (encQ) {\n if (encQ.autoCount !== undefined) {\n return true;\n }\n switch (encQ.type) {\n case type_1.Type.QUANTITATIVE:\n return !!encQ.bin;\n case type_1.Type.TEMPORAL:\n return !!encQ.timeUnit;\n case type_1.Type.ORDINAL:\n case type_1.Type.NOMINAL:\n return true;\n }\n /* istanbul ignore next */\n throw new Error('Unsupported Type');\n });\n }\n else {\n var neverHaveAutoCount = util_1.every(specM.wildcardIndex.encodingIndicesByProperty['autoCount'], function (index) {\n return !wildcard_1.isWildcard(specM.getEncodingQueryByIndex(index).autoCount);\n });\n if (neverHaveAutoCount) {\n // If the query surely does not have autoCount\n // then one of the field should be\n // (1) unbinned quantitative\n // (2) temporal without time unit\n // (3) nominal or ordinal field\n // or at least have potential to be (still ambiguous).\n return util_1.some(specM.getEncodings(), function (encQ) {\n if (encQ.type === type_1.Type.QUANTITATIVE) {\n if (encQ.autoCount === false) {\n return false;\n }\n else {\n return !encQ.bin || wildcard_1.isWildcard(encQ.bin);\n }\n }\n else if (encQ.type === type_1.Type.TEMPORAL) {\n return !encQ.timeUnit || wildcard_1.isWildcard(encQ.timeUnit);\n }\n return false; // nominal or ordinal\n });\n }\n }\n return true; // no auto count, no constraint\n }\n },\n {\n name: 'channelPermittedByMarkType',\n description: 'Each encoding channel should be supported by the mark type',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK],\n allowWildcardForProperties: true,\n strict: true,\n satisfy: function (specM, _, __) {\n var mark = specM.getMark();\n // if mark is unspecified, no need to check\n if (wildcard_1.isWildcard(mark))\n return true;\n // TODO: can optimize this to detect only what's the changed property if needed.\n return util_1.every(specM.getEncodings(), function (encQ) {\n // channel unspecified, no need to check\n if (wildcard_1.isWildcard(encQ.channel))\n return true;\n return channel_1.supportMark(encQ.channel, mark);\n });\n }\n },\n {\n name: 'hasAllRequiredChannelsForMark',\n description: 'All required channels for the specified mark should be specified',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (specM, _, __) {\n var mark = specM.getMark();\n switch (mark) {\n case mark_1.Mark.AREA:\n case mark_1.Mark.LINE:\n return specM.channelUsed(channel_1.Channel.X) && specM.channelUsed(channel_1.Channel.Y);\n case mark_1.Mark.TEXT:\n return specM.channelUsed(channel_1.Channel.TEXT);\n case mark_1.Mark.BAR:\n case mark_1.Mark.CIRCLE:\n case mark_1.Mark.SQUARE:\n case mark_1.Mark.TICK:\n case mark_1.Mark.RULE:\n return specM.channelUsed(channel_1.Channel.X) || specM.channelUsed(channel_1.Channel.Y);\n case mark_1.Mark.POINT:\n // This allows generating a point plot if channel was not a wildcard.\n return !specM.wildcardIndex.hasProperty(property_1.Property.CHANNEL) ||\n specM.channelUsed(channel_1.Channel.X) || specM.channelUsed(channel_1.Channel.Y);\n }\n /* istanbul ignore next */\n throw new Error('hasAllRequiredChannelsForMark not implemented for mark' + mark);\n }\n },\n {\n name: 'omitAggregate',\n description: 'Omit aggregate plots.',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, __) {\n if (specM.isAggregate()) {\n return false;\n }\n return true;\n }\n },\n {\n name: 'omitAggregatePlotWithDimensionOnlyOnFacet',\n description: 'All required channels for the specified mark should be specified',\n properties: [property_1.Property.CHANNEL, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, opt) {\n if (specM.isAggregate()) {\n var hasNonFacetDim_1 = false, hasDim_1 = false, hasEnumeratedFacetDim_1 = false;\n specM.specQuery.encodings.forEach(function (encQ, index) {\n if (encQ.autoCount === false)\n return; // skip unused field\n if (!encQ.aggregate && !encQ.autoCount) {\n hasDim_1 = true;\n if (util_1.contains([channel_1.Channel.ROW, channel_1.Channel.COLUMN], encQ.channel)) {\n if (specM.wildcardIndex.hasEncodingProperty(index, property_1.Property.CHANNEL)) {\n hasEnumeratedFacetDim_1 = true;\n }\n }\n else {\n hasNonFacetDim_1 = true;\n }\n }\n });\n if (hasDim_1 && !hasNonFacetDim_1) {\n if (hasEnumeratedFacetDim_1 || opt.constraintManuallySpecifiedValue) {\n return false;\n }\n }\n }\n return true;\n }\n },\n {\n name: 'omitAggregatePlotWithoutDimension',\n description: 'Aggregate plots without dimension should be omitted',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, __) {\n if (specM.isAggregate()) {\n // TODO relax\n return util_1.some(specM.getEncodings(), function (encQ) {\n if (encoding_1.isDimension(encQ)) {\n return true;\n }\n return false;\n });\n }\n return true;\n }\n },\n {\n // TODO: we can be smarter and check if bar has occlusion based on profiling statistics\n name: 'omitBarLineAreaWithOcclusion',\n description: 'Don\\'t use bar, line or area to visualize raw plot as they often lead to occlusion.',\n properties: [property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, __) {\n if (util_1.contains([mark_1.Mark.BAR, mark_1.Mark.LINE, mark_1.Mark.AREA], specM.getMark())) {\n return specM.isAggregate();\n }\n return true;\n }\n },\n {\n name: 'omitBarTickWithSize',\n description: 'Do not map field to size channel with bar and tick mark',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK],\n allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, opt) {\n var mark = specM.getMark();\n if (util_1.contains([mark_1.Mark.TICK, mark_1.Mark.BAR], mark)) {\n if (specM.channelUsed(channel_1.Channel.SIZE)) {\n if (opt.constraintManuallySpecifiedValue) {\n // If size is used and we constraintManuallySpecifiedValue,\n // then the spec violates this constraint.\n return false;\n }\n else {\n // Otherwise have to search for the size channel and check if it is enumerated\n var encodings = specM.specQuery.encodings;\n for (var i = 0; i < encodings.length; i++) {\n var encQ = encodings[i];\n if (encQ.channel === channel_1.Channel.SIZE) {\n if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) {\n // If enumerated, then this is bad\n return false;\n }\n else {\n // If it's manually specified, no need to continue searching, just return.\n return true;\n }\n }\n }\n }\n }\n }\n return true; // skip\n }\n },\n {\n name: 'omitBarAreaForLogScale',\n description: 'Do not use bar and area mark for x and y\\'s log scale',\n properties: [property_1.Property.MARK, property_1.Property.CHANNEL, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TYPE],\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (specM, _, __) {\n var mark = specM.getMark();\n var encodings = specM.getEncodings();\n // TODO: mark or scale type should be enumerated\n if (mark === mark_1.Mark.AREA || mark === mark_1.Mark.BAR) {\n for (var _i = 0, encodings_2 = encodings; _i < encodings_2.length; _i++) {\n var encQ = encodings_2[_i];\n if ((encQ.channel === channel_1.Channel.X || encQ.channel === channel_1.Channel.Y) && encQ.scale) {\n var sType = encoding_2.scaleType(encQ);\n if (sType === scale_1.ScaleType.LOG) {\n return false;\n }\n }\n }\n }\n return true;\n }\n },\n {\n name: 'omitMultipleNonPositionalChannels',\n description: 'Unless manually specified, do not use multiple non-positional encoding channel to avoid over-encoding.',\n properties: [property_1.Property.CHANNEL],\n allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, opt) {\n // have to use specM.specQuery.encodings insetad of specM.getEncodings()\n // since specM.getEncodings() remove encQ with autoCount===false from the array\n // and thus might shift the index\n var encodings = specM.specQuery.encodings;\n var nonPositionChannelCount = 0;\n var hasEnumeratedNonPositionChannel = false;\n for (var i = 0; i < encodings.length; i++) {\n var encQ = encodings[i];\n if (encQ.autoCount === false)\n continue; // ignore skipped encoding\n var channel = encQ.channel;\n if (!wildcard_1.isWildcard(channel)) {\n if (NONSPATIAL_CHANNELS_INDEX[channel + '']) {\n nonPositionChannelCount += 1;\n if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) {\n hasEnumeratedNonPositionChannel = true;\n }\n if (nonPositionChannelCount > 1 &&\n (hasEnumeratedNonPositionChannel || opt.constraintManuallySpecifiedValue)) {\n return false;\n }\n }\n }\n }\n return true;\n }\n },\n {\n name: 'omitNonPositionalOrFacetOverPositionalChannels',\n description: 'Do not use non-positional channels unless all positional channels are used',\n properties: [property_1.Property.CHANNEL],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, opt) {\n var encodings = specM.specQuery.encodings;\n var hasNonPositionalChannelOrFacet = false;\n var hasEnumeratedNonPositionOrFacetChannel = false;\n var hasX = false, hasY = false;\n for (var i = 0; i < encodings.length; i++) {\n var encQ = encodings[i];\n if (encQ.autoCount === false)\n continue; // ignore skipped encoding\n var channel = encQ.channel;\n if (channel === channel_1.Channel.X) {\n hasX = true;\n }\n else if (channel === channel_1.Channel.Y) {\n hasY = true;\n }\n else if (!wildcard_1.isWildcard(channel)) {\n // All non positional channel / Facet\n hasNonPositionalChannelOrFacet = true;\n if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.CHANNEL)) {\n hasEnumeratedNonPositionOrFacetChannel = true;\n }\n }\n }\n if (hasEnumeratedNonPositionOrFacetChannel ||\n (opt.constraintManuallySpecifiedValue && hasNonPositionalChannelOrFacet)) {\n return hasX && hasY;\n }\n return true;\n }\n },\n {\n name: 'omitRaw',\n description: 'Omit raw plots.',\n properties: [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT],\n allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, __) {\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 allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, opt) {\n if (specM.isAggregate()) {\n var encodings = specM.specQuery.encodings;\n for (var i = 0; i < encodings.length; i++) {\n var encQ = encodings[i];\n if (encQ.autoCount === false)\n continue; // skip unused encoding\n // TODO: aggregate for ordinal and temporal\n if (encQ.type === type_1.Type.TEMPORAL) {\n // Temporal fields should have timeUnit or is still a wildcard\n if (!encQ.timeUnit && (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.TIMEUNIT) ||\n opt.constraintManuallySpecifiedValue)) {\n return false;\n }\n }\n if (encQ.type === type_1.Type.QUANTITATIVE) {\n if (!encQ.bin && !encQ.aggregate && !encQ.autoCount) {\n // If Raw Q\n if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.BIN) ||\n specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.AGGREGATE) ||\n specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.AUTOCOUNT)) {\n // and it's raw from enumeration\n return false;\n }\n if (opt.constraintManuallySpecifiedValue) {\n // or if we constraintManuallySpecifiedValue\n return false;\n }\n }\n }\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 allowWildcardForProperties: false,\n strict: true,\n satisfy: function (specM, _, opt) {\n if (specM.isAggregate()) {\n return true;\n }\n return util_1.every(specM.specQuery.encodings, function (encQ, index) {\n if (encQ.autoCount === false)\n return true; // ignore autoCount field\n if (encQ.channel === channel_1.Channel.DETAIL) {\n // Detail channel for raw plot is not good, except when its enumerated\n // or when it's manually specified but we constraintManuallySpecifiedValue.\n if (specM.wildcardIndex.hasEncodingProperty(index, property_1.Property.CHANNEL) ||\n opt.constraintManuallySpecifiedValue) {\n return false;\n }\n }\n return true;\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 allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, opt) {\n var fieldUsed = {};\n var fieldEnumerated = {};\n var encodings = specM.specQuery.encodings;\n for (var i = 0; i < encodings.length; i++) {\n var encQ = encodings[i];\n if (encQ.field && !wildcard_1.isWildcard(encQ.field)) {\n var field = encQ.field;\n if (specM.wildcardIndex.hasEncodingProperty(i, property_1.Property.FIELD)) {\n fieldEnumerated[field] = true;\n }\n // When the field is specified previously,\n // if it is enumerated (either previously or in this encQ)\n // or if the opt.constraintManuallySpecifiedValue is true,\n // then it violates the constraint.\n if (fieldUsed[field]) {\n if (fieldEnumerated[field] || opt.constraintManuallySpecifiedValue) {\n return false;\n }\n }\n fieldUsed[field] = true;\n }\n }\n return true;\n }\n },\n // TODO: omitShapeWithBin\n {\n name: 'omitVerticalDotPlot',\n description: 'Do not output vertical dot plot.',\n properties: [property_1.Property.CHANNEL],\n allowWildcardForProperties: true,\n strict: false,\n satisfy: function (specM, _, __) {\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 allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, __) {\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: 'omitNonLinearScaleTypeWithStack',\n description: 'Stacked plot should only use linear scale',\n properties: [property_1.Property.CHANNEL, property_1.Property.MARK, property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.SCALE, property_1.Property.SCALE_TYPE, property_1.Property.TYPE],\n // TODO: Property.STACK\n allowWildcardForProperties: false,\n strict: true,\n satisfy: function (specM, _, __) {\n var stack = specM.stack();\n if (stack) {\n for (var _i = 0, _a = specM.getEncodings(); _i < _a.length; _i++) {\n var encQ = _a[_i];\n if ((!!encQ.aggregate || encQ.autoCount === true) &&\n encQ.type === type_1.Type.QUANTITATIVE &&\n util_1.contains([channel_1.Channel.X, channel_1.Channel.Y], encQ.channel)) {\n if (encoding_2.scaleType(encQ) !== scale_1.ScaleType.LINEAR) {\n return false;\n }\n }\n }\n }\n return true;\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 allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, __) {\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 allowWildcardForProperties: false,\n strict: false,\n satisfy: function (specM, _, 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, wildcard, specM, schema, opt) {\n // Check encoding constraint\n var specConstraints = exports.SPEC_CONSTRAINTS_BY_PROPERTY[prop] || [];\n for (var _i = 0, specConstraints_1 = specConstraints; _i < specConstraints_1.length; _i++) {\n var c = specConstraints_1[_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 ' + wildcard.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.7.0';\nvar util_1 = require(\"./util\");\nexports.config = require(\"./config\");\nexports.constraint = require(\"./constraint/constraint\");\nexports.enumerate = require(\"./enumerator\");\nexports.wildcard = require(\"./wildcard\");\nvar generate_1 = require(\"./generate\");\nexports.generate = generate_1.generate;\nexports.model = require(\"./model\");\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 (wildcardIndex, schema, opt) {\n return function (answerSet, specM) {\n var markWildcard = specM.getMark();\n // enumerate the value\n markWildcard.enum.forEach(function (mark) {\n specM.setMark(mark);\n // Check spec constraint\n var violatedSpecConstraint = spec_1.checkSpec(property_1.Property.MARK, wildcardIndex.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 (wildcardIndex, schema, opt) {\n return function (answerSet, specM) {\n // index of encoding mappings that require enumeration\n var indices = wildcardIndex.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 wildcard = wildcardIndex.encodings[index][prop];\n var encQ = specM.getEncodingQueryByIndex(index);\n var propWildcard = 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 !propWildcard) {\n enumerate(jobIndex + 1);\n }\n else {\n wildcard.enum.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, wildcard);\n // Check encoding constraint\n var violatedEncodingConstraint = encoding_1.checkEncoding(prop, wildcard, 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, wildcard, 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, wildcard);\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 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 wildcardIndex\n var specM = model_1.SpecQueryModel.build(specQ, schema, opt);\n var wildcardIndex = specM.wildcardIndex;\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 wildcard for this prop\n if (wildcardIndex.hasProperty(prop)) {\n // update answerset\n var reducer = enumerator_1.ENUMERATOR_INDEX[prop](wildcardIndex, schema, opt);\n answerSet = answerSet.reduce(reducer, []);\n }\n });\n if (opt.stylize) {\n if ((opt.nominalColorScaleForHighCardinality !== null) ||\n (opt.smallBandSizeForHighCardinalityOrFacet !== null) ||\n (opt.xAxisOnTopForHighYCardinalityWithoutColumn !== null)) {\n return stylize_1.stylize(answerSet, schema, opt);\n }\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 wildcard_1 = require(\"./wildcard\");\nvar wildcardindex_1 = require(\"./wildcardindex\");\nvar spec_1 = require(\"./query/spec\");\nvar encoding_1 = require(\"./query/encoding\");\nvar groupby_1 = require(\"./query/groupby\");\nvar shorthand_1 = require(\"./query/shorthand\");\nvar util_1 = require(\"./util\");\n/**\n * Internal class for specQuery that provides helper for the enumeration process.\n */\nvar SpecQueryModel = (function () {\n function SpecQueryModel(spec, wildcardIndex, schema, opt, wildcardAssignment) {\n this._rankingScore = {};\n this._spec = spec;\n this._channelCount = spec.encodings.reduce(function (m, encQ) {\n if (!wildcard_1.isWildcard(encQ.channel) && encQ.autoCount !== false) {\n m[encQ.channel + ''] = 1;\n }\n return m;\n }, {});\n this._wildcardIndex = wildcardIndex;\n this._wildcardAssignment = wildcardAssignment;\n this._opt = opt;\n this._schema = schema;\n }\n /**\n * Build an WildcardIndex by detecting enumeration specifiers\n * in the input specQuery and replace short wildcards with\n * full ones that includes both names and enumValues.\n *\n * @return a SpecQueryModel that wraps the specQuery and the WildcardIndex.\n */\n SpecQueryModel.build = function (specQ, schema, opt) {\n var wildcardIndex = new wildcardindex_1.WildcardIndex();\n // mark\n if (wildcard_1.isWildcard(specQ.mark)) {\n var name_1 = wildcard_1.getDefaultName(property_1.Property.MARK);\n specQ.mark = wildcard_1.initWildcard(specQ.mark, name_1, opt.marks);\n wildcardIndex.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 wildcard if not specified\n encQ.type = wildcard_1.SHORT_WILDCARD;\n }\n // For each property of the encodingQuery, enumerate\n property_1.ENCODING_PROPERTIES.forEach(function (prop) {\n if (wildcard_1.isWildcard(encQ[prop])) {\n // Assign default wildcard name and enum values.\n var defaultWildcardName = wildcard_1.getDefaultName(prop) + index;\n var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt);\n var wildcard = encQ[prop] = wildcard_1.initWildcard(encQ[prop], defaultWildcardName, defaultEnumValues);\n // Add index of the encoding mapping to the property's wildcard index.\n wildcardIndex.setEncodingProperty(index, prop, wildcard);\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 (wildcard_1.isWildcard(propObj[child])) {\n // Assign default wildcard name and enum values.\n var defaultWildcardName = wildcard_1.getDefaultName(prop) + index;\n var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt);\n var wildcard = propObj[child] = wildcard_1.initWildcard(propObj[child], defaultWildcardName, defaultEnumValues);\n // Add index of the encoding mapping to the property's wildcard index.\n wildcardIndex.setEncodingProperty(index, prop, wildcard);\n }\n }\n });\n });\n // AUTO COUNT\n // Add Auto Count Field\n if (opt.autoAddCount) {\n var countEncQ = {\n channel: {\n name: wildcard_1.getDefaultName(property_1.Property.CHANNEL) + specQ.encodings.length,\n enum: wildcard_1.getDefaultEnumValues(property_1.Property.CHANNEL, schema, opt)\n },\n autoCount: {\n name: wildcard_1.getDefaultName(property_1.Property.AUTOCOUNT) + specQ.encodings.length,\n enum: [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 wildcard index.\n wildcardIndex.setEncodingProperty(index, property_1.Property.CHANNEL, countEncQ.channel);\n wildcardIndex.setEncodingProperty(index, property_1.Property.AUTOCOUNT, countEncQ.autoCount);\n }\n return new SpecQueryModel(specQ, wildcardIndex, schema, opt, {});\n };\n Object.defineProperty(SpecQueryModel.prototype, \"wildcardIndex\", {\n get: function () {\n return this._wildcardIndex;\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._wildcardIndex, this._schema, this._opt, util_1.duplicate(this._wildcardAssignment));\n };\n SpecQueryModel.prototype.setMark = function (mark) {\n var name = this._spec.mark.name;\n this._wildcardAssignment[name] = this._spec.mark = mark;\n };\n SpecQueryModel.prototype.resetMark = function () {\n var wildcard = this._spec.mark = this._wildcardIndex.mark;\n delete this._wildcardAssignment[wildcard.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, wildcard) {\n var encQ = this._spec.encodings[index];\n var nestedProp = property_1.getNestedEncodingProperty(prop);\n if (prop === property_1.Property.CHANNEL && encQ.channel && !wildcard_1.isWildcard(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 { enum: undefined, name: undefined } // except name and values to it no longer an wildcard\n );\n }\n else {\n encQ[prop] = value;\n }\n this._wildcardAssignment[wildcard.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, wildcard) {\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 wildcard\n if (nestedProp) {\n encQ[nestedProp.parent][nestedProp.child] = wildcard;\n }\n else {\n encQ[prop] = wildcard;\n }\n // add remove value that is reset from the assignment map\n delete this._wildcardAssignment[wildcard.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, _a = this._spec.encodings; _i < _a.length; _i++) {\n var specEncoding = _a[_i];\n if (specEncoding.channel === channel) {\n return specEncoding;\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 (groupBy) {\n if (groupBy) {\n var include = {}, replace = {};\n var parsedGroupBy = groupby_1.parse(groupBy, include, replace);\n return shorthand_1.spec(this._spec, include, parsedGroupBy.replacer);\n }\n return shorthand_1.spec(this._spec);\n };\n SpecQueryModel.prototype._encoding = function () {\n var encoding = {};\n for (var _i = 0, _a = this._spec.encodings; _i < _a.length; _i++) {\n var encQ = _a[_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 a wildcard, return null\n if (wildcard_1.isWildcard(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.TIMEUNIT, property_1.Property.FIELD, property_1.Property.TYPE, property_1.Property.SCALE, property_1.Property.SORT, property_1.Property.AXIS, property_1.Property.LEGEND];\n // TODO(#226):\n // write toSpec() and toShorthand() in a way that prevents outputting inapplicable scale, sort, axis / legend\n for (var _b = 0, PROPERTIES_1 = PROPERTIES; _b < PROPERTIES_1.length; _b++) {\n var prop = PROPERTIES_1[_b];\n // if the property is a wildcard, return null\n if (wildcard_1.isWildcard(encQ[prop]))\n return null;\n // otherwise, assign the proper to the field def\n if (encQ[prop] !== undefined) {\n if (!shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop] ||\n shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop][encQ.channel]) {\n fieldDef[prop] = encQ[prop];\n }\n }\n }\n if (fieldDef.bin === false) {\n // exclude bin false\n delete fieldDef.bin;\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 (wildcard_1.isWildcard(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;\nvar SpecQueryModelGroup = (function () {\n function SpecQueryModelGroup(name, path, items, groupBy, orderGroupBy) {\n if (name === void 0) { name = ''; }\n if (path === void 0) { path = ''; }\n if (items === void 0) { items = []; }\n if (groupBy === void 0) { groupBy = undefined; }\n if (orderGroupBy === void 0) { orderGroupBy = undefined; }\n this._name = name;\n this._path = path;\n this._items = items;\n this._groupBy = groupBy;\n this._orderGroupBy = orderGroupBy;\n }\n SpecQueryModelGroup.prototype.getTopSpecQueryModel = function () {\n var topItem = this._items[0];\n if (topItem instanceof SpecQueryModelGroup) {\n return topItem.getTopSpecQueryModel();\n }\n else {\n return topItem;\n }\n };\n Object.defineProperty(SpecQueryModelGroup.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModelGroup.prototype, \"items\", {\n get: function () {\n return this._items;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModelGroup.prototype, \"groupBy\", {\n get: function () {\n return this._groupBy;\n },\n set: function (groupBy) {\n this._groupBy = groupBy;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModelGroup.prototype, \"orderGroupBy\", {\n get: function () {\n return this._orderGroupBy;\n },\n set: function (orderGroupBy) {\n this._orderGroupBy = orderGroupBy;\n },\n enumerable: true,\n configurable: true\n });\n return SpecQueryModelGroup;\n}());\nexports.SpecQueryModelGroup = SpecQueryModelGroup;\n//# sourceMappingURL=model.js.map", + "\"use strict\";\nvar channel_1 = require(\"vega-lite/src/channel\");\nvar util_1 = require(\"datalib/src/util\");\nvar model_1 = require(\"./model\");\nvar property_1 = require(\"./property\");\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 if (query.nest) {\n var rootGroup_1 = new model_1.SpecQueryModelGroup();\n var groupIndex_1 = {};\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 = [];\n var replacers_1 = [];\n for (var l = 0; l < query.nest.length; l++) {\n includes_1.push(l > 0 ? util_2.duplicate(includes_1[l - 1]) : {});\n replaces.push(l > 0 ? util_2.duplicate(replaces[l - 1]) : {});\n var groupBy = query.nest[l].groupBy;\n if (util_1.isArray(groupBy)) {\n var parsedGroupBy = groupby_1.parse(groupBy, includes_1[l], replaces[l]);\n replacers_1.push(parsedGroupBy.replacer);\n }\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_1;\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_1[path]) {\n groupIndex_1[path] = new model_1.SpecQueryModelGroup(key, path, []);\n group.items.push(groupIndex_1[path]);\n }\n group = groupIndex_1[path];\n }\n group.items.push(specM);\n });\n return rootGroup_1;\n }\n else {\n // no nesting, just return a flat group\n return new model_1.SpecQueryModelGroup('', '', specModels);\n }\n}\nexports.nest = nest;\n// TODO: move this to groupBy, rename properly, and export\nvar GROUP_BY_FIELD = [property_1.Property.FIELD];\nvar PARSED_GROUP_BY_FIELD = groupby_1.parse(GROUP_BY_FIELD, {}, {});\nregisterKeyFn(exports.FIELD, function (specM) {\n return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_FIELD.include, PARSED_GROUP_BY_FIELD.replacer);\n});\n// TODO: move this to groupBy, rename properly, and export\nvar GROUP_BY_FIELD_TRANSFORM = [\n property_1.Property.FIELD, property_1.Property.TYPE,\n property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.STACK\n];\nvar PARSED_GROUP_BY_FIELD_TRANSFORM = groupby_1.parse(GROUP_BY_FIELD_TRANSFORM, {}, {});\nregisterKeyFn(exports.FIELD_TRANSFORM, function (specM) {\n return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_FIELD_TRANSFORM.include, PARSED_GROUP_BY_FIELD_TRANSFORM.replacer);\n});\n// TODO: move this to groupBy, rename properly, and export\nvar GROUP_BY_ENCODING = GROUP_BY_FIELD_TRANSFORM.concat([\n {\n property: property_1.Property.CHANNEL,\n replace: {\n 'x': 'xy', 'y': 'xy',\n 'color': 'style', 'size': 'style', 'shape': 'style', 'opacity': 'style',\n 'row': 'facet', 'column': 'facet'\n }\n }\n]);\nvar PARSED_GROUP_BY_ENCODING = groupby_1.parse(GROUP_BY_ENCODING, {}, {});\nfunction stringifyStack(specM) {\n var _stack = spec_1.stack(specM.specQuery);\n return (!!_stack ? 'stack=' + _stack.offset + '|' : '');\n}\nregisterKeyFn(exports.ENCODING, function (specM) {\n return shorthand_1.spec(specM.specQuery, PARSED_GROUP_BY_ENCODING.include, PARSED_GROUP_BY_ENCODING.replacer);\n});\n// TODO: rename, provide similar format\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 util_1 = require(\"./util\");\nvar scale_1 = require(\"vega-lite/src/scale\");\nvar Property;\n(function (Property) {\n Property.MARK = 'mark';\n Property.FILTER = 'filter';\n // TODO: Sub-properties for filter\n Property.CALCULATE = 'calculate';\n // TODO: Sub-properties for calculate\n Property.FILTERINVALID = 'filterInvalid';\n // Layout\n Property.STACK = 'stack';\n // TODO: sub parts of stack\n // Encoding Properties\n Property.CHANNEL = 'channel';\n Property.AGGREGATE = 'aggregate';\n Property.AUTOCOUNT = 'autoCount';\n Property.BIN = 'bin';\n Property.BIN_MAXBINS = 'binMaxbins';\n Property.BIN_MIN = 'binMin';\n Property.BIN_MAX = 'binMax';\n Property.BIN_BASE = 'binBase';\n Property.BIN_STEP = 'binStep';\n Property.BIN_STEPS = 'binSteps';\n Property.BIN_MINSTEP = 'binMinstep';\n Property.BIN_DIV = 'binDiv';\n Property.HAS_FN = 'hasFn';\n Property.TIMEUNIT = 'timeUnit';\n Property.FIELD = 'field';\n Property.TYPE = 'type';\n // - Sort\n Property.SORT = 'sort';\n Property.SORT_FIELD = 'sortField';\n Property.SORT_OP = 'sortOp';\n Property.SORT_ORDER = 'sortOrder';\n // - Scale\n Property.SCALE = 'scale';\n Property.SCALE_BANDSIZE = 'scaleBandSize';\n Property.SCALE_CLAMP = 'scaleClamp';\n Property.SCALE_DOMAIN = 'scaleDomain';\n Property.SCALE_EXPONENT = 'scaleExponent';\n Property.SCALE_NICE = 'scaleNice';\n Property.SCALE_RANGE = 'scaleRange';\n Property.SCALE_ROUND = 'scaleRound';\n Property.SCALE_TYPE = 'scaleType';\n Property.SCALE_USERAWDOMAIN = 'scaleUseRawDomain';\n Property.SCALE_ZERO = 'scaleZero';\n // - Axis\n Property.AXIS = 'axis';\n // General Axis Properties\n Property.AXIS_AXISCOLOR = 'axisAxisColor';\n Property.AXIS_AXISWIDTH = 'axisAxisWidth';\n Property.AXIS_LAYER = 'axisLayer';\n Property.AXIS_OFFSET = 'axisOffset';\n Property.AXIS_ORIENT = 'axisOrient';\n // Axis_Grid Properties\n Property.AXIS_GRID = 'axisGrid';\n Property.AXIS_GRIDCOLOR = 'axisGridColor';\n Property.AXIS_GRIDDASH = 'axisGridDash';\n Property.AXIS_GRIDOPACITY = 'axisGridOpacity';\n Property.AXIS_GRIDWIDTH = 'axisGridWidth';\n // Axis Properties\n Property.AXIS_LABELS = 'axisLabels';\n Property.AXIS_FORMAT = 'axisFormat';\n Property.AXIS_LABELANGLE = 'axisLabelAngle';\n Property.AXIS_LABELMAXLENGTH = 'axisLabelMaxLength';\n Property.AXIS_SHORTTIMELABELS = 'axisShortTimeLabels';\n // Axis_Tick Properties\n Property.AXIS_SUBDIVIDE = 'axisSubdivide';\n Property.AXIS_TICKS = 'axisTicks';\n Property.AXIS_TICKCOLOR = 'axisTickColor';\n Property.AXIS_TICKLABELCOLOR = 'axisTickLabelColor';\n Property.AXIS_TICKLABELFONT = 'axisTickLabelFont';\n Property.AXIS_TICKLABELFONTSIZE = 'axisTickLabelFontSize';\n Property.AXIS_TICKPADDING = 'axisTickPadding';\n Property.AXIS_TICKSIZE = 'axisTickSize';\n Property.AXIS_TICKSIZEMAJOR = 'axisTickSizeMajor';\n Property.AXIS_TICKSIZEMINOR = 'axisTickSizeMinor';\n Property.AXIS_TICKSIZEEND = 'axisTickSizeEnd';\n Property.AXIS_TICKWIDTH = 'axisTickWidth';\n Property.AXIS_VALUES = 'axisValues';\n // Axis_Title Properties\n Property.AXIS_TITLE = 'axisTitle';\n Property.AXIS_TITLECOLOR = 'axisTitleColor';\n Property.AXIS_TITLEFONT = 'axisTitleFont';\n Property.AXIS_TITLEFONTSIZE = 'axisTitleFontSize';\n Property.AXIS_TITLEFONTWEIGHT = 'axisTitleFontWeight';\n Property.AXIS_TITLEOFFSET = 'axisTitleOffset';\n Property.AXIS_TITLEMAXLENGTH = 'axisTitleMaxLength';\n Property.AXIS_CHARACTERWIDTH = 'axisCharacterWidth';\n // - Legend\n Property.LEGEND = 'legend';\n // General Legend Properties\n Property.LEGEND_ORIENT = 'legendOrient';\n Property.LEGEND_OFFSET = 'legendOffset';\n Property.LEGEND_VALUES = 'legendValues';\n // Legend_Label Properties\n Property.LEGEND_FORMAT = 'legendFormat';\n Property.LEGEND_LABELALIGN = 'legendLabelAlign';\n Property.LEGEND_LABELBASELINE = 'legendLabelBaseline';\n Property.LEGEND_LABELCOLOR = 'legendLabelColor';\n Property.LEGEND_LABELFONT = 'legendLabelFont';\n Property.LEGEND_LABELFONTSIZE = 'legendLabelFontSize';\n Property.LEGEND_SHORTTIMELABELS = 'legendShortTimeLabels';\n // Legend_Symbol Properties\n Property.LEGEND_SYMBOLCOLOR = 'legendSymbolColor';\n Property.LEGEND_SYMBOLSHAPE = 'legendSymbolShape';\n Property.LEGEND_SYMBOLSIZE = 'legendSymbolSize';\n Property.LEGEND_SYMBOLSTROKEWIDTH = 'legendSymbolStrokeWidth';\n // Legend_Title Properties\n Property.LEGEND_TITLE = 'legendTitle';\n Property.LEGEND_TITLECOLOR = 'legendTitleColor';\n Property.LEGEND_TITLEFONT = 'legendTitleFont';\n Property.LEGEND_TITLEFONTSIZE = 'legendTitleFontSize';\n Property.LEGEND_TITLEFONTWEIGHT = 'legendTitleFontWeight';\n})(Property = exports.Property || (exports.Property = {}));\nexports.NESTED_ENCODING_PROPERTIES_PARENT = [\n 'bin', 'scale', 'sort', 'axis', 'legend'\n];\nvar NESTED_ENCODING_PROPERTIES_PARENT_INDEX = util_1.toMap(exports.NESTED_ENCODING_PROPERTIES_PARENT);\nfunction hasNestedProperty(prop) {\n return NESTED_ENCODING_PROPERTIES_PARENT_INDEX[prop];\n}\nexports.hasNestedProperty = hasNestedProperty;\nexports.ENCODING_PROPERTIES = [\n Property.CHANNEL,\n Property.BIN,\n Property.BIN_MAXBINS,\n Property.BIN_MIN,\n Property.BIN_MAX,\n Property.BIN_BASE,\n Property.BIN_STEP,\n Property.BIN_STEPS,\n Property.BIN_MINSTEP,\n Property.BIN_DIV,\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 Property.AXIS,\n Property.AXIS_AXISCOLOR,\n Property.AXIS_AXISWIDTH,\n Property.AXIS_CHARACTERWIDTH,\n Property.AXIS_FORMAT,\n Property.AXIS_GRID,\n Property.AXIS_GRIDCOLOR,\n Property.AXIS_GRIDDASH,\n Property.AXIS_GRIDOPACITY,\n Property.AXIS_GRIDWIDTH,\n Property.AXIS_LABELANGLE,\n Property.AXIS_LABELMAXLENGTH,\n Property.AXIS_LABELS,\n Property.AXIS_LAYER,\n Property.AXIS_OFFSET,\n Property.AXIS_ORIENT,\n Property.AXIS_SHORTTIMELABELS,\n Property.AXIS_SUBDIVIDE,\n Property.AXIS_TICKCOLOR,\n Property.AXIS_TICKLABELCOLOR,\n Property.AXIS_TICKLABELFONT,\n Property.AXIS_TICKLABELFONTSIZE,\n Property.AXIS_TICKPADDING,\n Property.AXIS_TICKS,\n Property.AXIS_TICKSIZE,\n Property.AXIS_TICKSIZEEND,\n Property.AXIS_TICKSIZEMAJOR,\n Property.AXIS_TICKSIZEMINOR,\n Property.AXIS_TICKWIDTH,\n Property.AXIS_TITLE,\n Property.AXIS_TITLECOLOR,\n Property.AXIS_TITLEFONT,\n Property.AXIS_TITLEFONTSIZE,\n Property.AXIS_TITLEFONTWEIGHT,\n Property.AXIS_TITLEMAXLENGTH,\n Property.AXIS_TITLEOFFSET,\n Property.AXIS_VALUES,\n Property.LEGEND,\n Property.LEGEND_ORIENT,\n Property.LEGEND_OFFSET,\n Property.LEGEND_VALUES,\n Property.LEGEND_FORMAT,\n Property.LEGEND_LABELALIGN,\n Property.LEGEND_LABELBASELINE,\n Property.LEGEND_LABELCOLOR,\n Property.LEGEND_LABELFONT,\n Property.LEGEND_LABELFONTSIZE,\n Property.LEGEND_SHORTTIMELABELS,\n Property.LEGEND_SYMBOLCOLOR,\n Property.LEGEND_SYMBOLSHAPE,\n Property.LEGEND_SYMBOLSIZE,\n Property.LEGEND_SYMBOLSTROKEWIDTH,\n Property.LEGEND_TITLE,\n Property.LEGEND_TITLECOLOR,\n Property.LEGEND_TITLEFONT,\n Property.LEGEND_TITLEFONTSIZE,\n Property.LEGEND_TITLEFONTWEIGHT\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 // TODO: Add filter and remove it from INCLUDE_ALL in shorthand\n // TODO: Add calculate and remove it from INCLUDE_ALL in shorthand\n // TODO: Add filterInvalid 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 Property.BIN_MIN,\n Property.BIN_MAX,\n Property.BIN_BASE,\n Property.BIN_STEP,\n Property.BIN_STEPS,\n Property.BIN_MINSTEP,\n Property.BIN_DIV,\n // Encoding\n Property.CHANNEL,\n Property.MARK,\n Property.SCALE,\n Property.AXIS,\n Property.LEGEND,\n // Nested Encoding Property\n // - 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 // - Axis\n Property.AXIS_AXISCOLOR,\n Property.AXIS_AXISWIDTH,\n Property.AXIS_CHARACTERWIDTH,\n Property.AXIS_FORMAT,\n Property.AXIS_GRID,\n Property.AXIS_GRIDCOLOR,\n Property.AXIS_GRIDDASH,\n Property.AXIS_GRIDOPACITY,\n Property.AXIS_GRIDWIDTH,\n Property.AXIS_LABELANGLE,\n Property.AXIS_LABELMAXLENGTH,\n Property.AXIS_LABELS,\n Property.AXIS_LAYER,\n Property.AXIS_OFFSET,\n Property.AXIS_ORIENT,\n Property.AXIS_SHORTTIMELABELS,\n Property.AXIS_SUBDIVIDE,\n Property.AXIS_TICKCOLOR,\n Property.AXIS_TICKLABELCOLOR,\n Property.AXIS_TICKLABELFONT,\n Property.AXIS_TICKLABELFONTSIZE,\n Property.AXIS_TICKPADDING,\n Property.AXIS_TICKS,\n Property.AXIS_TICKSIZE,\n Property.AXIS_TICKSIZEEND,\n Property.AXIS_TICKSIZEMAJOR,\n Property.AXIS_TICKSIZEMINOR,\n Property.AXIS_TICKWIDTH,\n Property.AXIS_TITLE,\n Property.AXIS_TITLECOLOR,\n Property.AXIS_TITLEFONT,\n Property.AXIS_TITLEFONTSIZE,\n Property.AXIS_TITLEFONTWEIGHT,\n Property.AXIS_TITLEMAXLENGTH,\n Property.AXIS_TITLEOFFSET,\n Property.AXIS_VALUES,\n // - Legend\n Property.LEGEND_ORIENT,\n Property.LEGEND_OFFSET,\n Property.LEGEND_VALUES,\n Property.LEGEND_FORMAT,\n Property.LEGEND_LABELALIGN,\n Property.LEGEND_LABELBASELINE,\n Property.LEGEND_LABELCOLOR,\n Property.LEGEND_LABELFONT,\n Property.LEGEND_LABELFONTSIZE,\n Property.LEGEND_SHORTTIMELABELS,\n Property.LEGEND_SYMBOLCOLOR,\n Property.LEGEND_SYMBOLSHAPE,\n Property.LEGEND_SYMBOLSIZE,\n Property.LEGEND_SYMBOLSTROKEWIDTH,\n Property.LEGEND_TITLE,\n Property.LEGEND_TITLECOLOR,\n Property.LEGEND_TITLEFONT,\n Property.LEGEND_TITLEFONTSIZE,\n Property.LEGEND_TITLEFONTWEIGHT\n];\n/**\n * Collection of nested encoding properties.\n *\n * [\n * {\n * property: Property.BIN_MAXBINS,\n * parent: 'bin',\n * child: 'maxbins'\n * },\n * ...\n * ]\n */\nexports.NESTED_ENCODING_PROPERTIES = exports.ENCODING_PROPERTIES.reduce(function (nestedEncodingProperties, prop) {\n var p = prop + '';\n // Check if it's a child property of any of the nested encoding property parent\n for (var _i = 0, NESTED_ENCODING_PROPERTIES_PARENT_1 = exports.NESTED_ENCODING_PROPERTIES_PARENT; _i < NESTED_ENCODING_PROPERTIES_PARENT_1.length; _i++) {\n var parent_1 = NESTED_ENCODING_PROPERTIES_PARENT_1[_i];\n if (p.length > parent_1.length && p.substr(0, parent_1.length) === parent_1) {\n // Convert PascalCase to camelCase\n var child = (p[parent_1.length] + '').toLowerCase() + p.substr(parent_1.length + 1);\n nestedEncodingProperties.push({\n property: prop,\n parent: parent_1,\n child: child\n });\n break;\n }\n }\n return nestedEncodingProperties;\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 wildcard_1 = require(\"../wildcard\");\nvar util_1 = require(\"../util\");\nfunction isDimension(encQ) {\n return util_1.contains([type_1.Type.NOMINAL, type_1.Type.ORDINAL], encQ.type) ||\n (!wildcard_1.isWildcard(encQ.bin) && !!encQ.bin) ||\n (!wildcard_1.isWildcard(encQ.timeUnit) && !!encQ.timeUnit); // surely T type\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}\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 a Wildcard, there is no clear scale type\n */\nfunction scaleType(encQ) {\n var scale = encQ.scale === true || encQ.scale === wildcard_1.SHORT_WILDCARD ? {} : encQ.scale;\n var type = encQ.type;\n var timeUnit = encQ.timeUnit;\n if (scale && scale.type !== undefined) {\n return scale.type;\n }\n if (wildcard_1.isWildcard(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 (wildcard_1.isWildcard(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('Unsupported type: ' + type + ' in scaleType');\n }\n}\nexports.scaleType = scaleType;\n//# sourceMappingURL=encoding.js.map", + "\"use strict\";\nvar util_1 = require(\"datalib/src/util\");\nvar shorthand_1 = require(\"./shorthand\");\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 parse(groupBy, include, replaceIndex) {\n groupBy.forEach(function (grpBy) {\n if (isExtendedGroupBy(grpBy)) {\n include[grpBy.property] = true;\n replaceIndex[grpBy.property] = grpBy.replace;\n }\n else {\n include[grpBy] = true;\n }\n });\n return {\n include: include,\n replaceIndex: replaceIndex,\n replacer: shorthand_1.getReplacerIndex(replaceIndex)\n };\n}\nexports.parse = parse;\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_1 = 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_1).map(function (valTo) {\n var valsFrom = replaceIndex_1[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 aggregate_1 = require(\"vega-lite/src/aggregate\");\nvar channel_1 = require(\"vega-lite/src/channel\");\nvar timeunit_1 = require(\"vega-lite/src/timeunit\");\nvar type_1 = require(\"vega-lite/src/type\");\nvar util_1 = require(\"datalib/src/util\");\nvar property_1 = require(\"../property\");\nvar spec_1 = require(\"./spec\");\nvar wildcard_1 = require(\"../wildcard\");\nvar property_2 = require(\"../property\");\nvar util_2 = require(\"../util\");\nfunction getReplacerIndex(replaceIndex) {\n return util_2.keys(replaceIndex).reduce(function (fnIndex, prop) {\n fnIndex[prop] = getReplacer(replaceIndex[prop]);\n return fnIndex;\n }, {});\n}\nexports.getReplacerIndex = getReplacerIndex;\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, replacer) {\n if (wildcard_1.isWildcard(v)) {\n // Return the enum array if it's a full wildcard, or just return SHORT_WILDCARD for short ones.\n if (!wildcard_1.isShortWildcard(v) && v.enum) {\n return wildcard_1.SHORT_WILDCARD + JSON.stringify(v.enum);\n }\n else {\n return wildcard_1.SHORT_WILDCARD;\n }\n }\n if (replacer) {\n return replacer(v);\n }\n return v;\n}\nexports.value = value;\nfunction replace(v, replacer) {\n if (replacer) {\n return replacer(v);\n }\n return v;\n}\nexports.replace = replace;\nexports.INCLUDE_ALL = \n// TODO: remove manual STACK, FILTER, CALCULATE concat once we really support enumerating it.\nproperty_2.DEFAULT_PROPERTY_PRECEDENCE.concat([property_2.Property.CALCULATE, property_2.Property.FILTER, property_2.Property.FILTERINVALID, property_2.Property.STACK])\n .reduce(function (m, prop) {\n m[prop] = true;\n return m;\n}, {});\nfunction vlSpec(vlspec, _, __) {\n if (_ === void 0) { _ = exports.INCLUDE_ALL; }\n if (__ === void 0) { __ = {}; }\n var specQ = spec_1.fromSpec(vlspec);\n return spec(specQ);\n}\nexports.vlSpec = vlSpec;\nexports.PROPERTY_SUPPORTED_CHANNELS = {\n axis: { x: true, y: true, row: true, column: true },\n legend: { color: true, opacity: true, size: true, shape: true },\n scale: { x: true, y: true, color: true, opacity: true, row: true, column: true, size: true, shape: true },\n sort: { x: true, y: true, path: true, order: true }\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_2.Property.MARK]) {\n parts.push(value(specQ.mark, replace[property_2.Property.MARK]));\n }\n if (specQ.transform) {\n if (include[property_2.Property.CALCULATE]) {\n if (specQ.transform.calculate !== undefined) {\n parts.push('calculate:' + calculate(specQ.transform.calculate));\n }\n }\n if (include[property_2.Property.FILTER]) {\n if (specQ.transform.filter !== undefined) {\n parts.push('filter:' + JSON.stringify(specQ.transform.filter));\n }\n }\n if (include[property_2.Property.FILTERINVALID]) {\n if (specQ.transform.filterInvalid !== undefined) {\n parts.push('filterInvalid:' + specQ.transform.filterInvalid);\n }\n }\n }\n // TODO: extract this to its own stack method\n if (include[property_2.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 if (specQ.encodings) {\n var encodings = 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 if (encodings) {\n parts.push(encodings);\n }\n }\n return parts.join('|');\n}\nexports.spec = spec;\nfunction calculate(formulaArr) {\n return JSON.stringify(formulaArr.reduce(function (m, calculateItem) {\n m[calculateItem.field] = calculateItem.expr;\n return m;\n }, {}));\n}\nexports.calculate = calculate;\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_2.Property.CHANNEL]) {\n parts.push(value(encQ.channel, replace[property_2.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 definition 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, replacer) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replacer === void 0) { replacer = {}; }\n var fn = null, fnEnumIndex = null;\n /** Encoding properties e.g., Scale, Axis, Legend */\n var props = [];\n if (include[property_2.Property.AGGREGATE] && encQ.autoCount === false) {\n return '-';\n }\n else if (include[property_2.Property.AGGREGATE] && encQ.aggregate && !wildcard_1.isWildcard(encQ.aggregate)) {\n fn = replace(encQ.aggregate, replacer[property_2.Property.AGGREGATE]);\n }\n else if (include[property_2.Property.AGGREGATE] && encQ.autoCount && !wildcard_1.isWildcard(encQ.autoCount)) {\n fn = replace('count', replacer[property_2.Property.AGGREGATE]);\n ;\n }\n else if (include[property_2.Property.TIMEUNIT] && encQ.timeUnit && !wildcard_1.isWildcard(encQ.timeUnit)) {\n fn = replace(encQ.timeUnit, replacer[property_2.Property.TIMEUNIT]);\n }\n else if (include[property_2.Property.BIN] && encQ.bin && !wildcard_1.isWildcard(encQ.bin)) {\n fn = 'bin';\n property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) {\n if (nestedProp && nestedProp.parent === fn) {\n var binTypeProp = nestedProp.property;\n var binTypeStr = nestedProp.child;\n if (include[binTypeProp] && encQ.bin[binTypeStr]) {\n props.push({\n key: binTypeStr,\n value: value(encQ.bin[binTypeStr], replacer[binTypeProp])\n });\n }\n }\n });\n }\n else {\n for (var _i = 0, _a = [property_2.Property.AGGREGATE, property_2.Property.AUTOCOUNT, property_2.Property.TIMEUNIT, property_2.Property.BIN]; _i < _a.length; _i++) {\n var prop = _a[_i];\n var val = encQ[prop];\n if (include[prop] && encQ[prop] && wildcard_1.isWildcard(val)) {\n fn = wildcard_1.SHORT_WILDCARD + '';\n // assign fnEnumIndex[prop] = array of enum values or just \"?\" if it is SHORT_WILDCARD\n fnEnumIndex = fnEnumIndex || {};\n fnEnumIndex[prop] = wildcard_1.isShortWildcard(val) ? val : val.enum;\n if (prop === property_2.Property.BIN) {\n property_1.NESTED_ENCODING_PROPERTIES.forEach(function (nestedProp) {\n var binTypeProp = nestedProp.property;\n var binTypeStr = nestedProp.child;\n if (include[binTypeProp] && encQ.bin[binTypeStr]) {\n props.push({\n key: binTypeStr,\n value: value(encQ.bin[binTypeStr], replacer[binTypeProp])\n });\n }\n });\n }\n }\n }\n if (fnEnumIndex && encQ.hasFn) {\n fnEnumIndex.hasFn = true;\n }\n }\n var _loop_1 = function (nestedPropParent) {\n if (!wildcard_1.isWildcard(encQ.channel) && !exports.PROPERTY_SUPPORTED_CHANNELS[nestedPropParent][encQ.channel]) {\n return \"continue\";\n }\n if (include[nestedPropParent]) {\n if (encQ[nestedPropParent] && !wildcard_1.isWildcard(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: JSON.stringify(encQ[nestedPropParent])\n });\n }\n else {\n var nestedProps = property_2.getNestedEncodingPropertyChildren(nestedPropParent);\n var nestedPropChildren = nestedProps.reduce(function (p, nestedProp) {\n if (include[nestedProp.property] && encQ[nestedPropParent][nestedProp.child] !== undefined) {\n p[nestedProp.child] = replace(encQ[nestedPropParent][nestedProp.child], replacer[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_2.Property.SCALE, property_2.Property.SORT, property_2.Property.AXIS, property_2.Property.LEGEND]; _b < _c.length; _b++) {\n var nestedPropParent = _c[_b];\n _loop_1(nestedPropParent);\n }\n // field\n var fieldAndParams = include[property_2.Property.FIELD] ? value(encQ.field || '*', replacer[property_2.Property.FIELD]) : '...';\n // type\n if (include[property_2.Property.TYPE]) {\n if (wildcard_1.isWildcard(encQ.type)) {\n fieldAndParams += ',' + value(encQ.type, replacer[property_2.Property.TYPE]);\n }\n else {\n var typeShort = ((encQ.type || type_1.Type.QUANTITATIVE) + '').substr(0, 1);\n fieldAndParams += ',' + value(typeShort, replacer[property_2.Property.TYPE]);\n }\n }\n // encoding properties\n fieldAndParams += props.map(function (p) {\n var val = p.value instanceof Array ? '[' + p.value + ']' : p.value;\n return ',' + p.key + '=' + val;\n }).join('');\n if (fn) {\n return fn + (fnEnumIndex ? JSON.stringify(fnEnumIndex) : '') + '(' + fieldAndParams + ')';\n }\n return fieldAndParams;\n}\nexports.fieldDef = fieldDef;\nvar CHANNEL_INDEX = util_1.toMap(channel_1.CHANNELS);\nvar AGGREGATE_OP_INDEX = util_1.toMap(aggregate_1.AGGREGATE_OPS);\nvar SINGLE_TIMEUNIT_INDEX = util_1.toMap(timeunit_1.SINGLE_TIMEUNITS);\nvar MULTI_TIMEUNIT_INDEX = util_1.toMap(timeunit_1.MULTI_TIMEUNITS);\nfunction parse(shorthand) {\n // TODO(https://github.com/uwdata/compassql/issues/259):\n // Do not split directly, but use an upgraded version of `getClosingBraceIndex()`\n var splitShorthand = shorthand.split('|');\n var specQ = { mark: splitShorthand[0], encodings: [] };\n for (var i = 1; i < splitShorthand.length; i++) {\n var part = splitShorthand[i];\n var splitPart = splitWithTail(part, ':', 1);\n var splitPartKey = splitPart[0];\n var splitPartValue = splitPart[1];\n if (CHANNEL_INDEX[splitPartKey] || splitPartKey === '?') {\n var encQ = shorthandParser.encoding(splitPartKey, splitPartValue);\n specQ.encodings.push(encQ);\n continue;\n }\n if (splitPartKey === 'calculate') {\n specQ.transform = specQ.transform || {};\n var calculate_1 = [];\n var fieldExprMapping = JSON.parse(splitPartValue);\n for (var field in fieldExprMapping) {\n calculate_1.push({ field: field, expr: fieldExprMapping[field] });\n }\n specQ.transform.calculate = calculate_1;\n continue;\n }\n if (splitPartKey === 'filter') {\n specQ.transform = specQ.transform || {};\n specQ.transform.filter = JSON.parse(splitPartValue);\n continue;\n }\n if (splitPartKey === 'filterInvalid') {\n specQ.transform = specQ.transform || {};\n specQ.transform.filterInvalid = JSON.parse(splitPartValue);\n continue;\n }\n }\n return specQ;\n}\nexports.parse = parse;\n/**\n * Split a string n times into substrings with the specified delimiter and return them as an array.\n * @param str The string to be split\n * @param delim The delimiter string used to separate the string\n * @param number The value used to determine how many times the string is split\n */\nfunction splitWithTail(str, delim, count) {\n var result = [];\n var lastIndex = 0;\n for (var i = 0; i < count; i++) {\n var indexOfDelim = str.indexOf(delim, lastIndex);\n if (indexOfDelim !== -1) {\n result.push(str.substring(lastIndex, indexOfDelim));\n lastIndex = indexOfDelim + 1;\n }\n else {\n break;\n }\n }\n result.push(str.substr(lastIndex));\n // If the specified count is greater than the number of delimiters that exist in the string,\n // an empty string will be pushed count minus number of delimiter occurence times.\n if (result.length !== count + 1) {\n while (result.length !== count + 1) {\n result.push('');\n }\n }\n return result;\n}\nexports.splitWithTail = splitWithTail;\nvar shorthandParser;\n(function (shorthandParser) {\n function encoding(channel, fieldDefShorthand) {\n var encQ = { channel: channel };\n if (fieldDefShorthand.indexOf('(') !== -1) {\n encQ = fn(encQ, fieldDefShorthand);\n }\n else {\n encQ = rawFieldDef(encQ, splitWithTail(fieldDefShorthand, ',', 2));\n }\n return encQ;\n }\n shorthandParser.encoding = encoding;\n function rawFieldDef(encQ, fieldDefPart) {\n encQ.field = fieldDefPart[0];\n encQ.type = type_1.TYPE_FROM_SHORT_TYPE[fieldDefPart[1].toUpperCase()] || '?';\n var partParams = fieldDefPart[2];\n var closingBraceIndex = 0;\n var i = 0;\n while (i < partParams.length) {\n var propEqualSignIndex = partParams.indexOf('=', i);\n var parsedValue = void 0;\n if (propEqualSignIndex !== -1) {\n var prop = partParams.substring(i, propEqualSignIndex);\n if (partParams[i + prop.length + 1] === '{') {\n var openingBraceIndex = i + prop.length + 1;\n closingBraceIndex = getClosingIndex(openingBraceIndex, partParams, '}');\n var value_1 = partParams.substring(openingBraceIndex, closingBraceIndex + 1);\n parsedValue = JSON.parse(value_1);\n // index after next comma\n i = closingBraceIndex + 2;\n }\n else if (partParams[i + prop.length + 1] === '[') {\n // find closing square bracket\n var openingBracketIndex = i + prop.length + 1;\n var closingBracketIndex = getClosingIndex(openingBracketIndex, partParams, ']');\n var value_2 = partParams.substring(openingBracketIndex, closingBracketIndex + 1);\n parsedValue = JSON.parse(value_2);\n // index after next comma\n i = closingBracketIndex + 2;\n }\n else {\n var propIndex = i;\n // Substring until the next comma (or end of the string)\n var nextCommaIndex = partParams.indexOf(',', i + prop.length);\n if (nextCommaIndex === -1) {\n nextCommaIndex = partParams.length;\n }\n // index after next comma\n i = nextCommaIndex + 1;\n parsedValue = JSON.parse(partParams.substring(propIndex + prop.length + 1, nextCommaIndex));\n }\n if (property_1.hasNestedProperty(prop)) {\n encQ[prop] = parsedValue;\n }\n else {\n // prop is a property of the aggregation function such as bin\n encQ.bin[prop] = parsedValue;\n }\n }\n else {\n // something is wrong with the format of the partParams\n // exits loop if don't have then infintie loop\n break;\n }\n }\n return encQ;\n }\n shorthandParser.rawFieldDef = rawFieldDef;\n function getClosingIndex(openingBraceIndex, str, closingChar) {\n for (var i = openingBraceIndex; i < str.length; i++) {\n if (str[i] === closingChar) {\n return i;\n }\n }\n }\n shorthandParser.getClosingIndex = getClosingIndex;\n function fn(encQ, fieldDefShorthand) {\n // Aggregate, Bin, TimeUnit as wildcard case\n if (fieldDefShorthand[0] === '?') {\n var closingBraceIndex = getClosingIndex(1, fieldDefShorthand, '}');\n var fnEnumIndex = JSON.parse(fieldDefShorthand.substring(1, closingBraceIndex + 1));\n for (var encodingProperty in fnEnumIndex) {\n if (util_2.isArray(fnEnumIndex[encodingProperty])) {\n encQ[encodingProperty] = { enum: fnEnumIndex[encodingProperty] };\n }\n else {\n encQ[encodingProperty] = fnEnumIndex[encodingProperty];\n }\n }\n return rawFieldDef(encQ, splitWithTail(fieldDefShorthand.substring(closingBraceIndex + 2, fieldDefShorthand.length - 1), ',', 2));\n }\n else {\n var func = fieldDefShorthand.substring(0, fieldDefShorthand.indexOf('('));\n var insideFn = fieldDefShorthand.substring(func.length + 1, fieldDefShorthand.length - 1);\n var insideFnParts = splitWithTail(insideFn, ',', 2);\n if (AGGREGATE_OP_INDEX[func]) {\n encQ.aggregate = func;\n return rawFieldDef(encQ, insideFnParts);\n }\n else if (MULTI_TIMEUNIT_INDEX[func] || SINGLE_TIMEUNIT_INDEX[func]) {\n encQ.timeUnit = func;\n return rawFieldDef(encQ, insideFnParts);\n }\n else if (func === 'bin') {\n encQ.bin = {};\n return rawFieldDef(encQ, insideFnParts);\n }\n }\n }\n shorthandParser.fn = fn;\n})(shorthandParser = exports.shorthandParser || (exports.shorthandParser = {}));\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 wildcard_1 = require(\"../wildcard\");\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 (!wildcard_1.isWildcard(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, _, __) {\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 var hasCount = util_1.some(encodings, function (encQ) {\n return encQ.aggregate === aggregate_1.AggregateOp.COUNT || encQ.autoCount === true;\n });\n var hasBin = util_1.some(encodings, function (encQ) {\n return !!encQ.bin;\n });\n if (hasCount) {\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 else if (hasBin) {\n // This is not as good as binning all the Q and show heatmap\n return {\n type: exports.name,\n score: 0.7,\n feature: 'Aggregate with bin but without count'\n };\n }\n else {\n return {\n type: exports.name,\n score: 0.9,\n feature: 'Aggregate without count and without bin'\n };\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 TypeChannelScore.TERRIBLE = -10;\n function init() {\n var SCORE = {};\n // Continuous Quantitative / Temporal Fields\n var CONTINUOUS_TYPE_CHANNEL_SCORE = {\n x: 0,\n y: 0,\n size: -0.575,\n color: -0.725,\n text: -2,\n opacity: -3,\n shape: TypeChannelScore.TERRIBLE,\n row: TypeChannelScore.TERRIBLE,\n column: TypeChannelScore.TERRIBLE,\n detail: 2 * TypeChannelScore.TERRIBLE\n };\n [type_1.Q, type_1.T, type_1.TIMEUNIT_T].forEach(function (type) {\n util_1.keys(CONTINUOUS_TYPE_CHANNEL_SCORE).forEach(function (channel) {\n SCORE[featurize(type, channel)] = CONTINUOUS_TYPE_CHANNEL_SCORE[channel];\n });\n });\n // Discretized Quantitative / Temporal Fields / Ordinal\n var ORDERED_TYPE_CHANNEL_SCORE = util_1.extend({}, CONTINUOUS_TYPE_CHANNEL_SCORE, {\n row: -0.75,\n column: -0.75,\n shape: -3.1,\n text: -3.2,\n detail: -4\n });\n [type_1.BIN_Q, type_1.TIMEUNIT_O, 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 var NOMINAL_TYPE_CHANNEL_SCORE = {\n x: 0,\n y: 0,\n color: -0.6,\n shape: -0.65,\n row: -0.7,\n column: -0.7,\n text: -0.8,\n detail: -2,\n size: -3,\n opacity: -3.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, _, __) {\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 = type_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.TIMEUNIT_O,\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, _, __) {\n return specM.getEncodings().reduce(function (features, encQ) {\n var type = type_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, _, __) {\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, _, __) {\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, _, __) {\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 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 DISCRETE = [type_1.BIN_Q, type_1.TIMEUNIT_O, type_1.O, type_1.N];\n var DISCRETE_OR_NONE = DISCRETE.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 rect: -1,\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 DISCRETE_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 [type_1.TIMEUNIT_T].forEach(function (yType) {\n var occludedDimensionMeasureMark = {\n // For Time Dimension with time scale, tick is not good\n point: 0,\n text: -0.5,\n tick: -1,\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, type_1.O].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.TIMEUNIT_O].forEach(function (yType) {\n // For aggregate / surely no occlusion plot, Temporal with time or ordinal\n // are not that different.\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 [type_1.TIMEUNIT_T].forEach(function (xType) {\n [type_1.TIMEUNIT_T].forEach(function (yType) {\n // has occlusion\n var ttMark = {\n point: 0,\n rect: -0.1,\n text: -0.5,\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 // as most of the time, it will be the occluded case.\n util_1.forEach(ttMark, function (score, mark) {\n var feature = featurize(xType, yType, true, mark);\n SCORE[feature] = score;\n });\n util_1.forEach(ttMark, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n });\n });\n DISCRETE_OR_NONE.forEach(function (yType) {\n // has occlusion\n var tdMark = {\n tick: 0,\n point: -0.2,\n text: -0.5,\n rect: -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 // as most of the time, it will be the occluded case.\n util_1.forEach(tdMark, function (score, mark) {\n var feature = featurize(xType, yType, true, mark);\n SCORE[feature] = score;\n });\n util_1.forEach(tdMark, function (score, mark) {\n var feature = featurize(yType, xType, true, mark);\n SCORE[feature] = score;\n });\n util_1.forEach(tdMark, function (score, mark) {\n var feature = featurize(xType, yType, false, mark);\n SCORE[feature] = score;\n });\n util_1.forEach(tdMark, function (score, mark) {\n var feature = featurize(yType, xType, false, mark);\n SCORE[feature] = score;\n });\n });\n });\n // DxD\n DISCRETE_OR_NONE.forEach(function (xType) {\n DISCRETE_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, _, __) {\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 ? type_1.getExtendedType(xEncQ) : type_1.NONE;\n var yEncQ = specM.getEncodingQueryByChannel(channel_1.Channel.Y);\n var yType = yEncQ ? type_1.getExtendedType(yEncQ) : type_1.NONE;\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 scale_1 = require(\"vega-lite/src/scale\");\nvar type_1 = require(\"vega-lite/src/type\");\nvar encoding_1 = require(\"../../query/encoding\");\n/**\n * Finer grained data types that takes binning and timeUnit into account.\n */\nvar ExtendedType;\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 /**\n * Time Unit Temporal Field with time scale.\n */\n ExtendedType[ExtendedType[\"TIMEUNIT_T\"] = 'timeUnit_time'] = \"TIMEUNIT_T\";\n /**\n * Time Unit Temporal Field with ordinal scale.\n */\n ExtendedType[ExtendedType[\"TIMEUNIT_O\"] = 'timeUnit_' + type_1.Type.ORDINAL] = \"TIMEUNIT_O\";\n ExtendedType[ExtendedType[\"O\"] = type_1.Type.ORDINAL] = \"O\";\n ExtendedType[ExtendedType[\"N\"] = type_1.Type.NOMINAL] = \"N\";\n ExtendedType[ExtendedType[\"NONE\"] = '-'] = \"NONE\";\n})(ExtendedType = exports.ExtendedType || (exports.ExtendedType = {}));\nexports.Q = ExtendedType.Q;\nexports.BIN_Q = ExtendedType.BIN_Q;\nexports.T = ExtendedType.T;\nexports.TIMEUNIT_T = ExtendedType.TIMEUNIT_T;\nexports.TIMEUNIT_O = ExtendedType.TIMEUNIT_O;\nexports.O = ExtendedType.O;\nexports.N = ExtendedType.N;\nexports.NONE = ExtendedType.NONE;\nfunction getExtendedType(encQ) {\n if (encQ.bin) {\n return ExtendedType.BIN_Q;\n }\n else if (encQ.timeUnit) {\n // FIXME fix scale type checking here\n return encoding_1.scaleType(encQ) === scale_1.ScaleType.ORDINAL ? ExtendedType.TIMEUNIT_O : ExtendedType.TIMEUNIT_T;\n }\n return encQ.type;\n}\nexports.getExtendedType = getExtendedType;\n//# sourceMappingURL=type.js.map", + "\"use strict\";\nvar property_1 = require(\"../property\");\nexports.name = 'fieldOrder';\n/**\n * Return ranking score based on indices of encoded fields in the schema.\n * If there are multiple fields, prioritize field on the lower indices of encodings.\n *\n * For example, to compare two specs with two encodings each,\n * first we compare the field on the 0-th index\n * and only compare the field on the 1-th index only if the fields on the 0-th index are the same.\n */\nfunction score(specM, schema, _) {\n var fieldWildcardIndices = specM.wildcardIndex.encodingIndicesByProperty[property_1.Property.FIELD];\n if (!fieldWildcardIndices) {\n return {\n score: 0,\n features: []\n };\n }\n var encodings = specM.specQuery.encodings;\n var numFields = schema.fieldSchemas.length;\n var features = [];\n var totalScore = 0, base = 1;\n for (var i = fieldWildcardIndices.length - 1; i >= 0; i--) {\n var index = fieldWildcardIndices[i];\n var field = encodings[index].field;\n var fieldWildcard = specM.wildcardIndex.encodings[index].field;\n var fieldIndex = schema.fieldSchema(field).index;\n // reverse order field with lower index should get higher score and come first\n var score_1 = -fieldIndex * base;\n totalScore += score_1;\n features.push({\n score: score_1,\n type: 'fieldOrder',\n feature: \"field \" + fieldWildcard.name + \" is \" + field + \" (#\" + fieldIndex + \" in the schema)\"\n });\n base *= numFields;\n }\n return {\n score: totalScore,\n features: features\n };\n}\nexports.score = score;\n//# sourceMappingURL=fieldorder.js.map", + "\"use strict\";\nexports.effectiveness = require(\"./effectiveness/effectiveness\");\nexports.aggregation = require(\"./aggregation\");\nexports.fieldOrder = require(\"./fieldorder\");\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(comparatorFactory(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.splice(1);\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(groupComparatorFactory(query.nest[level].orderGroupBy, schema, query.config));\n }\n }\n return group;\n}\nexports.rank = rank;\nfunction comparatorFactory(name, schema, opt) {\n return function (m1, m2) {\n if (name instanceof Array) {\n return getScoreDifference(name, m1, m2, schema, opt);\n }\n else {\n return getScoreDifference([name], m1, m2, schema, opt);\n }\n };\n}\nexports.comparatorFactory = comparatorFactory;\nfunction groupComparatorFactory(name, schema, opt) {\n return function (g1, g2) {\n var m1 = g1.getTopSpecQueryModel();\n var m2 = g2.getTopSpecQueryModel();\n if (name instanceof Array) {\n return getScoreDifference(name, m1, m2, schema, opt);\n }\n else {\n return getScoreDifference([name], m1, m2, schema, opt);\n }\n };\n}\nexports.groupComparatorFactory = groupComparatorFactory;\nfunction getScoreDifference(name, m1, m2, schema, opt) {\n for (var _i = 0, name_1 = name; _i < name_1.length; _i++) {\n var rankingName = name_1[_i];\n var scoreDifference = getScore(m2, rankingName, schema, opt).score - getScore(m1, rankingName, schema, opt).score;\n if (scoreDifference !== 0) {\n return scoreDifference;\n }\n }\n return 0;\n}\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}\nexports.getScore = getScore;\nexports.EFFECTIVENESS = 'effectiveness';\nregister(exports.EFFECTIVENESS, exports.effectiveness.default);\nregister(exports.aggregation.name, exports.aggregation.score);\nregister(exports.fieldOrder.name, exports.fieldOrder.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 and the distinct values are less than an amount specified in options\n if ((distinct < opt.numberNominalLimit) && (distinct / summary.count < opt.numberNominalProportion)) {\n type = type_1.Type.NOMINAL;\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, data_1 = data; _i < data_1.length; _i++) {\n var dataEntry = data_1[_i];\n var time = new Date(dataEntry[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 // Add index for sorting\n fieldSchemas.forEach(function (fieldSchema, index) { return fieldSchema.index = index; });\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 /** @return a list of the field names. */\n Schema.prototype.fields = function () {\n return this._fieldSchemas.map(function (fieldSchema) { return fieldSchema.field; });\n };\n Object.defineProperty(Schema.prototype, \"fieldSchemas\", {\n /** @return a list of FieldSchemas */\n get: function () {\n return this._fieldSchemas;\n },\n enumerable: true,\n configurable: true\n });\n Schema.prototype.fieldSchema = function (field) {\n return this._fieldSchemaIndex[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, excludeInvalid) {\n if (augmentTimeUnitDomain === void 0) { augmentTimeUnitDomain = true; }\n if (excludeInvalid === void 0) { excludeInvalid = false; }\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 = void 0;\n if (typeof encQ.bin === 'boolean') {\n // autoMaxBins defaults to 10 if channel is Wildcard\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 // don't need to worry about excludeInvalid here because invalid values don't affect linearly binned field's cardinality\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 var unit = encQ.timeUnit;\n var timeStats = fieldSchema.timeStats;\n // if the cardinality for the timeUnit is not cached, calculate it\n if (!timeStats[unit]) {\n timeStats[unit] = timeSummary(encQ.timeUnit, fieldSchema.stats);\n }\n if (excludeInvalid) {\n return timeStats[unit].distinct - invalidCount(timeStats[unit].unique, ['Invalid Date', null]);\n }\n else {\n return timeStats[unit].distinct;\n }\n }\n else {\n if (fieldSchema) {\n if (excludeInvalid) {\n return fieldSchema.stats.distinct - invalidCount(fieldSchema.stats.unique, [NaN, null]);\n }\n else {\n return fieldSchema.stats.distinct;\n }\n }\n else {\n return null;\n }\n }\n };\n /**\n * Given an EncodingQuery with a timeUnit, returns true if the date field\n * has multiple distinct values for all parts of the timeUnit. Returns undefined\n * if the timeUnit is undefined.\n * i.e.\n * ('yearmonth', [Jan 1 2000, Feb 2 2000] returns false)\n * ('yearmonth', [Jan 1 2000, Feb 2 2001] returns true)\n */\n Schema.prototype.timeUnitHasVariation = function (encQ) {\n if (!encQ.timeUnit) {\n return;\n }\n // if there is no variation in `date`, there should not be variation in `day`\n if (encQ.timeUnit === timeunit_1.TimeUnit.DAY) {\n var dateEncQ = util_1.extend({}, encQ, { timeUnit: timeunit_1.TimeUnit.DATE });\n if (this.cardinality(dateEncQ, false, true) <= 1) {\n return false;\n }\n }\n var fullTimeUnit = encQ.timeUnit;\n for (var _i = 0, SINGLE_TIMEUNITS_1 = timeunit_1.SINGLE_TIMEUNITS; _i < SINGLE_TIMEUNITS_1.length; _i++) {\n var singleUnit = SINGLE_TIMEUNITS_1[_i];\n if (timeunit_1.containsTimeUnit(fullTimeUnit, singleUnit)) {\n // Create a clone of encQ, but with singleTimeUnit\n var singleUnitEncQ = util_1.extend({}, encQ, { timeUnit: singleUnit });\n if (this.cardinality(singleUnitEncQ, false, true) <= 1) {\n return false;\n }\n }\n }\n return true;\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) {\n // return [min, max], coerced into number types\n return [+fieldSchema.stats.min, +fieldSchema.stats.max];\n }\n else if (fieldSchema.primitiveType === PrimitiveType.DATE) {\n // return [min, max] dates\n return [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 return domain.sort(util_1.cmp);\n }\n return domain.map(function (x) {\n // Convert 'null' to null as it is encoded similarly in datalib.\n // This is wrong when it is a string 'null' but that rarely happens.\n return x === 'null' ? null : x;\n }).sort(util_1.cmp);\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.\n * Maps 'null' (string) keys to the null value and invalid dates to 'Invalid Date' in the unique dictionary.\n */\nfunction timeSummary(timeunit, summary) {\n var result = util_1.extend({}, summary);\n var unique = {};\n util_1.keys(summary.unique).forEach(function (dateString) {\n // don't convert null value because the Date constructor will actually convert it to a date\n var date = (dateString === 'null') ? null : new Date(dateString);\n // at this point, `date` is either the null value, a valid Date object, or \"Invalid Date\" which is a Date\n var key;\n if (date === null) {\n key = null;\n }\n else if (isNaN(date.getTime())) {\n key = 'Invalid Date';\n }\n else {\n key = ((timeunit === timeunit_1.TimeUnit.DAY) ? date.getDay() : timeunit_1.convert(timeunit, date)).toString();\n }\n unique[key] = (unique[key] || 0) + 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 = void 0;\n if (value === null) {\n bucket = null;\n }\n else if (isNaN(Number(value))) {\n bucket = NaN;\n }\n else {\n bucket = bin.value(Number(value));\n }\n newUnique[bucket] = (newUnique[bucket] || 0) + oldUnique[value];\n }\n return newUnique;\n}\n/** @return the number of items in list that occur as keys of unique */\nfunction invalidCount(unique, list) {\n return list.reduce(function (prev, cur) {\n return unique[cur] ? prev + 1 : prev;\n }, 0);\n}\nvar PrimitiveType;\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})(PrimitiveType = exports.PrimitiveType || (exports.PrimitiveType = {}));\n//# sourceMappingURL=schema.js.map", + "\"use strict\";\nvar axis_1 = require(\"vega-lite/src/axis\");\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 encoding_1 = require(\"./query/encoding\");\nvar util_1 = require(\"./util\");\nfunction stylize(answerSet, schema, opt) {\n var encQIndex = {};\n answerSet = answerSet.map(function (specM) {\n if (opt.smallBandSizeForHighCardinalityOrFacet) {\n specM = smallBandSizeForHighCardinalityOrFacet(specM, schema, encQIndex, opt);\n }\n if (opt.nominalColorScaleForHighCardinality) {\n specM = nominalColorScaleForHighCardinality(specM, schema, encQIndex, opt);\n }\n if (opt.xAxisOnTopForHighYCardinalityWithoutColumn) {\n specM = xAxisOnTopForHighYCardinalityWithoutColumn(specM, schema, encQIndex, opt);\n }\n return specM;\n });\n return answerSet;\n}\nexports.stylize = stylize;\nfunction smallBandSizeForHighCardinalityOrFacet(specM, schema, encQIndex, opt) {\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) > opt.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))) {\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) > opt.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))) {\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, encQIndex, opt) {\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) > opt.nominalColorScaleForHighCardinality.maxCardinality)) {\n if (colorEncQ.scale === undefined) {\n colorEncQ.scale = {};\n }\n if (colorEncQ.scale) {\n if (!colorEncQ.scale.range) {\n colorEncQ.scale.range = opt.nominalColorScaleForHighCardinality.palette;\n }\n }\n }\n return specM;\n}\nexports.nominalColorScaleForHighCardinality = nominalColorScaleForHighCardinality;\nfunction xAxisOnTopForHighYCardinalityWithoutColumn(specM, schema, encQIndex, opt) {\n [channel_1.Channel.COLUMN, channel_1.Channel.X, channel_1.Channel.Y].forEach(function (channel) {\n encQIndex[channel] = specM.getEncodingQueryByChannel(channel);\n });\n if (encQIndex[channel_1.Channel.COLUMN] === undefined) {\n var xEncQ = encQIndex[channel_1.Channel.X];\n var yEncQ = encQIndex[channel_1.Channel.Y];\n if (yEncQ !== undefined && yEncQ.field && encoding_1.scaleType(yEncQ) === scale_1.ScaleType.ORDINAL) {\n if (xEncQ !== undefined) {\n if (schema.cardinality(yEncQ) > opt.xAxisOnTopForHighYCardinalityWithoutColumn.maxCardinality) {\n if (xEncQ.axis === undefined) {\n xEncQ.axis = {};\n }\n if (xEncQ.axis && !xEncQ.axis.orient) {\n xEncQ.axis.orient = axis_1.AxisOrient.TOP;\n }\n }\n }\n }\n }\n return specM;\n}\nexports.xAxisOnTopForHighYCardinalityWithoutColumn = xAxisOnTopForHighYCardinalityWithoutColumn;\n//# sourceMappingURL=stylize.js.map", + "\"use strict\";\nvar util_1 = require(\"datalib/src/util\");\nvar util_2 = require(\"datalib/src/util\");\nexports.cmp = util_2.cmp;\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;\nexports.toMap = util_2.toMap;\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", + "\"use strict\";\nvar property_1 = require(\"./property\");\nvar util_1 = require(\"./util\");\nexports.SHORT_WILDCARD = '?';\nfunction isWildcard(prop) {\n return isShortWildcard(prop) || (prop !== undefined && (!!prop.enum || !!prop.name) && !util_1.isArray(prop));\n}\nexports.isWildcard = isWildcard;\nfunction isShortWildcard(prop) {\n return prop === exports.SHORT_WILDCARD;\n}\nexports.isShortWildcard = isShortWildcard;\nfunction initWildcard(prop, defaultName, defaultEnumValues) {\n return util_1.extend({}, {\n name: defaultName,\n enum: defaultEnumValues\n }, prop === exports.SHORT_WILDCARD ? {} : prop);\n}\nexports.initWildcard = initWildcard;\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.BIN_MIN:\n return 'b-min';\n case property_1.Property.BIN_MAX:\n return 'b-max';\n case property_1.Property.BIN_BASE:\n return 'b-base';\n case property_1.Property.BIN_STEP:\n return 'b-step';\n case property_1.Property.BIN_STEPS:\n return 'b-steps';\n case property_1.Property.BIN_MINSTEP:\n return 'b-mstep';\n case property_1.Property.BIN_DIV:\n return 'b-div';\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.AXIS:\n return 'ax';\n case property_1.Property.AXIS_AXISCOLOR:\n return 'ax-ac';\n case property_1.Property.AXIS_AXISWIDTH:\n return 'ax-aw';\n case property_1.Property.AXIS_LAYER:\n return 'ax-lay';\n case property_1.Property.AXIS_OFFSET:\n return 'ax-of';\n case property_1.Property.AXIS_ORIENT:\n return 'ax-or';\n case property_1.Property.AXIS_GRID:\n return 'ax-g';\n case property_1.Property.AXIS_GRIDCOLOR:\n return 'ax-gc';\n case property_1.Property.AXIS_GRIDDASH:\n return 'ax-gd';\n case property_1.Property.AXIS_GRIDOPACITY:\n return 'ax-go';\n case property_1.Property.AXIS_GRIDWIDTH:\n return 'ax-gw';\n case property_1.Property.AXIS_LABELS:\n return 'ax-lab';\n case property_1.Property.AXIS_FORMAT:\n return 'ax-f';\n case property_1.Property.AXIS_LABELANGLE:\n return 'ax-laba';\n case property_1.Property.AXIS_LABELMAXLENGTH:\n return 'ax-labm';\n case property_1.Property.AXIS_SHORTTIMELABELS:\n return 'ax-stl';\n case property_1.Property.AXIS_SUBDIVIDE:\n return 'ax-sub';\n case property_1.Property.AXIS_TICKS:\n return 'ax-t';\n case property_1.Property.AXIS_TICKCOLOR:\n return 'ax-tc';\n case property_1.Property.AXIS_TICKLABELCOLOR:\n return 'ax-tlc';\n case property_1.Property.AXIS_TICKLABELFONT:\n return 'ax-tlf';\n case property_1.Property.AXIS_TICKLABELFONTSIZE:\n return 'ax-tlfs';\n case property_1.Property.AXIS_TICKPADDING:\n return 'ax-tp';\n case property_1.Property.AXIS_TICKSIZE:\n return 'ax-ts';\n case property_1.Property.AXIS_TICKSIZEMAJOR:\n return 'ax-tsma';\n case property_1.Property.AXIS_TICKSIZEMINOR:\n return 'ax-tsmi';\n case property_1.Property.AXIS_TICKSIZEEND:\n return 'ax-tse';\n case property_1.Property.AXIS_TICKWIDTH:\n return 'ax-tw';\n case property_1.Property.AXIS_VALUES:\n return 'ax-v';\n case property_1.Property.AXIS_TITLE:\n return 'ax-ti';\n case property_1.Property.AXIS_TITLECOLOR:\n return 'ax-tic';\n case property_1.Property.AXIS_TITLEFONT:\n return 'ax-tif';\n case property_1.Property.AXIS_TITLEFONTSIZE:\n return 'ax-tifs';\n case property_1.Property.AXIS_TITLEFONTWEIGHT:\n return 'ax-tifw';\n case property_1.Property.AXIS_TITLEOFFSET:\n return 'ax-tio';\n case property_1.Property.AXIS_TITLEMAXLENGTH:\n return 'ax-timl';\n case property_1.Property.AXIS_CHARACTERWIDTH:\n return 'ax-cw';\n case property_1.Property.LEGEND:\n return 'l';\n case property_1.Property.LEGEND_ORIENT:\n return 'l-or';\n case property_1.Property.LEGEND_OFFSET:\n return 'l-of';\n case property_1.Property.LEGEND_VALUES:\n return 'l-v';\n case property_1.Property.LEGEND_FORMAT:\n return 'l-f';\n case property_1.Property.LEGEND_LABELALIGN:\n return 'l-la';\n case property_1.Property.LEGEND_LABELBASELINE:\n return 'l-lb';\n case property_1.Property.LEGEND_LABELCOLOR:\n return 'l-lc';\n case property_1.Property.LEGEND_LABELFONT:\n return 'l-lf';\n case property_1.Property.LEGEND_LABELFONTSIZE:\n return 'l-lfs';\n case property_1.Property.LEGEND_SHORTTIMELABELS:\n return 'l-stl';\n case property_1.Property.LEGEND_SYMBOLCOLOR:\n return 'l-syc';\n case property_1.Property.LEGEND_SYMBOLSHAPE:\n return 'l-sysh';\n case property_1.Property.LEGEND_SYMBOLSIZE:\n return 'l-sysi';\n case property_1.Property.LEGEND_SYMBOLSTROKEWIDTH:\n return 'l-sysw';\n case property_1.Property.LEGEND_TITLE:\n return 'l-ti';\n case property_1.Property.LEGEND_TITLECOLOR:\n return 'l-tic';\n case property_1.Property.LEGEND_TITLEFONT:\n return 'l-tif';\n case property_1.Property.LEGEND_TITLEFONTSIZE:\n return 'l-tifs';\n case property_1.Property.LEGEND_TITLEFONTWEIGHT:\n return 'l-tifw';\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.AXIS:\n case property_1.Property.AXIS_GRID:\n case property_1.Property.AXIS_LABELS:\n case property_1.Property.AXIS_SHORTTIMELABELS:\n case property_1.Property.BIN:\n case property_1.Property.LEGEND:\n case property_1.Property.LEGEND_SHORTTIMELABELS:\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.AXIS_AXISCOLOR:\n return opt.axisAxisColors;\n case property_1.Property.AXIS_AXISWIDTH:\n return opt.axisAxisWidths;\n case property_1.Property.AXIS_LAYER:\n return opt.axisLayers;\n case property_1.Property.AXIS_OFFSET:\n return opt.axisOffsets;\n case property_1.Property.AXIS_ORIENT:\n return opt.axisOrients;\n case property_1.Property.AXIS_GRIDCOLOR:\n return opt.axisGridColors;\n case property_1.Property.AXIS_GRIDDASH:\n return opt.axisGridDashes;\n case property_1.Property.AXIS_GRIDOPACITY:\n return opt.axisGridOpacities;\n case property_1.Property.AXIS_GRIDWIDTH:\n return opt.axisGridWidths;\n case property_1.Property.AXIS_FORMAT:\n return opt.axisFormats;\n case property_1.Property.AXIS_LABELANGLE:\n return opt.axisLabelAngles;\n case property_1.Property.AXIS_LABELMAXLENGTH:\n return opt.axisLabelMaxLengths;\n case property_1.Property.AXIS_SUBDIVIDE:\n return opt.axisSubDivides;\n case property_1.Property.AXIS_TICKS:\n return opt.axisTicks;\n case property_1.Property.AXIS_TICKCOLOR:\n return opt.axisTickColors;\n case property_1.Property.AXIS_TICKLABELCOLOR:\n return opt.axisTickLabelColors;\n case property_1.Property.AXIS_TICKLABELFONT:\n return opt.axisTickLabelFonts;\n case property_1.Property.AXIS_TICKLABELFONTSIZE:\n return opt.axisTickLabelFontSizes;\n case property_1.Property.AXIS_TICKPADDING:\n return opt.axisTickPaddings;\n case property_1.Property.AXIS_TICKSIZE:\n return opt.axisTickSizes;\n case property_1.Property.AXIS_TICKSIZEMAJOR:\n return opt.axisTickSizeMajors;\n case property_1.Property.AXIS_TICKSIZEMINOR:\n return opt.axisTickSizeMinors;\n case property_1.Property.AXIS_TICKSIZEEND:\n return opt.axisTickSizeEnds;\n case property_1.Property.AXIS_TICKWIDTH:\n return opt.axisTickWidths;\n case property_1.Property.AXIS_VALUES:\n return opt.axisValuesList;\n case property_1.Property.AXIS_TITLE:\n return opt.axisTitles;\n case property_1.Property.AXIS_TITLECOLOR:\n return opt.axisTitleColors;\n case property_1.Property.AXIS_TITLEFONT:\n return opt.axisTitleFonts;\n case property_1.Property.AXIS_TITLEFONTWEIGHT:\n return opt.axisTitleFontWeights;\n case property_1.Property.AXIS_TITLEFONTSIZE:\n return opt.axisTitleFontSizes;\n case property_1.Property.AXIS_TITLEOFFSET:\n return opt.axisTitleOffsets;\n case property_1.Property.AXIS_TITLEMAXLENGTH:\n return opt.axisTitleMaxLengths;\n case property_1.Property.AXIS_CHARACTERWIDTH:\n return opt.axisCharacterWidths;\n case property_1.Property.BIN_MAXBINS:\n return opt.maxBinsList;\n case property_1.Property.BIN_MIN:\n return opt.binMinList;\n case property_1.Property.BIN_MAX:\n return opt.binMaxList;\n case property_1.Property.BIN_BASE:\n return opt.binBaseList;\n case property_1.Property.BIN_STEP:\n return opt.binStepList;\n case property_1.Property.BIN_STEPS:\n return opt.binStepsList;\n case property_1.Property.BIN_MINSTEP:\n return opt.binMinstepList;\n case property_1.Property.BIN_DIV:\n return opt.binDivList;\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.LEGEND_ORIENT:\n return opt.legendOrients;\n case property_1.Property.LEGEND_OFFSET:\n return opt.legendOffsets;\n case property_1.Property.LEGEND_VALUES:\n return opt.legendValuesList;\n case property_1.Property.LEGEND_FORMAT:\n return opt.legendFormats;\n case property_1.Property.LEGEND_LABELALIGN:\n return opt.legendLabelAligns;\n case property_1.Property.LEGEND_LABELBASELINE:\n return opt.legendLabelBaselines;\n case property_1.Property.LEGEND_LABELCOLOR:\n return opt.legendLabelColors;\n case property_1.Property.LEGEND_LABELFONT:\n return opt.legendLabelFonts;\n case property_1.Property.LEGEND_LABELFONTSIZE:\n return opt.legendLabelFontSizes;\n case property_1.Property.LEGEND_SYMBOLCOLOR:\n return opt.legendSymbolColors;\n case property_1.Property.LEGEND_SYMBOLSHAPE:\n return opt.legendSymbolShapes;\n case property_1.Property.LEGEND_SYMBOLSIZE:\n return opt.legendSymbolSizes;\n case property_1.Property.LEGEND_SYMBOLSTROKEWIDTH:\n return opt.legendSymbolStrokeWidths;\n case property_1.Property.LEGEND_TITLE:\n return opt.legendTitles;\n case property_1.Property.LEGEND_TITLECOLOR:\n return opt.legendTitleColors;\n case property_1.Property.LEGEND_TITLEFONT:\n return opt.legendTitleFonts;\n case property_1.Property.LEGEND_TITLEFONTSIZE:\n return opt.legendTitleFontSizes;\n case property_1.Property.LEGEND_TITLEFONTWEIGHT:\n return opt.legendTitleFontWeights;\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//# sourceMappingURL=wildcard.js.map", + "\"use strict\";\nvar property_1 = require(\"./property\");\nvar util_1 = require(\"./util\");\nvar WildcardIndex = (function () {\n function WildcardIndex() {\n this._mark = undefined;\n this._encodings = {};\n this._encodingIndicesByProperty = {};\n }\n WildcardIndex.prototype.setEncodingProperty = function (index, prop, wildcard) {\n var encodingsIndex = this._encodings;\n // Init encoding index and set prop\n var encIndex = encodingsIndex[index] = encodingsIndex[index] || {};\n encIndex[prop] = wildcard;\n // Initialize indicesByProperty[prop] and add index\n var encodingIndicesByProperty = this._encodingIndicesByProperty;\n (encodingIndicesByProperty[prop] = encodingIndicesByProperty[prop] || []).push(index);\n return this;\n };\n WildcardIndex.prototype.hasEncodingProperty = function (index, prop) {\n return !!(this._encodings[index] || {})[prop];\n };\n WildcardIndex.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 WildcardIndex.prototype.isEmpty = function () {\n return !this.mark && util_1.keys(this.encodingIndicesByProperty).length === 0;\n };\n WildcardIndex.prototype.setMark = function (mark) {\n this._mark = mark;\n return this;\n };\n Object.defineProperty(WildcardIndex.prototype, \"mark\", {\n get: function () {\n return this._mark;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WildcardIndex.prototype, \"encodings\", {\n get: function () {\n return this._encodings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WildcardIndex.prototype, \"encodingIndicesByProperty\", {\n get: function () {\n return this._encodingIndicesByProperty;\n },\n enumerable: true,\n configurable: true\n });\n return WildcardIndex;\n}());\nexports.WildcardIndex = WildcardIndex;\n//# sourceMappingURL=wildcardindex.js.map" + ] +} \ No newline at end of file diff --git a/compassql.min.js b/compassql.min.js new file mode 100644 index 00000000..c7c7e47c --- /dev/null +++ b/compassql.min.js @@ -0,0 +1,6 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r;r="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,r.cql=e()}}(function(){var e;return function r(e,t,n){function i(o,c){if(!t[o]){if(!e[o]){var s="function"==typeof require&&require;if(!c&&s)return s(o,!0);if(a)return a(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var l=t[o]={exports:{}};e[o][0].call(l.exports,function(r){var t=e[o][1][r];return i(t?t:r)},l,l.exports,r,e,t,n)}return t[o].exports}for(var a="function"==typeof require&&require,o=0;o0))return a;for(t(r,1),e(r),r=0;)for(;t(e,1),!n(e););})},n&&(c.count=function(r,t){return i.setTime(+r),a.setTime(+t),e(i),e(a),Math.floor(n(i,a))},c.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?c.filter(o?function(r){return o(r)%e===0}:function(r){return c.count(0,r)%e===0}):c:null}),c}function t(e){return r(function(r){r.setHours(0,0,0,0),r.setDate(r.getDate()-(r.getDay()+7-e)%7)},function(e,r){e.setDate(e.getDate()+7*r)},function(e,r){return(r-e-6e4*(r.getTimezoneOffset()-e.getTimezoneOffset()))/6048e5})}function n(e){return r(function(r){r.setUTCHours(0,0,0,0),r.setUTCDate(r.getUTCDate()-(r.getUTCDay()+7-e)%7)},function(e,r){e.setUTCDate(e.getUTCDate()+7*r)},function(e,r){return(r-e)/6048e5})}var i=new Date,a=new Date,o=r(function(){},function(e,r){e.setTime(+e+r)},function(e,r){return r-e});o.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?r(function(r){r.setTime(Math.floor(r/e)*e)},function(r,t){r.setTime(+r+t*e)},function(r,t){return(t-r)/e}):o:null};var c=r(function(e){e.setMilliseconds(0)},function(e,r){e.setTime(+e+1e3*r)},function(e,r){return(r-e)/1e3},function(e){return e.getSeconds()}),s=r(function(e){e.setSeconds(0,0)},function(e,r){e.setTime(+e+6e4*r)},function(e,r){return(r-e)/6e4},function(e){return e.getMinutes()}),u=r(function(e){e.setMinutes(0,0,0)},function(e,r){e.setTime(+e+36e5*r)},function(e,r){return(r-e)/36e5},function(e){return e.getHours()}),l=r(function(e){e.setHours(0,0,0,0)},function(e,r){e.setDate(e.getDate()+r)},function(e,r){return(r-e-6e4*(r.getTimezoneOffset()-e.getTimezoneOffset()))/864e5},function(e){return e.getDate()-1}),p=t(0),f=t(1),d=t(2),E=t(3),T=t(4),y=t(5),A=t(6),g=r(function(e){e.setHours(0,0,0,0),e.setDate(1)},function(e,r){e.setMonth(e.getMonth()+r)},function(e,r){return r.getMonth()-e.getMonth()+12*(r.getFullYear()-e.getFullYear())},function(e){return e.getMonth()}),S=r(function(e){e.setHours(0,0,0,0),e.setMonth(0,1)},function(e,r){e.setFullYear(e.getFullYear()+r)},function(e,r){return r.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()}),I=r(function(e){e.setUTCMilliseconds(0)},function(e,r){e.setTime(+e+1e3*r)},function(e,r){return(r-e)/1e3},function(e){return e.getUTCSeconds()}),h=r(function(e){e.setUTCSeconds(0,0)},function(e,r){e.setTime(+e+6e4*r)},function(e,r){return(r-e)/6e4},function(e){return e.getUTCMinutes()}),N=r(function(e){e.setUTCMinutes(0,0,0)},function(e,r){e.setTime(+e+36e5*r)},function(e,r){return(r-e)/36e5},function(e){return e.getUTCHours()}),O=r(function(e){e.setUTCHours(0,0,0,0)},function(e,r){e.setUTCDate(e.getUTCDate()+r)},function(e,r){return(r-e)/864e5},function(e){return e.getUTCDate()-1}),m=n(0),L=n(1),v=n(2),C=n(3),P=n(4),R=n(5),_=n(6),M=r(function(e){e.setUTCHours(0,0,0,0),e.setUTCDate(1)},function(e,r){e.setUTCMonth(e.getUTCMonth()+r)},function(e,r){return r.getUTCMonth()-e.getUTCMonth()+12*(r.getUTCFullYear()-e.getUTCFullYear())},function(e){return e.getUTCMonth()}),D=r(function(e){e.setUTCHours(0,0,0,0),e.setUTCMonth(0,1)},function(e,r){e.setUTCFullYear(e.getUTCFullYear()+r)},function(e,r){return r.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()}),U=o.range,b=c.range,x=s.range,F=u.range,G=l.range,B=p.range,X=f.range,w=d.range,k=E.range,H=T.range,Y=y.range,W=A.range,Q=p.range,V=g.range,q=S.range,K=o,z=U,Z=I.range,j=h.range,$=N.range,J=O.range,ee=m.range,re=L.range,te=v.range,ne=C.range,ie=P.range,ae=R.range,oe=_.range,ce=m.range,se=M.range,ue=D.range,le="0.1.1";e.version=le,e.milliseconds=U,e.seconds=b,e.minutes=x,e.hours=F,e.days=G,e.sundays=B,e.mondays=X,e.tuesdays=w,e.wednesdays=k,e.thursdays=H,e.fridays=Y,e.saturdays=W,e.weeks=Q,e.months=V,e.years=q,e.utcMillisecond=K,e.utcMilliseconds=z,e.utcSeconds=Z,e.utcMinutes=j,e.utcHours=$,e.utcDays=J,e.utcSundays=ee,e.utcMondays=re,e.utcTuesdays=te,e.utcWednesdays=ne,e.utcThursdays=ie,e.utcFridays=ae,e.utcSaturdays=oe,e.utcWeeks=ce,e.utcMonths=se,e.utcYears=ue,e.millisecond=o,e.second=c,e.minute=s,e.hour=u,e.day=l,e.sunday=p,e.monday=f,e.tuesday=d,e.wednesday=E,e.thursday=T,e.friday=y,e.saturday=A,e.week=p,e.month=g,e.year=S,e.utcSecond=I,e.utcMinute=h,e.utcHour=N,e.utcDay=O,e.utcSunday=m,e.utcMonday=L,e.utcTuesday=v,e.utcWednesday=C,e.utcThursday=P,e.utcFriday=R,e.utcSaturday=_,e.utcWeek=m,e.utcMonth=M,e.utcYear=D,e.interval=r})},{}],3:[function(e,r,t){function n(e){if(!e)throw Error("Missing binning options.");var r,t,n,c,s,u,l,p=e.maxbins||15,f=e.base||10,d=Math.log(f),E=e.div||[5,2],T=e.min,y=e.max,A=y-T;if(e.step)r=e.step;else if(e.steps)r=e.steps[Math.min(e.steps.length-1,i(e.steps,A/p,0,e.steps.length))];else{for(t=Math.ceil(Math.log(p)/d),n=e.minstep||0,r=Math.max(n,Math.pow(f,Math.round(Math.log(A)/d)-t));Math.ceil(A/r)>p;)r*=f;for(u=0;u=n&&A/s<=p&&(r=s)}return s=Math.log(r),c=s>=0?0:~~(-s/d)+1,l=Math.pow(f,-c-1),T=Math.min(T,Math.floor(T/r+l)*r),y=Math.ceil(y/r)*r,{start:T,stop:y,step:r,unit:{precision:c},value:a,index:o}}function i(e,r,t,n){for(;t>>1;u.cmp(e[i],r)<0?t=i+1:n=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 c(e){return this.unit.date(a.call(this,e))}function s(e){return o.call(this,this.unit.unit(e))}var u=e("../util"),l=e("../time"),p=1e-15;n.date=function(e){if(!e)throw Error("Missing date binning options.");var r=e.utc?l.utc:l,t=e.min,i=e.max,a=e.maxbins||20,o=e.minbins||4,u=+i-+t,p=e.unit?r[e.unit]:r.find(u,o,a),f=n({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=s,e.raw||(f.value=c),f},r.exports=n},{"../time":7,"../util":8}],4:[function(e,r,t){var n=e("./util"),i=r.exports;i.repeat=function(e,r){var t,n=Array(r);for(t=0;tr;)i.push(n);else for(;(n=e+t*++a)=e&&n<=r?1/t:0},n.cdf=function(n){return nr?1:(n-e)/t},n.icdf=function(r){return r>=0&&r<=1?e+r*t:NaN},n},i.random.integer=function(e,r){void 0===r&&(r=e,e=0);var t=r-e,n=function(){return e+Math.floor(t*Math.random())};return n.samples=function(e){return i.zeros(e).map(n)},n.pdf=function(n){return n===Math.floor(n)&&n>=e&&n=r?1:(i-e+1)/t},n.icdf=function(r){return r>=0&&r<=1?e-1+Math.floor(r*t):NaN},n},i.random.normal=function(e,r){e=e||0,r=r||1;var t,n=function(){var n,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,n=a*a+o*o;while(0===n||n>1);return i=Math.sqrt(-2*Math.log(n)/n),t=e+o*i*r,e+a*i*r};return n.samples=function(e){return i.zeros(e).map(n)},n.pdf=function(t){var n=Math.exp(Math.pow(t-e,2)/(-2*Math.pow(r,2)));return 1/(r*Math.sqrt(2*Math.PI))*n},n.cdf=function(t){var n,i=(t-e)/r,a=Math.abs(i);if(a>37)n=0;else{var o,c=Math.exp(-a*a/2);a<7.07106781186547?(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,n=c*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,n/=o):(o=a+.65,o=a+4/o,o=a+3/o,o=a+2/o,o=a+1/o,n=c/o/2.506628274631)}return i>0?1-n:n},n.icdf=function(t){if(t<=0||t>=1)return NaN;var n=2*t-1,i=8*(Math.PI-3)/(3*Math.PI*(4-Math.PI)),a=2/(Math.PI*i)+Math.log(1-Math.pow(n,2))/2,o=Math.log(1-n*n)/i,c=(n>0?1:-1)*Math.sqrt(Math.sqrt(a*a-o)-a);return e+r*Math.SQRT2*c},n},i.random.bootstrap=function(e,r){var t=e.filter(n.isValid),a=t.length,o=r?i.random.normal(0,r):null,c=function(){return t[~~(Math.random()*a)]+(o?o():0)};return c.samples=function(e){return i.zeros(e).map(c)},c}},{"./util":8}],5:[function(e,r,t){function n(e,r){return r?void(e[p]=r):e&&e[p]||null}function i(e){return l.keys(e)}function a(e){return"["+e+"]"}function o(e,r){e=l.array(e),r=l.$(r);var t,n,i;if(e[p]&&(t=r(e[p]),l.isString(t)))return t;for(n=0,i=e.length;!l.isValid(t)&&n0?Math.pow(c,1/t):0},u.mean.harmonic=function(e,r){r=o.$(r);var t,n,i,a,c=0;for(a=0,t=0,n=e.length;an&&(n=i));return[t,n]},u.extent.index=function(e,r){r=o.$(r);var t,n,i,a,c=-1,s=-1,u=e.length;for(a=0;an&&(n=i,s=a));return[c,s]},u.dot=function(e,r,t){var n,i,a=0;if(t)for(r=o.$(r),t=o.$(t),n=0;n-1&&l!==n){for(i=1+(t-1+u)/2;u-1)for(i=1+(c-1+u)/2;uT)&&(T=s),t=s-l,l+=t/++p,y+=t*(s-l),A.push(s));return y/=p-1,n=Math.sqrt(y),A.sort(o.cmp),{type:c(e,r),unique:g,count:e.length,valid:p,missing:f,distinct:d,min:E,max:T,mean:l,stdev:n,median:a=u.quantile(A,.5),q1:u.quantile(A,.25),q3:u.quantile(A,.75),modeskew:0===n?0:(l-a)/n}},u.summary=function(e,r){r=r||o.keys(e[0]);var t=r.map(function(r){var t=u.profile(e,o.$(r));return t.field=r,t});return t.__summary__=!0,t}},{"./generate":4,"./import/type":5,"./util":8}],7:[function(e,r,t){function n(e){return u.setTime(+e),u}function i(e,r,t,n,i,a){var o={type:e,date:r,unit:t};return n?o.step=n:o.minstep=1,null!=i&&(o.min=i),null!=a&&(o.max=a),o}function a(e,r,t,n,a,o){return i(e,function(e){return r.offset(t,e)},function(e){return r.count(t,e)},n,a,o)}function o(e,r,t,n){var i,a,o,c=E[0];for(i=1,a=E.length;ic[0]){if(o=r/c[0],o>n)return e[E[i-1][1]];if(o>=t)return e[c[1]]}return e[E[a-1][1]]}function c(e){var r,t,n={};for(r=0,t=e.length;r1?function(e,t){for(var n=0;nr||null==r)&&null!=e?1:(r=r instanceof Date?+r:r,(e=e instanceof Date?+e:e)!==e&&r===r?-1:r!==r&&e===e?1:0)},i.numcmp=function(e,r){return e-r},i.stablesort=function(e,r,t){var n=e.reduce(function(e,r,n){return e[t(r)]=n,e},{});return e.sort(function(e,i){var a=r(e),o=r(i);return ao?1:n[t(e)]-n[t(i)]}),e},i.permute=function(e){for(var r,t,n=e.length;n;)t=Math.floor(Math.random()*n--),r=e[n],e[n]=e[t],e[t]=r},i.pad=function(e,r,n,i){i=i||" ";var a=r-e.length;if(a<=0)return e;switch(n){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,r,t,i,a){var o=e.length;if(o<=r)return e;a=void 0!==a?String(a):"…";var c=Math.max(0,r-a.length);switch(t){case"left":return a+(i?n(e,c,1):e.slice(o-c));case"middle":case"center":var s=Math.ceil(c/2),u=Math.floor(c/2);return(i?n(e,s):e.slice(0,s))+a+(i?n(e,u,1):e.slice(o-u));default:return(i?n(e,c):e.slice(0,c))+a}};var s=/([\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,r,t){var n="undefined"!=typeof JSON?JSON:e("jsonify");r.exports=function(e,r){r||(r={}),"function"==typeof r&&(r={cmp:r});var t=r.space||"";"number"==typeof t&&(t=Array(t+1).join(" "));var o="boolean"==typeof r.cycles&&r.cycles,c=r.replacer||function(e,r){return r},s=r.cmp&&function(e){return function(r){return function(t,n){var i={key:t,value:r[t]},a={key:n,value:r[n]};return e(i,a)}}}(r.cmp),u=[];return function l(e,r,p,f){var d=t?"\n"+new Array(f+1).join(t):"",E=t?": ":":";if(p&&p.toJSON&&"function"==typeof p.toJSON&&(p=p.toJSON()),p=c.call(e,r,p),void 0!==p){if("object"!=typeof p||null===p)return n.stringify(p);if(i(p)){for(var T=[],y=0;y="0"&&i<="9";)r+=i,u();if("."===i)for(r+=".";u()&&i>="0"&&i<="9";)r+=i;if("e"===i||"E"===i)for(r+=i,u(),"-"!==i&&"+"!==i||(r+=i,u());i>="0"&&i<="9";)r+=i,u();return e=+r,isFinite(e)?e:void s("Bad number")},p=function(){var e,r,t,n="";if('"'===i)for(;u();){if('"'===i)return u(),n;if("\\"===i)if(u(),"u"===i){for(t=0,r=0;r<4&&(e=parseInt(u(),16),isFinite(e));r+=1)t=16*t+e;n+=String.fromCharCode(t)}else{if("string"!=typeof c[i])break;n+=c[i]}else n+=i}s("Bad string")},f=function(){for(;i&&i<=" ";)u()},d=function(){switch(i){case"t":return u("t"),u("r"),u("u"),u("e"),!0;case"f":return u("f"),u("a"),u("l"),u("s"),u("e"),!1;case"n":return u("n"),u("u"),u("l"),u("l"),null}s("Unexpected '"+i+"'")},E=function(){var e=[];if("["===i){if(u("["),f(),"]"===i)return u("]"),e;for(;i;){if(e.push(o()),f(),"]"===i)return u("]"),e;u(","),f()}}s("Bad array")},T=function(){var e,r={};if("{"===i){if(u("{"),f(),"}"===i)return u("}"),r;for(;i;){if(e=p(),f(),u(":"),Object.hasOwnProperty.call(r,e)&&s('Duplicate key "'+e+'"'),r[e]=o(),f(),"}"===i)return u("}"),r;u(","),f()}}s("Bad object")};o=function(){switch(f(),i){case"{":return T();case"[":return E();case'"':return p();case"-":return l();default:return i>="0"&&i<="9"?l():d()}},r.exports=function(e,r){var t;return a=e,n=0,i=" ",t=o(),f(),i&&s("Syntax error"),"function"==typeof r?function c(e,t){var n,i,a=e[t];if(a&&"object"==typeof a)for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(i=c(a,n),void 0!==i?a[n]=i:delete a[n]);return r.call(e,t,a)}({"":t},""):t}},{}],12:[function(e,r,t){function n(e){return s.lastIndex=0,s.test(e)?'"'+e.replace(s,function(e){var r=u[e];return"string"==typeof r?r:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function i(e,r){var t,s,u,l,p,f=a,d=r[e];switch(d&&"object"==typeof d&&"function"==typeof d.toJSON&&(d=d.toJSON(e)),"function"==typeof c&&(d=c.call(r,e,d)),typeof d){case"string":return n(d);case"number":return isFinite(d)?String(d):"null";case"boolean":case"null":return String(d);case"object":if(!d)return"null";if(a+=o,p=[],"[object Array]"===Object.prototype.toString.apply(d)){for(l=d.length,t=0;t1)console.warn("Dropping day from datetime",JSON.stringify(e),"as day cannot be combined with other units."),e=u.duplicate(e),delete e.day;else{t.setFullYear(l);var n=r?o(e.day):e.day;t.setDate(+n+1)}if(void 0!==e.year&&t.setFullYear(e.year),void 0!==e.quarter){var c=r?i(e.quarter):e.quarter;t.setMonth(3*+c)}if(void 0!==e.month){var s=r?a(e.month):e.month;t.setMonth(+s)}return void 0!==e.date&&t.setDate(e.date),void 0!==e.hours&&t.setHours(e.hours),void 0!==e.minutes&&t.setMinutes(e.minutes),void 0!==e.seconds&&t.setSeconds(e.seconds),void 0!==e.milliseconds&&t.setMilliseconds(e.milliseconds),t.getTime()}function s(e,r){void 0===r&&(r=!1);var t=[];if(r&&void 0!==e.day&&u.keys(e).length>1&&(console.warn("Dropping day from datetime",JSON.stringify(e),"as day cannot be combined with other units."),e=u.duplicate(e),delete e.day),void 0!==e.year?t.push(e.year):void 0!==e.day?t.push(l):t.push(0),void 0!==e.month){var n=r?a(e.month):e.month;t.push(n)}else if(void 0!==e.quarter){var c=r?i(e.quarter):e.quarter;t.push(c+"*3")}else t.push(0);if(void 0!==e.date)t.push(e.date);else if(void 0!==e.day){var s=r?o(e.day):e.day;t.push(s+"+1")}else t.push(1);for(var p=0,f=["hours","minutes","seconds","milliseconds"];p0)}function o(e){return y.some(T.CHANNELS,function(r){return!(!a(e,r)||!e[r].aggregate)})}function c(e){return e&&(!!e.x&&!!e.x2||!!e.y&&!!e.y2)}function s(e){var r=[];return T.CHANNELS.forEach(function(t){a(e,t)&&(y.isArray(e[t])?e[t].forEach(function(e){r.push(e)}):r.push(e[t]))}),r}function u(e,r,t){l(T.CHANNELS,e,r,t)}function l(e,r,t,n){var i=0;e.forEach(function(e){a(r,e)&&(y.isArray(r[e])?r[e].forEach(function(r){t.call(n,r,e,i++)}):t.call(n,r[e],e,i++))})}function p(e,r,t){return f(T.CHANNELS,e,r,t)}function f(e,r,t,n){var i=[];return e.forEach(function(e){a(r,e)&&(y.isArray(r[e])?r[e].forEach(function(r){i.push(t.call(n,r,e))}):i.push(t.call(n,r[e],e)))}),i}function d(e,r,t,n){return E(T.CHANNELS,e,r,t,n)}function E(e,r,t,n,i){var o=n;return T.CHANNELS.forEach(function(e){a(r,e)&&(y.isArray(r[e])?r[e].forEach(function(r){o=t.call(i,o,r,e)}):o=t.call(i,o,r[e],e))}),o}var T=e("./channel"),y=e("./util");t.countRetinal=n,t.channels=i,t.has=a,t.isAggregate=o,t.isRanged=c,t.fieldDefs=s,t.forEach=u,t.channelMappingForEach=l,t.map=p,t.channelMappingMap=f,t.reduce=d,t.channelMappingReduce=E},{"./channel":16,"./util":25}],19:[function(e,r,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 n=t.Mark;t.AREA=n.AREA,t.BAR=n.BAR,t.LINE=n.LINE,t.POINT=n.POINT,t.TEXT=n.TEXT,t.TICK=n.TICK,t.RULE=n.RULE,t.CIRCLE=n.CIRCLE,t.SQUARE=n.SQUARE,t.ERRORBAR=n.ERRORBAR,t.PRIMITIVE_MARKS=[t.AREA,t.BAR,t.LINE,t.POINT,t.TEXT,t.TICK,t.RULE,t.CIRCLE,t.SQUARE]},{}],20:[function(e,r,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 n=t.BandSize;t.BANDSIZE_FIT=n.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}},{}],21:[function(e,r,t){"use strict";function n(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=n},{}],22:[function(e,r,t){"use strict";function n(e,r,t){if(u.contains([l.NONE,null,!1],t))return null;if(!u.contains([c.BAR,c.AREA,c.POINT,c.CIRCLE,c.SQUARE,c.LINE,c.TEXT,c.TICK],e))return null;if(!o.isAggregate(r))return null;var n=a.STACK_GROUP_CHANNELS.reduce(function(e,t){return o.has(r,t)&&!r[t].aggregate&&e.push(t),e},[]);if(0===n.length)return null;var p=o.has(r,a.X),f=o.has(r,a.Y),d=p&&!!r.x.aggregate,E=f&&!!r.y.aggregate;if(d!==E){var T=d?a.X:a.Y,y=r[T].aggregate,A=r[T].scale;return A&&A.type&&A.type!==s.ScaleType.LINEAR?(console.warn("Cannot stack non-linear ("+A.type+") scale"),null):u.contains(i.SUM_OPS,y)?(u.contains([c.BAR,c.AREA],e)&&(t=void 0===t?l.ZERO:t),t?{groupbyChannel:d?f?a.Y:null:p?a.X:null,fieldChannel:T,stackByChannels:n,offset:t}:null):(console.warn("Cannot stack when the aggregate function is "+y+"(non-summative)."),null)}return null}var i=e("./aggregate"),a=e("./channel"),o=e("./encoding"),c=e("./mark"),s=e("./scale"),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 l=t.StackOffset;t.stack=n},{"./aggregate":13,"./channel":16,"./encoding":18,"./mark":19,"./scale":20,"./util":25}],23:[function(e,r,t){"use strict";function n(e){return!!A[e]}function i(e,r){var n=new Date(0,0,1,0,0,0,0);return t.SINGLE_TIMEUNITS.forEach(function(t){if(o(e,t))switch(t){case y.DAY:throw new Error("Cannot convert to TimeUnits containing 'day'");case y.YEAR:n.setFullYear(r.getFullYear());break;case y.QUARTER:n.setMonth(3*Math.floor(r.getMonth()/3));break;case y.MONTH:n.setMonth(r.getMonth());break;case y.DATE:n.setDate(r.getDate());break;case y.HOURS:n.setHours(r.getHours());break;case y.MINUTES:n.setMinutes(r.getMinutes());break;case y.SECONDS:n.setSeconds(r.getSeconds());break;case y.MILLISECONDS:n.setMilliseconds(r.getMilliseconds())}}),n}function a(e){return!!g[e]}function o(e,r){var t=e.toString(),n=r.toString(),i=t.indexOf(n);return i>-1&&(r!==y.SECONDS||0===i||"i"!==t.charAt(i-1))}function c(e){switch(e){case y.HOURS:case y.DAY:case y.MONTH:case y.QUARTER:return E.ScaleType.ORDINAL}return E.ScaleType.TIME}function s(e,r){function n(e){return e===y.QUARTER?"floor(month("+i+")/3)":e+"("+i+")"}var i='datum["'+r+'"]',a=t.SINGLE_TIMEUNITS.reduce(function(r,t){return o(e,t)&&(r[t]=n(t)),r},{});return a.day&&T.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=n(y.DATE)),d.dateTimeExpr(a)}function u(e,r){if(T.contains([f.ROW,f.COLUMN,f.SHAPE,f.COLOR],r))return null;switch(e){case y.SECONDS:return T.range(0,60);case y.MINUTES:return T.range(0,60);case y.HOURS:return T.range(0,24);case y.DAY:return T.range(0,7);case y.DATE:return T.range(1,32);case y.MONTH:return T.range(0,12);case y.QUARTER:return[0,1,2,3]}return null}function l(e){if(e)return o(e,y.SECONDS)?"second":o(e,y.MINUTES)?"minute":o(e,y.HOURS)?"hour":o(e,y.DAY)||o(e,y.DATE)?"day":o(e,y.MONTH)?"month":o(e,y.YEAR)?"year":void 0}function p(e,r,t){if(e){var n=[],i="",a=o(e,y.YEAR);o(e,y.QUARTER)&&(i="Q{{"+r+" | quarter}}"),o(e,y.MONTH)&&n.push(t!==!1?"%b":"%B"),o(e,y.DAY)?n.push(t?"%a":"%A"):o(e,y.DATE)&&n.push("%d"+(a?",":"")),a&&n.push(t?"%y":"%Y");var c=[];o(e,y.HOURS)&&c.push("%H"),o(e,y.MINUTES)&&c.push("%M"),o(e,y.SECONDS)&&c.push("%S"),o(e,y.MILLISECONDS)&&c.push("%L");var s=[];return n.length>0&&s.push(n.join(" ")),c.length>0&&s.push(c.join(":")),s.length>0&&(i&&(i+=" "),i+="{{"+r+" | time:'"+s.join(" ")+"'}}"),i||void 0}}var f=e("./channel"),d=e("./datetime"),E=e("./scale"),T=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.MONTHDATE="monthdate"]="MONTHDATE",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 y=t.TimeUnit;t.SINGLE_TIMEUNITS=[y.YEAR,y.QUARTER,y.MONTH,y.DAY,y.DATE,y.HOURS,y.MINUTES,y.SECONDS,y.MILLISECONDS];var A=t.SINGLE_TIMEUNITS.reduce(function(e,r){return e[r]=!0,e},{});t.isSingleTimeUnit=n,t.convert=i,t.MULTI_TIMEUNITS=[y.YEARQUARTER,y.YEARQUARTERMONTH,y.YEARMONTH,y.YEARMONTHDATE,y.YEARMONTHDATEHOURS,y.YEARMONTHDATEHOURSMINUTES,y.YEARMONTHDATEHOURSMINUTESSECONDS,y.QUARTERMONTH,y.HOURSMINUTES,y.HOURSMINUTESSECONDS,y.MINUTESSECONDS,y.SECONDSMILLISECONDS];var g=t.MULTI_TIMEUNITS.reduce(function(e,r){return e[r]=!0,e},{});t.isMultiTimeUnit=a,t.TIMEUNITS=t.SINGLE_TIMEUNITS.concat(t.MULTI_TIMEUNITS),t.containsTimeUnit=o,t.defaultScaleType=c,t.fieldExpr=s,t.imputedDomain=u,t.smallestUnit=l,t.template=p},{"./channel":16,"./datetime":17,"./scale":20,"./util":25}],24:[function(e,r,t){"use strict";function n(e){var r=e;return t.TYPE_FROM_SHORT_TYPE[r.toUpperCase()]||r.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=n},{}],25:[function(e,r,t){"use strict";function n(e,r){var t={};return r.forEach(function(r){e.hasOwnProperty(r)&&(t[r]=e[r])}),t}function i(e,r,t){if(arguments.length<3&&(t=1,arguments.length<2&&(r=e,e=0)),(r-e)/t===1/0)throw new Error("Infinite range");var n,i=[],a=-1;if(t<0)for(;(n=e+t*++a)>r;)i.push(n);else for(;(n=e+t*++a)-1}function s(e,r){return e.filter(function(e){return!c(r,e)})}function u(e,r){return e.concat(s(r,e))}function l(e,r,t){if(e.forEach)e.forEach.call(t,r);else for(var n in e)e.hasOwnProperty(n)&&r.call(t,e[n],n,e)}function p(e,r,t,n){if(e.reduce)return e.reduce.call(n,r,t);for(var i in e)e.hasOwnProperty(i)&&(t=r.call(n,t,e[i],i,e));return t}function f(e,r,t){if(e.map)return e.map.call(t,r);var n=[];for(var i in e)e.hasOwnProperty(i)&&n.push(r.call(t,e[i],i,e));return n}function d(e,r){for(var t=0,n=0;n1&&(a||t.constraintManuallySpecifiedValue)))return!1}}return!0}},{name:"omitNonPositionalOrFacetOverPositionalChannels",description:"Do not use non-positional channels unless all positional channels are used",properties:[f.Property.CHANNEL],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,r,t){for(var n=e.specQuery.encodings,i=!1,a=!1,c=!1,s=!1,u=0;u0},e.prototype.stack=function(){return s.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 r=0,t=this._spec.encodings;r0?l.duplicate(i[u-1]):{}),a.push(u>0?l.duplicate(a[u-1]):{});var d=r.nest[u].groupBy;if(c.isArray(d)){var T=p.parse(d,i[u],a[u]);o.push(T.replacer)}}return e.forEach(function(e){for(var a="",u=t,l=0;lo.length&&n.substr(0,o.length)===o){var c=(n[o.length]+"").toLowerCase()+n.substr(o.length+1);e.push({property:r,parent:o,child:c});break}}return e},[]);var f=t.NESTED_ENCODING_PROPERTIES.reduce(function(e,r){return e[r.property]=r,e},{}),d=t.NESTED_ENCODING_PROPERTIES.reduce(function(e,r){var t=r.parent;return t in e||(e[t]=[]),e[r.parent].push(r),e},{});t.SCALE_PROPERTIES=d.scale.map(function(e){return e.property});var E=t.ENCODING_PROPERTIES.reduce(function(e,r){return e[r]=r,e},{});t.isEncodingProperty=i,t.getNestedEncodingProperty=a,t.getNestedEncodingPropertyChildren=o,t.isNestedEncodingProperty=c;var T=[{property:"bandSize",supportedScaleType:[l.ScaleType.ORDINAL]},{property:"clamp",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"domain",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.QUANTILE,l.ScaleType.QUANTIZE,l.ScaleType.ORDINAL,l.ScaleType.SQRT,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"exponent",supportedScaleType:[l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.SQRT]},{property:"nice",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"range",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.QUANTILE,l.ScaleType.QUANTIZE,l.ScaleType.ORDINAL,l.ScaleType.SQRT,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"round",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.SQRT,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"useRawDomain",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.QUANTILE,l.ScaleType.QUANTIZE,l.ScaleType.ORDINAL,l.ScaleType.SQRT,l.ScaleType.TIME,l.ScaleType.UTC]},{property:"zero",supportedScaleType:[l.ScaleType.LINEAR,l.ScaleType.POW,l.ScaleType.SQRT]}];t.SUPPORTED_SCALE_PROPERTY_INDEX=T.reduce(function(e,r){var t=r.property;return e[t]=r.supportedScaleType,e},{})},{"./util":52,"vega-lite/src/scale":20}],37:[function(e,r,t){"use strict";function n(e){return l.contains([s.Type.NOMINAL,s.Type.ORDINAL],e.type)||!u.isWildcard(e.bin)&&!!e.bin||!u.isWildcard(e.timeUnit)&&!!e.timeUnit}function i(e){return e.type===s.Type.QUANTITATIVE&&!e.bin||e.type===s.Type.TEMPORAL&&!e.timeUnit}function a(e){var r=e.scale===!0||e.scale===u.SHORT_WILDCARD?{}:e.scale,t=e.type,n=e.timeUnit;if(r&&void 0!==r.type)return r.type;if(!u.isWildcard(t)){if(t===s.Type.QUANTITATIVE)return o.ScaleType.LINEAR;if(t===s.Type.ORDINAL||t===s.Type.NOMINAL)return o.ScaleType.ORDINAL;if(t===s.Type.TEMPORAL){if(void 0!==n){if(u.isWildcard(n))return;return c.defaultScaleType(n)}return o.ScaleType.TIME}throw new Error("Unsupported type: "+t+" in scaleType")}}var o=e("vega-lite/src/scale"),c=e("vega-lite/src/timeunit"),s=e("vega-lite/src/type"),u=e("../wildcard"),l=e("../util");t.isDimension=n,t.isMeasure=i,t.scaleType=a},{"../util":52,"../wildcard":53,"vega-lite/src/scale":20,"vega-lite/src/timeunit":23,"vega-lite/src/type":24}],38:[function(e,r,t){"use strict";function n(e){return o.isObject(e)&&!!e.property}function i(e,r,t){return e.forEach(function(e){n(e)?(r[e.property]=!0,t[e.property]=e.replace):r[e]=!0}),{include:r,replaceIndex:t,replacer:c.getReplacerIndex(t)}}function a(e){return o.isArray(e)?e.map(function(e){if(n(e)){if(e.replace){var r=s.keys(e.replace).reduce(function(r,t){var n=e.replace[t];return(r[n]=r[n]||[]).push(t),r},{});return e.property+"["+s.keys(r).map(function(e){var t=r[e].sort();return t.join(",")+"=>"+e}).join(";")+"]"}return e.property}return e}).join(","):e}var o=e("datalib/src/util"),c=e("./shorthand"),s=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=n,t.parse=i,t.toString=a},{"../util":52,"./shorthand":40,"datalib/src/util":8}],39:[function(e,r,t){"use strict";function n(e,r,t){e=u.extend({},i(e),{config:u.extend({},a.DEFAULT_QUERY_CONFIG,t,e.config)});var n=o.generate(e.spec,r,e.config),l=c.nest(n,e),p=s.rank(l,e,r,0);return{query:e,result:p}}function i(e){if(e.groupBy){var r={groupBy:e.groupBy};e.orderBy&&(r.orderGroupBy=e.orderBy);var t={spec:u.duplicate(e.spec),nest:[r]};return e.chooseBy&&(t.chooseBy=e.chooseBy),e.config&&(t.config=e.config),t}return u.duplicate(e)}var a=e("../config"),o=e("../generate"),c=e("../nest"),s=e("../ranking/ranking"),u=e("../util");t.encoding=e("./encoding"),t.groupBy=e("./groupby"),t.shorthand=e("./shorthand"),t.spec=e("./spec"),t.transform=e("./transform"),t.query=n,t.normalize=i},{"../config":26,"../generate":33,"../nest":35,"../ranking/ranking":49,"../util":52,"./encoding":37,"./groupby":38,"./shorthand":40,"./spec":41,"./transform":42}],40:[function(e,r,t){"use strict";function n(e){return O.keys(e).reduce(function(r,t){return r[t]=i(e[t]),r},{})}function i(e){return function(r){return void 0!==e[r]?e[r]:r}}function a(e,r){return h.isWildcard(e)?!h.isShortWildcard(e)&&e["enum"]?h.SHORT_WILDCARD+JSON.stringify(e["enum"]):h.SHORT_WILDCARD:r?r(e):e}function o(e,r){return r?r(e):e}function c(e,r,n){void 0===r&&(r=t.INCLUDE_ALL),void 0===n&&(n={});var i=I.fromSpec(e);return s(i)}function s(e,r,n){void 0===r&&(r=t.INCLUDE_ALL),void 0===n&&(n={});var i=[];if(r[N.Property.MARK]&&i.push(a(e.mark,n[N.Property.MARK])),e.transform&&(r[N.Property.CALCULATE]&&void 0!==e.transform.calculate&&i.push("calculate:"+u(e.transform.calculate)),r[N.Property.FILTER]&&void 0!==e.transform.filter&&i.push("filter:"+JSON.stringify(e.transform.filter)),r[N.Property.FILTERINVALID]&&void 0!==e.transform.filterInvalid&&i.push("filterInvalid:"+e.transform.filterInvalid)),r[N.Property.STACK]){var o=I.stack(e);if(o){var c=O.extend({},r,{type:!1}),s=p(o.fieldEncQ,c,n),f=p(o.groupByEncQ,c,n);i.push("stack={field:"+s+","+(f?"by:"+f+",":"")+"offset:"+o.offset+"}")}}if(e.encodings){var d=e.encodings.reduce(function(e,t){if(t.autoCount!==!1){var i=l(t,r,n);i&&e.push(i)}return e},[]).sort().join("|");d&&i.push(d)}return i.join("|")}function u(e){return JSON.stringify(e.reduce(function(e,r){return e[r.field]=r.expr,e},{}))}function l(e,r,n){void 0===r&&(r=t.INCLUDE_ALL),void 0===n&&(n={});var i=[];r[N.Property.CHANNEL]&&i.push(a(e.channel,n[N.Property.CHANNEL]));var o=p(e,r,n);return o&&i.push(o),i.join(":")}function p(e,r,n){void 0===r&&(r=t.INCLUDE_ALL),void 0===n&&(n={});var i=null,c=null,s=[];if(r[N.Property.AGGREGATE]&&e.autoCount===!1)return"-";if(r[N.Property.AGGREGATE]&&e.aggregate&&!h.isWildcard(e.aggregate))i=o(e.aggregate,n[N.Property.AGGREGATE]);else if(r[N.Property.AGGREGATE]&&e.autoCount&&!h.isWildcard(e.autoCount))i=o("count",n[N.Property.AGGREGATE]);else if(r[N.Property.TIMEUNIT]&&e.timeUnit&&!h.isWildcard(e.timeUnit))i=o(e.timeUnit,n[N.Property.TIMEUNIT]);else if(r[N.Property.BIN]&&e.bin&&!h.isWildcard(e.bin))i="bin",S.NESTED_ENCODING_PROPERTIES.forEach(function(t){if(t&&t.parent===i){var o=t.property,c=t.child;r[o]&&e.bin[c]&&s.push({key:c,value:a(e.bin[c],n[o])})}});else{for(var u=0,l=[N.Property.AGGREGATE,N.Property.AUTOCOUNT,N.Property.TIMEUNIT,N.Property.BIN];u0&&s.push({key:i+"",value:JSON.stringify(c)})}else e[i]!==!1&&null!==e[i]||s.push({key:i+"",value:!1})},E=0,T=[N.Property.SCALE,N.Property.SORT,N.Property.AXIS,N.Property.LEGEND];Er.score?o:r},null);l.push(n)}),l}e.TYPE_CHANNEL="typeChannel",e.TERRIBLE=-10,e.init=r,e.featurize=t,e.getScore=n}(n=t.TypeChannelScore||(t.TypeChannelScore={}));var l;!function(e){function r(e){void 0===e&&(e={}),e=c.extend({},a.DEFAULT_QUERY_CONFIG,e);var r={},t=[{feature:u.BIN_Q,opt:"preferredBinAxis"},{feature:u.T,opt:"preferredTemporalAxis"},{feature:u.TIMEUNIT_T,opt:"preferredTemporalAxis"},{feature:u.TIMEUNIT_O,opt:"preferredTemporalAxis"},{feature:u.O,opt:"preferredOrdinalAxis"},{feature:u.N,opt:"preferredNominalAxis"}];return t.forEach(function(t){e[t.opt]===i.Channel.X?r[t.feature+"_"+i.Channel.Y]=-.01:e[t.opt]===i.Channel.Y&&(r[t.feature+"_"+i.Channel.X]=-.01)}),r}function t(e,r){return e+"_"+r}function n(r,n,i){return r.getEncodings().reduce(function(r,n){var i=u.getExtendedType(n),a=t(i,n.channel),o=s.getFeatureScore(e.PREFERRED_AXIS,a);return o&&r.push(o),r},[])}e.PREFERRED_AXIS="preferredAxis",e.init=r,e.featurize=t,e.getScore=n}(l=t.PreferredAxisScore||(t.PreferredAxisScore={}));var p;!function(e){function r(e){e=c.extend({},a.DEFAULT_QUERY_CONFIG,e);var r={};return e.preferredFacet===i.Channel.ROW?r[i.Channel.COLUMN]=-.01:e.preferredFacet===i.Channel.COLUMN&&(r[i.Channel.ROW]=-.01),r}function t(r,t,n){return r.getEncodings().reduce(function(r,t){var n=s.getFeatureScore(e.PREFERRED_FACET,t.channel);return n&&r.push(n),r},[])}e.PREFERRED_FACET="preferredFacet",e.init=r,e.getScore=t}(p=t.PreferredFacetScore||(t.PreferredFacetScore={}));var f;!function(e){function r(){return{bar_size:-2,tick_size:-2}}function t(r,t,n){var i=r.getMark();return r.getEncodings().reduce(function(r,t){var n=i+"_"+t.channel,a=s.getFeatureScore(e.MARK_CHANNEL,n);return a&&r.push(a),r},[])}e.MARK_CHANNEL="markChannel",e.init=r,e.getScore=t}(f=t.MarkChannelScore||(t.MarkChannelScore={}));var d;!function(e){function r(){return{row:-2,column:-2,color:0,opacity:0,size:0,shape:0}}function t(r,t,n){return r.isAggregate()&&r.getEncodings().reduce(function(r,t){if(!t.aggregate&&!t.autoCount){var n=s.getFeatureScore(e.DIMENSION,t.channel+"");if(n.score>r.score)return n}return r},{type:e.DIMENSION,feature:"No Dimension",score:-5}),[]}e.DIMENSION="dimension",e.init=r,e.getScore=t}(d=t.DimensionScore||(t.DimensionScore={}))},{"../../config":26,"../../query/shorthand":40,"../../util":52,"./effectiveness":45,"./type":47,"vega-lite/src/channel":16}],45:[function(e,r,t){"use strict";function n(e,r){var n=t.FEATURE_INDEX[e][r];return void 0!==n?{score:n,type:e,feature:r}:null}function i(e){s.push(e),t.FEATURE_INDEX[e.type]=e.init()}function a(e,r,t){var n=s.reduce(function(n,i){var a=i.getScore(e,r,t);return n.concat(a)},[]);return{score:n.reduce(function(e,r){return e+r.score},0),features:n}}var o=e("./channel"),c=e("./mark");t.FEATURE_INDEX={};var s=[];t.getFeatureScore=n,t.addFeatureFactory=i,i({type:o.TypeChannelScore.TYPE_CHANNEL,init:o.TypeChannelScore.init,getScore:o.TypeChannelScore.getScore}),i({type:o.PreferredAxisScore.PREFERRED_AXIS,init:o.PreferredAxisScore.init,getScore:o.PreferredAxisScore.getScore}),i({type:o.PreferredFacetScore.PREFERRED_FACET,init:o.PreferredFacetScore.init,getScore:o.PreferredFacetScore.getScore}),i({type:o.MarkChannelScore.MARK_CHANNEL,init:o.MarkChannelScore.init,getScore:o.MarkChannelScore.getScore}),i({type:c.MarkScore.MARK_SCORE,init:c.MarkScore.init,getScore:c.MarkScore.getScore}),Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a},{"./channel":44,"./mark":46}],46:[function(e,r,t){"use strict";var n,i=e("vega-lite/src/channel"),a=e("vega-lite/src/mark"),o=e("../../util"),c=e("./effectiveness"),s=e("./type");!function(e){function r(e,r,t,n){return e+"_"+r+"_"+t+"_"+n}function t(){var e=[s.Q,s.T],t=[s.BIN_Q,s.TIMEUNIT_O,s.O,s.N],n=t.concat([s.NONE]),i={};return e.forEach(function(t){e.forEach(function(e){var n={point:0,text:-.2,tick:-.5,rect:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(t,e,!0,a);i[o]=n});var a={point:0,text:-.2,tick:-.5,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(a,function(n,a){var o=r(t,e,!1,a);i[o]=n})})}),e.forEach(function(e){n.forEach(function(t){var n={tick:0,point:-.2,text:-.5,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!0,a);i[o]=n;var c=r(t,e,!0,a);i[c]=n})}),[s.TIMEUNIT_T].forEach(function(t){var n={point:0,text:-.5,tick:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!0,a);i[o]=n;var c=r(t,e,!0,a);i[c]=n})}),[s.NONE,s.N,s.O].forEach(function(t){var n={bar:0,point:-.2,tick:-.25,text:-.3,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n;var c=r(t,e,!1,a);i[c]=n})}),[s.BIN_Q].forEach(function(t){var n={bar:0,point:-.2,tick:-.25,text:-.3,line:-.5,area:-.5,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n;var c=r(t,e,!1,a);i[c]=n})}),[s.TIMEUNIT_T,s.TIMEUNIT_O].forEach(function(t){var n={line:0,area:-.1,bar:-.2,point:-.3,tick:-.35,text:-.4,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n;var c=r(t,e,!1,a);i[c]=n})})}),[s.TIMEUNIT_T].forEach(function(e){[s.TIMEUNIT_T].forEach(function(t){var n={point:0,rect:-.1,text:-.5,tick:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!0,a);i[o]=n}),o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n})}),n.forEach(function(t){var n={tick:0,point:-.2,text:-.5,rect:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!0,a);i[o]=n}),o.forEach(n,function(n,a){var o=r(t,e,!0,a);i[o]=n}),o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n}),o.forEach(n,function(n,a){var o=r(t,e,!1,a);i[o]=n})})}),n.forEach(function(e){n.forEach(function(t){var n={point:0,rect:0,text:-.1,tick:-1,bar:-2,line:-2,area:-2,rule:-2.5};o.forEach(n,function(n,a){var o=r(e,t,!0,a);i[o]=n}),o.forEach(n,function(n,a){var o=r(e,t,!1,a);i[o]=n})})}),i}function n(r,t,n){var o=r.getMark();o!==a.Mark.CIRCLE&&o!==a.Mark.SQUARE||(o=a.Mark.POINT);var u=r.getEncodingQueryByChannel(i.Channel.X),l=u?s.getExtendedType(u):s.NONE,p=r.getEncodingQueryByChannel(i.Channel.Y),f=p?s.getExtendedType(p):s.NONE,d=!r.isAggregate(),E=l+"_"+f+"_"+d+"_"+o,T=c.getFeatureScore(e.MARK_SCORE,E);return[T]}e.MARK_SCORE="markScore",e.featurize=r,e.init=t,e.getScore=n}(n=t.MarkScore||(t.MarkScore={}))},{"../../util":52,"./effectiveness":45,"./type":47,"vega-lite/src/channel":16,"vega-lite/src/mark":19}],47:[function(e,r,t){"use strict";function n(e){return e.bin?i.BIN_Q:e.timeUnit?c.scaleType(e)===a.ScaleType.ORDINAL?i.TIMEUNIT_O:i.TIMEUNIT_T:e.type}var i,a=e("vega-lite/src/scale"),o=e("vega-lite/src/type"),c=e("../../query/encoding");!function(e){e[e.Q=o.Type.QUANTITATIVE]="Q",e[e.BIN_Q="bin_"+o.Type.QUANTITATIVE]="BIN_Q",e[e.T=o.Type.TEMPORAL]="T",e[e.TIMEUNIT_T="timeUnit_time"]="TIMEUNIT_T",e[e.TIMEUNIT_O="timeUnit_"+o.Type.ORDINAL]="TIMEUNIT_O",e[e.O=o.Type.ORDINAL]="O",e[e.N=o.Type.NOMINAL]="N",e[e.NONE="-"]="NONE"}(i=t.ExtendedType||(t.ExtendedType={})),t.Q=i.Q,t.BIN_Q=i.BIN_Q,t.T=i.T,t.TIMEUNIT_T=i.TIMEUNIT_T,t.TIMEUNIT_O=i.TIMEUNIT_O,t.O=i.O,t.N=i.N,t.NONE=i.NONE,t.getExtendedType=n},{"../../query/encoding":37,"vega-lite/src/scale":20,"vega-lite/src/type":24}],48:[function(e,r,t){"use strict";function n(e,r,t){var n=e.wildcardIndex.encodingIndicesByProperty[i.Property.FIELD];if(!n)return{score:0,features:[]};for(var a=e.specQuery.encodings,o=r.fieldSchemas.length,c=[],s=0,u=1,l=n.length-1;l>=0;l--){var p=n[l],f=a[p].field,d=e.wildcardIndex.encodings[p].field,E=r.fieldSchema(f).index,T=-E*u;s+=T,c.push({score:T,type:"fieldOrder",feature:"field "+d.name+" is "+f+" (#"+E+" in the schema)"}),u*=o}return{score:s,features:c}}var i=e("../property");t.name="fieldOrder",t.score=n},{"../property":36}],49:[function(e,r,t){"use strict";function n(e,r){l[e]=r}function i(e){return l[e]}function a(e,r,t,n){return r.nest&&n!==r.nest.length?(e.items.forEach(function(e){a(e,r,t,n+1)}),r.nest[n].orderGroupBy&&e.items.sort(c(r.nest[n].orderGroupBy,t,r.config))):(r.orderBy||r.chooseBy)&&(e.items.sort(o(r.orderBy||r.chooseBy,t,r.config)),r.chooseBy&&e.items.length>0&&e.items.splice(1)),e}function o(e,r,t){return function(n,i){return e instanceof Array?s(e,n,i,r,t):s([e],n,i,r,t)}}function c(e,r,t){return function(n,i){var a=n.getTopSpecQueryModel(),o=i.getTopSpecQueryModel();return e instanceof Array?s(e,a,o,r,t):s([e],a,o,r,t)}}function s(e,r,t,n,i){for(var a=0,o=e;ae.max.getTime()&&(e.max=new Date(f))}}else n=c.Type.NOMINAL;return{field:i,type:n,primitiveType:a,stats:e,timeStats:{},binStats:{}}}),u={nominal:0,ordinal:1,temporal:2,quantitative:3};s.sort(function(e,r){return u[e.type]u[r.type]?1:e.field.localeCompare(r.field)}),s.forEach(function(e,r){return e.index=r});for(var f=0,T=s;fn.smallBandSizeForHighCardinalityOrFacet.maxCardinality)&&(void 0===i.scale&&(i.scale={}),i.scale&&f.contains([u.ScaleType.ORDINAL,void 0],p.scaleType(i))&&(i.scale.bandSize||(i.scale.bandSize=12)));var a=t[s.Channel.X];return void 0!==a&&(t[s.Channel.COLUMN]||r.cardinality(a)>n.smallBandSizeForHighCardinalityOrFacet.maxCardinality)&&(void 0===a.scale&&(a.scale={}),a.scale&&f.contains([u.ScaleType.ORDINAL,void 0],p.scaleType(a))&&(a.scale.bandSize||(a.scale.bandSize=12))),e}function a(e,r,t,n){t[s.Channel.COLOR]=e.getEncodingQueryByChannel(s.Channel.COLOR);var i=t[s.Channel.COLOR];return void 0!==i&&i.type===l.Type.NOMINAL&&r.cardinality(i)>n.nominalColorScaleForHighCardinality.maxCardinality&&(void 0===i.scale&&(i.scale={}),i.scale&&(i.scale.range||(i.scale.range=n.nominalColorScaleForHighCardinality.palette))),e}function o(e,r,t,n){if([s.Channel.COLUMN,s.Channel.X,s.Channel.Y].forEach(function(r){t[r]=e.getEncodingQueryByChannel(r)}),void 0===t[s.Channel.COLUMN]){var i=t[s.Channel.X],a=t[s.Channel.Y];void 0!==a&&a.field&&p.scaleType(a)===u.ScaleType.ORDINAL&&void 0!==i&&r.cardinality(a)>n.xAxisOnTopForHighYCardinalityWithoutColumn.maxCardinality&&(void 0===i.axis&&(i.axis={}),i.axis&&!i.axis.orient&&(i.axis.orient=c.AxisOrient.TOP))}return e}var c=e("vega-lite/src/axis"),s=e("vega-lite/src/channel"),u=e("vega-lite/src/scale"),l=e("vega-lite/src/type"),p=e("./query/encoding"),f=e("./util");t.stylize=n,t.smallBandSizeForHighCardinalityOrFacet=i,t.nominalColorScaleForHighCardinality=a,t.xAxisOnTopForHighYCardinalityWithoutColumn=o},{"./query/encoding":37,"./util":52,"vega-lite/src/axis":14,"vega-lite/src/channel":16,"vega-lite/src/scale":20,"vega-lite/src/type":24}],52:[function(e,r,t){"use strict";function n(e,r){return e.indexOf(r)!==-1}function i(e,r){var t,n=0;for(t in e)if(!r(e[t],t,n++))return!1;return!0}function a(e,r,t){if(e.forEach)e.forEach.call(t,r);else for(var n in e)r.call(t,e[n],n,e)}function o(e,r){var t,n=0;for(t in e)if(r(e[t],t,n++))return!0;return!1}function c(e,r){return e.map(function(e){return u.isArray(e)?c(e,r):r(e)})}function s(e,r){return e.filter(function(e){return!n(r,e)})}var u=e("datalib/src/util"),l=e("datalib/src/util");t.cmp=l.cmp,t.keys=l.keys,t.duplicate=l.duplicate,t.extend=l.extend,t.isObject=l.isObject,t.isArray=l.isArray,t.toMap=l.toMap,t.contains=n,t.every=i,t.forEach=a,t.some=o,t.nestedMap=c,t.without=s},{"datalib/src/util":8}],53:[function(e,r,t){"use strict";function n(e){return i(e)||void 0!==e&&(!!e["enum"]||!!e.name)&&!u.isArray(e)}function i(e){return e===t.SHORT_WILDCARD}function a(e,r,n){return u.extend({},{name:r,"enum":n},e===t.SHORT_WILDCARD?{}:e)}function o(e){switch(e){case s.Property.MARK:return"m";case s.Property.CHANNEL:return"c";case s.Property.AGGREGATE:return"a";case s.Property.AUTOCOUNT:return"#";case s.Property.BIN:return"b";case s.Property.BIN_MAXBINS:return"b-mb";case s.Property.BIN_MIN:return"b-min";case s.Property.BIN_MAX:return"b-max";case s.Property.BIN_BASE:return"b-base";case s.Property.BIN_STEP:return"b-step";case s.Property.BIN_STEPS:return"b-steps";case s.Property.BIN_MINSTEP:return"b-mstep";case s.Property.BIN_DIV:return"b-div";case s.Property.SORT:return"so";case s.Property.SORT_FIELD:return"so-f";case s.Property.SORT_OP:return"so-op";case s.Property.SORT_ORDER:return"so-or";case s.Property.SCALE:return"s";case s.Property.SCALE_BANDSIZE:return"s-bs";case s.Property.SCALE_CLAMP:return"s-c";case s.Property.SCALE_DOMAIN:return"s-d";case s.Property.SCALE_EXPONENT:return"s-e";case s.Property.SCALE_NICE:return"s-n";case s.Property.SCALE_RANGE:return"s-ra";case s.Property.SCALE_ROUND:return"s-r";case s.Property.SCALE_TYPE:return"s-t";case s.Property.SCALE_USERAWDOMAIN:return"s-u";case s.Property.SCALE_ZERO:return"s-z";case s.Property.AXIS:return"ax";case s.Property.AXIS_AXISCOLOR:return"ax-ac";case s.Property.AXIS_AXISWIDTH:return"ax-aw";case s.Property.AXIS_LAYER:return"ax-lay";case s.Property.AXIS_OFFSET:return"ax-of";case s.Property.AXIS_ORIENT:return"ax-or";case s.Property.AXIS_GRID:return"ax-g";case s.Property.AXIS_GRIDCOLOR:return"ax-gc";case s.Property.AXIS_GRIDDASH:return"ax-gd";case s.Property.AXIS_GRIDOPACITY:return"ax-go";case s.Property.AXIS_GRIDWIDTH:return"ax-gw";case s.Property.AXIS_LABELS:return"ax-lab";case s.Property.AXIS_FORMAT:return"ax-f";case s.Property.AXIS_LABELANGLE:return"ax-laba";case s.Property.AXIS_LABELMAXLENGTH:return"ax-labm";case s.Property.AXIS_SHORTTIMELABELS:return"ax-stl";case s.Property.AXIS_SUBDIVIDE:return"ax-sub";case s.Property.AXIS_TICKS:return"ax-t";case s.Property.AXIS_TICKCOLOR:return"ax-tc";case s.Property.AXIS_TICKLABELCOLOR:return"ax-tlc";case s.Property.AXIS_TICKLABELFONT:return"ax-tlf";case s.Property.AXIS_TICKLABELFONTSIZE:return"ax-tlfs";case s.Property.AXIS_TICKPADDING:return"ax-tp";case s.Property.AXIS_TICKSIZE:return"ax-ts";case s.Property.AXIS_TICKSIZEMAJOR:return"ax-tsma";case s.Property.AXIS_TICKSIZEMINOR:return"ax-tsmi";case s.Property.AXIS_TICKSIZEEND:return"ax-tse";case s.Property.AXIS_TICKWIDTH:return"ax-tw";case s.Property.AXIS_VALUES:return"ax-v";case s.Property.AXIS_TITLE:return"ax-ti";case s.Property.AXIS_TITLECOLOR:return"ax-tic";case s.Property.AXIS_TITLEFONT:return"ax-tif";case s.Property.AXIS_TITLEFONTSIZE:return"ax-tifs";case s.Property.AXIS_TITLEFONTWEIGHT:return"ax-tifw";case s.Property.AXIS_TITLEOFFSET:return"ax-tio";case s.Property.AXIS_TITLEMAXLENGTH:return"ax-timl";case s.Property.AXIS_CHARACTERWIDTH:return"ax-cw";case s.Property.LEGEND:return"l";case s.Property.LEGEND_ORIENT:return"l-or";case s.Property.LEGEND_OFFSET:return"l-of";case s.Property.LEGEND_VALUES:return"l-v";case s.Property.LEGEND_FORMAT:return"l-f";case s.Property.LEGEND_LABELALIGN:return"l-la";case s.Property.LEGEND_LABELBASELINE:return"l-lb";case s.Property.LEGEND_LABELCOLOR:return"l-lc";case s.Property.LEGEND_LABELFONT:return"l-lf";case s.Property.LEGEND_LABELFONTSIZE:return"l-lfs";case s.Property.LEGEND_SHORTTIMELABELS:return"l-stl";case s.Property.LEGEND_SYMBOLCOLOR:return"l-syc";case s.Property.LEGEND_SYMBOLSHAPE:return"l-sysh";case s.Property.LEGEND_SYMBOLSIZE:return"l-sysi";case s.Property.LEGEND_SYMBOLSTROKEWIDTH:return"l-sysw"; +case s.Property.LEGEND_TITLE:return"l-ti";case s.Property.LEGEND_TITLECOLOR:return"l-tic";case s.Property.LEGEND_TITLEFONT:return"l-tif";case s.Property.LEGEND_TITLEFONTSIZE:return"l-tifs";case s.Property.LEGEND_TITLEFONTWEIGHT:return"l-tifw";case s.Property.TIMEUNIT:return"tu";case s.Property.FIELD:return"f";case s.Property.TYPE:return"t"}throw new Error("Default name undefined")}function c(e,r,t){switch(e){case s.Property.FIELD:case s.Property.SORT_FIELD:return r.fields();case s.Property.AXIS:case s.Property.AXIS_GRID:case s.Property.AXIS_LABELS:case s.Property.AXIS_SHORTTIMELABELS:case s.Property.BIN:case s.Property.LEGEND:case s.Property.LEGEND_SHORTTIMELABELS:case s.Property.SCALE:case s.Property.SCALE_CLAMP:case s.Property.SCALE_NICE:case s.Property.SCALE_ROUND:case s.Property.SCALE_USERAWDOMAIN:case s.Property.SCALE_ZERO:case s.Property.AUTOCOUNT:return[!1,!0];case s.Property.AGGREGATE:return t.aggregates;case s.Property.AXIS_AXISCOLOR:return t.axisAxisColors;case s.Property.AXIS_AXISWIDTH:return t.axisAxisWidths;case s.Property.AXIS_LAYER:return t.axisLayers;case s.Property.AXIS_OFFSET:return t.axisOffsets;case s.Property.AXIS_ORIENT:return t.axisOrients;case s.Property.AXIS_GRIDCOLOR:return t.axisGridColors;case s.Property.AXIS_GRIDDASH:return t.axisGridDashes;case s.Property.AXIS_GRIDOPACITY:return t.axisGridOpacities;case s.Property.AXIS_GRIDWIDTH:return t.axisGridWidths;case s.Property.AXIS_FORMAT:return t.axisFormats;case s.Property.AXIS_LABELANGLE:return t.axisLabelAngles;case s.Property.AXIS_LABELMAXLENGTH:return t.axisLabelMaxLengths;case s.Property.AXIS_SUBDIVIDE:return t.axisSubDivides;case s.Property.AXIS_TICKS:return t.axisTicks;case s.Property.AXIS_TICKCOLOR:return t.axisTickColors;case s.Property.AXIS_TICKLABELCOLOR:return t.axisTickLabelColors;case s.Property.AXIS_TICKLABELFONT:return t.axisTickLabelFonts;case s.Property.AXIS_TICKLABELFONTSIZE:return t.axisTickLabelFontSizes;case s.Property.AXIS_TICKPADDING:return t.axisTickPaddings;case s.Property.AXIS_TICKSIZE:return t.axisTickSizes;case s.Property.AXIS_TICKSIZEMAJOR:return t.axisTickSizeMajors;case s.Property.AXIS_TICKSIZEMINOR:return t.axisTickSizeMinors;case s.Property.AXIS_TICKSIZEEND:return t.axisTickSizeEnds;case s.Property.AXIS_TICKWIDTH:return t.axisTickWidths;case s.Property.AXIS_VALUES:return t.axisValuesList;case s.Property.AXIS_TITLE:return t.axisTitles;case s.Property.AXIS_TITLECOLOR:return t.axisTitleColors;case s.Property.AXIS_TITLEFONT:return t.axisTitleFonts;case s.Property.AXIS_TITLEFONTWEIGHT:return t.axisTitleFontWeights;case s.Property.AXIS_TITLEFONTSIZE:return t.axisTitleFontSizes;case s.Property.AXIS_TITLEOFFSET:return t.axisTitleOffsets;case s.Property.AXIS_TITLEMAXLENGTH:return t.axisTitleMaxLengths;case s.Property.AXIS_CHARACTERWIDTH:return t.axisCharacterWidths;case s.Property.BIN_MAXBINS:return t.maxBinsList;case s.Property.BIN_MIN:return t.binMinList;case s.Property.BIN_MAX:return t.binMaxList;case s.Property.BIN_BASE:return t.binBaseList;case s.Property.BIN_STEP:return t.binStepList;case s.Property.BIN_STEPS:return t.binStepsList;case s.Property.BIN_MINSTEP:return t.binMinstepList;case s.Property.BIN_DIV:return t.binDivList;case s.Property.CHANNEL:return t.channels;case s.Property.MARK:return t.marks;case s.Property.LEGEND_ORIENT:return t.legendOrients;case s.Property.LEGEND_OFFSET:return t.legendOffsets;case s.Property.LEGEND_VALUES:return t.legendValuesList;case s.Property.LEGEND_FORMAT:return t.legendFormats;case s.Property.LEGEND_LABELALIGN:return t.legendLabelAligns;case s.Property.LEGEND_LABELBASELINE:return t.legendLabelBaselines;case s.Property.LEGEND_LABELCOLOR:return t.legendLabelColors;case s.Property.LEGEND_LABELFONT:return t.legendLabelFonts;case s.Property.LEGEND_LABELFONTSIZE:return t.legendLabelFontSizes;case s.Property.LEGEND_SYMBOLCOLOR:return t.legendSymbolColors;case s.Property.LEGEND_SYMBOLSHAPE:return t.legendSymbolShapes;case s.Property.LEGEND_SYMBOLSIZE:return t.legendSymbolSizes;case s.Property.LEGEND_SYMBOLSTROKEWIDTH:return t.legendSymbolStrokeWidths;case s.Property.LEGEND_TITLE:return t.legendTitles;case s.Property.LEGEND_TITLECOLOR:return t.legendTitleColors;case s.Property.LEGEND_TITLEFONT:return t.legendTitleFonts;case s.Property.LEGEND_TITLEFONTSIZE:return t.legendTitleFontSizes;case s.Property.LEGEND_TITLEFONTWEIGHT:return t.legendTitleFontWeights;case s.Property.SORT:return t.sorts;case s.Property.SORT_OP:return t.sortOps;case s.Property.SORT_ORDER:return t.sortOrders;case s.Property.SCALE_BANDSIZE:return t.scaleBandSizes;case s.Property.SCALE_DOMAIN:return t.scaleDomains;case s.Property.SCALE_EXPONENT:return t.scaleExponents;case s.Property.SCALE_RANGE:return t.scaleRanges;case s.Property.SCALE_TYPE:return t.scaleTypes;case s.Property.TIMEUNIT:return t.timeUnits;case s.Property.TYPE:return t.types}throw new Error("No default enumValues for "+e)}var s=e("./property"),u=e("./util");t.SHORT_WILDCARD="?",t.isWildcard=n,t.isShortWildcard=i,t.initWildcard=a,t.getDefaultName=o,t.getDefaultEnumValues=c},{"./property":36,"./util":52}],54:[function(e,r,t){"use strict";var n=e("./property"),i=e("./util"),a=function(){function e(){this._mark=void 0,this._encodings={},this._encodingIndicesByProperty={}}return e.prototype.setEncodingProperty=function(e,r,t){var n=this._encodings,i=n[e]=n[e]||{};i[r]=t;var a=this._encodingIndicesByProperty;return(a[r]=a[r]||[]).push(e),this},e.prototype.hasEncodingProperty=function(e,r){return!!(this._encodings[e]||{})[r]},e.prototype.hasProperty=function(e){if(n.isEncodingProperty(e))return!!this.encodingIndicesByProperty[e];if(e===n.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.WildcardIndex=a},{"./property":36,"./util":52}]},{},[31])(31)}); +//# sourceMappingURL=compassql.min.js.map diff --git a/compassql.min.js.map b/compassql.min.js.map new file mode 100644 index 00000000..61066865 --- /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","fieldNames","datum","keys","bracket","fieldName","type","values","array","$","isString","isDate","isNumber","isBoolean","typeAll","fields","get","identity","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","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","json","opts","space","cycles","replacer","key","node","aobj","bobj","seen","parent","indent","colonSeparator","toJSON","out","item","indexOf","TypeError","objectKeys","keyValue","","has","hasOwnProperty","jsonify","10","./lib/parse","./lib/stringify","11","at","ch","text","escapee","\"","\\","/","error","message","charAt","hex","uffff","parseInt","fromCharCode","white","object","source","reviver","result","walk","holder","12","quote","escapable","lastIndex","meta","charCodeAt","partial","mind","gap","rep","apply","\b","\t","\n","\f","\r","13","AggregateOp","AGGREGATE_OPS","VALUES","COUNT","VALID","MISSING","DISTINCT","SUM","MEAN","AVERAGE","VARIANCE","VARIANCEP","STDEV","STDEVP","MEDIAN","Q1","Q3","MODESKEW","MIN","MAX","ARGMIN","ARGMAX","SUM_OPS","SHARED_DOMAIN_OPS","14","AxisOrient","defaultAxisConfig","grid","labels","labelMaxLength","tickSize","characterWidth","defaultFacetAxisConfig","axisWidth","15","autoMaxBins","channel","channel_1","ROW","COLUMN","SIZE","SHAPE","./channel","16","supportMark","mark","getSupportedMark","COLOR","DETAIL","ORDER","OPACITY","point","tick","rule","circle","square","bar","line","area","X2","Y2","TEXT","PATH","getSupportedRole","LABEL","measure","dimension","hasScale","util_1","contains","Channel","CHANNELS","UNIT_CHANNELS","without","UNIT_SCALE_CHANNELS","NONSPATIAL_CHANNELS","NONSPATIAL_SCALE_CHANNELS","STACK_GROUP_CHANNELS","17","isDateTime","quarter","normalizeQuarter","console","warn","normalizeMonth","lowerM","toLowerCase","monthIndex","MONTHS","shortM","substr","shortMonthIndex","SHORT_MONTHS","normalizeDay","lowerD","dayIndex","DAYS","shortD","shortDayIndex","SHORT_DAYS","timestamp","normalize","SUNDAY_YEAR","getTime","dateTimeExpr","_i","_a","timeUnit","18","countRetinal","encoding","color","opacity","size","shape","channels","channelEncoding","isAggregate","some","aggregate","isRanged","y2","fieldDefs","arr","forEach","fieldDef","thisArg","channelMappingForEach","mapping","channelMappingMap","init","channelMappingReduce","19","Mark","AREA","BAR","LINE","POINT","TICK","RULE","CIRCLE","SQUARE","ERRORBAR","PRIMITIVE_MARKS","20","ScaleType","NiceTime","BandSize","BANDSIZE_FIT","FIT","defaultScaleConfig","textBandWidth","bandSize","padding","useRawDomain","nominalColorRange","sequentialColorRange","shapeRange","fontSizeRange","ruleSizeRange","tickSizeRange","defaultFacetScaleConfig","21","isSortField","SortOrder","22","stack","stacked","StackOffset","NONE","mark_1","encoding_1","stackByChannels","sc","hasXField","hasYField","xIsAggregate","yIsAggregate","fieldChannel","fieldChannelAggregate","fieldChannelScale","scale","scale_1","LINEAR","aggregate_1","ZERO","groupbyChannel","./aggregate","./encoding","./mark","./scale","23","isSingleTimeUnit","SINGLE_TIMEUNIT_INDEX","convert","SINGLE_TIMEUNITS","singleUnit","containsTimeUnit","TimeUnit","DAY","YEAR","QUARTER","MONTH","DATE","HOURS","MINUTES","SECONDS","MILLISECONDS","getMilliseconds","isMultiTimeUnit","MULTI_TIMEUNIT_INDEX","fullTimeUnit","fullTimeUnitStr","timeUnitStr","defaultScaleType","ORDINAL","TIME","fieldExpr","func","fieldRef","_d","tu","datetime_1","imputedDomain","smallestUnit","template","shortTimeLabels","dateComponents","hasYear","timeComponents","dateTimeComponents","MULTI_TIMEUNITS","YEARQUARTER","YEARQUARTERMONTH","YEARMONTH","YEARMONTHDATE","YEARMONTHDATEHOURS","YEARMONTHDATEHOURSMINUTES","YEARMONTHDATEHOURSMINUTESSECONDS","QUARTERMONTH","HOURSMINUTES","HOURSMINUTESSECONDS","MINUTESSECONDS","SECONDSMILLISECONDS","TIMEUNITS","concat","./datetime","24","getFullName","typeString","TYPE_FROM_SHORT_TYPE","toUpperCase","Type","QUANTITATIVE","TEMPORAL","NOMINAL","SHORT_TYPE","quantitative","temporal","nominal","ordinal","Q","T","O","25","pick","props","copy","prop","omit","util_2","hash","util_3","excludedItems","union","other","output","flatten","arrays","mergeDeep","dest","src","deepMerge_","constructor","warning","differ","dict","datalib/src/util","json-stable-stringify","26","sort_1","timeunit_1","type_1","property_1","DEFAULT_QUERY_CONFIG","verbose","defaultSpecConfig","overlay","propertyPrecedence","DEFAULT_PROPERTY_PRECEDENCE","marks","aggregates","timeUnits","maxBinsList","binMinList","binMaxList","binBaseList","binStepList","binStepsList","binMinstepList","binDivList","axisAxisColors","axisAxisWidths","axisLayers","axisOffsets","axisOrients","axisGridColors","axisGridDashes","axisGridOpacities","axisGridWidths","axisFormats","axisLabelAngles","axisLabelMaxLengths","axisSubDivides","axisTicks","axisTickColors","axisTickLabelColors","axisTickLabelFonts","axisTickLabelFontSizes","axisTickPaddings","axisTickSizes","axisTickSizeMajors","axisTickSizeMinors","axisTickSizeEnds","axisTickWidths","axisValuesList","axisTitles","axisTitleColors","axisTitleFonts","axisTitleFontWeights","axisTitleFontSizes","axisTitleOffsets","axisTitleMaxLengths","axisCharacterWidths","legendOrients","legendOffsets","legendValuesList","legendFormats","legendLabelAligns","legendLabelBaselines","legendLabelColors","legendLabelFonts","legendLabelFontSizes","legendSymbolColors","legendSymbolShapes","legendSymbolSizes","legendSymbolStrokeWidths","legendTitles","legendTitleColors","legendTitleFonts","legendTitleFontSizes","legendTitleFontWeights","sorts","ASCENDING","DESCENDING","sortOps","sortOrders","scaleBandSizes","scaleDomains","scaleExponents","scaleRanges","scaleTypes","LOG","numberNominalProportion","numberNominalLimit","constraintManuallySpecifiedValue","autoAddCount","hasAppropriateGraphicTypeForMark","omitAggregate","omitAggregatePlotWithDimensionOnlyOnFacet","omitAggregatePlotWithoutDimension","omitBarLineAreaWithOcclusion","omitBarTickWithSize","omitMultipleNonPositionalChannels","omitNonSumStack","omitRaw","omitRawContinuousFieldForAggregatePlot","omitRepeatedField","omitNonPositionalOrFacetOverPositionalChannels","omitTableWithOcclusionIfAutoAddCount","omitVerticalDotPlot","preferredBinAxis","preferredTemporalAxis","preferredOrdinalAxis","preferredNominalAxis","preferredFacet","maxCardinalityForCategoricalColor","maxCardinalityForFacet","maxCardinalityForShape","timeUnitShouldHaveVariation","typeMatchesSchemaType","stylize","smallBandSizeForHighCardinalityOrFacet","maxCardinality","nominalColorScaleForHighCardinality","palette","xAxisOnTopForHighYCardinalityWithoutColumn","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","27","AbstractConstraintModel","constraint","description","properties","strict","28","_encoding","_spec","./spec","29","checkEncoding","wildcard","specM","schema","encodingConstraints","ENCODING_CONSTRAINTS_BY_PROPERTY","encQ","getEncodingQueryByIndex","encodingConstraints_1","satisfy","wildcardIndex","encodings","violatedConstraint","toShorthand","__extends","__","base_1","wildcard_1","schema_1","EncodingConstraintModel","_super","hasAllRequiredPropertiesSpecific","nestedEncProp","getNestedEncodingProperty","parent_1","child","isWildcard","encWildcardIndex","allowWildcardForProperties","ENCODING_CONSTRAINTS","Property","TYPE","AGGREGATE","_","___","FIELD","BIN","bin","CHANNEL","TIMEUNIT","supportedRole","isDimension","isMeasure","hasFn","SCALE","SCALE_ZERO","zero","AUTOCOUNT","numFn","autoCount","timeUnitHasVariation","SCALE_PROPERTIES","sType","scaleType","scaleProp","SUPPORTED_SCALE_PROPERTY_INDEX","primitiveType","PrimitiveType","BOOLEAN","STRING","NUMBER","INTEGER","cardinality","SCALE_TYPE","POW","SQRT","QUANTILE","QUANTIZE","ec","ENCODING_CONSTRAINT_INDEX","../property","../query/encoding","../schema","../wildcard","./base","30","checkSpec","specConstraints","SPEC_CONSTRAINTS_BY_PROPERTY","specConstraints_1","encoding_2","NONSPATIAL_CHANNELS_INDEX","SpecConstraintModel","specConstraint","MARK","getMark","child_1","getEncodings","isEncodingProperty","SPEC_CONSTRAINTS","usedChannel","encodings_1","hasAutoCount","neverHaveAutoCount","encodingIndicesByProperty","channelUsed","hasProperty","hasNonFacetDim_1","hasDim_1","hasEnumeratedFacetDim_1","specQuery","hasEncodingProperty","encodings_2","nonPositionChannelCount","hasEnumeratedNonPositionChannel","hasNonPositionalChannelOrFacet","hasEnumeratedNonPositionOrFacetChannel","hasX","hasY","fieldUsed","fieldEnumerated","xEncQ","getEncodingQueryByChannel","yEncQ","xIsMeasure","yIsMeasure","measureEncQ","SPEC_CONSTRAINT_INDEX","31","config","enumerate","generate_1","generate","model","nest","property","cqlQuery","query_1","query","ranking","./config","./constraint/constraint","./enumerator","./model","./nest","./query/query","./ranking/ranking","./schema","./wildcard","32","EncodingPropertyGeneratorFactory","answerSet","jobIndex","propWildcard","getEncodingProperty","propVal","setEncodingProperty","violatedEncodingConstraint","violatedSpecConstraint","spec_1","resetEncodingProperty","ENUMERATOR_INDEX","markWildcard","setMark","resetMark","ENCODING_PROPERTIES","NESTED_ENCODING_PROPERTIES","nestedProp","./constraint/encoding","./constraint/spec","33","specQ","config_1","model_1","SpecQueryModel","build","reducer","enumerator_1","stylize_1","../src/enumerator","./stylize","34","wildcardindex_1","groupby_1","shorthand_1","wildcardAssignment","_rankingScore","_channelCount","_wildcardIndex","_wildcardAssignment","_opt","_schema","WildcardIndex","name_1","getDefaultName","initWildcard","SHORT_WILDCARD","defaultWildcardName","defaultEnumValues","getDefaultEnumValues","propObj","countEncQ","enum","defineProperty","enumerable","configurable","hasNestedProperty","specEncoding","groupBy","include","parsedGroupBy","PROPERTIES","SORT","AXIS","LEGEND","_b","PROPERTIES_1","PROPERTY_SUPPORTED_CHANNELS","toSpec","transform","getRankingScore","rankingName","setRankingScore","score","SpecQueryModelGroup","path","items","orderGroupBy","_name","_path","_items","_groupBy","_orderGroupBy","getTopSpecQueryModel","topItem","set","./query/encoding","./query/groupby","./query/shorthand","./query/spec","./wildcardindex","35","registerKeyFn","groupRegistry","specModels","rootGroup_1","groupIndex_1","includes_1","replaces","replacers_1","group","stringifyStack","_stack","FIELD_TRANSFORM","ENCODING","TRANSPOSE","SPEC","GROUP_BY_FIELD","PARSED_GROUP_BY_FIELD","GROUP_BY_FIELD_TRANSFORM","STACK","PARSED_GROUP_BY_FIELD_TRANSFORM","GROUP_BY_ENCODING","row","column","PARSED_GROUP_BY_ENCODING","36","NESTED_ENCODING_PROPERTIES_PARENT_INDEX","ENCODING_INDEX","NESTED_ENCODING_INDEX","getNestedEncodingPropertyChildren","NESTED_ENCODING_PROPERTY_PARENT_INDEX","isNestedEncodingProperty","FILTER","CALCULATE","FILTERINVALID","BIN_MAXBINS","BIN_MIN","BIN_MAX","BIN_BASE","BIN_STEP","BIN_STEPS","BIN_MINSTEP","BIN_DIV","HAS_FN","SORT_FIELD","SORT_OP","SORT_ORDER","SCALE_BANDSIZE","SCALE_CLAMP","SCALE_DOMAIN","SCALE_EXPONENT","SCALE_NICE","SCALE_RANGE","SCALE_ROUND","SCALE_USERAWDOMAIN","AXIS_AXISCOLOR","AXIS_AXISWIDTH","AXIS_LAYER","AXIS_OFFSET","AXIS_ORIENT","AXIS_GRID","AXIS_GRIDCOLOR","AXIS_GRIDDASH","AXIS_GRIDOPACITY","AXIS_GRIDWIDTH","AXIS_LABELS","AXIS_FORMAT","AXIS_LABELANGLE","AXIS_LABELMAXLENGTH","AXIS_SHORTTIMELABELS","AXIS_SUBDIVIDE","AXIS_TICKS","AXIS_TICKCOLOR","AXIS_TICKLABELCOLOR","AXIS_TICKLABELFONT","AXIS_TICKLABELFONTSIZE","AXIS_TICKPADDING","AXIS_TICKSIZE","AXIS_TICKSIZEMAJOR","AXIS_TICKSIZEMINOR","AXIS_TICKSIZEEND","AXIS_TICKWIDTH","AXIS_VALUES","AXIS_TITLE","AXIS_TITLECOLOR","AXIS_TITLEFONT","AXIS_TITLEFONTSIZE","AXIS_TITLEFONTWEIGHT","AXIS_TITLEOFFSET","AXIS_TITLEMAXLENGTH","AXIS_CHARACTERWIDTH","LEGEND_ORIENT","LEGEND_OFFSET","LEGEND_VALUES","LEGEND_FORMAT","LEGEND_LABELALIGN","LEGEND_LABELBASELINE","LEGEND_LABELCOLOR","LEGEND_LABELFONT","LEGEND_LABELFONTSIZE","LEGEND_SHORTTIMELABELS","LEGEND_SYMBOLCOLOR","LEGEND_SYMBOLSHAPE","LEGEND_SYMBOLSIZE","LEGEND_SYMBOLSTROKEWIDTH","LEGEND_TITLE","LEGEND_TITLECOLOR","LEGEND_TITLEFONT","LEGEND_TITLEFONTSIZE","LEGEND_TITLEFONTWEIGHT","NESTED_ENCODING_PROPERTIES_PARENT","nestedEncodingProperties","NESTED_ENCODING_PROPERTIES_PARENT_1","SUPPORTED_SCALE_PROPERTY","supportedScaleType","37","38","isExtendedGroupBy","replaceIndex","grpBy","getReplacerIndex","replaceIndex_1","valFrom","valTo","valsFrom","REPLACE_BLANK_FIELDS","*","REPLACE_XY_CHANNELS","REPLACE_FACET_CHANNELS","REPLACE_MARK_STYLE_CHANNELS","./shorthand","39","nestedAnswerSet","nest_1","ranking_1","nest_2","orderBy","normalizedQ","chooseBy","shorthand","../config","../generate","../nest","../ranking/ranking","./groupby","./transform","40","fnIndex","getReplacer","isShortWildcard","vlSpec","vlspec","INCLUDE_ALL","fromSpec","parts","property_2","calculate","filterInvalid","includeExceptType","fieldEncQ","groupby","groupByEncQ","encQs","formulaArr","calculateItem","expr","fieldDefStr","fnEnumIndex","binTypeProp","binTypeStr","_loop_1","nestedPropParent","nestedProps","nestedPropChildren","_c","fieldAndParams","typeShort","splitShorthand","part","splitPart","splitWithTail","splitPartKey","splitPartValue","CHANNEL_INDEX","shorthandParser","calculate_1","fieldExprMapping","delim","indexOfDelim","substring","axis","legend","order","AGGREGATE_OP_INDEX","fieldDefShorthand","rawFieldDef","fieldDefPart","partParams","closingBraceIndex","propEqualSignIndex","parsedValue","openingBraceIndex","getClosingIndex","value_1","openingBracketIndex","closingBracketIndex","value_2","propIndex","nextCommaIndex","closingChar","encodingProperty","insideFn","insideFnParts","41","channelDef","ENCODING_PROPERTIES_1","stack_1","vega-lite/src/stack","42","43","feature","aggregationQualityFeature","features","isRawContinuous","hasCount","hasBin","44","TypeChannelScore","effectiveness_1","SCORE","CONTINUOUS_TYPE_CHANNEL_SCORE","TERRIBLE","detail","TIMEUNIT_T","featurize","ORDERED_TYPE_CHANNEL_SCORE","BIN_Q","TIMEUNIT_O","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","45","FEATURE_INDEX","addFeatureFactory","FEATURE_FACTORIES","default_1","scores","MarkScore","MARK_SCORE","46","xType","yType","hasOcclusion","MEASURES","DISCRETE","DISCRETE_OR_NONE","occludedQQMark","rect","noOccludedQQMark","occludedDimensionMeasureMark","feature2","noOccludedQxN","noOccludedQxBinQ","ttMark","tdMark","ddMark","isOccluded","47","ExtendedType","../../query/encoding","48","fieldWildcardIndices","numFields","fieldSchemas","totalScore","fieldWildcard","fieldIndex","fieldSchema","score_1","49","register","rankingRegistry","subgroup","groupComparatorFactory","comparatorFactory","m1","m2","getScoreDifference","g1","g2","scoreDifference","effectiveness","aggregation","fieldOrder","EFFECTIVENESS","./aggregation","./effectiveness/effectiveness","./fieldorder","50","binSummary","dlBin","binUnique","timeSummary","timeunit","dateString","oldUnique","newUnique","bucket","Number","invalidCount","prev","cur","bin_1","stats_1","type_2","Schema","_fieldSchemas","_fieldSchemaIndex","summaries","data_1","dataEntry","timeStats","binStats","localeCompare","fieldSchemas_1","augmentTimeUnitDomain","excludeInvalid","dateEncQ","SINGLE_TIMEUNITS_1","singleUnitEncQ","datalib/src/bins/bins","datalib/src/import/type","datalib/src/stats","vega-lite/src/bin","51","encQIndex","colorEncQ","orient","axis_1","TOP","vega-lite/src/axis","52","nestedMap","53","defaultName","54","_mark","_encodings","_encodingIndicesByProperty","encodingsIndex","encIndex","isEmpty"],"mappings":"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"} \ No newline at end of file