mirror of
https://github.com/swc-project/swc.git
synced 2024-12-29 16:42:28 +03:00
064bcf4854
Co-authored-by: Donny/강동윤 <kdy1997.dev@gmail.com>
10990 lines
547 KiB
JavaScript
10990 lines
547 KiB
JavaScript
!function(global, factory) {
|
|
'object' == typeof exports && 'undefined' != typeof module ? factory(exports) : 'function' == typeof define && define.amd ? define([
|
|
'exports'
|
|
], factory) : factory((global = 'undefined' != typeof globalThis ? globalThis : global || self).d3 = global.d3 || {});
|
|
}(this, function(exports1) {
|
|
'use strict';
|
|
function ascending(a, b) {
|
|
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
|
|
}
|
|
function bisector(f) {
|
|
let delta = f, compare = f;
|
|
function left(a, x, lo, hi) {
|
|
for(null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi;){
|
|
const mid = lo + hi >>> 1;
|
|
0 > compare(a[mid], x) ? lo = mid + 1 : hi = mid;
|
|
}
|
|
return lo;
|
|
}
|
|
return 1 === f.length && (delta = (d, x)=>f(d) - x, compare = (d, x)=>ascending(f(d), x)), {
|
|
left,
|
|
center: function(a, x, lo, hi) {
|
|
null == lo && (lo = 0), null == hi && (hi = a.length);
|
|
const i = left(a, x, lo, hi - 1);
|
|
return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;
|
|
},
|
|
right: function(a, x, lo, hi) {
|
|
for(null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi;){
|
|
const mid = lo + hi >>> 1;
|
|
compare(a[mid], x) > 0 ? hi = mid : lo = mid + 1;
|
|
}
|
|
return lo;
|
|
}
|
|
};
|
|
}
|
|
function number(x) {
|
|
return null === x ? NaN : +x;
|
|
}
|
|
const ascendingBisect = bisector(ascending), bisectRight = ascendingBisect.right, bisectLeft = ascendingBisect.left, bisectCenter = bisector(number).center;
|
|
function count(values, valueof) {
|
|
let count = 0;
|
|
if (void 0 === valueof) for (let value of values)null != value && (value = +value) >= value && ++count;
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (value = +value) >= value && ++count;
|
|
}
|
|
return count;
|
|
}
|
|
function length(array) {
|
|
return 0 | array.length;
|
|
}
|
|
function empty(length) {
|
|
return !(length > 0);
|
|
}
|
|
function arrayify(values) {
|
|
return "object" != typeof values || "length" in values ? values : Array.from(values);
|
|
}
|
|
function variance(values, valueof) {
|
|
let delta, count = 0, mean = 0, sum = 0;
|
|
if (void 0 === valueof) for (let value of values)null != value && (value = +value) >= value && (delta = value - mean, mean += delta / ++count, sum += delta * (value - mean));
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (value = +value) >= value && (delta = value - mean, mean += delta / ++count, sum += delta * (value - mean));
|
|
}
|
|
if (count > 1) return sum / (count - 1);
|
|
}
|
|
function deviation(values, valueof) {
|
|
const v = variance(values, valueof);
|
|
return v ? Math.sqrt(v) : v;
|
|
}
|
|
function extent(values, valueof) {
|
|
let min, max;
|
|
if (void 0 === valueof) for (const value of values)null != value && (void 0 === min ? value >= value && (min = max = value) : (min > value && (min = value), max < value && (max = value)));
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (void 0 === min ? value >= value && (min = max = value) : (min > value && (min = value), max < value && (max = value)));
|
|
}
|
|
return [
|
|
min,
|
|
max
|
|
];
|
|
}
|
|
class Adder {
|
|
constructor(){
|
|
this._partials = new Float64Array(32), this._n = 0;
|
|
}
|
|
add(x) {
|
|
const p = this._partials;
|
|
let i = 0;
|
|
for(let j = 0; j < this._n && j < 32; j++){
|
|
const y = p[j], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);
|
|
lo && (p[i++] = lo), x = hi;
|
|
}
|
|
return p[i] = x, this._n = i + 1, this;
|
|
}
|
|
valueOf() {
|
|
const p = this._partials;
|
|
let n = this._n, x, y, lo, hi = 0;
|
|
if (n > 0) {
|
|
for(hi = p[--n]; n > 0 && (hi = (x = hi) + (y = p[--n]), !(lo = y - (hi - x))););
|
|
n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0) && (x = hi + (y = 2 * lo), y == x - hi && (hi = x));
|
|
}
|
|
return hi;
|
|
}
|
|
}
|
|
function identity(x) {
|
|
return x;
|
|
}
|
|
function unique(values) {
|
|
if (1 !== values.length) throw Error("duplicate key");
|
|
return values[0];
|
|
}
|
|
function nest(values, map, reduce, keys) {
|
|
return function regroup(values, i) {
|
|
if (i >= keys.length) return reduce(values);
|
|
const groups = new Map(), keyof = keys[i++];
|
|
let index = -1;
|
|
for (const value of values){
|
|
const key = keyof(value, ++index, values), group = groups.get(key);
|
|
group ? group.push(value) : groups.set(key, [
|
|
value
|
|
]);
|
|
}
|
|
for (const [key, values] of groups)groups.set(key, regroup(values, i));
|
|
return map(groups);
|
|
}(values, 0);
|
|
}
|
|
var slice = Array.prototype.slice;
|
|
function constant(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
var e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);
|
|
function ticks(start, stop, count) {
|
|
var reverse, n, ticks, step, i = -1;
|
|
if (count = +count, (start = +start) == (stop = +stop) && count > 0) return [
|
|
start
|
|
];
|
|
if ((reverse = stop < start) && (n = start, start = stop, stop = n), 0 === (step = tickIncrement(start, stop, count)) || !isFinite(step)) return [];
|
|
if (step > 0) for(start = Math.ceil(start / step), ticks = Array(n = Math.ceil((stop = Math.floor(stop / step)) - start + 1)); ++i < n;)ticks[i] = (start + i) * step;
|
|
else for(start = Math.ceil(start * (step = -step)), ticks = Array(n = Math.ceil((stop = Math.floor(stop * step)) - start + 1)); ++i < n;)ticks[i] = (start + i) / step;
|
|
return reverse && ticks.reverse(), ticks;
|
|
}
|
|
function tickIncrement(start, stop, count) {
|
|
var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);
|
|
return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
|
|
}
|
|
function tickStep(start, stop, count) {
|
|
var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;
|
|
return error >= e10 ? step1 *= 10 : error >= e5 ? step1 *= 5 : error >= e2 && (step1 *= 2), stop < start ? -step1 : step1;
|
|
}
|
|
function nice(start, stop, count) {
|
|
let prestep;
|
|
for(;;){
|
|
const step = tickIncrement(start, stop, count);
|
|
if (step === prestep || 0 === step || !isFinite(step)) return [
|
|
start,
|
|
stop
|
|
];
|
|
step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step) : step < 0 && (start = Math.ceil(start * step) / step, stop = Math.floor(stop * step) / step), prestep = step;
|
|
}
|
|
}
|
|
function thresholdSturges(values) {
|
|
return Math.ceil(Math.log(count(values)) / Math.LN2) + 1;
|
|
}
|
|
function bin() {
|
|
var value = identity, domain = extent, threshold = thresholdSturges;
|
|
function histogram(data) {
|
|
Array.isArray(data) || (data = Array.from(data));
|
|
var i, x, n = data.length, values = Array(n);
|
|
for(i = 0; i < n; ++i)values[i] = value(data[i], i, data);
|
|
var xz = domain(values), x0 = xz[0], x1 = xz[1], tz = threshold(values, x0, x1);
|
|
if (!Array.isArray(tz)) {
|
|
const max = x1, tn = +tz;
|
|
if (domain === extent && ([x0, x1] = nice(x0, x1, tn)), (tz = ticks(x0, x1, tn))[tz.length - 1] >= x1) {
|
|
if (max >= x1 && domain === extent) {
|
|
const step = tickIncrement(x0, x1, tn);
|
|
isFinite(step) && (step > 0 ? x1 = (Math.floor(x1 / step) + 1) * step : step < 0 && (x1 = -((Math.ceil(-(x1 * step)) + 1) / step)));
|
|
} else tz.pop();
|
|
}
|
|
}
|
|
for(var m = tz.length; tz[0] <= x0;)tz.shift(), --m;
|
|
for(; tz[m - 1] > x1;)tz.pop(), --m;
|
|
var bin, bins = Array(m + 1);
|
|
for(i = 0; i <= m; ++i)(bin = bins[i] = []).x0 = i > 0 ? tz[i - 1] : x0, bin.x1 = i < m ? tz[i] : x1;
|
|
for(i = 0; i < n; ++i)x0 <= (x = values[i]) && x <= x1 && bins[bisectRight(tz, x, 0, m)].push(data[i]);
|
|
return bins;
|
|
}
|
|
return histogram.value = function(_) {
|
|
return arguments.length ? (value = "function" == typeof _ ? _ : constant(_), histogram) : value;
|
|
}, histogram.domain = function(_) {
|
|
return arguments.length ? (domain = "function" == typeof _ ? _ : constant([
|
|
_[0],
|
|
_[1]
|
|
]), histogram) : domain;
|
|
}, histogram.thresholds = function(_) {
|
|
return arguments.length ? (threshold = "function" == typeof _ ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
|
|
}, histogram;
|
|
}
|
|
function max(values, valueof) {
|
|
let max;
|
|
if (void 0 === valueof) for (const value of values)null != value && (max < value || void 0 === max && value >= value) && (max = value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (max < value || void 0 === max && value >= value) && (max = value);
|
|
}
|
|
return max;
|
|
}
|
|
function min(values, valueof) {
|
|
let min;
|
|
if (void 0 === valueof) for (const value of values)null != value && (min > value || void 0 === min && value >= value) && (min = value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (min > value || void 0 === min && value >= value) && (min = value);
|
|
}
|
|
return min;
|
|
}
|
|
function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) {
|
|
for(; right > left;){
|
|
if (right - left > 600) {
|
|
const n = right - left + 1, m = k - left + 1, z = Math.log(n), s = 0.5 * Math.exp(2 * z / 3), sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1), newLeft = Math.max(left, Math.floor(k - m * s / n + sd)), newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
|
quickselect(array, k, newLeft, newRight, compare);
|
|
}
|
|
const t = array[k];
|
|
let i = left, j = right;
|
|
for(swap(array, left, k), compare(array[right], t) > 0 && swap(array, left, right); i < j;){
|
|
for(swap(array, i, j), ++i, --j; 0 > compare(array[i], t);)++i;
|
|
for(; compare(array[j], t) > 0;)--j;
|
|
}
|
|
0 === compare(array[left], t) ? swap(array, left, j) : swap(array, ++j, right), j <= k && (left = j + 1), k <= j && (right = j - 1);
|
|
}
|
|
return array;
|
|
}
|
|
function swap(array, i, j) {
|
|
const t = array[i];
|
|
array[i] = array[j], array[j] = t;
|
|
}
|
|
function quantile(values, p, valueof) {
|
|
if (n = (values = Float64Array.from(function*(values, valueof) {
|
|
if (void 0 === valueof) for (let value of values)null != value && (value = +value) >= value && (yield value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (value = +value) >= value && (yield value);
|
|
}
|
|
}(values, valueof))).length) {
|
|
if ((p = +p) <= 0 || n < 2) return min(values);
|
|
if (p >= 1) return max(values);
|
|
var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = max(quickselect(values, i0).subarray(0, i0 + 1));
|
|
return value0 + (min(values.subarray(i0 + 1)) - value0) * (i - i0);
|
|
}
|
|
}
|
|
function quantileSorted(values, p, valueof = number) {
|
|
if (n = values.length) {
|
|
if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
|
|
if (p >= 1) return +valueof(values[n - 1], n - 1, values);
|
|
var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values[i0], i0, values);
|
|
return value0 + (+valueof(values[i0 + 1], i0 + 1, values) - value0) * (i - i0);
|
|
}
|
|
}
|
|
function maxIndex(values, valueof) {
|
|
let max;
|
|
let maxIndex = -1, index = -1;
|
|
if (void 0 === valueof) for (const value of values)++index, null != value && (max < value || void 0 === max && value >= value) && (max = value, maxIndex = index);
|
|
else for (let value of values)null != (value = valueof(value, ++index, values)) && (max < value || void 0 === max && value >= value) && (max = value, maxIndex = index);
|
|
return maxIndex;
|
|
}
|
|
function merge(arrays) {
|
|
return Array.from(function*(arrays) {
|
|
for (const array of arrays)yield* array;
|
|
}(arrays));
|
|
}
|
|
function minIndex(values, valueof) {
|
|
let min;
|
|
let minIndex = -1, index = -1;
|
|
if (void 0 === valueof) for (const value of values)++index, null != value && (min > value || void 0 === min && value >= value) && (min = value, minIndex = index);
|
|
else for (let value of values)null != (value = valueof(value, ++index, values)) && (min > value || void 0 === min && value >= value) && (min = value, minIndex = index);
|
|
return minIndex;
|
|
}
|
|
function pair(a, b) {
|
|
return [
|
|
a,
|
|
b
|
|
];
|
|
}
|
|
function permute(source, keys) {
|
|
return Array.from(keys, (key)=>source[key]);
|
|
}
|
|
function sequence(start, stop, step) {
|
|
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
|
|
for(var i = -1, n = 0 | Math.max(0, Math.ceil((stop - start) / step)), range = Array(n); ++i < n;)range[i] = start + i * step;
|
|
return range;
|
|
}
|
|
function leastIndex(values, compare = ascending) {
|
|
let minValue;
|
|
if (1 === compare.length) return minIndex(values, compare);
|
|
let min = -1, index = -1;
|
|
for (const value of values)++index, (min < 0 ? 0 === compare(value, value) : 0 > compare(value, minValue)) && (minValue = value, min = index);
|
|
return min;
|
|
}
|
|
var shuffle = shuffler(Math.random);
|
|
function shuffler(random) {
|
|
return function(array, i0 = 0, i1 = array.length) {
|
|
let m = i1 - (i0 = +i0);
|
|
for(; m;){
|
|
const i = random() * m-- | 0, t = array[m + i0];
|
|
array[m + i0] = array[i + i0], array[i + i0] = t;
|
|
}
|
|
return array;
|
|
};
|
|
}
|
|
function transpose(matrix) {
|
|
if (!(n = matrix.length)) return [];
|
|
for(var i = -1, m = min(matrix, length$1), transpose = Array(m); ++i < m;)for(var n, j = -1, row = transpose[i] = Array(n); ++j < n;)row[j] = matrix[j][i];
|
|
return transpose;
|
|
}
|
|
function length$1(d) {
|
|
return d.length;
|
|
}
|
|
function set(values) {
|
|
return values instanceof Set ? values : new Set(values);
|
|
}
|
|
function superset(values, other) {
|
|
const iterator = values[Symbol.iterator](), set = new Set();
|
|
for (const o of other){
|
|
let value, done;
|
|
if (!set.has(o)) for(; { value, done } = iterator.next();){
|
|
if (done) return !1;
|
|
if (set.add(value), Object.is(o, value)) break;
|
|
}
|
|
}
|
|
return !0;
|
|
}
|
|
var slice$1 = Array.prototype.slice;
|
|
function identity$1(x) {
|
|
return x;
|
|
}
|
|
function translateX(x) {
|
|
return "translate(" + (x + 0.5) + ",0)";
|
|
}
|
|
function translateY(y) {
|
|
return "translate(0," + (y + 0.5) + ")";
|
|
}
|
|
function number$1(scale) {
|
|
return (d)=>+scale(d);
|
|
}
|
|
function center(scale) {
|
|
var offset = Math.max(0, scale.bandwidth() - 1) / 2;
|
|
return scale.round() && (offset = Math.round(offset)), function(d) {
|
|
return +scale(d) + offset;
|
|
};
|
|
}
|
|
function entering() {
|
|
return !this.__axis;
|
|
}
|
|
function axis(orient, scale) {
|
|
var tickArguments = [], tickValues = null, tickFormat = null, tickSizeInner = 6, tickSizeOuter = 6, tickPadding = 3, k = 1 === orient || 4 === orient ? -1 : 1, x = 4 === orient || 2 === orient ? "x" : "y", transform = 1 === orient || 3 === orient ? translateX : translateY;
|
|
function axis(context) {
|
|
var values = null == tickValues ? scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain() : tickValues, format = null == tickFormat ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1 : tickFormat, spacing = Math.max(tickSizeInner, 0) + tickPadding, range = scale.range(), range0 = +range[0] + 0.5, range1 = +range[range.length - 1] + 0.5, position = (scale.bandwidth ? center : number$1)(scale.copy()), selection = context.selection ? context.selection() : context, path = selection.selectAll(".domain").data([
|
|
null
|
|
]), tick = selection.selectAll(".tick").data(values, scale).order(), tickExit = tick.exit(), tickEnter = tick.enter().append("g").attr("class", "tick"), line = tick.select("line"), text = tick.select("text");
|
|
path = path.merge(path.enter().insert("path", ".tick").attr("class", "domain").attr("stroke", "currentColor")), tick = tick.merge(tickEnter), line = line.merge(tickEnter.append("line").attr("stroke", "currentColor").attr(x + "2", k * tickSizeInner)), text = text.merge(tickEnter.append("text").attr("fill", "currentColor").attr(x, k * spacing).attr("dy", 1 === orient ? "0em" : 3 === orient ? "0.71em" : "0.32em")), context !== selection && (path = path.transition(context), tick = tick.transition(context), line = line.transition(context), text = text.transition(context), tickExit = tickExit.transition(context).attr("opacity", 1e-6).attr("transform", function(d) {
|
|
return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform");
|
|
}), tickEnter.attr("opacity", 1e-6).attr("transform", function(d) {
|
|
var p = this.parentNode.__axis;
|
|
return transform(p && isFinite(p = p(d)) ? p : position(d));
|
|
})), tickExit.remove(), path.attr("d", 4 === orient || 2 == orient ? tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1 : tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1), tick.attr("opacity", 1).attr("transform", function(d) {
|
|
return transform(position(d));
|
|
}), line.attr(x + "2", k * tickSizeInner), text.attr(x, k * spacing).text(format), selection.filter(entering).attr("fill", "none").attr("font-size", 10).attr("font-family", "sans-serif").attr("text-anchor", 2 === orient ? "start" : 4 === orient ? "end" : "middle"), selection.each(function() {
|
|
this.__axis = position;
|
|
});
|
|
}
|
|
return axis.scale = function(_) {
|
|
return arguments.length ? (scale = _, axis) : scale;
|
|
}, axis.ticks = function() {
|
|
return tickArguments = slice$1.call(arguments), axis;
|
|
}, axis.tickArguments = function(_) {
|
|
return arguments.length ? (tickArguments = null == _ ? [] : slice$1.call(_), axis) : tickArguments.slice();
|
|
}, axis.tickValues = function(_) {
|
|
return arguments.length ? (tickValues = null == _ ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
|
|
}, axis.tickFormat = function(_) {
|
|
return arguments.length ? (tickFormat = _, axis) : tickFormat;
|
|
}, axis.tickSize = function(_) {
|
|
return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
|
|
}, axis.tickSizeInner = function(_) {
|
|
return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
|
|
}, axis.tickSizeOuter = function(_) {
|
|
return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
|
|
}, axis.tickPadding = function(_) {
|
|
return arguments.length ? (tickPadding = +_, axis) : tickPadding;
|
|
}, axis;
|
|
}
|
|
var noop = {
|
|
value: ()=>{}
|
|
};
|
|
function dispatch() {
|
|
for(var t, i = 0, n = arguments.length, _ = {}; i < n; ++i){
|
|
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw Error("illegal type: " + t);
|
|
_[t] = [];
|
|
}
|
|
return new Dispatch(_);
|
|
}
|
|
function Dispatch(_) {
|
|
this._ = _;
|
|
}
|
|
function set$1(type, name, callback) {
|
|
for(var i = 0, n = type.length; i < n; ++i)if (type[i].name === name) {
|
|
type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
|
|
break;
|
|
}
|
|
return null != callback && type.push({
|
|
name: name,
|
|
value: callback
|
|
}), type;
|
|
}
|
|
Dispatch.prototype = dispatch.prototype = {
|
|
constructor: Dispatch,
|
|
on: function(typename, callback) {
|
|
var t, _ = this._, T = (typename + "").trim().split(/^|\s+/).map(function(t) {
|
|
var name = "", i = t.indexOf(".");
|
|
if (i >= 0 && (name = t.slice(i + 1), t = t.slice(0, i)), t && !_.hasOwnProperty(t)) throw Error("unknown type: " + t);
|
|
return {
|
|
type: t,
|
|
name: name
|
|
};
|
|
}), i = -1, n = T.length;
|
|
if (arguments.length < 2) {
|
|
for(; ++i < n;)if ((t = (typename = T[i]).type) && (t = function(type, name) {
|
|
for(var c, i = 0, n = type.length; i < n; ++i)if ((c = type[i]).name === name) return c.value;
|
|
}(_[t], typename.name))) return t;
|
|
return;
|
|
}
|
|
if (null != callback && "function" != typeof callback) throw Error("invalid callback: " + callback);
|
|
for(; ++i < n;)if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);
|
|
else if (null == callback) for(t in _)_[t] = set$1(_[t], typename.name, null);
|
|
return this;
|
|
},
|
|
copy: function() {
|
|
var copy = {}, _ = this._;
|
|
for(var t in _)copy[t] = _[t].slice();
|
|
return new Dispatch(copy);
|
|
},
|
|
call: function(type, that) {
|
|
if ((n = arguments.length - 2) > 0) for(var n, t, args = Array(n), i = 0; i < n; ++i)args[i] = arguments[i + 2];
|
|
if (!this._.hasOwnProperty(type)) throw Error("unknown type: " + type);
|
|
for(t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);
|
|
},
|
|
apply: function(type, that, args) {
|
|
if (!this._.hasOwnProperty(type)) throw Error("unknown type: " + type);
|
|
for(var t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);
|
|
}
|
|
};
|
|
var xhtml = "http://www.w3.org/1999/xhtml", namespaces = {
|
|
svg: "http://www.w3.org/2000/svg",
|
|
xhtml: xhtml,
|
|
xlink: "http://www.w3.org/1999/xlink",
|
|
xml: "http://www.w3.org/XML/1998/namespace",
|
|
xmlns: "http://www.w3.org/2000/xmlns/"
|
|
};
|
|
function namespace(name) {
|
|
var prefix = name += "", i = prefix.indexOf(":");
|
|
return i >= 0 && "xmlns" !== (prefix = name.slice(0, i)) && (name = name.slice(i + 1)), namespaces.hasOwnProperty(prefix) ? {
|
|
space: namespaces[prefix],
|
|
local: name
|
|
} : name;
|
|
}
|
|
function creatorInherit(name) {
|
|
return function() {
|
|
var document1 = this.ownerDocument, uri = this.namespaceURI;
|
|
return uri === xhtml && document1.documentElement.namespaceURI === xhtml ? document1.createElement(name) : document1.createElementNS(uri, name);
|
|
};
|
|
}
|
|
function creatorFixed(fullname) {
|
|
return function() {
|
|
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function creator(name) {
|
|
var fullname = namespace(name);
|
|
return (fullname.local ? creatorFixed : creatorInherit)(fullname);
|
|
}
|
|
function none() {}
|
|
function selector(selector) {
|
|
return null == selector ? none : function() {
|
|
return this.querySelector(selector);
|
|
};
|
|
}
|
|
function array$1(x) {
|
|
return "object" == typeof x && "length" in x ? x : Array.from(x);
|
|
}
|
|
function empty$1() {
|
|
return [];
|
|
}
|
|
function selectorAll(selector) {
|
|
return null == selector ? empty$1 : function() {
|
|
return this.querySelectorAll(selector);
|
|
};
|
|
}
|
|
function matcher(selector) {
|
|
return function() {
|
|
return this.matches(selector);
|
|
};
|
|
}
|
|
function childMatcher(selector) {
|
|
return function(node) {
|
|
return node.matches(selector);
|
|
};
|
|
}
|
|
var find = Array.prototype.find;
|
|
function childFirst() {
|
|
return this.firstElementChild;
|
|
}
|
|
var filter$1 = Array.prototype.filter;
|
|
function children() {
|
|
return this.children;
|
|
}
|
|
function sparse(update) {
|
|
return Array(update.length);
|
|
}
|
|
function EnterNode(parent, datum) {
|
|
this.ownerDocument = parent.ownerDocument, this.namespaceURI = parent.namespaceURI, this._next = null, this._parent = parent, this.__data__ = datum;
|
|
}
|
|
function bindIndex(parent, group, enter, update, exit, data) {
|
|
for(var node, i = 0, groupLength = group.length, dataLength = data.length; i < dataLength; ++i)(node = group[i]) ? (node.__data__ = data[i], update[i] = node) : enter[i] = new EnterNode(parent, data[i]);
|
|
for(; i < groupLength; ++i)(node = group[i]) && (exit[i] = node);
|
|
}
|
|
function bindKey(parent, group, enter, update, exit, data, key) {
|
|
var i, node, keyValue, nodeByKeyValue = new Map, groupLength = group.length, dataLength = data.length, keyValues = Array(groupLength);
|
|
for(i = 0; i < groupLength; ++i)(node = group[i]) && (keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "", nodeByKeyValue.has(keyValue) ? exit[i] = node : nodeByKeyValue.set(keyValue, node));
|
|
for(i = 0; i < dataLength; ++i)keyValue = key.call(parent, data[i], i, data) + "", (node = nodeByKeyValue.get(keyValue)) ? (update[i] = node, node.__data__ = data[i], nodeByKeyValue.delete(keyValue)) : enter[i] = new EnterNode(parent, data[i]);
|
|
for(i = 0; i < groupLength; ++i)(node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node && (exit[i] = node);
|
|
}
|
|
function datum(node) {
|
|
return node.__data__;
|
|
}
|
|
function ascending$1(a, b) {
|
|
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
|
|
}
|
|
function attrRemove(name) {
|
|
return function() {
|
|
this.removeAttribute(name);
|
|
};
|
|
}
|
|
function attrRemoveNS(fullname) {
|
|
return function() {
|
|
this.removeAttributeNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function attrConstant(name, value) {
|
|
return function() {
|
|
this.setAttribute(name, value);
|
|
};
|
|
}
|
|
function attrConstantNS(fullname, value) {
|
|
return function() {
|
|
this.setAttributeNS(fullname.space, fullname.local, value);
|
|
};
|
|
}
|
|
function attrFunction(name, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
null == v ? this.removeAttribute(name) : this.setAttribute(name, v);
|
|
};
|
|
}
|
|
function attrFunctionNS(fullname, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
null == v ? this.removeAttributeNS(fullname.space, fullname.local) : this.setAttributeNS(fullname.space, fullname.local, v);
|
|
};
|
|
}
|
|
function defaultView(node) {
|
|
return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
|
|
}
|
|
function styleRemove(name) {
|
|
return function() {
|
|
this.style.removeProperty(name);
|
|
};
|
|
}
|
|
function styleConstant(name, value, priority) {
|
|
return function() {
|
|
this.style.setProperty(name, value, priority);
|
|
};
|
|
}
|
|
function styleFunction(name, value, priority) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
null == v ? this.style.removeProperty(name) : this.style.setProperty(name, v, priority);
|
|
};
|
|
}
|
|
function styleValue(node, name) {
|
|
return node.style.getPropertyValue(name) || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
|
|
}
|
|
function propertyRemove(name) {
|
|
return function() {
|
|
delete this[name];
|
|
};
|
|
}
|
|
function propertyConstant(name, value) {
|
|
return function() {
|
|
this[name] = value;
|
|
};
|
|
}
|
|
function propertyFunction(name, value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
null == v ? delete this[name] : this[name] = v;
|
|
};
|
|
}
|
|
function classArray(string) {
|
|
return string.trim().split(/^|\s+/);
|
|
}
|
|
function classList(node) {
|
|
return node.classList || new ClassList(node);
|
|
}
|
|
function ClassList(node) {
|
|
this._node = node, this._names = classArray(node.getAttribute("class") || "");
|
|
}
|
|
function classedAdd(node, names) {
|
|
for(var list = classList(node), i = -1, n = names.length; ++i < n;)list.add(names[i]);
|
|
}
|
|
function classedRemove(node, names) {
|
|
for(var list = classList(node), i = -1, n = names.length; ++i < n;)list.remove(names[i]);
|
|
}
|
|
function classedTrue(names) {
|
|
return function() {
|
|
classedAdd(this, names);
|
|
};
|
|
}
|
|
function classedFalse(names) {
|
|
return function() {
|
|
classedRemove(this, names);
|
|
};
|
|
}
|
|
function classedFunction(names, value) {
|
|
return function() {
|
|
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
|
|
};
|
|
}
|
|
function textRemove() {
|
|
this.textContent = "";
|
|
}
|
|
function textConstant(value) {
|
|
return function() {
|
|
this.textContent = value;
|
|
};
|
|
}
|
|
function textFunction(value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
this.textContent = null == v ? "" : v;
|
|
};
|
|
}
|
|
function htmlRemove() {
|
|
this.innerHTML = "";
|
|
}
|
|
function htmlConstant(value) {
|
|
return function() {
|
|
this.innerHTML = value;
|
|
};
|
|
}
|
|
function htmlFunction(value) {
|
|
return function() {
|
|
var v = value.apply(this, arguments);
|
|
this.innerHTML = null == v ? "" : v;
|
|
};
|
|
}
|
|
function raise() {
|
|
this.nextSibling && this.parentNode.appendChild(this);
|
|
}
|
|
function lower() {
|
|
this.previousSibling && this.parentNode.insertBefore(this, this.parentNode.firstChild);
|
|
}
|
|
function constantNull() {
|
|
return null;
|
|
}
|
|
function remove() {
|
|
var parent = this.parentNode;
|
|
parent && parent.removeChild(this);
|
|
}
|
|
function selection_cloneShallow() {
|
|
var clone = this.cloneNode(!1), parent = this.parentNode;
|
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
|
|
}
|
|
function selection_cloneDeep() {
|
|
var clone = this.cloneNode(!0), parent = this.parentNode;
|
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
|
|
}
|
|
function onRemove(typename) {
|
|
return function() {
|
|
var on = this.__on;
|
|
if (on) {
|
|
for(var o, j = 0, i = -1, m = on.length; j < m; ++j)(o = on[j], typename.type && o.type !== typename.type || o.name !== typename.name) ? on[++i] = o : this.removeEventListener(o.type, o.listener, o.options);
|
|
++i ? on.length = i : delete this.__on;
|
|
}
|
|
};
|
|
}
|
|
function onAdd(typename, value, options) {
|
|
return function() {
|
|
var o, on = this.__on, listener = function(event) {
|
|
value.call(this, event, this.__data__);
|
|
};
|
|
if (on) {
|
|
for(var j = 0, m = on.length; j < m; ++j)if ((o = on[j]).type === typename.type && o.name === typename.name) {
|
|
this.removeEventListener(o.type, o.listener, o.options), this.addEventListener(o.type, o.listener = listener, o.options = options), o.value = value;
|
|
return;
|
|
}
|
|
}
|
|
this.addEventListener(typename.type, listener, options), o = {
|
|
type: typename.type,
|
|
name: typename.name,
|
|
value: value,
|
|
listener: listener,
|
|
options: options
|
|
}, on ? on.push(o) : this.__on = [
|
|
o
|
|
];
|
|
};
|
|
}
|
|
function dispatchEvent(node, type, params) {
|
|
var window1 = defaultView(node), event = window1.CustomEvent;
|
|
"function" == typeof event ? event = new event(type, params) : (event = window1.document.createEvent("Event"), params ? (event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail) : event.initEvent(type, !1, !1)), node.dispatchEvent(event);
|
|
}
|
|
function dispatchConstant(type, params) {
|
|
return function() {
|
|
return dispatchEvent(this, type, params);
|
|
};
|
|
}
|
|
function dispatchFunction(type, params) {
|
|
return function() {
|
|
return dispatchEvent(this, type, params.apply(this, arguments));
|
|
};
|
|
}
|
|
EnterNode.prototype = {
|
|
constructor: EnterNode,
|
|
appendChild: function(child) {
|
|
return this._parent.insertBefore(child, this._next);
|
|
},
|
|
insertBefore: function(child, next) {
|
|
return this._parent.insertBefore(child, next);
|
|
},
|
|
querySelector: function(selector) {
|
|
return this._parent.querySelector(selector);
|
|
},
|
|
querySelectorAll: function(selector) {
|
|
return this._parent.querySelectorAll(selector);
|
|
}
|
|
}, ClassList.prototype = {
|
|
add: function(name) {
|
|
0 > this._names.indexOf(name) && (this._names.push(name), this._node.setAttribute("class", this._names.join(" ")));
|
|
},
|
|
remove: function(name) {
|
|
var i = this._names.indexOf(name);
|
|
i >= 0 && (this._names.splice(i, 1), this._node.setAttribute("class", this._names.join(" ")));
|
|
},
|
|
contains: function(name) {
|
|
return this._names.indexOf(name) >= 0;
|
|
}
|
|
};
|
|
var root = [
|
|
null
|
|
];
|
|
function Selection(groups, parents) {
|
|
this._groups = groups, this._parents = parents;
|
|
}
|
|
function selection() {
|
|
return new Selection([
|
|
[
|
|
document.documentElement
|
|
]
|
|
], root);
|
|
}
|
|
function select(selector) {
|
|
return "string" == typeof selector ? new Selection([
|
|
[
|
|
document.querySelector(selector)
|
|
]
|
|
], [
|
|
document.documentElement
|
|
]) : new Selection([
|
|
[
|
|
selector
|
|
]
|
|
], root);
|
|
}
|
|
Selection.prototype = selection.prototype = {
|
|
constructor: Selection,
|
|
select: function(select) {
|
|
"function" != typeof select && (select = selector(select));
|
|
for(var groups = this._groups, m = groups.length, subgroups = Array(m), j = 0; j < m; ++j)for(var node, subnode, group = groups[j], n = group.length, subgroup = subgroups[j] = Array(n), i = 0; i < n; ++i)(node = group[i]) && (subnode = select.call(node, node.__data__, i, group)) && ("__data__" in node && (subnode.__data__ = node.__data__), subgroup[i] = subnode);
|
|
return new Selection(subgroups, this._parents);
|
|
},
|
|
selectAll: function(select) {
|
|
if ("function" == typeof select) {
|
|
var select1;
|
|
select1 = select, select = function() {
|
|
var group = select1.apply(this, arguments);
|
|
return null == group ? [] : array$1(group);
|
|
};
|
|
} else select = selectorAll(select);
|
|
for(var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, i = 0; i < n; ++i)(node = group[i]) && (subgroups.push(select.call(node, node.__data__, i, group)), parents.push(node));
|
|
return new Selection(subgroups, parents);
|
|
},
|
|
selectChild: function(match) {
|
|
var match1;
|
|
return this.select(null == match ? childFirst : (match1 = "function" == typeof match ? match : childMatcher(match), function() {
|
|
return find.call(this.children, match1);
|
|
}));
|
|
},
|
|
selectChildren: function(match) {
|
|
var match1;
|
|
return this.selectAll(null == match ? children : (match1 = "function" == typeof match ? match : childMatcher(match), function() {
|
|
return filter$1.call(this.children, match1);
|
|
}));
|
|
},
|
|
filter: function(match) {
|
|
"function" != typeof match && (match = matcher(match));
|
|
for(var groups = this._groups, m = groups.length, subgroups = Array(m), j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, subgroup = subgroups[j] = [], i = 0; i < n; ++i)(node = group[i]) && match.call(node, node.__data__, i, group) && subgroup.push(node);
|
|
return new Selection(subgroups, this._parents);
|
|
},
|
|
data: function(value, key) {
|
|
if (!arguments.length) return Array.from(this, datum);
|
|
var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
|
|
"function" != typeof value && (x = value, value = function() {
|
|
return x;
|
|
});
|
|
for(var m = groups.length, update = Array(m), enter = Array(m), exit = Array(m), j = 0; j < m; ++j){
|
|
var parent = parents[j], group = groups[j], groupLength = group.length, data = array$1(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = Array(dataLength), updateGroup = update[j] = Array(dataLength);
|
|
bind(parent, group, enterGroup, updateGroup, exit[j] = Array(groupLength), data, key);
|
|
for(var x, previous, next, i0 = 0, i1 = 0; i0 < dataLength; ++i0)if (previous = enterGroup[i0]) {
|
|
for(i0 >= i1 && (i1 = i0 + 1); !(next = updateGroup[i1]) && ++i1 < dataLength;);
|
|
previous._next = next || null;
|
|
}
|
|
}
|
|
return (update = new Selection(update, parents))._enter = enter, update._exit = exit, update;
|
|
},
|
|
enter: function() {
|
|
return new Selection(this._enter || this._groups.map(sparse), this._parents);
|
|
},
|
|
exit: function() {
|
|
return new Selection(this._exit || this._groups.map(sparse), this._parents);
|
|
},
|
|
join: function(onenter, onupdate, onexit) {
|
|
var enter = this.enter(), update = this, exit = this.exit();
|
|
return enter = "function" == typeof onenter ? onenter(enter) : enter.append(onenter + ""), null != onupdate && (update = onupdate(update)), null == onexit ? exit.remove() : onexit(exit), enter && update ? enter.merge(update).order() : update;
|
|
},
|
|
merge: function(selection) {
|
|
if (!(selection instanceof Selection)) throw Error("invalid merge");
|
|
for(var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = Array(m0), j = 0; j < m; ++j)for(var node, group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = Array(n), i = 0; i < n; ++i)(node = group0[i] || group1[i]) && (merge[i] = node);
|
|
for(; j < m0; ++j)merges[j] = groups0[j];
|
|
return new Selection(merges, this._parents);
|
|
},
|
|
selection: function() {
|
|
return this;
|
|
},
|
|
order: function() {
|
|
for(var groups = this._groups, j = -1, m = groups.length; ++j < m;)for(var node, group = groups[j], i = group.length - 1, next = group[i]; --i >= 0;)(node = group[i]) && (next && 4 ^ node.compareDocumentPosition(next) && next.parentNode.insertBefore(node, next), next = node);
|
|
return this;
|
|
},
|
|
sort: function(compare) {
|
|
function compareNode(a, b) {
|
|
return a && b ? compare(a.__data__, b.__data__) : !a - !b;
|
|
}
|
|
compare || (compare = ascending$1);
|
|
for(var groups = this._groups, m = groups.length, sortgroups = Array(m), j = 0; j < m; ++j){
|
|
for(var node, group = groups[j], n = group.length, sortgroup = sortgroups[j] = Array(n), i = 0; i < n; ++i)(node = group[i]) && (sortgroup[i] = node);
|
|
sortgroup.sort(compareNode);
|
|
}
|
|
return new Selection(sortgroups, this._parents).order();
|
|
},
|
|
call: function() {
|
|
var callback = arguments[0];
|
|
return arguments[0] = this, callback.apply(null, arguments), this;
|
|
},
|
|
nodes: function() {
|
|
return Array.from(this);
|
|
},
|
|
node: function() {
|
|
for(var groups = this._groups, j = 0, m = groups.length; j < m; ++j)for(var group = groups[j], i = 0, n = group.length; i < n; ++i){
|
|
var node = group[i];
|
|
if (node) return node;
|
|
}
|
|
return null;
|
|
},
|
|
size: function() {
|
|
let size = 0;
|
|
for (const node of this)++size;
|
|
return size;
|
|
},
|
|
empty: function() {
|
|
return !this.node();
|
|
},
|
|
each: function(callback) {
|
|
for(var groups = this._groups, j = 0, m = groups.length; j < m; ++j)for(var node, group = groups[j], i = 0, n = group.length; i < n; ++i)(node = group[i]) && callback.call(node, node.__data__, i, group);
|
|
return this;
|
|
},
|
|
attr: function(name, value) {
|
|
var fullname = namespace(name);
|
|
if (arguments.length < 2) {
|
|
var node = this.node();
|
|
return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
|
|
}
|
|
return this.each((null == value ? fullname.local ? attrRemoveNS : attrRemove : "function" == typeof value ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
|
|
},
|
|
style: function(name, value, priority) {
|
|
return arguments.length > 1 ? this.each((null == value ? styleRemove : "function" == typeof value ? styleFunction : styleConstant)(name, value, null == priority ? "" : priority)) : styleValue(this.node(), name);
|
|
},
|
|
property: function(name, value) {
|
|
return arguments.length > 1 ? this.each((null == value ? propertyRemove : "function" == typeof value ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
|
|
},
|
|
classed: function(name, value) {
|
|
var names = classArray(name + "");
|
|
if (arguments.length < 2) {
|
|
for(var list = classList(this.node()), i = -1, n = names.length; ++i < n;)if (!list.contains(names[i])) return !1;
|
|
return !0;
|
|
}
|
|
return this.each(("function" == typeof value ? classedFunction : value ? classedTrue : classedFalse)(names, value));
|
|
},
|
|
text: function(value) {
|
|
return arguments.length ? this.each(null == value ? textRemove : ("function" == typeof value ? textFunction : textConstant)(value)) : this.node().textContent;
|
|
},
|
|
html: function(value) {
|
|
return arguments.length ? this.each(null == value ? htmlRemove : ("function" == typeof value ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
|
|
},
|
|
raise: function() {
|
|
return this.each(raise);
|
|
},
|
|
lower: function() {
|
|
return this.each(lower);
|
|
},
|
|
append: function(name) {
|
|
var create = "function" == typeof name ? name : creator(name);
|
|
return this.select(function() {
|
|
return this.appendChild(create.apply(this, arguments));
|
|
});
|
|
},
|
|
insert: function(name, before) {
|
|
var create = "function" == typeof name ? name : creator(name), select = null == before ? constantNull : "function" == typeof before ? before : selector(before);
|
|
return this.select(function() {
|
|
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
|
|
});
|
|
},
|
|
remove: function() {
|
|
return this.each(remove);
|
|
},
|
|
clone: function(deep) {
|
|
return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
|
|
},
|
|
datum: function(value) {
|
|
return arguments.length ? this.property("__data__", value) : this.node().__data__;
|
|
},
|
|
on: function(typename, value, options) {
|
|
var i, t, typenames = (typename + "").trim().split(/^|\s+/).map(function(t) {
|
|
var name = "", i = t.indexOf(".");
|
|
return i >= 0 && (name = t.slice(i + 1), t = t.slice(0, i)), {
|
|
type: t,
|
|
name: name
|
|
};
|
|
}), n = typenames.length;
|
|
if (arguments.length < 2) {
|
|
var on = this.node().__on;
|
|
if (on) {
|
|
for(var o, j = 0, m = on.length; j < m; ++j)for(i = 0, o = on[j]; i < n; ++i)if ((t = typenames[i]).type === o.type && t.name === o.name) return o.value;
|
|
}
|
|
return;
|
|
}
|
|
for(i = 0, on = value ? onAdd : onRemove; i < n; ++i)this.each(on(typenames[i], value, options));
|
|
return this;
|
|
},
|
|
dispatch: function(type, params) {
|
|
return this.each(("function" == typeof params ? dispatchFunction : dispatchConstant)(type, params));
|
|
},
|
|
[Symbol.iterator]: function*() {
|
|
for(var groups = this._groups, j = 0, m = groups.length; j < m; ++j)for(var node, group = groups[j], i = 0, n = group.length; i < n; ++i)(node = group[i]) && (yield node);
|
|
}
|
|
};
|
|
var nextId = 0;
|
|
function local() {
|
|
return new Local;
|
|
}
|
|
function Local() {
|
|
this._ = "@" + (++nextId).toString(36);
|
|
}
|
|
function sourceEvent(event) {
|
|
let sourceEvent;
|
|
for(; sourceEvent = event.sourceEvent;)event = sourceEvent;
|
|
return event;
|
|
}
|
|
function pointer(event, node) {
|
|
if (event = sourceEvent(event), void 0 === node && (node = event.currentTarget), node) {
|
|
var svg = node.ownerSVGElement || node;
|
|
if (svg.createSVGPoint) {
|
|
var point = svg.createSVGPoint();
|
|
return point.x = event.clientX, point.y = event.clientY, [
|
|
(point = point.matrixTransform(node.getScreenCTM().inverse())).x,
|
|
point.y
|
|
];
|
|
}
|
|
if (node.getBoundingClientRect) {
|
|
var rect = node.getBoundingClientRect();
|
|
return [
|
|
event.clientX - rect.left - node.clientLeft,
|
|
event.clientY - rect.top - node.clientTop
|
|
];
|
|
}
|
|
}
|
|
return [
|
|
event.pageX,
|
|
event.pageY
|
|
];
|
|
}
|
|
function nopropagation(event) {
|
|
event.stopImmediatePropagation();
|
|
}
|
|
function noevent(event) {
|
|
event.preventDefault(), event.stopImmediatePropagation();
|
|
}
|
|
function dragDisable(view) {
|
|
var root = view.document.documentElement, selection = select(view).on("dragstart.drag", noevent, !0);
|
|
"onselectstart" in root ? selection.on("selectstart.drag", noevent, !0) : (root.__noselect = root.style.MozUserSelect, root.style.MozUserSelect = "none");
|
|
}
|
|
function yesdrag(view, noclick) {
|
|
var root = view.document.documentElement, selection = select(view).on("dragstart.drag", null);
|
|
noclick && (selection.on("click.drag", noevent, !0), setTimeout(function() {
|
|
selection.on("click.drag", null);
|
|
}, 0)), "onselectstart" in root ? selection.on("selectstart.drag", null) : (root.style.MozUserSelect = root.__noselect, delete root.__noselect);
|
|
}
|
|
Local.prototype = local.prototype = {
|
|
constructor: Local,
|
|
get: function(node) {
|
|
for(var id = this._; !(id in node);)if (!(node = node.parentNode)) return;
|
|
return node[id];
|
|
},
|
|
set: function(node, value) {
|
|
return node[this._] = value;
|
|
},
|
|
remove: function(node) {
|
|
return this._ in node && delete node[this._];
|
|
},
|
|
toString: function() {
|
|
return this._;
|
|
}
|
|
};
|
|
var constant$2 = (x)=>()=>x;
|
|
function DragEvent(type, { sourceEvent, subject, target, identifier, active, x, y, dx, dy, dispatch }) {
|
|
Object.defineProperties(this, {
|
|
type: {
|
|
value: type,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
sourceEvent: {
|
|
value: sourceEvent,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
subject: {
|
|
value: subject,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
target: {
|
|
value: target,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
identifier: {
|
|
value: identifier,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
active: {
|
|
value: active,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
x: {
|
|
value: x,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
y: {
|
|
value: y,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
dx: {
|
|
value: dx,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
dy: {
|
|
value: dy,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
_: {
|
|
value: dispatch
|
|
}
|
|
});
|
|
}
|
|
function defaultFilter(event) {
|
|
return !event.ctrlKey && !event.button;
|
|
}
|
|
function defaultContainer() {
|
|
return this.parentNode;
|
|
}
|
|
function defaultSubject(event, d) {
|
|
return null == d ? {
|
|
x: event.x,
|
|
y: event.y
|
|
} : d;
|
|
}
|
|
function defaultTouchable() {
|
|
return navigator.maxTouchPoints || "ontouchstart" in this;
|
|
}
|
|
function define1(constructor, factory, prototype) {
|
|
constructor.prototype = factory.prototype = prototype, prototype.constructor = constructor;
|
|
}
|
|
function extend(parent, definition) {
|
|
var prototype = Object.create(parent.prototype);
|
|
for(var key in definition)prototype[key] = definition[key];
|
|
return prototype;
|
|
}
|
|
function Color() {}
|
|
DragEvent.prototype.on = function() {
|
|
var value = this._.on.apply(this._, arguments);
|
|
return value === this._ ? this : value;
|
|
};
|
|
var reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = RegExp("^rgb\\(" + [
|
|
reI,
|
|
reI,
|
|
reI
|
|
] + "\\)$"), reRgbPercent = RegExp("^rgb\\(" + [
|
|
reP,
|
|
reP,
|
|
reP
|
|
] + "\\)$"), reRgbaInteger = RegExp("^rgba\\(" + [
|
|
reI,
|
|
reI,
|
|
reI,
|
|
reN
|
|
] + "\\)$"), reRgbaPercent = RegExp("^rgba\\(" + [
|
|
reP,
|
|
reP,
|
|
reP,
|
|
reN
|
|
] + "\\)$"), reHslPercent = RegExp("^hsl\\(" + [
|
|
reN,
|
|
reP,
|
|
reP
|
|
] + "\\)$"), reHslaPercent = RegExp("^hsla\\(" + [
|
|
reN,
|
|
reP,
|
|
reP,
|
|
reN
|
|
] + "\\)$"), named = {
|
|
aliceblue: 0xf0f8ff,
|
|
antiquewhite: 0xfaebd7,
|
|
aqua: 0x00ffff,
|
|
aquamarine: 0x7fffd4,
|
|
azure: 0xf0ffff,
|
|
beige: 0xf5f5dc,
|
|
bisque: 0xffe4c4,
|
|
black: 0x000000,
|
|
blanchedalmond: 0xffebcd,
|
|
blue: 0x0000ff,
|
|
blueviolet: 0x8a2be2,
|
|
brown: 0xa52a2a,
|
|
burlywood: 0xdeb887,
|
|
cadetblue: 0x5f9ea0,
|
|
chartreuse: 0x7fff00,
|
|
chocolate: 0xd2691e,
|
|
coral: 0xff7f50,
|
|
cornflowerblue: 0x6495ed,
|
|
cornsilk: 0xfff8dc,
|
|
crimson: 0xdc143c,
|
|
cyan: 0x00ffff,
|
|
darkblue: 0x00008b,
|
|
darkcyan: 0x008b8b,
|
|
darkgoldenrod: 0xb8860b,
|
|
darkgray: 0xa9a9a9,
|
|
darkgreen: 0x006400,
|
|
darkgrey: 0xa9a9a9,
|
|
darkkhaki: 0xbdb76b,
|
|
darkmagenta: 0x8b008b,
|
|
darkolivegreen: 0x556b2f,
|
|
darkorange: 0xff8c00,
|
|
darkorchid: 0x9932cc,
|
|
darkred: 0x8b0000,
|
|
darksalmon: 0xe9967a,
|
|
darkseagreen: 0x8fbc8f,
|
|
darkslateblue: 0x483d8b,
|
|
darkslategray: 0x2f4f4f,
|
|
darkslategrey: 0x2f4f4f,
|
|
darkturquoise: 0x00ced1,
|
|
darkviolet: 0x9400d3,
|
|
deeppink: 0xff1493,
|
|
deepskyblue: 0x00bfff,
|
|
dimgray: 0x696969,
|
|
dimgrey: 0x696969,
|
|
dodgerblue: 0x1e90ff,
|
|
firebrick: 0xb22222,
|
|
floralwhite: 0xfffaf0,
|
|
forestgreen: 0x228b22,
|
|
fuchsia: 0xff00ff,
|
|
gainsboro: 0xdcdcdc,
|
|
ghostwhite: 0xf8f8ff,
|
|
gold: 0xffd700,
|
|
goldenrod: 0xdaa520,
|
|
gray: 0x808080,
|
|
green: 0x008000,
|
|
greenyellow: 0xadff2f,
|
|
grey: 0x808080,
|
|
honeydew: 0xf0fff0,
|
|
hotpink: 0xff69b4,
|
|
indianred: 0xcd5c5c,
|
|
indigo: 0x4b0082,
|
|
ivory: 0xfffff0,
|
|
khaki: 0xf0e68c,
|
|
lavender: 0xe6e6fa,
|
|
lavenderblush: 0xfff0f5,
|
|
lawngreen: 0x7cfc00,
|
|
lemonchiffon: 0xfffacd,
|
|
lightblue: 0xadd8e6,
|
|
lightcoral: 0xf08080,
|
|
lightcyan: 0xe0ffff,
|
|
lightgoldenrodyellow: 0xfafad2,
|
|
lightgray: 0xd3d3d3,
|
|
lightgreen: 0x90ee90,
|
|
lightgrey: 0xd3d3d3,
|
|
lightpink: 0xffb6c1,
|
|
lightsalmon: 0xffa07a,
|
|
lightseagreen: 0x20b2aa,
|
|
lightskyblue: 0x87cefa,
|
|
lightslategray: 0x778899,
|
|
lightslategrey: 0x778899,
|
|
lightsteelblue: 0xb0c4de,
|
|
lightyellow: 0xffffe0,
|
|
lime: 0x00ff00,
|
|
limegreen: 0x32cd32,
|
|
linen: 0xfaf0e6,
|
|
magenta: 0xff00ff,
|
|
maroon: 0x800000,
|
|
mediumaquamarine: 0x66cdaa,
|
|
mediumblue: 0x0000cd,
|
|
mediumorchid: 0xba55d3,
|
|
mediumpurple: 0x9370db,
|
|
mediumseagreen: 0x3cb371,
|
|
mediumslateblue: 0x7b68ee,
|
|
mediumspringgreen: 0x00fa9a,
|
|
mediumturquoise: 0x48d1cc,
|
|
mediumvioletred: 0xc71585,
|
|
midnightblue: 0x191970,
|
|
mintcream: 0xf5fffa,
|
|
mistyrose: 0xffe4e1,
|
|
moccasin: 0xffe4b5,
|
|
navajowhite: 0xffdead,
|
|
navy: 0x000080,
|
|
oldlace: 0xfdf5e6,
|
|
olive: 0x808000,
|
|
olivedrab: 0x6b8e23,
|
|
orange: 0xffa500,
|
|
orangered: 0xff4500,
|
|
orchid: 0xda70d6,
|
|
palegoldenrod: 0xeee8aa,
|
|
palegreen: 0x98fb98,
|
|
paleturquoise: 0xafeeee,
|
|
palevioletred: 0xdb7093,
|
|
papayawhip: 0xffefd5,
|
|
peachpuff: 0xffdab9,
|
|
peru: 0xcd853f,
|
|
pink: 0xffc0cb,
|
|
plum: 0xdda0dd,
|
|
powderblue: 0xb0e0e6,
|
|
purple: 0x800080,
|
|
rebeccapurple: 0x663399,
|
|
red: 0xff0000,
|
|
rosybrown: 0xbc8f8f,
|
|
royalblue: 0x4169e1,
|
|
saddlebrown: 0x8b4513,
|
|
salmon: 0xfa8072,
|
|
sandybrown: 0xf4a460,
|
|
seagreen: 0x2e8b57,
|
|
seashell: 0xfff5ee,
|
|
sienna: 0xa0522d,
|
|
silver: 0xc0c0c0,
|
|
skyblue: 0x87ceeb,
|
|
slateblue: 0x6a5acd,
|
|
slategray: 0x708090,
|
|
slategrey: 0x708090,
|
|
snow: 0xfffafa,
|
|
springgreen: 0x00ff7f,
|
|
steelblue: 0x4682b4,
|
|
tan: 0xd2b48c,
|
|
teal: 0x008080,
|
|
thistle: 0xd8bfd8,
|
|
tomato: 0xff6347,
|
|
turquoise: 0x40e0d0,
|
|
violet: 0xee82ee,
|
|
wheat: 0xf5deb3,
|
|
white: 0xffffff,
|
|
whitesmoke: 0xf5f5f5,
|
|
yellow: 0xffff00,
|
|
yellowgreen: 0x9acd32
|
|
};
|
|
function color_formatHex() {
|
|
return this.rgb().formatHex();
|
|
}
|
|
function color_formatRgb() {
|
|
return this.rgb().formatRgb();
|
|
}
|
|
function color(format) {
|
|
var m, l;
|
|
return format = (format + "").trim().toLowerCase(), (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), 6 === l ? rgbn(m) : 3 === l ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | 0xf0 & m, (0xf & m) << 4 | 0xf & m, 1) : 8 === l ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (0xff & m) / 0xff) : 4 === l ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | 0xf0 & m, ((0xf & m) << 4 | 0xf & m) / 0xff) : null) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format)) ? new Rgb(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, 1) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format)) ? rgba(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, m[4]) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : "transparent" === format ? new Rgb(NaN, NaN, NaN, 0) : null;
|
|
}
|
|
function rgbn(n) {
|
|
return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, 0xff & n, 1);
|
|
}
|
|
function rgba(r, g, b, a) {
|
|
return a <= 0 && (r = g = b = NaN), new Rgb(r, g, b, a);
|
|
}
|
|
function rgbConvert(o) {
|
|
return (o instanceof Color || (o = color(o)), o) ? (o = o.rgb(), new Rgb(o.r, o.g, o.b, o.opacity)) : new Rgb;
|
|
}
|
|
function rgb(r, g, b, opacity) {
|
|
return 1 == arguments.length ? rgbConvert(r) : new Rgb(r, g, b, null == opacity ? 1 : opacity);
|
|
}
|
|
function Rgb(r, g, b, opacity) {
|
|
this.r = +r, this.g = +g, this.b = +b, this.opacity = +opacity;
|
|
}
|
|
function rgb_formatHex() {
|
|
return "#" + hex(this.r) + hex(this.g) + hex(this.b);
|
|
}
|
|
function rgb_formatRgb() {
|
|
var a = this.opacity;
|
|
return (1 === (a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a))) ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (1 === a ? ")" : ", " + a + ")");
|
|
}
|
|
function hex(value) {
|
|
return ((value = Math.max(0, Math.min(255, Math.round(value) || 0))) < 16 ? "0" : "") + value.toString(16);
|
|
}
|
|
function hsla(h, s, l, a) {
|
|
return a <= 0 ? h = s = l = NaN : l <= 0 || l >= 1 ? h = s = NaN : s <= 0 && (h = NaN), new Hsl(h, s, l, a);
|
|
}
|
|
function hslConvert(o) {
|
|
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
|
|
if (o instanceof Color || (o = color(o)), !o) return new Hsl;
|
|
if (o instanceof Hsl) return o;
|
|
var r = (o = o.rgb()).r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;
|
|
return s ? (h = r === max ? (g - b) / s + (g < b) * 6 : g === max ? (b - r) / s + 2 : (r - g) / s + 4, s /= l < 0.5 ? max + min : 2 - max - min, h *= 60) : s = l > 0 && l < 1 ? 0 : h, new Hsl(h, s, l, o.opacity);
|
|
}
|
|
function hsl(h, s, l, opacity) {
|
|
return 1 == arguments.length ? hslConvert(h) : new Hsl(h, s, l, null == opacity ? 1 : opacity);
|
|
}
|
|
function Hsl(h, s, l, opacity) {
|
|
this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;
|
|
}
|
|
function hsl2rgb(h, m1, m2) {
|
|
return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
|
|
}
|
|
define1(Color, color, {
|
|
copy: function(channels) {
|
|
return Object.assign(new this.constructor, this, channels);
|
|
},
|
|
displayable: function() {
|
|
return this.rgb().displayable();
|
|
},
|
|
hex: color_formatHex,
|
|
formatHex: color_formatHex,
|
|
formatHsl: function() {
|
|
return hslConvert(this).formatHsl();
|
|
},
|
|
formatRgb: color_formatRgb,
|
|
toString: color_formatRgb
|
|
}), define1(Rgb, rgb, extend(Color, {
|
|
brighter: function(k) {
|
|
return k = null == k ? 1.4285714285714286 : Math.pow(1.4285714285714286, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
|
|
},
|
|
darker: function(k) {
|
|
return k = null == k ? 0.7 : Math.pow(0.7, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
|
|
},
|
|
rgb: function() {
|
|
return this;
|
|
},
|
|
displayable: function() {
|
|
return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;
|
|
},
|
|
hex: rgb_formatHex,
|
|
formatHex: rgb_formatHex,
|
|
formatRgb: rgb_formatRgb,
|
|
toString: rgb_formatRgb
|
|
})), define1(Hsl, hsl, extend(Color, {
|
|
brighter: function(k) {
|
|
return k = null == k ? 1.4285714285714286 : Math.pow(1.4285714285714286, k), new Hsl(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
darker: function(k) {
|
|
return k = null == k ? 0.7 : Math.pow(0.7, k), new Hsl(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
rgb: function() {
|
|
var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
|
|
return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);
|
|
},
|
|
displayable: function() {
|
|
return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;
|
|
},
|
|
formatHsl: function() {
|
|
var a = this.opacity;
|
|
return (1 === (a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a))) ? "hsl(" : "hsla(") + (this.h || 0) + ", " + 100 * (this.s || 0) + "%, " + 100 * (this.l || 0) + "%" + (1 === a ? ")" : ", " + a + ")");
|
|
}
|
|
}));
|
|
const radians = Math.PI / 180, degrees = 180 / Math.PI, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;
|
|
function labConvert(o) {
|
|
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
|
|
if (o instanceof Hcl) return hcl2lab(o);
|
|
o instanceof Rgb || (o = rgbConvert(o));
|
|
var x, z, r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / 1);
|
|
return r === g && g === b ? x = z = y : (x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / 0.96422), z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / 0.82521)), new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
|
|
}
|
|
function lab(l, a, b, opacity) {
|
|
return 1 == arguments.length ? labConvert(l) : new Lab(l, a, b, null == opacity ? 1 : opacity);
|
|
}
|
|
function Lab(l, a, b, opacity) {
|
|
this.l = +l, this.a = +a, this.b = +b, this.opacity = +opacity;
|
|
}
|
|
function xyz2lab(t) {
|
|
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
|
|
}
|
|
function lab2xyz(t) {
|
|
return t > t1 ? t * t * t : t2 * (t - t0);
|
|
}
|
|
function lrgb2rgb(x) {
|
|
return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
|
}
|
|
function rgb2lrgb(x) {
|
|
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
|
|
}
|
|
function hclConvert(o) {
|
|
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
|
|
if (o instanceof Lab || (o = labConvert(o)), 0 === o.a && 0 === o.b) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);
|
|
var h = Math.atan2(o.b, o.a) * degrees;
|
|
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
|
|
}
|
|
function hcl(h, c, l, opacity) {
|
|
return 1 == arguments.length ? hclConvert(h) : new Hcl(h, c, l, null == opacity ? 1 : opacity);
|
|
}
|
|
function Hcl(h, c, l, opacity) {
|
|
this.h = +h, this.c = +c, this.l = +l, this.opacity = +opacity;
|
|
}
|
|
function hcl2lab(o) {
|
|
if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
|
|
var h = o.h * radians;
|
|
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
|
|
}
|
|
define1(Lab, lab, extend(Color, {
|
|
brighter: function(k) {
|
|
return new Lab(this.l + 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);
|
|
},
|
|
darker: function(k) {
|
|
return new Lab(this.l - 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);
|
|
},
|
|
rgb: function() {
|
|
var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200;
|
|
return x = 0.96422 * lab2xyz(x), y = 1 * lab2xyz(y), z = 0.82521 * lab2xyz(z), new Rgb(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);
|
|
}
|
|
})), define1(Hcl, hcl, extend(Color, {
|
|
brighter: function(k) {
|
|
return new Hcl(this.h, this.c, this.l + 18 * (null == k ? 1 : k), this.opacity);
|
|
},
|
|
darker: function(k) {
|
|
return new Hcl(this.h, this.c, this.l - 18 * (null == k ? 1 : k), this.opacity);
|
|
},
|
|
rgb: function() {
|
|
return hcl2lab(this).rgb();
|
|
}
|
|
}));
|
|
var BC_DA = -1.78277 * 0.29227 - 0.1347134789;
|
|
function cubehelix(h, s, l, opacity) {
|
|
return 1 == arguments.length ? function(o) {
|
|
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
|
|
o instanceof Rgb || (o = rgbConvert(o));
|
|
var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + -1.7884503806 * r - 3.5172982438 * g) / (BC_DA + -1.7884503806 - 3.5172982438), bl = b - l, k = -((1.97294 * (g - l) - -0.29227 * bl) / 0.90649), s = Math.sqrt(k * k + bl * bl) / (1.97294 * l * (1 - l)), h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;
|
|
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
|
|
}(h) : new Cubehelix(h, s, l, null == opacity ? 1 : opacity);
|
|
}
|
|
function Cubehelix(h, s, l, opacity) {
|
|
this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;
|
|
}
|
|
function basis(t1, v0, v1, v2, v3) {
|
|
var t2 = t1 * t1, t3 = t2 * t1;
|
|
return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
|
|
}
|
|
function basis$1(values) {
|
|
var n = values.length - 1;
|
|
return function(t) {
|
|
var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
|
|
return basis((t - i / n) * n, v0, v1, v2, v3);
|
|
};
|
|
}
|
|
function basisClosed(values) {
|
|
var n = values.length;
|
|
return function(t) {
|
|
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];
|
|
return basis((t - i / n) * n, v0, v1, v2, v3);
|
|
};
|
|
}
|
|
define1(Cubehelix, cubehelix, extend(Color, {
|
|
brighter: function(k) {
|
|
return k = null == k ? 1.4285714285714286 : Math.pow(1.4285714285714286, k), new Cubehelix(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
darker: function(k) {
|
|
return k = null == k ? 0.7 : Math.pow(0.7, k), new Cubehelix(this.h, this.s, this.l * k, this.opacity);
|
|
},
|
|
rgb: function() {
|
|
var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h);
|
|
return new Rgb(255 * (l + a * (-0.14861 * cosh + 1.78277 * sinh)), 255 * (l + a * (-0.29227 * cosh + -0.90649 * sinh)), 255 * (l + a * (1.97294 * cosh)), this.opacity);
|
|
}
|
|
}));
|
|
var constant$3 = (x)=>()=>x;
|
|
function linear(a, d) {
|
|
return function(t) {
|
|
return a + t * d;
|
|
};
|
|
}
|
|
function hue(a, b) {
|
|
var d = b - a;
|
|
return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
|
|
}
|
|
function nogamma(a, b) {
|
|
var d = b - a;
|
|
return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
|
|
}
|
|
var interpolateRgb = function rgbGamma(y) {
|
|
var y1, color = 1 == (y1 = +(y1 = y)) ? nogamma : function(a, b) {
|
|
var a1, b1, y;
|
|
return b - a ? (a1 = a, b1 = b, a1 = Math.pow(a1, y = y1), b1 = Math.pow(b1, y) - a1, y = 1 / y, function(t) {
|
|
return Math.pow(a1 + t * b1, y);
|
|
}) : constant$3(isNaN(a) ? b : a);
|
|
};
|
|
function rgb$1(start, end) {
|
|
var r = color((start = rgb(start)).r, (end = rgb(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = nogamma(start.opacity, end.opacity);
|
|
return function(t) {
|
|
return start.r = r(t), start.g = g(t), start.b = b(t), start.opacity = opacity(t), start + "";
|
|
};
|
|
}
|
|
return rgb$1.gamma = rgbGamma, rgb$1;
|
|
}(1);
|
|
function rgbSpline(spline) {
|
|
return function(colors) {
|
|
var i, color, n = colors.length, r = Array(n), g = Array(n), b = Array(n);
|
|
for(i = 0; i < n; ++i)color = rgb(colors[i]), r[i] = color.r || 0, g[i] = color.g || 0, b[i] = color.b || 0;
|
|
return r = spline(r), g = spline(g), b = spline(b), color.opacity = 1, function(t) {
|
|
return color.r = r(t), color.g = g(t), color.b = b(t), color + "";
|
|
};
|
|
};
|
|
}
|
|
var rgbBasis = rgbSpline(basis$1), rgbBasisClosed = rgbSpline(basisClosed);
|
|
function numberArray(a, b) {
|
|
b || (b = []);
|
|
var i, n = a ? Math.min(b.length, a.length) : 0, c = b.slice();
|
|
return function(t) {
|
|
for(i = 0; i < n; ++i)c[i] = a[i] * (1 - t) + b[i] * t;
|
|
return c;
|
|
};
|
|
}
|
|
function isNumberArray(x) {
|
|
return ArrayBuffer.isView(x) && !(x instanceof DataView);
|
|
}
|
|
function genericArray(a, b) {
|
|
var i, nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = Array(na), c = Array(nb);
|
|
for(i = 0; i < na; ++i)x[i] = interpolate(a[i], b[i]);
|
|
for(; i < nb; ++i)c[i] = b[i];
|
|
return function(t) {
|
|
for(i = 0; i < na; ++i)c[i] = x[i](t);
|
|
return c;
|
|
};
|
|
}
|
|
function date(a, b) {
|
|
var d = new Date;
|
|
return a = +a, b = +b, function(t) {
|
|
return d.setTime(a * (1 - t) + b * t), d;
|
|
};
|
|
}
|
|
function interpolateNumber(a, b) {
|
|
return a = +a, b = +b, function(t) {
|
|
return a * (1 - t) + b * t;
|
|
};
|
|
}
|
|
function object(a, b) {
|
|
var k, i = {}, c = {};
|
|
for(k in (null === a || "object" != typeof a) && (a = {}), (null === b || "object" != typeof b) && (b = {}), b)k in a ? i[k] = interpolate(a[k], b[k]) : c[k] = b[k];
|
|
return function(t) {
|
|
for(k in i)c[k] = i[k](t);
|
|
return c;
|
|
};
|
|
}
|
|
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, reB = RegExp(reA.source, "g");
|
|
function interpolateString(a, b) {
|
|
var b1, b2, am, bm, bs, bi = reA.lastIndex = reB.lastIndex = 0, i = -1, s = [], q = [];
|
|
for(a += "", b += ""; (am = reA.exec(a)) && (bm = reB.exec(b));)(bs = bm.index) > bi && (bs = b.slice(bi, bs), s[i] ? s[i] += bs : s[++i] = bs), (am = am[0]) === (bm = bm[0]) ? s[i] ? s[i] += bm : s[++i] = bm : (s[++i] = null, q.push({
|
|
i: i,
|
|
x: interpolateNumber(am, bm)
|
|
})), bi = reB.lastIndex;
|
|
return bi < b.length && (bs = b.slice(bi), s[i] ? s[i] += bs : s[++i] = bs), s.length < 2 ? q[0] ? (b1 = q[0].x, function(t) {
|
|
return b1(t) + "";
|
|
}) : (b2 = b, function() {
|
|
return b2;
|
|
}) : (b = q.length, function(t) {
|
|
for(var o, i = 0; i < b; ++i)s[(o = q[i]).i] = o.x(t);
|
|
return s.join("");
|
|
});
|
|
}
|
|
function interpolate(a, b) {
|
|
var c, t = typeof b;
|
|
return null == b || "boolean" === t ? constant$3(b) : ("number" === t ? interpolateNumber : "string" === t ? (c = color(b)) ? (b = c, interpolateRgb) : interpolateString : b instanceof color ? interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : "function" != typeof b.valueOf && "function" != typeof b.toString || isNaN(b) ? object : interpolateNumber)(a, b);
|
|
}
|
|
function interpolateRound(a, b) {
|
|
return a = +a, b = +b, function(t) {
|
|
return Math.round(a * (1 - t) + b * t);
|
|
};
|
|
}
|
|
var degrees$1 = 180 / Math.PI, identity$2 = {
|
|
translateX: 0,
|
|
translateY: 0,
|
|
rotate: 0,
|
|
skewX: 0,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
function decompose(a, b, c, d, e, f) {
|
|
var scaleX, scaleY, skewX;
|
|
return (scaleX = Math.sqrt(a * a + b * b)) && (a /= scaleX, b /= scaleX), (skewX = a * c + b * d) && (c -= a * skewX, d -= b * skewX), (scaleY = Math.sqrt(c * c + d * d)) && (c /= scaleY, d /= scaleY, skewX /= scaleY), a * d < b * c && (a = -a, b = -b, skewX = -skewX, scaleX = -scaleX), {
|
|
translateX: e,
|
|
translateY: f,
|
|
rotate: Math.atan2(b, a) * degrees$1,
|
|
skewX: Math.atan(skewX) * degrees$1,
|
|
scaleX: scaleX,
|
|
scaleY: scaleY
|
|
};
|
|
}
|
|
function interpolateTransform(parse, pxComma, pxParen, degParen) {
|
|
function pop(s) {
|
|
return s.length ? s.pop() + " " : "";
|
|
}
|
|
return function(a, b) {
|
|
var a1, b1, a2, b2, s = [], q = [];
|
|
return a = parse(a), b = parse(b), !function(xa, ya, xb, yb, s, q) {
|
|
if (xa !== xb || ya !== yb) {
|
|
var i = s.push("translate(", null, pxComma, null, pxParen);
|
|
q.push({
|
|
i: i - 4,
|
|
x: interpolateNumber(xa, xb)
|
|
}, {
|
|
i: i - 2,
|
|
x: interpolateNumber(ya, yb)
|
|
});
|
|
} else (xb || yb) && s.push("translate(" + xb + pxComma + yb + pxParen);
|
|
}(a.translateX, a.translateY, b.translateX, b.translateY, s, q), (a1 = a.rotate) !== (b1 = b.rotate) ? (a1 - b1 > 180 ? b1 += 360 : b1 - a1 > 180 && (a1 += 360), q.push({
|
|
i: s.push(pop(s) + "rotate(", null, degParen) - 2,
|
|
x: interpolateNumber(a1, b1)
|
|
})) : b1 && s.push(pop(s) + "rotate(" + b1 + degParen), (a2 = a.skewX) !== (b2 = b.skewX) ? q.push({
|
|
i: s.push(pop(s) + "skewX(", null, degParen) - 2,
|
|
x: interpolateNumber(a2, b2)
|
|
}) : b2 && s.push(pop(s) + "skewX(" + b2 + degParen), !function(xa, ya, xb, yb, s, q) {
|
|
if (xa !== xb || ya !== yb) {
|
|
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
|
|
q.push({
|
|
i: i - 4,
|
|
x: interpolateNumber(xa, xb)
|
|
}, {
|
|
i: i - 2,
|
|
x: interpolateNumber(ya, yb)
|
|
});
|
|
} else (1 !== xb || 1 !== yb) && s.push(pop(s) + "scale(" + xb + "," + yb + ")");
|
|
}(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q), a = b = null, function(t) {
|
|
for(var o, i = -1, n = q.length; ++i < n;)s[(o = q[i]).i] = o.x(t);
|
|
return s.join("");
|
|
};
|
|
};
|
|
}
|
|
var interpolateTransformCss = interpolateTransform(function(value) {
|
|
const m = new ("function" == typeof DOMMatrix ? DOMMatrix : WebKitCSSMatrix)(value + "");
|
|
return m.isIdentity ? identity$2 : decompose(m.a, m.b, m.c, m.d, m.e, m.f);
|
|
}, "px, ", "px)", "deg)"), interpolateTransformSvg = interpolateTransform(function(value) {
|
|
return null == value ? identity$2 : (svgNode || (svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g")), svgNode.setAttribute("transform", value), value = svgNode.transform.baseVal.consolidate()) ? decompose((value = value.matrix).a, value.b, value.c, value.d, value.e, value.f) : identity$2;
|
|
}, ", ", ")", ")");
|
|
function cosh(x) {
|
|
return ((x = Math.exp(x)) + 1 / x) / 2;
|
|
}
|
|
var interpolateZoom = function zoomRho(rho, rho2, rho4) {
|
|
function zoom(p0, p1) {
|
|
var i, S, ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy;
|
|
if (d2 < 1e-12) S = Math.log(w1 / w0) / rho, i = function(t) {
|
|
return [
|
|
ux0 + t * dx,
|
|
uy0 + t * dy,
|
|
w0 * Math.exp(rho * t * S)
|
|
];
|
|
};
|
|
else {
|
|
var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);
|
|
S = (Math.log(Math.sqrt(b1 * b1 + 1) - b1) - r0) / rho, i = function(t) {
|
|
var x, x1, s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * (((x = Math.exp(2 * (x = rho * s + r0))) - 1) / (x + 1)) - ((x1 = Math.exp(x1 = r0)) - 1 / x1) / 2);
|
|
return [
|
|
ux0 + u * dx,
|
|
uy0 + u * dy,
|
|
w0 * coshr0 / cosh(rho * s + r0)
|
|
];
|
|
};
|
|
}
|
|
return i.duration = 1000 * S * rho / Math.SQRT2, i;
|
|
}
|
|
return zoom.rho = function(_) {
|
|
var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
|
|
return zoomRho(_1, _2, _4);
|
|
}, zoom;
|
|
}(Math.SQRT2, 2, 4);
|
|
function hsl$1(hue) {
|
|
return function(start, end) {
|
|
var h = hue((start = hsl(start)).h, (end = hsl(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);
|
|
return function(t) {
|
|
return start.h = h(t), start.s = s(t), start.l = l(t), start.opacity = opacity(t), start + "";
|
|
};
|
|
};
|
|
}
|
|
var hsl$2 = hsl$1(hue), hslLong = hsl$1(nogamma);
|
|
function hcl$1(hue) {
|
|
return function(start, end) {
|
|
var h = hue((start = hcl(start)).h, (end = hcl(end)).h), c = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);
|
|
return function(t) {
|
|
return start.h = h(t), start.c = c(t), start.l = l(t), start.opacity = opacity(t), start + "";
|
|
};
|
|
};
|
|
}
|
|
var hcl$2 = hcl$1(hue), hclLong = hcl$1(nogamma);
|
|
function cubehelix$1(hue) {
|
|
return function cubehelixGamma(y) {
|
|
function cubehelix$1(start, end) {
|
|
var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);
|
|
return function(t) {
|
|
return start.h = h(t), start.s = s(t), start.l = l(Math.pow(t, y)), start.opacity = opacity(t), start + "";
|
|
};
|
|
}
|
|
return y = +y, cubehelix$1.gamma = cubehelixGamma, cubehelix$1;
|
|
}(1);
|
|
}
|
|
var cubehelix$2 = cubehelix$1(hue), cubehelixLong = cubehelix$1(nogamma);
|
|
function piecewise(interpolate$1, values) {
|
|
void 0 === values && (values = interpolate$1, interpolate$1 = interpolate);
|
|
for(var i = 0, n = values.length - 1, v = values[0], I = Array(n < 0 ? 0 : n); i < n;)I[i] = interpolate$1(v, v = values[++i]);
|
|
return function(t) {
|
|
var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
|
|
return I[i](t - i);
|
|
};
|
|
}
|
|
var locale$1, svgNode, taskHead, taskTail, frame = 0, timeout = 0, interval = 0, clockLast = 0, clockNow = 0, clockSkew = 0, clock = "object" == typeof performance && performance.now ? performance : Date, setFrame = "object" == typeof window && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {
|
|
setTimeout(f, 17);
|
|
};
|
|
function now() {
|
|
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
|
|
}
|
|
function clearNow() {
|
|
clockNow = 0;
|
|
}
|
|
function Timer() {
|
|
this._call = this._time = this._next = null;
|
|
}
|
|
function timer(callback, delay, time) {
|
|
var t = new Timer;
|
|
return t.restart(callback, delay, time), t;
|
|
}
|
|
function timerFlush() {
|
|
now(), ++frame;
|
|
for(var e, t = taskHead; t;)(e = clockNow - t._time) >= 0 && t._call.call(null, e), t = t._next;
|
|
--frame;
|
|
}
|
|
function wake() {
|
|
clockNow = (clockLast = clock.now()) + clockSkew, frame = timeout = 0;
|
|
try {
|
|
timerFlush();
|
|
} finally{
|
|
frame = 0, function() {
|
|
for(var t0, t2, t1 = taskHead, time = 1 / 0; t1;)t1._call ? (time > t1._time && (time = t1._time), t0 = t1, t1 = t1._next) : (t2 = t1._next, t1._next = null, t1 = t0 ? t0._next = t2 : taskHead = t2);
|
|
taskTail = t0, sleep(time);
|
|
}(), clockNow = 0;
|
|
}
|
|
}
|
|
function poke() {
|
|
var now = clock.now(), delay = now - clockLast;
|
|
delay > 1000 && (clockSkew -= delay, clockLast = now);
|
|
}
|
|
function sleep(time) {
|
|
!frame && (timeout && (timeout = clearTimeout(timeout)), time - clockNow > 24 ? (time < 1 / 0 && (timeout = setTimeout(wake, time - clock.now() - clockSkew)), interval && (interval = clearInterval(interval))) : (interval || (clockLast = clock.now(), interval = setInterval(poke, 1000)), frame = 1, setFrame(wake)));
|
|
}
|
|
function timeout$1(callback, delay, time) {
|
|
var t = new Timer;
|
|
return delay = null == delay ? 0 : +delay, t.restart((elapsed)=>{
|
|
t.stop(), callback(elapsed + delay);
|
|
}, delay, time), t;
|
|
}
|
|
Timer.prototype = timer.prototype = {
|
|
constructor: Timer,
|
|
restart: function(callback, delay, time) {
|
|
if ("function" != typeof callback) throw TypeError("callback is not a function");
|
|
time = (null == time ? now() : +time) + (null == delay ? 0 : +delay), this._next || taskTail === this || (taskTail ? taskTail._next = this : taskHead = this, taskTail = this), this._call = callback, this._time = time, sleep();
|
|
},
|
|
stop: function() {
|
|
this._call && (this._call = null, this._time = 1 / 0, sleep());
|
|
}
|
|
};
|
|
var emptyOn = dispatch("start", "end", "cancel", "interrupt"), emptyTween = [];
|
|
function schedule(node, name, id, index, group, timing) {
|
|
var schedules = node.__transition;
|
|
if (schedules) {
|
|
if (id in schedules) return;
|
|
} else node.__transition = {};
|
|
!function(node, id, self1) {
|
|
var tween, schedules = node.__transition;
|
|
function start(elapsed) {
|
|
var i, j, n, o;
|
|
if (1 !== self1.state) return stop();
|
|
for(i in schedules)if ((o = schedules[i]).name === self1.name) {
|
|
if (3 === o.state) return timeout$1(start);
|
|
4 === o.state ? (o.state = 6, o.timer.stop(), o.on.call("interrupt", node, node.__data__, o.index, o.group), delete schedules[i]) : +i < id && (o.state = 6, o.timer.stop(), o.on.call("cancel", node, node.__data__, o.index, o.group), delete schedules[i]);
|
|
}
|
|
if (timeout$1(function() {
|
|
3 === self1.state && (self1.state = 4, self1.timer.restart(tick, self1.delay, self1.time), tick(elapsed));
|
|
}), self1.state = 2, self1.on.call("start", node, node.__data__, self1.index, self1.group), 2 === self1.state) {
|
|
for(i = 0, self1.state = 3, tween = Array(n = self1.tween.length), j = -1; i < n; ++i)(o = self1.tween[i].value.call(node, node.__data__, self1.index, self1.group)) && (tween[++j] = o);
|
|
tween.length = j + 1;
|
|
}
|
|
}
|
|
function tick(elapsed) {
|
|
for(var t = elapsed < self1.duration ? self1.ease.call(null, elapsed / self1.duration) : (self1.timer.restart(stop), self1.state = 5, 1), i = -1, n = tween.length; ++i < n;)tween[i].call(node, t);
|
|
5 === self1.state && (self1.on.call("end", node, node.__data__, self1.index, self1.group), stop());
|
|
}
|
|
function stop() {
|
|
for(var i in self1.state = 6, self1.timer.stop(), delete schedules[id], schedules)return;
|
|
delete node.__transition;
|
|
}
|
|
schedules[id] = self1, self1.timer = timer(function(elapsed) {
|
|
self1.state = 1, self1.timer.restart(start, self1.delay, self1.time), self1.delay <= elapsed && start(elapsed - self1.delay);
|
|
}, 0, self1.time);
|
|
}(node, id, {
|
|
name: name,
|
|
index: index,
|
|
group: group,
|
|
on: emptyOn,
|
|
tween: emptyTween,
|
|
time: timing.time,
|
|
delay: timing.delay,
|
|
duration: timing.duration,
|
|
ease: timing.ease,
|
|
timer: null,
|
|
state: 0
|
|
});
|
|
}
|
|
function init(node, id) {
|
|
var schedule = get$1(node, id);
|
|
if (schedule.state > 0) throw Error("too late; already scheduled");
|
|
return schedule;
|
|
}
|
|
function set$2(node, id) {
|
|
var schedule = get$1(node, id);
|
|
if (schedule.state > 3) throw Error("too late; already running");
|
|
return schedule;
|
|
}
|
|
function get$1(node, id) {
|
|
var schedule = node.__transition;
|
|
if (!schedule || !(schedule = schedule[id])) throw Error("transition not found");
|
|
return schedule;
|
|
}
|
|
function interrupt(node, name) {
|
|
var schedule, active, i, schedules = node.__transition, empty = !0;
|
|
if (schedules) {
|
|
for(i in name = null == name ? null : name + "", schedules){
|
|
if ((schedule = schedules[i]).name !== name) {
|
|
empty = !1;
|
|
continue;
|
|
}
|
|
active = schedule.state > 2 && schedule.state < 5, schedule.state = 6, schedule.timer.stop(), schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group), delete schedules[i];
|
|
}
|
|
empty && delete node.__transition;
|
|
}
|
|
}
|
|
function tweenRemove(id, name) {
|
|
var tween0, tween1;
|
|
return function() {
|
|
var schedule = set$2(this, id), tween = schedule.tween;
|
|
if (tween !== tween0) {
|
|
tween1 = tween0 = tween;
|
|
for(var i = 0, n = tween1.length; i < n; ++i)if (tween1[i].name === name) {
|
|
(tween1 = tween1.slice()).splice(i, 1);
|
|
break;
|
|
}
|
|
}
|
|
schedule.tween = tween1;
|
|
};
|
|
}
|
|
function tweenFunction(id, name, value) {
|
|
var tween0, tween1;
|
|
if ("function" != typeof value) throw Error();
|
|
return function() {
|
|
var schedule = set$2(this, id), tween = schedule.tween;
|
|
if (tween !== tween0) {
|
|
tween1 = (tween0 = tween).slice();
|
|
for(var t = {
|
|
name: name,
|
|
value: value
|
|
}, i = 0, n = tween1.length; i < n; ++i)if (tween1[i].name === name) {
|
|
tween1[i] = t;
|
|
break;
|
|
}
|
|
i === n && tween1.push(t);
|
|
}
|
|
schedule.tween = tween1;
|
|
};
|
|
}
|
|
function tweenValue(transition, name, value) {
|
|
var id = transition._id;
|
|
return transition.each(function() {
|
|
var schedule = set$2(this, id);
|
|
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
|
|
}), function(node) {
|
|
return get$1(node, id).value[name];
|
|
};
|
|
}
|
|
function interpolate$1(a, b) {
|
|
var c;
|
|
return ("number" == typeof b ? interpolateNumber : b instanceof color ? interpolateRgb : (c = color(b)) ? (b = c, interpolateRgb) : interpolateString)(a, b);
|
|
}
|
|
function attrRemove$1(name) {
|
|
return function() {
|
|
this.removeAttribute(name);
|
|
};
|
|
}
|
|
function attrRemoveNS$1(fullname) {
|
|
return function() {
|
|
this.removeAttributeNS(fullname.space, fullname.local);
|
|
};
|
|
}
|
|
function attrConstant$1(name, interpolate, value1) {
|
|
var string00, interpolate0, string1 = value1 + "";
|
|
return function() {
|
|
var string0 = this.getAttribute(name);
|
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
|
|
};
|
|
}
|
|
function attrConstantNS$1(fullname, interpolate, value1) {
|
|
var string00, interpolate0, string1 = value1 + "";
|
|
return function() {
|
|
var string0 = this.getAttributeNS(fullname.space, fullname.local);
|
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
|
|
};
|
|
}
|
|
function attrFunction$1(name, interpolate, value) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0, string1, value1 = value(this);
|
|
return null == value1 ? void this.removeAttribute(name) : (string0 = this.getAttribute(name)) === (string1 = value1 + "") ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
|
|
};
|
|
}
|
|
function attrFunctionNS$1(fullname, interpolate, value) {
|
|
var string00, string10, interpolate0;
|
|
return function() {
|
|
var string0, string1, value1 = value(this);
|
|
return null == value1 ? void this.removeAttributeNS(fullname.space, fullname.local) : (string0 = this.getAttributeNS(fullname.space, fullname.local)) === (string1 = value1 + "") ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
|
|
};
|
|
}
|
|
function attrTweenNS(fullname, value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
return i !== i0 && (t0 = (i0 = i) && function(t) {
|
|
this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
|
|
}), t0;
|
|
}
|
|
return tween._value = value, tween;
|
|
}
|
|
function attrTween(name, value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
return i !== i0 && (t0 = (i0 = i) && function(t) {
|
|
this.setAttribute(name, i.call(this, t));
|
|
}), t0;
|
|
}
|
|
return tween._value = value, tween;
|
|
}
|
|
function delayFunction(id, value) {
|
|
return function() {
|
|
init(this, id).delay = +value.apply(this, arguments);
|
|
};
|
|
}
|
|
function delayConstant(id, value) {
|
|
return value = +value, function() {
|
|
init(this, id).delay = value;
|
|
};
|
|
}
|
|
function durationFunction(id, value) {
|
|
return function() {
|
|
set$2(this, id).duration = +value.apply(this, arguments);
|
|
};
|
|
}
|
|
function durationConstant(id, value) {
|
|
return value = +value, function() {
|
|
set$2(this, id).duration = value;
|
|
};
|
|
}
|
|
var Selection$1 = selection.prototype.constructor;
|
|
function styleRemove$1(name) {
|
|
return function() {
|
|
this.style.removeProperty(name);
|
|
};
|
|
}
|
|
var id = 0;
|
|
function Transition(groups, parents, name, id) {
|
|
this._groups = groups, this._parents = parents, this._name = name, this._id = id;
|
|
}
|
|
function transition(name) {
|
|
return selection().transition(name);
|
|
}
|
|
var selection_prototype = selection.prototype;
|
|
function quadInOut(t) {
|
|
return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
|
|
}
|
|
function cubicInOut(t) {
|
|
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
|
|
}
|
|
Transition.prototype = transition.prototype = {
|
|
constructor: Transition,
|
|
select: function(select) {
|
|
var name = this._name, id = this._id;
|
|
"function" != typeof select && (select = selector(select));
|
|
for(var groups = this._groups, m = groups.length, subgroups = Array(m), j = 0; j < m; ++j)for(var node, subnode, group = groups[j], n = group.length, subgroup = subgroups[j] = Array(n), i = 0; i < n; ++i)(node = group[i]) && (subnode = select.call(node, node.__data__, i, group)) && ("__data__" in node && (subnode.__data__ = node.__data__), subgroup[i] = subnode, schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)));
|
|
return new Transition(subgroups, this._parents, name, id);
|
|
},
|
|
selectAll: function(select) {
|
|
var name = this._name, id = this._id;
|
|
"function" != typeof select && (select = selectorAll(select));
|
|
for(var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, i = 0; i < n; ++i)if (node = group[i]) {
|
|
for(var child, children = select.call(node, node.__data__, i, group), inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k)(child = children[k]) && schedule(child, name, id, k, children, inherit);
|
|
subgroups.push(children), parents.push(node);
|
|
}
|
|
return new Transition(subgroups, parents, name, id);
|
|
},
|
|
filter: function(match) {
|
|
"function" != typeof match && (match = matcher(match));
|
|
for(var groups = this._groups, m = groups.length, subgroups = Array(m), j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, subgroup = subgroups[j] = [], i = 0; i < n; ++i)(node = group[i]) && match.call(node, node.__data__, i, group) && subgroup.push(node);
|
|
return new Transition(subgroups, this._parents, this._name, this._id);
|
|
},
|
|
merge: function(transition) {
|
|
if (transition._id !== this._id) throw Error();
|
|
for(var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = Array(m0), j = 0; j < m; ++j)for(var node, group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = Array(n), i = 0; i < n; ++i)(node = group0[i] || group1[i]) && (merge[i] = node);
|
|
for(; j < m0; ++j)merges[j] = groups0[j];
|
|
return new Transition(merges, this._parents, this._name, this._id);
|
|
},
|
|
selection: function() {
|
|
return new Selection$1(this._groups, this._parents);
|
|
},
|
|
transition: function() {
|
|
for(var name = this._name, id0 = this._id, id1 = ++id, groups = this._groups, m = groups.length, j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, i = 0; i < n; ++i)if (node = group[i]) {
|
|
var inherit = get$1(node, id0);
|
|
schedule(node, name, id1, i, group, {
|
|
time: inherit.time + inherit.delay + inherit.duration,
|
|
delay: 0,
|
|
duration: inherit.duration,
|
|
ease: inherit.ease
|
|
});
|
|
}
|
|
return new Transition(groups, this._parents, name, id1);
|
|
},
|
|
call: selection_prototype.call,
|
|
nodes: selection_prototype.nodes,
|
|
node: selection_prototype.node,
|
|
size: selection_prototype.size,
|
|
empty: selection_prototype.empty,
|
|
each: selection_prototype.each,
|
|
on: function(name, listener) {
|
|
var on0, on1, sit, id = this._id;
|
|
return arguments.length < 2 ? get$1(this.node(), id).on.on(name) : this.each((sit = (name + "").trim().split(/^|\s+/).every(function(t) {
|
|
var i = t.indexOf(".");
|
|
return i >= 0 && (t = t.slice(0, i)), !t || "start" === t;
|
|
}) ? init : set$2, function() {
|
|
var schedule = sit(this, id), on = schedule.on;
|
|
on !== on0 && (on1 = (on0 = on).copy()).on(name, listener), schedule.on = on1;
|
|
}));
|
|
},
|
|
attr: function(name, value) {
|
|
var fullname = namespace(name), i = "transform" === fullname ? interpolateTransformSvg : interpolate$1;
|
|
return this.attrTween(name, "function" == typeof value ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) : null == value ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
|
|
},
|
|
attrTween: function(name, value) {
|
|
var key = "attr." + name;
|
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
|
|
if (null == value) return this.tween(key, null);
|
|
if ("function" != typeof value) throw Error();
|
|
var fullname = namespace(name);
|
|
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
|
|
},
|
|
style: function(name, value, priority) {
|
|
var name1, string00, string10, interpolate0, name2, value1, string001, string101, interpolate01, id, name3, on0, on1, listener0, remove, key, event, name4, string002, interpolate02, string1, i = "transform" == (name += "") ? interpolateTransformCss : interpolate$1;
|
|
return null == value ? this.styleTween(name, (name1 = name, function() {
|
|
var string0 = styleValue(this, name1), string1 = (this.style.removeProperty(name1), styleValue(this, name1));
|
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = i(string00 = string0, string10 = string1);
|
|
})).on("end.style." + name, styleRemove$1(name)) : "function" == typeof value ? this.styleTween(name, (name2 = name, value1 = tweenValue(this, "style." + name, value), function() {
|
|
var string0 = styleValue(this, name2), value11 = value1(this), string1 = value11 + "";
|
|
return null == value11 && (this.style.removeProperty(name2), string1 = value11 = styleValue(this, name2)), string0 === string1 ? null : string0 === string001 && string1 === string101 ? interpolate01 : (string101 = string1, interpolate01 = i(string001 = string0, value11));
|
|
})).each((id = this._id, event = "end." + (key = "style." + (name3 = name)), function() {
|
|
var schedule = set$2(this, id), on = schedule.on, listener = null == schedule.value[key] ? remove || (remove = styleRemove$1(name3)) : void 0;
|
|
(on !== on0 || listener0 !== listener) && (on1 = (on0 = on).copy()).on(event, listener0 = listener), schedule.on = on1;
|
|
})) : this.styleTween(name, (name4 = name, string1 = value + "", function() {
|
|
var string0 = styleValue(this, name4);
|
|
return string0 === string1 ? null : string0 === string002 ? interpolate02 : interpolate02 = i(string002 = string0, value);
|
|
}), priority).on("end.style." + name, null);
|
|
},
|
|
styleTween: function(name, value, priority) {
|
|
var key = "style." + (name += "");
|
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
|
|
if (null == value) return this.tween(key, null);
|
|
if ("function" != typeof value) throw Error();
|
|
return this.tween(key, function(name, value, priority) {
|
|
var t, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
return i !== i0 && (t = (i0 = i) && function(t) {
|
|
this.style.setProperty(name, i.call(this, t), priority);
|
|
}), t;
|
|
}
|
|
return tween._value = value, tween;
|
|
}(name, value, null == priority ? "" : priority));
|
|
},
|
|
text: function(value) {
|
|
var value1, value2;
|
|
return this.tween("text", "function" == typeof value ? (value1 = tweenValue(this, "text", value), function() {
|
|
var value11 = value1(this);
|
|
this.textContent = null == value11 ? "" : value11;
|
|
}) : (value2 = null == value ? "" : value + "", function() {
|
|
this.textContent = value2;
|
|
}));
|
|
},
|
|
textTween: function(value) {
|
|
var key = "text";
|
|
if (arguments.length < 1) return (key = this.tween(key)) && key._value;
|
|
if (null == value) return this.tween(key, null);
|
|
if ("function" != typeof value) throw Error();
|
|
return this.tween(key, function(value) {
|
|
var t0, i0;
|
|
function tween() {
|
|
var i = value.apply(this, arguments);
|
|
return i !== i0 && (t0 = (i0 = i) && function(t) {
|
|
this.textContent = i.call(this, t);
|
|
}), t0;
|
|
}
|
|
return tween._value = value, tween;
|
|
}(value));
|
|
},
|
|
remove: function() {
|
|
var id;
|
|
return this.on("end.remove", (id = this._id, function() {
|
|
var parent = this.parentNode;
|
|
for(var i in this.__transition)if (+i !== id) return;
|
|
parent && parent.removeChild(this);
|
|
}));
|
|
},
|
|
tween: function(name, value) {
|
|
var id = this._id;
|
|
if (name += "", arguments.length < 2) {
|
|
for(var t, tween = get$1(this.node(), id).tween, i = 0, n = tween.length; i < n; ++i)if ((t = tween[i]).name === name) return t.value;
|
|
return null;
|
|
}
|
|
return this.each((null == value ? tweenRemove : tweenFunction)(id, name, value));
|
|
},
|
|
delay: function(value) {
|
|
var id = this._id;
|
|
return arguments.length ? this.each(("function" == typeof value ? delayFunction : delayConstant)(id, value)) : get$1(this.node(), id).delay;
|
|
},
|
|
duration: function(value) {
|
|
var id = this._id;
|
|
return arguments.length ? this.each(("function" == typeof value ? durationFunction : durationConstant)(id, value)) : get$1(this.node(), id).duration;
|
|
},
|
|
ease: function(value) {
|
|
var id = this._id;
|
|
return arguments.length ? this.each(function(id, value) {
|
|
if ("function" != typeof value) throw Error();
|
|
return function() {
|
|
set$2(this, id).ease = value;
|
|
};
|
|
}(id, value)) : get$1(this.node(), id).ease;
|
|
},
|
|
easeVarying: function(value) {
|
|
var id;
|
|
if ("function" != typeof value) throw Error();
|
|
return this.each((id = this._id, function() {
|
|
var v = value.apply(this, arguments);
|
|
if ("function" != typeof v) throw Error();
|
|
set$2(this, id).ease = v;
|
|
}));
|
|
},
|
|
end: function() {
|
|
var on0, on1, that = this, id = that._id, size = that.size();
|
|
return new Promise(function(resolve, reject) {
|
|
var cancel = {
|
|
value: reject
|
|
}, end = {
|
|
value: function() {
|
|
0 == --size && resolve();
|
|
}
|
|
};
|
|
that.each(function() {
|
|
var schedule = set$2(this, id), on = schedule.on;
|
|
on !== on0 && ((on1 = (on0 = on).copy())._.cancel.push(cancel), on1._.interrupt.push(cancel), on1._.end.push(end)), schedule.on = on1;
|
|
}), 0 === size && resolve();
|
|
});
|
|
},
|
|
[Symbol.iterator]: selection_prototype[Symbol.iterator]
|
|
};
|
|
var polyIn = function custom(e) {
|
|
function polyIn(t) {
|
|
return Math.pow(t, e);
|
|
}
|
|
return e = +e, polyIn.exponent = custom, polyIn;
|
|
}(3), polyOut = function custom(e) {
|
|
function polyOut(t) {
|
|
return 1 - Math.pow(1 - t, e);
|
|
}
|
|
return e = +e, polyOut.exponent = custom, polyOut;
|
|
}(3), polyInOut = function custom(e) {
|
|
function polyInOut(t) {
|
|
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
|
|
}
|
|
return e = +e, polyInOut.exponent = custom, polyInOut;
|
|
}(3), pi = Math.PI, halfPi = pi / 2;
|
|
function sinInOut(t) {
|
|
return (1 - Math.cos(pi * t)) / 2;
|
|
}
|
|
function tpmt(x) {
|
|
return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;
|
|
}
|
|
function expInOut(t) {
|
|
return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;
|
|
}
|
|
function circleInOut(t) {
|
|
return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
|
|
}
|
|
var b1 = 4 / 11, b2 = 6 / 11, b3 = 8 / 11, b4 = 3 / 4, b5 = 9 / 11, b6 = 10 / 11, b7 = 15 / 16, b8 = 21 / 22, b9 = 63 / 64, b0 = 1 / (4 / 11) / (4 / 11);
|
|
function bounceOut(t) {
|
|
return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
|
|
}
|
|
var backIn = function custom(s) {
|
|
function backIn(t) {
|
|
return (t = +t) * t * (s * (t - 1) + t);
|
|
}
|
|
return s = +s, backIn.overshoot = custom, backIn;
|
|
}(1.70158), backOut = function custom(s) {
|
|
function backOut(t) {
|
|
return --t * t * ((t + 1) * s + t) + 1;
|
|
}
|
|
return s = +s, backOut.overshoot = custom, backOut;
|
|
}(1.70158), backInOut = function custom(s) {
|
|
function backInOut(t) {
|
|
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
|
|
}
|
|
return s = +s, backInOut.overshoot = custom, backInOut;
|
|
}(1.70158), tau = 2 * Math.PI, elasticIn = function custom(a, p) {
|
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
|
|
function elasticIn(t) {
|
|
return a * tpmt(- --t) * Math.sin((s - t) / p);
|
|
}
|
|
return elasticIn.amplitude = function(a) {
|
|
return custom(a, p * tau);
|
|
}, elasticIn.period = function(p) {
|
|
return custom(a, p);
|
|
}, elasticIn;
|
|
}(1, 0.3), elasticOut = function custom(a, p) {
|
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
|
|
function elasticOut(t) {
|
|
return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);
|
|
}
|
|
return elasticOut.amplitude = function(a) {
|
|
return custom(a, p * tau);
|
|
}, elasticOut.period = function(p) {
|
|
return custom(a, p);
|
|
}, elasticOut;
|
|
}(1, 0.3), elasticInOut = function custom(a, p) {
|
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
|
|
function elasticInOut(t) {
|
|
return ((t = 2 * t - 1) < 0 ? a * tpmt(-t) * Math.sin((s - t) / p) : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;
|
|
}
|
|
return elasticInOut.amplitude = function(a) {
|
|
return custom(a, p * tau);
|
|
}, elasticInOut.period = function(p) {
|
|
return custom(a, p);
|
|
}, elasticInOut;
|
|
}(1, 0.3), defaultTiming = {
|
|
time: null,
|
|
delay: 0,
|
|
duration: 250,
|
|
ease: cubicInOut
|
|
};
|
|
selection.prototype.interrupt = function(name) {
|
|
return this.each(function() {
|
|
interrupt(this, name);
|
|
});
|
|
}, selection.prototype.transition = function(name) {
|
|
var id1, timing;
|
|
name instanceof Transition ? (id1 = name._id, name = name._name) : (id1 = ++id, (timing = defaultTiming).time = now(), name = null == name ? null : name + "");
|
|
for(var groups = this._groups, m = groups.length, j = 0; j < m; ++j)for(var node, group = groups[j], n = group.length, i = 0; i < n; ++i)(node = group[i]) && schedule(node, name, id1, i, group, timing || function(node, id) {
|
|
for(var timing; !(timing = node.__transition) || !(timing = timing[id]);)if (!(node = node.parentNode)) throw Error(`transition ${id} not found`);
|
|
return timing;
|
|
}(node, id1));
|
|
return new Transition(groups, this._parents, name, id1);
|
|
};
|
|
var root$1 = [
|
|
null
|
|
], constant$4 = (x)=>()=>x;
|
|
function BrushEvent(type, { sourceEvent, target, selection, mode, dispatch }) {
|
|
Object.defineProperties(this, {
|
|
type: {
|
|
value: type,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
sourceEvent: {
|
|
value: sourceEvent,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
target: {
|
|
value: target,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
selection: {
|
|
value: selection,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
mode: {
|
|
value: mode,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
_: {
|
|
value: dispatch
|
|
}
|
|
});
|
|
}
|
|
function noevent$1(event) {
|
|
event.preventDefault(), event.stopImmediatePropagation();
|
|
}
|
|
var MODE_DRAG = {
|
|
name: "drag"
|
|
}, MODE_SPACE = {
|
|
name: "space"
|
|
}, MODE_HANDLE = {
|
|
name: "handle"
|
|
}, MODE_CENTER = {
|
|
name: "center"
|
|
};
|
|
const { abs, max: max$1, min: min$1 } = Math;
|
|
function number1(e) {
|
|
return [
|
|
+e[0],
|
|
+e[1]
|
|
];
|
|
}
|
|
function number2(e) {
|
|
return [
|
|
number1(e[0]),
|
|
number1(e[1])
|
|
];
|
|
}
|
|
var X = {
|
|
name: "x",
|
|
handles: [
|
|
"w",
|
|
"e"
|
|
].map(type),
|
|
input: function(x, e) {
|
|
return null == x ? null : [
|
|
[
|
|
+x[0],
|
|
e[0][1]
|
|
],
|
|
[
|
|
+x[1],
|
|
e[1][1]
|
|
]
|
|
];
|
|
},
|
|
output: function(xy) {
|
|
return xy && [
|
|
xy[0][0],
|
|
xy[1][0]
|
|
];
|
|
}
|
|
}, Y = {
|
|
name: "y",
|
|
handles: [
|
|
"n",
|
|
"s"
|
|
].map(type),
|
|
input: function(y, e) {
|
|
return null == y ? null : [
|
|
[
|
|
e[0][0],
|
|
+y[0]
|
|
],
|
|
[
|
|
e[1][0],
|
|
+y[1]
|
|
]
|
|
];
|
|
},
|
|
output: function(xy) {
|
|
return xy && [
|
|
xy[0][1],
|
|
xy[1][1]
|
|
];
|
|
}
|
|
}, XY = {
|
|
name: "xy",
|
|
handles: [
|
|
"n",
|
|
"w",
|
|
"e",
|
|
"s",
|
|
"nw",
|
|
"ne",
|
|
"sw",
|
|
"se"
|
|
].map(type),
|
|
input: function(xy) {
|
|
return null == xy ? null : number2(xy);
|
|
},
|
|
output: function(xy) {
|
|
return xy;
|
|
}
|
|
}, cursors = {
|
|
overlay: "crosshair",
|
|
selection: "move",
|
|
n: "ns-resize",
|
|
e: "ew-resize",
|
|
s: "ns-resize",
|
|
w: "ew-resize",
|
|
nw: "nwse-resize",
|
|
ne: "nesw-resize",
|
|
se: "nwse-resize",
|
|
sw: "nesw-resize"
|
|
}, flipX = {
|
|
e: "w",
|
|
w: "e",
|
|
nw: "ne",
|
|
ne: "nw",
|
|
se: "sw",
|
|
sw: "se"
|
|
}, flipY = {
|
|
n: "s",
|
|
s: "n",
|
|
nw: "sw",
|
|
ne: "se",
|
|
se: "ne",
|
|
sw: "nw"
|
|
}, signsX = {
|
|
overlay: 1,
|
|
selection: 1,
|
|
n: null,
|
|
e: 1,
|
|
s: null,
|
|
w: -1,
|
|
nw: -1,
|
|
ne: 1,
|
|
se: 1,
|
|
sw: -1
|
|
}, signsY = {
|
|
overlay: 1,
|
|
selection: 1,
|
|
n: -1,
|
|
e: null,
|
|
s: 1,
|
|
w: null,
|
|
nw: -1,
|
|
ne: -1,
|
|
se: 1,
|
|
sw: 1
|
|
};
|
|
function type(t) {
|
|
return {
|
|
type: t
|
|
};
|
|
}
|
|
function defaultFilter$1(event) {
|
|
return !event.ctrlKey && !event.button;
|
|
}
|
|
function defaultExtent() {
|
|
var svg = this.ownerSVGElement || this;
|
|
return svg.hasAttribute("viewBox") ? [
|
|
[
|
|
(svg = svg.viewBox.baseVal).x,
|
|
svg.y
|
|
],
|
|
[
|
|
svg.x + svg.width,
|
|
svg.y + svg.height
|
|
]
|
|
] : [
|
|
[
|
|
0,
|
|
0
|
|
],
|
|
[
|
|
svg.width.baseVal.value,
|
|
svg.height.baseVal.value
|
|
]
|
|
];
|
|
}
|
|
function defaultTouchable$1() {
|
|
return navigator.maxTouchPoints || "ontouchstart" in this;
|
|
}
|
|
function local$1(node) {
|
|
for(; !node.__brush;)if (!(node = node.parentNode)) return;
|
|
return node.__brush;
|
|
}
|
|
function brush$1(dim) {
|
|
var touchending, extent = defaultExtent, filter = defaultFilter$1, touchable = defaultTouchable$1, keys = !0, listeners = dispatch("start", "brush", "end"), handleSize = 6;
|
|
function brush(group) {
|
|
var overlay = group.property("__brush", initialize).selectAll(".overlay").data([
|
|
type("overlay")
|
|
]);
|
|
overlay.enter().append("rect").attr("class", "overlay").attr("pointer-events", "all").attr("cursor", cursors.overlay).merge(overlay).each(function() {
|
|
var extent = local$1(this).extent;
|
|
select(this).attr("x", extent[0][0]).attr("y", extent[0][1]).attr("width", extent[1][0] - extent[0][0]).attr("height", extent[1][1] - extent[0][1]);
|
|
}), group.selectAll(".selection").data([
|
|
type("selection")
|
|
]).enter().append("rect").attr("class", "selection").attr("cursor", cursors.selection).attr("fill", "#777").attr("fill-opacity", 0.3).attr("stroke", "#fff").attr("shape-rendering", "crispEdges");
|
|
var handle = group.selectAll(".handle").data(dim.handles, function(d) {
|
|
return d.type;
|
|
});
|
|
handle.exit().remove(), handle.enter().append("rect").attr("class", function(d) {
|
|
return "handle handle--" + d.type;
|
|
}).attr("cursor", function(d) {
|
|
return cursors[d.type];
|
|
}), group.each(redraw).attr("fill", "none").attr("pointer-events", "all").on("mousedown.brush", started).filter(touchable).on("touchstart.brush", started).on("touchmove.brush", touchmoved).on("touchend.brush touchcancel.brush", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
|
|
}
|
|
function redraw() {
|
|
var group = select(this), selection = local$1(this).selection;
|
|
selection ? (group.selectAll(".selection").style("display", null).attr("x", selection[0][0]).attr("y", selection[0][1]).attr("width", selection[1][0] - selection[0][0]).attr("height", selection[1][1] - selection[0][1]), group.selectAll(".handle").style("display", null).attr("x", function(d) {
|
|
return "e" === d.type[d.type.length - 1] ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2;
|
|
}).attr("y", function(d) {
|
|
return "s" === d.type[0] ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2;
|
|
}).attr("width", function(d) {
|
|
return "n" === d.type || "s" === d.type ? selection[1][0] - selection[0][0] + handleSize : handleSize;
|
|
}).attr("height", function(d) {
|
|
return "e" === d.type || "w" === d.type ? selection[1][1] - selection[0][1] + handleSize : handleSize;
|
|
})) : group.selectAll(".selection,.handle").style("display", "none").attr("x", null).attr("y", null).attr("width", null).attr("height", null);
|
|
}
|
|
function emitter(that, args, clean) {
|
|
var emit = that.__brush.emitter;
|
|
return !emit || clean && emit.clean ? new Emitter(that, args, clean) : emit;
|
|
}
|
|
function Emitter(that, args, clean) {
|
|
this.that = that, this.args = args, this.state = that.__brush, this.active = 0, this.clean = clean;
|
|
}
|
|
function started(event) {
|
|
if ((!touchending || event.touches) && filter.apply(this, arguments)) {
|
|
var w0, w1, n0, n1, e0, e1, s0, s1, moving, lockX, lockY, that = this, type = event.target.__data__.type, mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : keys && event.altKey ? MODE_CENTER : MODE_HANDLE, signX = dim === Y ? null : signsX[type], signY = dim === X ? null : signsY[type], state = local$1(that), extent = state.extent, selection = state.selection, W = extent[0][0], N = extent[0][1], E = extent[1][0], S = extent[1][1], dx = 0, dy = 0, shifting = signX && signY && keys && event.shiftKey, points = Array.from(event.touches || [
|
|
event
|
|
], (t)=>{
|
|
const i = t.identifier;
|
|
return (t = pointer(t, that)).point0 = t.slice(), t.identifier = i, t;
|
|
});
|
|
if ("overlay" === type) {
|
|
selection && (moving = !0);
|
|
const pts = [
|
|
points[0],
|
|
points[1] || points[0]
|
|
];
|
|
state.selection = selection = [
|
|
[
|
|
w0 = dim === Y ? W : min$1(pts[0][0], pts[1][0]),
|
|
n0 = dim === X ? N : min$1(pts[0][1], pts[1][1])
|
|
],
|
|
[
|
|
e0 = dim === Y ? E : max$1(pts[0][0], pts[1][0]),
|
|
s0 = dim === X ? S : max$1(pts[0][1], pts[1][1])
|
|
]
|
|
], points.length > 1 && move();
|
|
} else w0 = selection[0][0], n0 = selection[0][1], e0 = selection[1][0], s0 = selection[1][1];
|
|
w1 = w0, n1 = n0, e1 = e0, s1 = s0;
|
|
var group = select(that).attr("pointer-events", "none"), overlay = group.selectAll(".overlay").attr("cursor", cursors[type]);
|
|
interrupt(that);
|
|
var emit = emitter(that, arguments, !0).beforestart();
|
|
if (event.touches) emit.moved = moved, emit.ended = ended;
|
|
else {
|
|
var view = select(event.view).on("mousemove.brush", moved, !0).on("mouseup.brush", ended, !0);
|
|
keys && view.on("keydown.brush", function(event) {
|
|
switch(event.keyCode){
|
|
case 16:
|
|
shifting = signX && signY;
|
|
break;
|
|
case 18:
|
|
mode === MODE_HANDLE && (signX && (e0 = e1 - dx * signX, w0 = w1 + dx * signX), signY && (s0 = s1 - dy * signY, n0 = n1 + dy * signY), mode = MODE_CENTER, move());
|
|
break;
|
|
case 32:
|
|
(mode === MODE_HANDLE || mode === MODE_CENTER) && (signX < 0 ? e0 = e1 - dx : signX > 0 && (w0 = w1 - dx), signY < 0 ? s0 = s1 - dy : signY > 0 && (n0 = n1 - dy), mode = MODE_SPACE, overlay.attr("cursor", cursors.selection), move());
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
noevent$1(event);
|
|
}, !0).on("keyup.brush", function(event) {
|
|
switch(event.keyCode){
|
|
case 16:
|
|
shifting && (lockX = lockY = shifting = !1, move());
|
|
break;
|
|
case 18:
|
|
mode === MODE_CENTER && (signX < 0 ? e0 = e1 : signX > 0 && (w0 = w1), signY < 0 ? s0 = s1 : signY > 0 && (n0 = n1), mode = MODE_HANDLE, move());
|
|
break;
|
|
case 32:
|
|
mode === MODE_SPACE && (event.altKey ? (signX && (e0 = e1 - dx * signX, w0 = w1 + dx * signX), signY && (s0 = s1 - dy * signY, n0 = n1 + dy * signY), mode = MODE_CENTER) : (signX < 0 ? e0 = e1 : signX > 0 && (w0 = w1), signY < 0 ? s0 = s1 : signY > 0 && (n0 = n1), mode = MODE_HANDLE), overlay.attr("cursor", cursors[type]), move());
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
noevent$1(event);
|
|
}, !0), dragDisable(event.view);
|
|
}
|
|
redraw.call(that), emit.start(event, mode.name);
|
|
}
|
|
function moved(event) {
|
|
for (const p of event.changedTouches || [
|
|
event
|
|
])for (const d of points)d.identifier === p.identifier && (d.cur = pointer(p, that));
|
|
if (shifting && !lockX && !lockY && 1 === points.length) {
|
|
const point = points[0];
|
|
abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]) ? lockY = !0 : lockX = !0;
|
|
}
|
|
for (const point of points)point.cur && (point[0] = point.cur[0], point[1] = point.cur[1]);
|
|
moving = !0, noevent$1(event), move(event);
|
|
}
|
|
function move(event) {
|
|
var t;
|
|
const point = points[0], point0 = point.point0;
|
|
switch(dx = point[0] - point0[0], dy = point[1] - point0[1], mode){
|
|
case MODE_SPACE:
|
|
case MODE_DRAG:
|
|
signX && (dx = max$1(W - w0, min$1(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx), signY && (dy = max$1(N - n0, min$1(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy);
|
|
break;
|
|
case MODE_HANDLE:
|
|
points[1] ? (signX && (w1 = max$1(W, min$1(E, points[0][0])), e1 = max$1(W, min$1(E, points[1][0])), signX = 1), signY && (n1 = max$1(N, min$1(S, points[0][1])), s1 = max$1(N, min$1(S, points[1][1])), signY = 1)) : (signX < 0 ? (dx = max$1(W - w0, min$1(E - w0, dx)), w1 = w0 + dx, e1 = e0) : signX > 0 && (dx = max$1(W - e0, min$1(E - e0, dx)), w1 = w0, e1 = e0 + dx), signY < 0 ? (dy = max$1(N - n0, min$1(S - n0, dy)), n1 = n0 + dy, s1 = s0) : signY > 0 && (dy = max$1(N - s0, min$1(S - s0, dy)), n1 = n0, s1 = s0 + dy));
|
|
break;
|
|
case MODE_CENTER:
|
|
signX && (w1 = max$1(W, min$1(E, w0 - dx * signX)), e1 = max$1(W, min$1(E, e0 + dx * signX))), signY && (n1 = max$1(N, min$1(S, n0 - dy * signY)), s1 = max$1(N, min$1(S, s0 + dy * signY)));
|
|
}
|
|
e1 < w1 && (signX *= -1, t = w0, w0 = e0, e0 = t, t = w1, w1 = e1, e1 = t, type in flipX && overlay.attr("cursor", cursors[type = flipX[type]])), s1 < n1 && (signY *= -1, t = n0, n0 = s0, s0 = t, t = n1, n1 = s1, s1 = t, type in flipY && overlay.attr("cursor", cursors[type = flipY[type]])), state.selection && (selection = state.selection), lockX && (w1 = selection[0][0], e1 = selection[1][0]), lockY && (n1 = selection[0][1], s1 = selection[1][1]), (selection[0][0] !== w1 || selection[0][1] !== n1 || selection[1][0] !== e1 || selection[1][1] !== s1) && (state.selection = [
|
|
[
|
|
w1,
|
|
n1
|
|
],
|
|
[
|
|
e1,
|
|
s1
|
|
]
|
|
], redraw.call(that), emit.brush(event, mode.name));
|
|
}
|
|
function ended(event) {
|
|
var extent;
|
|
if (!function(event) {
|
|
event.stopImmediatePropagation();
|
|
}(event), event.touches) {
|
|
if (event.touches.length) return;
|
|
touchending && clearTimeout(touchending), touchending = setTimeout(function() {
|
|
touchending = null;
|
|
}, 500);
|
|
} else yesdrag(event.view, moving), view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
|
|
group.attr("pointer-events", "all"), overlay.attr("cursor", cursors.overlay), state.selection && (selection = state.selection), ((extent = selection)[0][0] === extent[1][0] || extent[0][1] === extent[1][1]) && (state.selection = null, redraw.call(that)), emit.end(event, mode.name);
|
|
}
|
|
}
|
|
function touchmoved(event) {
|
|
emitter(this, arguments).moved(event);
|
|
}
|
|
function touchended(event) {
|
|
emitter(this, arguments).ended(event);
|
|
}
|
|
function initialize() {
|
|
var state = this.__brush || {
|
|
selection: null
|
|
};
|
|
return state.extent = number2(extent.apply(this, arguments)), state.dim = dim, state;
|
|
}
|
|
return brush.move = function(group, selection) {
|
|
group.tween ? group.on("start.brush", function(event) {
|
|
emitter(this, arguments).beforestart().start(event);
|
|
}).on("interrupt.brush end.brush", function(event) {
|
|
emitter(this, arguments).end(event);
|
|
}).tween("brush", function() {
|
|
var that = this, state = that.__brush, emit = emitter(that, arguments), selection0 = state.selection, selection1 = dim.input("function" == typeof selection ? selection.apply(this, arguments) : selection, state.extent), i = interpolate(selection0, selection1);
|
|
function tween(t) {
|
|
state.selection = 1 === t && null === selection1 ? null : i(t), redraw.call(that), emit.brush();
|
|
}
|
|
return null !== selection0 && null !== selection1 ? tween : tween(1);
|
|
}) : group.each(function() {
|
|
var args = arguments, state = this.__brush, selection1 = dim.input("function" == typeof selection ? selection.apply(this, args) : selection, state.extent), emit = emitter(this, args).beforestart();
|
|
interrupt(this), state.selection = null === selection1 ? null : selection1, redraw.call(this), emit.start().brush().end();
|
|
});
|
|
}, brush.clear = function(group) {
|
|
brush.move(group, null);
|
|
}, Emitter.prototype = {
|
|
beforestart: function() {
|
|
return 1 == ++this.active && (this.state.emitter = this, this.starting = !0), this;
|
|
},
|
|
start: function(event, mode) {
|
|
return this.starting ? (this.starting = !1, this.emit("start", event, mode)) : this.emit("brush", event), this;
|
|
},
|
|
brush: function(event, mode) {
|
|
return this.emit("brush", event, mode), this;
|
|
},
|
|
end: function(event, mode) {
|
|
return 0 == --this.active && (delete this.state.emitter, this.emit("end", event, mode)), this;
|
|
},
|
|
emit: function(type, event, mode) {
|
|
var d = select(this.that).datum();
|
|
listeners.call(type, this.that, new BrushEvent(type, {
|
|
sourceEvent: event,
|
|
target: brush,
|
|
selection: dim.output(this.state.selection),
|
|
mode,
|
|
dispatch: listeners
|
|
}), d);
|
|
}
|
|
}, brush.extent = function(_) {
|
|
return arguments.length ? (extent = "function" == typeof _ ? _ : constant$4(number2(_)), brush) : extent;
|
|
}, brush.filter = function(_) {
|
|
return arguments.length ? (filter = "function" == typeof _ ? _ : constant$4(!!_), brush) : filter;
|
|
}, brush.touchable = function(_) {
|
|
return arguments.length ? (touchable = "function" == typeof _ ? _ : constant$4(!!_), brush) : touchable;
|
|
}, brush.handleSize = function(_) {
|
|
return arguments.length ? (handleSize = +_, brush) : handleSize;
|
|
}, brush.keyModifiers = function(_) {
|
|
return arguments.length ? (keys = !!_, brush) : keys;
|
|
}, brush.on = function() {
|
|
var value = listeners.on.apply(listeners, arguments);
|
|
return value === listeners ? brush : value;
|
|
}, brush;
|
|
}
|
|
var abs$1 = Math.abs, cos = Math.cos, sin = Math.sin, pi$1 = Math.PI, halfPi$1 = pi$1 / 2, tau$1 = 2 * pi$1, max$2 = Math.max;
|
|
function range(i, j) {
|
|
return Array.from({
|
|
length: j - i
|
|
}, (_, k)=>i + k);
|
|
}
|
|
function chord$1(directed, transpose) {
|
|
var padAngle = 0, sortGroups = null, sortSubgroups = null, sortChords = null;
|
|
function chord(matrix) {
|
|
var dx, n = matrix.length, groupSums = Array(n), groupIndex = range(0, n), chords = Array(n * n), groups = Array(n), k = 0;
|
|
matrix = Float64Array.from({
|
|
length: n * n
|
|
}, transpose ? (_, i)=>matrix[i % n][i / n | 0] : (_, i)=>matrix[i / n | 0][i % n]);
|
|
for(let i = 0; i < n; ++i){
|
|
let x = 0;
|
|
for(let j = 0; j < n; ++j)x += matrix[i * n + j] + directed * matrix[j * n + i];
|
|
k += groupSums[i] = x;
|
|
}
|
|
dx = (k = max$2(0, tau$1 - padAngle * n) / k) ? padAngle : tau$1 / n;
|
|
{
|
|
let x = 0;
|
|
for (const i of (sortGroups && groupIndex.sort((a, b)=>sortGroups(groupSums[a], groupSums[b])), groupIndex)){
|
|
const x0 = x;
|
|
if (directed) {
|
|
const subgroupIndex = range(~n + 1, n).filter((j)=>j < 0 ? matrix[~j * n + i] : matrix[i * n + j]);
|
|
for (const j of (sortSubgroups && subgroupIndex.sort((a, b)=>sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])), subgroupIndex))if (j < 0) {
|
|
const chord = chords[~j * n + i] || (chords[~j * n + i] = {
|
|
source: null,
|
|
target: null
|
|
});
|
|
chord.target = {
|
|
index: i,
|
|
startAngle: x,
|
|
endAngle: x += matrix[~j * n + i] * k,
|
|
value: matrix[~j * n + i]
|
|
};
|
|
} else {
|
|
const chord = chords[i * n + j] || (chords[i * n + j] = {
|
|
source: null,
|
|
target: null
|
|
});
|
|
chord.source = {
|
|
index: i,
|
|
startAngle: x,
|
|
endAngle: x += matrix[i * n + j] * k,
|
|
value: matrix[i * n + j]
|
|
};
|
|
}
|
|
groups[i] = {
|
|
index: i,
|
|
startAngle: x0,
|
|
endAngle: x,
|
|
value: groupSums[i]
|
|
};
|
|
} else {
|
|
const subgroupIndex = range(0, n).filter((j)=>matrix[i * n + j] || matrix[j * n + i]);
|
|
for (const j of (sortSubgroups && subgroupIndex.sort((a, b)=>sortSubgroups(matrix[i * n + a], matrix[i * n + b])), subgroupIndex)){
|
|
let chord;
|
|
if (i < j ? (chord = chords[i * n + j] || (chords[i * n + j] = {
|
|
source: null,
|
|
target: null
|
|
})).source = {
|
|
index: i,
|
|
startAngle: x,
|
|
endAngle: x += matrix[i * n + j] * k,
|
|
value: matrix[i * n + j]
|
|
} : ((chord = chords[j * n + i] || (chords[j * n + i] = {
|
|
source: null,
|
|
target: null
|
|
})).target = {
|
|
index: i,
|
|
startAngle: x,
|
|
endAngle: x += matrix[i * n + j] * k,
|
|
value: matrix[i * n + j]
|
|
}, i === j && (chord.source = chord.target)), chord.source && chord.target && chord.source.value < chord.target.value) {
|
|
const source = chord.source;
|
|
chord.source = chord.target, chord.target = source;
|
|
}
|
|
}
|
|
groups[i] = {
|
|
index: i,
|
|
startAngle: x0,
|
|
endAngle: x,
|
|
value: groupSums[i]
|
|
};
|
|
}
|
|
x += dx;
|
|
}
|
|
}
|
|
return (chords = Object.values(chords)).groups = groups, sortChords ? chords.sort(sortChords) : chords;
|
|
}
|
|
return chord.padAngle = function(_) {
|
|
return arguments.length ? (padAngle = max$2(0, _), chord) : padAngle;
|
|
}, chord.sortGroups = function(_) {
|
|
return arguments.length ? (sortGroups = _, chord) : sortGroups;
|
|
}, chord.sortSubgroups = function(_) {
|
|
return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
|
|
}, chord.sortChords = function(_) {
|
|
return arguments.length ? (null == _ ? sortChords = null : (sortChords = function(a, b) {
|
|
return _(a.source.value + a.target.value, b.source.value + b.target.value);
|
|
})._ = _, chord) : sortChords && sortChords._;
|
|
}, chord;
|
|
}
|
|
const pi$2 = Math.PI, tau$2 = 2 * pi$2, tauEpsilon = tau$2 - 1e-6;
|
|
function Path() {
|
|
this._x0 = this._y0 = this._x1 = this._y1 = null, this._ = "";
|
|
}
|
|
function path() {
|
|
return new Path;
|
|
}
|
|
Path.prototype = path.prototype = {
|
|
constructor: Path,
|
|
moveTo: function(x, y) {
|
|
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
|
|
},
|
|
closePath: function() {
|
|
null !== this._x1 && (this._x1 = this._x0, this._y1 = this._y0, this._ += "Z");
|
|
},
|
|
lineTo: function(x, y) {
|
|
this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
},
|
|
quadraticCurveTo: function(x1, y1, x, y) {
|
|
this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
},
|
|
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
|
|
this._ += "C" + +x1 + "," + +y1 + "," + +x2 + "," + +y2 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
},
|
|
arcTo: function(x1, y1, x2, y2, r) {
|
|
x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
|
|
var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
|
|
if (r < 0) throw Error("negative radius: " + r);
|
|
if (null === this._x1) this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
|
|
else if (l01_2 > 1e-6) {
|
|
if (Math.abs(y01 * x21 - y21 * x01) > 1e-6 && r) {
|
|
var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - (x20 * x20 + y20 * y20)) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
|
|
Math.abs(t01 - 1) > 1e-6 && (this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01)), this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
|
|
} else this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
|
|
}
|
|
},
|
|
arc: function(x, y, r, a0, a1, ccw) {
|
|
x = +x, y = +y, r = +r, ccw = !!ccw;
|
|
var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
|
|
if (r < 0) throw Error("negative radius: " + r);
|
|
null === this._x1 ? this._ += "M" + x0 + "," + y0 : (Math.abs(this._x1 - x0) > 1e-6 || Math.abs(this._y1 - y0) > 1e-6) && (this._ += "L" + x0 + "," + y0), r && (da < 0 && (da = da % tau$2 + tau$2), da > tauEpsilon ? this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0) : da > 1e-6 && (this._ += "A" + r + "," + r + ",0," + +(da >= pi$2) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1))));
|
|
},
|
|
rect: function(x, y, w, h) {
|
|
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + +w + "v" + +h + "h" + -w + "Z";
|
|
},
|
|
toString: function() {
|
|
return this._;
|
|
}
|
|
};
|
|
var slice$2 = Array.prototype.slice;
|
|
function constant$5(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
function defaultSource(d) {
|
|
return d.source;
|
|
}
|
|
function defaultTarget(d) {
|
|
return d.target;
|
|
}
|
|
function defaultRadius(d) {
|
|
return d.radius;
|
|
}
|
|
function defaultStartAngle(d) {
|
|
return d.startAngle;
|
|
}
|
|
function defaultEndAngle(d) {
|
|
return d.endAngle;
|
|
}
|
|
function defaultPadAngle() {
|
|
return 0;
|
|
}
|
|
function defaultArrowheadRadius() {
|
|
return 10;
|
|
}
|
|
function ribbon(headRadius) {
|
|
var source = defaultSource, target = defaultTarget, sourceRadius = defaultRadius, targetRadius = defaultRadius, startAngle = defaultStartAngle, endAngle = defaultEndAngle, padAngle = defaultPadAngle, context = null;
|
|
function ribbon() {
|
|
var buffer, s = source.apply(this, arguments), t = target.apply(this, arguments), ap = padAngle.apply(this, arguments) / 2, argv = slice$2.call(arguments), sr = +sourceRadius.apply(this, (argv[0] = s, argv)), sa0 = startAngle.apply(this, argv) - halfPi$1, sa1 = endAngle.apply(this, argv) - halfPi$1, tr = +targetRadius.apply(this, (argv[0] = t, argv)), ta0 = startAngle.apply(this, argv) - halfPi$1, ta1 = endAngle.apply(this, argv) - halfPi$1;
|
|
if (context || (context = buffer = path()), ap > 1e-12 && (abs$1(sa1 - sa0) > 2 * ap + 1e-12 ? sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap) : sa0 = sa1 = (sa0 + sa1) / 2, abs$1(ta1 - ta0) > 2 * ap + 1e-12 ? ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap) : ta0 = ta1 = (ta0 + ta1) / 2), context.moveTo(sr * cos(sa0), sr * sin(sa0)), context.arc(0, 0, sr, sa0, sa1), sa0 !== ta0 || sa1 !== ta1) {
|
|
if (headRadius) {
|
|
var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2;
|
|
context.quadraticCurveTo(0, 0, tr2 * cos(ta0), tr2 * sin(ta0)), context.lineTo(tr * cos(ta2), tr * sin(ta2)), context.lineTo(tr2 * cos(ta1), tr2 * sin(ta1));
|
|
} else context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)), context.arc(0, 0, tr, ta0, ta1);
|
|
}
|
|
if (context.quadraticCurveTo(0, 0, sr * cos(sa0), sr * sin(sa0)), context.closePath(), buffer) return context = null, buffer + "" || null;
|
|
}
|
|
return headRadius && (ribbon.headRadius = function(_) {
|
|
return arguments.length ? (headRadius = "function" == typeof _ ? _ : constant$5(+_), ribbon) : headRadius;
|
|
}), ribbon.radius = function(_) {
|
|
return arguments.length ? (sourceRadius = targetRadius = "function" == typeof _ ? _ : constant$5(+_), ribbon) : sourceRadius;
|
|
}, ribbon.sourceRadius = function(_) {
|
|
return arguments.length ? (sourceRadius = "function" == typeof _ ? _ : constant$5(+_), ribbon) : sourceRadius;
|
|
}, ribbon.targetRadius = function(_) {
|
|
return arguments.length ? (targetRadius = "function" == typeof _ ? _ : constant$5(+_), ribbon) : targetRadius;
|
|
}, ribbon.startAngle = function(_) {
|
|
return arguments.length ? (startAngle = "function" == typeof _ ? _ : constant$5(+_), ribbon) : startAngle;
|
|
}, ribbon.endAngle = function(_) {
|
|
return arguments.length ? (endAngle = "function" == typeof _ ? _ : constant$5(+_), ribbon) : endAngle;
|
|
}, ribbon.padAngle = function(_) {
|
|
return arguments.length ? (padAngle = "function" == typeof _ ? _ : constant$5(+_), ribbon) : padAngle;
|
|
}, ribbon.source = function(_) {
|
|
return arguments.length ? (source = _, ribbon) : source;
|
|
}, ribbon.target = function(_) {
|
|
return arguments.length ? (target = _, ribbon) : target;
|
|
}, ribbon.context = function(_) {
|
|
return arguments.length ? (context = null == _ ? null : _, ribbon) : context;
|
|
}, ribbon;
|
|
}
|
|
var slice$3 = Array.prototype.slice;
|
|
function ascending$2(a, b) {
|
|
return a - b;
|
|
}
|
|
var constant$6 = (x)=>()=>x;
|
|
function noop$1() {}
|
|
var cases = [
|
|
[],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
1.5
|
|
],
|
|
[
|
|
0.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
1.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.5,
|
|
1.0
|
|
],
|
|
[
|
|
0.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
0.5
|
|
],
|
|
[
|
|
1.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
1.5
|
|
],
|
|
[
|
|
0.5,
|
|
1.0
|
|
]
|
|
],
|
|
[
|
|
[
|
|
1.0,
|
|
0.5
|
|
],
|
|
[
|
|
1.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
0.5
|
|
],
|
|
[
|
|
1.0,
|
|
1.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
0.5
|
|
],
|
|
[
|
|
0.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
0.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
0.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
1.5
|
|
],
|
|
[
|
|
1.0,
|
|
0.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
0.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
0.5
|
|
]
|
|
],
|
|
[
|
|
[
|
|
1.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
1.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
0.5
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
0.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
1.0,
|
|
1.5
|
|
],
|
|
[
|
|
1.5,
|
|
1.0
|
|
]
|
|
]
|
|
],
|
|
[
|
|
[
|
|
[
|
|
0.5,
|
|
1.0
|
|
],
|
|
[
|
|
1.0,
|
|
1.5
|
|
]
|
|
]
|
|
],
|
|
[]
|
|
];
|
|
function contours() {
|
|
var dx = 1, dy = 1, threshold = thresholdSturges, smooth = smoothLinear;
|
|
function contours(values) {
|
|
var tz = threshold(values);
|
|
if (Array.isArray(tz)) tz = tz.slice().sort(ascending$2);
|
|
else {
|
|
var domain = extent(values), start = domain[0], stop = domain[1];
|
|
tz = tickStep(start, stop, tz), tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
|
|
}
|
|
return tz.map(function(value) {
|
|
return contour(values, value);
|
|
});
|
|
}
|
|
function contour(values, value) {
|
|
var polygons = [], holes = [];
|
|
return function(values, value, callback) {
|
|
var x, y, t0, t1, t2, t3, fragmentByStart = [], fragmentByEnd = [];
|
|
for(x = y = -1, cases[(t1 = values[0] >= value) << 1].forEach(stitch); ++x < dx - 1;)cases[(t0 = t1) | (t1 = values[x + 1] >= value) << 1].forEach(stitch);
|
|
for(cases[t1 << 0].forEach(stitch); ++y < dy - 1;){
|
|
for(x = -1, cases[(t1 = values[y * dx + dx] >= value) << 1 | (t2 = values[y * dx] >= value) << 2].forEach(stitch); ++x < dx - 1;)t0 = t1, t1 = values[y * dx + dx + x + 1] >= value, t3 = t2, cases[t0 | t1 << 1 | (t2 = values[y * dx + x + 1] >= value) << 2 | t3 << 3].forEach(stitch);
|
|
cases[t1 | t2 << 3].forEach(stitch);
|
|
}
|
|
for(x = -1, cases[(t2 = values[y * dx] >= value) << 2].forEach(stitch); ++x < dx - 1;)t3 = t2, cases[(t2 = values[y * dx + x + 1] >= value) << 2 | t3 << 3].forEach(stitch);
|
|
function stitch(line) {
|
|
var f, g, start = [
|
|
line[0][0] + x,
|
|
line[0][1] + y
|
|
], end = [
|
|
line[1][0] + x,
|
|
line[1][1] + y
|
|
], startIndex = index(start), endIndex = index(end);
|
|
(f = fragmentByEnd[startIndex]) ? (g = fragmentByStart[endIndex]) ? (delete fragmentByEnd[f.end], delete fragmentByStart[g.start], f === g ? (f.ring.push(end), callback(f.ring)) : fragmentByStart[f.start] = fragmentByEnd[g.end] = {
|
|
start: f.start,
|
|
end: g.end,
|
|
ring: f.ring.concat(g.ring)
|
|
}) : (delete fragmentByEnd[f.end], f.ring.push(end), fragmentByEnd[f.end = endIndex] = f) : (f = fragmentByStart[endIndex]) ? (g = fragmentByEnd[startIndex]) ? (delete fragmentByStart[f.start], delete fragmentByEnd[g.end], f === g ? (f.ring.push(end), callback(f.ring)) : fragmentByStart[g.start] = fragmentByEnd[f.end] = {
|
|
start: g.start,
|
|
end: f.end,
|
|
ring: g.ring.concat(f.ring)
|
|
}) : (delete fragmentByStart[f.start], f.ring.unshift(start), fragmentByStart[f.start = startIndex] = f) : fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {
|
|
start: startIndex,
|
|
end: endIndex,
|
|
ring: [
|
|
start,
|
|
end
|
|
]
|
|
};
|
|
}
|
|
cases[t2 << 3].forEach(stitch);
|
|
}(values, value, function(ring) {
|
|
smooth(ring, values, value), function(ring) {
|
|
for(var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; ++i < n;)area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
|
|
return area;
|
|
}(ring) > 0 ? polygons.push([
|
|
ring
|
|
]) : holes.push(ring);
|
|
}), holes.forEach(function(hole) {
|
|
for(var polygon, i = 0, n = polygons.length; i < n; ++i)if (-1 !== function(ring, hole) {
|
|
for(var c, i = -1, n = hole.length; ++i < n;)if (c = function(ring, point) {
|
|
for(var x = point[0], y = point[1], contains = -1, i = 0, n = ring.length, j = n - 1; i < n; j = i++){
|
|
var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
|
|
if (function(a, b, c) {
|
|
var i, p, q, r;
|
|
return (b[0] - a[0]) * (c[1] - a[1]) == (c[0] - a[0]) * (b[1] - a[1]) && (p = a[i = +(a[0] === b[0])], q = c[i], r = b[i], p <= q && q <= r || r <= q && q <= p);
|
|
}(pi, pj, point)) return 0;
|
|
yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi && (contains = -contains);
|
|
}
|
|
return contains;
|
|
}(ring, hole[i])) return c;
|
|
return 0;
|
|
}((polygon = polygons[i])[0], hole)) {
|
|
polygon.push(hole);
|
|
return;
|
|
}
|
|
}), {
|
|
type: "MultiPolygon",
|
|
value: value,
|
|
coordinates: polygons
|
|
};
|
|
}
|
|
function index(point) {
|
|
return 2 * point[0] + point[1] * (dx + 1) * 4;
|
|
}
|
|
function smoothLinear(ring, values, value) {
|
|
ring.forEach(function(point) {
|
|
var v0, x = point[0], y = point[1], xt = 0 | x, yt = 0 | y, v1 = values[yt * dx + xt];
|
|
x > 0 && x < dx && xt === x && (v0 = values[yt * dx + xt - 1], point[0] = x + (value - v0) / (v1 - v0) - 0.5), y > 0 && y < dy && yt === y && (v0 = values[(yt - 1) * dx + xt], point[1] = y + (value - v0) / (v1 - v0) - 0.5);
|
|
});
|
|
}
|
|
return contours.contour = contour, contours.size = function(_) {
|
|
if (!arguments.length) return [
|
|
dx,
|
|
dy
|
|
];
|
|
var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);
|
|
if (!(_0 >= 0 && _1 >= 0)) throw Error("invalid size");
|
|
return dx = _0, dy = _1, contours;
|
|
}, contours.thresholds = function(_) {
|
|
return arguments.length ? (threshold = "function" == typeof _ ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), contours) : threshold;
|
|
}, contours.smooth = function(_) {
|
|
return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours) : smooth === smoothLinear;
|
|
}, contours;
|
|
}
|
|
function blurX(source, target, r) {
|
|
for(var n = source.width, m = source.height, w = (r << 1) + 1, j = 0; j < m; ++j)for(var i = 0, sr = 0; i < n + r; ++i)i < n && (sr += source.data[i + j * n]), i >= r && (i >= w && (sr -= source.data[i - w + j * n]), target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w));
|
|
}
|
|
function blurY(source, target, r) {
|
|
for(var n = source.width, m = source.height, w = (r << 1) + 1, i = 0; i < n; ++i)for(var j = 0, sr = 0; j < m + r; ++j)j < m && (sr += source.data[i + j * n]), j >= r && (j >= w && (sr -= source.data[i + (j - w) * n]), target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w));
|
|
}
|
|
function defaultX(d) {
|
|
return d[0];
|
|
}
|
|
function defaultY(d) {
|
|
return d[1];
|
|
}
|
|
function defaultWeight() {
|
|
return 1;
|
|
}
|
|
const EDGE_STACK = new Uint32Array(512);
|
|
class Delaunator {
|
|
static from(points, getX = defaultGetX, getY = defaultGetY) {
|
|
const n = points.length, coords = new Float64Array(2 * n);
|
|
for(let i = 0; i < n; i++){
|
|
const p = points[i];
|
|
coords[2 * i] = getX(p), coords[2 * i + 1] = getY(p);
|
|
}
|
|
return new Delaunator(coords);
|
|
}
|
|
constructor(coords){
|
|
const n = coords.length >> 1;
|
|
if (n > 0 && 'number' != typeof coords[0]) throw Error('Expected coords to contain numbers.');
|
|
this.coords = coords;
|
|
const maxTriangles = Math.max(2 * n - 5, 0);
|
|
this._triangles = new Uint32Array(3 * maxTriangles), this._halfedges = new Int32Array(3 * maxTriangles), this._hashSize = Math.ceil(Math.sqrt(n)), this._hullPrev = new Uint32Array(n), this._hullNext = new Uint32Array(n), this._hullTri = new Uint32Array(n), this._hullHash = new Int32Array(this._hashSize).fill(-1), this._ids = new Uint32Array(n), this._dists = new Float64Array(n), this.update();
|
|
}
|
|
update() {
|
|
let i0, i1, i2;
|
|
const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this, n = coords.length >> 1;
|
|
let minX = 1 / 0, minY = 1 / 0, maxX = -1 / 0, maxY = -1 / 0;
|
|
for(let i = 0; i < n; i++){
|
|
const x = coords[2 * i], y = coords[2 * i + 1];
|
|
x < minX && (minX = x), y < minY && (minY = y), x > maxX && (maxX = x), y > maxY && (maxY = y), this._ids[i] = i;
|
|
}
|
|
const cx = (minX + maxX) / 2, cy = (minY + maxY) / 2;
|
|
let minDist = 1 / 0;
|
|
for(let i = 0; i < n; i++){
|
|
const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);
|
|
d < minDist && (i0 = i, minDist = d);
|
|
}
|
|
const i0x = coords[2 * i0], i0y = coords[2 * i0 + 1];
|
|
minDist = 1 / 0;
|
|
for(let i = 0; i < n; i++){
|
|
if (i === i0) continue;
|
|
const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);
|
|
d < minDist && d > 0 && (i1 = i, minDist = d);
|
|
}
|
|
let i1x = coords[2 * i1], i1y = coords[2 * i1 + 1], minRadius = 1 / 0;
|
|
for(let i = 0; i < n; i++){
|
|
if (i === i0 || i === i1) continue;
|
|
const r = function(ax, ay, bx, by, cx, cy) {
|
|
const dx = bx - ax, dy = by - ay, ex = cx - ax, ey = cy - ay, bl = dx * dx + dy * dy, cl = ex * ex + ey * ey, d = 0.5 / (dx * ey - dy * ex), x = (ey * bl - dy * cl) * d, y = (dx * cl - ex * bl) * d;
|
|
return x * x + y * y;
|
|
}(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);
|
|
r < minRadius && (i2 = i, minRadius = r);
|
|
}
|
|
let i2x = coords[2 * i2], i2y = coords[2 * i2 + 1];
|
|
if (minRadius === 1 / 0) {
|
|
for(let i = 0; i < n; i++)this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];
|
|
quicksort(this._ids, this._dists, 0, n - 1);
|
|
const hull = new Uint32Array(n);
|
|
let j = 0;
|
|
for(let i = 0, d0 = -1 / 0; i < n; i++){
|
|
const id = this._ids[i];
|
|
this._dists[id] > d0 && (hull[j++] = id, d0 = this._dists[id]);
|
|
}
|
|
this.hull = hull.subarray(0, j), this.triangles = new Uint32Array(0), this.halfedges = new Uint32Array(0);
|
|
return;
|
|
}
|
|
if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) {
|
|
const i = i1, x = i1x, y = i1y;
|
|
i1 = i2, i1x = i2x, i1y = i2y, i2 = i, i2x = x, i2y = y;
|
|
}
|
|
const center = function(ax, ay, bx, by, cx, cy) {
|
|
const dx = bx - ax, dy = by - ay, ex = cx - ax, ey = cy - ay, bl = dx * dx + dy * dy, cl = ex * ex + ey * ey, d = 0.5 / (dx * ey - dy * ex);
|
|
return {
|
|
x: ax + (ey * bl - dy * cl) * d,
|
|
y: ay + (dx * cl - ex * bl) * d
|
|
};
|
|
}(i0x, i0y, i1x, i1y, i2x, i2y);
|
|
this._cx = center.x, this._cy = center.y;
|
|
for(let i = 0; i < n; i++)this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);
|
|
quicksort(this._ids, this._dists, 0, n - 1), this._hullStart = i0;
|
|
let hullSize = 3;
|
|
hullNext[i0] = hullPrev[i2] = i1, hullNext[i1] = hullPrev[i0] = i2, hullNext[i2] = hullPrev[i1] = i0, hullTri[i0] = 0, hullTri[i1] = 1, hullTri[i2] = 2, hullHash.fill(-1), hullHash[this._hashKey(i0x, i0y)] = i0, hullHash[this._hashKey(i1x, i1y)] = i1, hullHash[this._hashKey(i2x, i2y)] = i2, this.trianglesLen = 0, this._addTriangle(i0, i1, i2, -1, -1, -1);
|
|
for(let k = 0, xp, yp; k < this._ids.length; k++){
|
|
const i = this._ids[k], x = coords[2 * i], y = coords[2 * i + 1];
|
|
if (k > 0 && 0.0000000000000002220446049250313 >= Math.abs(x - xp) && 0.0000000000000002220446049250313 >= Math.abs(y - yp) || (xp = x, yp = y, i === i0 || i === i1 || i === i2)) continue;
|
|
let start = 0;
|
|
for(let j = 0, key = this._hashKey(x, y); j < this._hashSize && (-1 === (start = hullHash[(key + j) % this._hashSize]) || start === hullNext[start]); j++);
|
|
let e = start = hullPrev[start], q;
|
|
for(; q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]);)if ((e = q) === start) {
|
|
e = -1;
|
|
break;
|
|
}
|
|
if (-1 === e) continue;
|
|
let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);
|
|
hullTri[i] = this._legalize(t + 2), hullTri[e] = t, hullSize++;
|
|
let n = hullNext[e];
|
|
for(; q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1]);)t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]), hullTri[i] = this._legalize(t + 2), hullNext[n] = n, hullSize--, n = q;
|
|
if (e === start) for(; orient(x, y, coords[2 * (q = hullPrev[e])], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]);)t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]), this._legalize(t + 2), hullTri[q] = t, hullNext[e] = e, hullSize--, e = q;
|
|
this._hullStart = hullPrev[i] = e, hullNext[e] = hullPrev[n] = i, hullNext[i] = n, hullHash[this._hashKey(x, y)] = i, hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;
|
|
}
|
|
this.hull = new Uint32Array(hullSize);
|
|
for(let i = 0, e = this._hullStart; i < hullSize; i++)this.hull[i] = e, e = hullNext[e];
|
|
this.triangles = this._triangles.subarray(0, this.trianglesLen), this.halfedges = this._halfedges.subarray(0, this.trianglesLen);
|
|
}
|
|
_hashKey(x, y) {
|
|
return Math.floor(function(dx, dy) {
|
|
const p = dx / (Math.abs(dx) + Math.abs(dy));
|
|
return (dy > 0 ? 3 - p : 1 + p) / 4;
|
|
}(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;
|
|
}
|
|
_legalize(a) {
|
|
const { _triangles: triangles, _halfedges: halfedges, coords } = this;
|
|
let i = 0, ar = 0;
|
|
for(;;){
|
|
const b = halfedges[a], a0 = a - a % 3;
|
|
if (ar = a0 + (a + 2) % 3, -1 === b) {
|
|
if (0 === i) break;
|
|
a = EDGE_STACK[--i];
|
|
continue;
|
|
}
|
|
const b0 = b - b % 3, al = a0 + (a + 1) % 3, bl = b0 + (b + 2) % 3, p0 = triangles[ar], pr = triangles[a], pl = triangles[al], p1 = triangles[bl], illegal = function(ax, ay, bx, by, cx, cy, px, py) {
|
|
const dx = ax - px, dy = ay - py, ex = bx - px, ey = by - py, fx = cx - px, fy = cy - py, bp = ex * ex + ey * ey, cp = fx * fx + fy * fy;
|
|
return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + (dx * dx + dy * dy) * (ex * fy - ey * fx) < 0;
|
|
}(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1]);
|
|
if (illegal) {
|
|
triangles[a] = p1, triangles[b] = p0;
|
|
const hbl = halfedges[bl];
|
|
if (-1 === hbl) {
|
|
let e = this._hullStart;
|
|
do {
|
|
if (this._hullTri[e] === bl) {
|
|
this._hullTri[e] = a;
|
|
break;
|
|
}
|
|
e = this._hullPrev[e];
|
|
}while (e !== this._hullStart)
|
|
}
|
|
this._link(a, hbl), this._link(b, halfedges[ar]), this._link(ar, bl);
|
|
const br = b0 + (b + 1) % 3;
|
|
i < EDGE_STACK.length && (EDGE_STACK[i++] = br);
|
|
} else {
|
|
if (0 === i) break;
|
|
a = EDGE_STACK[--i];
|
|
}
|
|
}
|
|
return ar;
|
|
}
|
|
_link(a, b) {
|
|
this._halfedges[a] = b, -1 !== b && (this._halfedges[b] = a);
|
|
}
|
|
_addTriangle(i0, i1, i2, a, b, c) {
|
|
const t = this.trianglesLen;
|
|
return this._triangles[t] = i0, this._triangles[t + 1] = i1, this._triangles[t + 2] = i2, this._link(t, a), this._link(t + 1, b), this._link(t + 2, c), this.trianglesLen += 3, t;
|
|
}
|
|
}
|
|
function dist(ax, ay, bx, by) {
|
|
const dx = ax - bx, dy = ay - by;
|
|
return dx * dx + dy * dy;
|
|
}
|
|
function orientIfSure(px, py, rx, ry, qx, qy) {
|
|
const l = (ry - py) * (qx - px), r = (rx - px) * (qy - py);
|
|
return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0;
|
|
}
|
|
function orient(rx, ry, qx, qy, px, py) {
|
|
const sign = orientIfSure(px, py, rx, ry, qx, qy) || orientIfSure(rx, ry, qx, qy, px, py) || orientIfSure(qx, qy, px, py, rx, ry);
|
|
return sign < 0;
|
|
}
|
|
function quicksort(ids, dists, left, right) {
|
|
if (right - left <= 20) for(let i = left + 1; i <= right; i++){
|
|
const temp = ids[i], tempDist = dists[temp];
|
|
let j = i - 1;
|
|
for(; j >= left && dists[ids[j]] > tempDist;)ids[j + 1] = ids[j--];
|
|
ids[j + 1] = temp;
|
|
}
|
|
else {
|
|
const median = left + right >> 1;
|
|
let i = left + 1, j = right;
|
|
swap$1(ids, median, i), dists[ids[left]] > dists[ids[right]] && swap$1(ids, left, right), dists[ids[i]] > dists[ids[right]] && swap$1(ids, i, right), dists[ids[left]] > dists[ids[i]] && swap$1(ids, left, i);
|
|
const temp = ids[i], tempDist = dists[temp];
|
|
for(;;){
|
|
do i++;
|
|
while (dists[ids[i]] < tempDist)
|
|
do j--;
|
|
while (dists[ids[j]] > tempDist)
|
|
if (j < i) break;
|
|
swap$1(ids, i, j);
|
|
}
|
|
ids[left + 1] = ids[j], ids[j] = temp, right - i + 1 >= j - left ? (quicksort(ids, dists, i, right), quicksort(ids, dists, left, j - 1)) : (quicksort(ids, dists, left, j - 1), quicksort(ids, dists, i, right));
|
|
}
|
|
}
|
|
function swap$1(arr, i, j) {
|
|
const tmp = arr[i];
|
|
arr[i] = arr[j], arr[j] = tmp;
|
|
}
|
|
function defaultGetX(p) {
|
|
return p[0];
|
|
}
|
|
function defaultGetY(p) {
|
|
return p[1];
|
|
}
|
|
class Path$1 {
|
|
constructor(){
|
|
this._x0 = this._y0 = this._x1 = this._y1 = null, this._ = "";
|
|
}
|
|
moveTo(x, y) {
|
|
this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;
|
|
}
|
|
closePath() {
|
|
null !== this._x1 && (this._x1 = this._x0, this._y1 = this._y0, this._ += "Z");
|
|
}
|
|
lineTo(x, y) {
|
|
this._ += `L${this._x1 = +x},${this._y1 = +y}`;
|
|
}
|
|
arc(x, y, r) {
|
|
x = +x, y = +y, r = +r;
|
|
const x0 = x + r, y0 = y;
|
|
if (r < 0) throw Error("negative radius");
|
|
null === this._x1 ? this._ += `M${x0},${y0}` : (Math.abs(this._x1 - x0) > 1e-6 || Math.abs(this._y1 - y0) > 1e-6) && (this._ += "L" + x0 + "," + y0), r && (this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`);
|
|
}
|
|
rect(x, y, w, h) {
|
|
this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`;
|
|
}
|
|
value() {
|
|
return this._ || null;
|
|
}
|
|
}
|
|
class Polygon {
|
|
constructor(){
|
|
this._ = [];
|
|
}
|
|
moveTo(x, y) {
|
|
this._.push([
|
|
x,
|
|
y
|
|
]);
|
|
}
|
|
closePath() {
|
|
this._.push(this._[0].slice());
|
|
}
|
|
lineTo(x, y) {
|
|
this._.push([
|
|
x,
|
|
y
|
|
]);
|
|
}
|
|
value() {
|
|
return this._.length ? this._ : null;
|
|
}
|
|
}
|
|
class Voronoi {
|
|
constructor(delaunay, [xmin, ymin, xmax, ymax] = [
|
|
0,
|
|
0,
|
|
960,
|
|
500
|
|
]){
|
|
if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw Error("invalid bounds");
|
|
this.delaunay = delaunay, this._circumcenters = new Float64Array(2 * delaunay.points.length), this.vectors = new Float64Array(2 * delaunay.points.length), this.xmax = xmax, this.xmin = xmin, this.ymax = ymax, this.ymin = ymin, this._init();
|
|
}
|
|
update() {
|
|
return this.delaunay.update(), this._init(), this;
|
|
}
|
|
_init() {
|
|
const { delaunay: { points, hull, triangles }, vectors } = this, circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);
|
|
for(let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2){
|
|
const t1 = 2 * triangles[i], t2 = 2 * triangles[i + 1], t3 = 2 * triangles[i + 2], x1 = points[t1], y1 = points[t1 + 1], x2 = points[t2], y2 = points[t2 + 1], x3 = points[t3], y3 = points[t3 + 1], dx = x2 - x1, dy = y2 - y1, ex = x3 - x1, ey = y3 - y1, bl = dx * dx + dy * dy, cl = ex * ex + ey * ey, ab = (dx * ey - dy * ex) * 2;
|
|
if (ab) {
|
|
if (1e-8 > Math.abs(ab)) x = (x1 + x3) / 2, y = (y1 + y3) / 2;
|
|
else {
|
|
const d = 1 / ab;
|
|
x = x1 + (ey * bl - dy * cl) * d, y = y1 + (dx * cl - ex * bl) * d;
|
|
}
|
|
} else x = (x1 + x3) / 2 - 1e8 * ey, y = (y1 + y3) / 2 + 1e8 * ex;
|
|
circumcenters[j] = x, circumcenters[j + 1] = y;
|
|
}
|
|
let h = hull[hull.length - 1], p0, p1 = 4 * h, x0, x1 = points[2 * h], y0, y1 = points[2 * h + 1];
|
|
vectors.fill(0);
|
|
for(let i = 0; i < hull.length; ++i)h = hull[i], p0 = p1, x0 = x1, y0 = y1, p1 = 4 * h, x1 = points[2 * h], y1 = points[2 * h + 1], vectors[p0 + 2] = vectors[p1] = y0 - y1, vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0;
|
|
}
|
|
render(context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, { delaunay: { halfedges, inedges, hull }, circumcenters, vectors } = this;
|
|
if (hull.length <= 1) return null;
|
|
for(let i = 0, n = halfedges.length; i < n; ++i){
|
|
const j = halfedges[i];
|
|
if (j < i) continue;
|
|
const ti = 2 * Math.floor(i / 3), tj = 2 * Math.floor(j / 3), xi = circumcenters[ti], yi = circumcenters[ti + 1], xj = circumcenters[tj], yj = circumcenters[tj + 1];
|
|
this._renderSegment(xi, yi, xj, yj, context);
|
|
}
|
|
let h0, h1 = hull[hull.length - 1];
|
|
for(let i = 0; i < hull.length; ++i){
|
|
h0 = h1, h1 = hull[i];
|
|
const t = 2 * Math.floor(inedges[h1] / 3), x = circumcenters[t], y = circumcenters[t + 1], v = 4 * h0, p = this._project(x, y, vectors[v + 2], vectors[v + 3]);
|
|
p && this._renderSegment(x, y, p[0], p[1], context);
|
|
}
|
|
return buffer && buffer.value();
|
|
}
|
|
renderBounds(context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0;
|
|
return context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin), buffer && buffer.value();
|
|
}
|
|
renderCell(i, context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, points = this._clip(i);
|
|
if (null === points || !points.length) return;
|
|
context.moveTo(points[0], points[1]);
|
|
let n = points.length;
|
|
for(; points[0] === points[n - 2] && points[1] === points[n - 1] && n > 1;)n -= 2;
|
|
for(let i = 2; i < n; i += 2)(points[i] !== points[i - 2] || points[i + 1] !== points[i - 1]) && context.lineTo(points[i], points[i + 1]);
|
|
return context.closePath(), buffer && buffer.value();
|
|
}
|
|
*cellPolygons() {
|
|
const { delaunay: { points } } = this;
|
|
for(let i = 0, n = points.length / 2; i < n; ++i){
|
|
const cell = this.cellPolygon(i);
|
|
cell && (cell.index = i, yield cell);
|
|
}
|
|
}
|
|
cellPolygon(i) {
|
|
const polygon = new Polygon;
|
|
return this.renderCell(i, polygon), polygon.value();
|
|
}
|
|
_renderSegment(x0, y0, x1, y1, context) {
|
|
let S;
|
|
const c0 = this._regioncode(x0, y0), c1 = this._regioncode(x1, y1);
|
|
0 === c0 && 0 === c1 ? (context.moveTo(x0, y0), context.lineTo(x1, y1)) : (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) && (context.moveTo(S[0], S[1]), context.lineTo(S[2], S[3]));
|
|
}
|
|
contains(i, x, y) {
|
|
return (x = +x) == x && (y = +y) == y && this.delaunay._step(i, x, y) === i;
|
|
}
|
|
*neighbors(i) {
|
|
const ci = this._clip(i);
|
|
if (ci) for (const j of this.delaunay.neighbors(i)){
|
|
const cj = this._clip(j);
|
|
if (cj) {
|
|
loop: for(let ai = 0, li = ci.length; ai < li; ai += 2)for(let aj = 0, lj = cj.length; aj < lj; aj += 2)if (ci[ai] == cj[aj] && ci[ai + 1] == cj[aj + 1] && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj]) {
|
|
yield j;
|
|
break loop;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_cell(i) {
|
|
const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this, e0 = inedges[i];
|
|
if (-1 === e0) return null;
|
|
const points = [];
|
|
let e = e0;
|
|
do {
|
|
const t = Math.floor(e / 3);
|
|
if (points.push(circumcenters[2 * t], circumcenters[2 * t + 1]), triangles[e = e % 3 == 2 ? e - 2 : e + 1] !== i) break;
|
|
e = halfedges[e];
|
|
}while (e !== e0 && -1 !== e)
|
|
return points;
|
|
}
|
|
_clip(i) {
|
|
if (0 === i && 1 === this.delaunay.hull.length) return [
|
|
this.xmax,
|
|
this.ymin,
|
|
this.xmax,
|
|
this.ymax,
|
|
this.xmin,
|
|
this.ymax,
|
|
this.xmin,
|
|
this.ymin
|
|
];
|
|
const points = this._cell(i);
|
|
if (null === points) return null;
|
|
const { vectors: V } = this, v = 4 * i;
|
|
return V[v] || V[v + 1] ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points);
|
|
}
|
|
_clipFinite(i, points) {
|
|
let e0, e1;
|
|
const n = points.length;
|
|
let P = null, x0, y0, x1 = points[n - 2], y1 = points[n - 1], c0, c1 = this._regioncode(x1, y1);
|
|
for(let j = 0; j < n; j += 2)if (x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1], c0 = c1, c1 = this._regioncode(x1, y1), 0 === c0 && 0 === c1) e0 = e1, e1 = 0, P ? P.push(x1, y1) : P = [
|
|
x1,
|
|
y1
|
|
];
|
|
else {
|
|
let S, sx0, sy0, sx1, sy1;
|
|
if (0 === c0) {
|
|
if (null === (S = this._clipSegment(x0, y0, x1, y1, c0, c1))) continue;
|
|
[sx0, sy0, sx1, sy1] = S;
|
|
} else {
|
|
if (null === (S = this._clipSegment(x1, y1, x0, y0, c1, c0))) continue;
|
|
[sx1, sy1, sx0, sy0] = S, e0 = e1, e1 = this._edgecode(sx0, sy0), e0 && e1 && this._edge(i, e0, e1, P, P.length), P ? P.push(sx0, sy0) : P = [
|
|
sx0,
|
|
sy0
|
|
];
|
|
}
|
|
e0 = e1, e1 = this._edgecode(sx1, sy1), e0 && e1 && this._edge(i, e0, e1, P, P.length), P ? P.push(sx1, sy1) : P = [
|
|
sx1,
|
|
sy1
|
|
];
|
|
}
|
|
if (P) e0 = e1, e1 = this._edgecode(P[0], P[1]), e0 && e1 && this._edge(i, e0, e1, P, P.length);
|
|
else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) return [
|
|
this.xmax,
|
|
this.ymin,
|
|
this.xmax,
|
|
this.ymax,
|
|
this.xmin,
|
|
this.ymax,
|
|
this.xmin,
|
|
this.ymin
|
|
];
|
|
return P;
|
|
}
|
|
_clipSegment(x0, y0, x1, y1, c0, c1) {
|
|
for(;;){
|
|
if (0 === c0 && 0 === c1) return [
|
|
x0,
|
|
y0,
|
|
x1,
|
|
y1
|
|
];
|
|
if (c0 & c1) return null;
|
|
let x, y, c = c0 || c1;
|
|
0b1000 & c ? (x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax) : 0b0100 & c ? (x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin) : 0b0010 & c ? (y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax) : (y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin), c0 ? (x0 = x, y0 = y, c0 = this._regioncode(x0, y0)) : (x1 = x, y1 = y, c1 = this._regioncode(x1, y1));
|
|
}
|
|
}
|
|
_clipInfinite(i, points, vx0, vy0, vxn, vyn) {
|
|
let P = Array.from(points), p;
|
|
if ((p = this._project(P[0], P[1], vx0, vy0)) && P.unshift(p[0], p[1]), (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) && P.push(p[0], p[1]), P = this._clipFinite(i, P)) for(let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2)c0 = c1, c1 = this._edgecode(P[j], P[j + 1]), c0 && c1 && (j = this._edge(i, c0, c1, P, j), n = P.length);
|
|
else this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2) && (P = [
|
|
this.xmin,
|
|
this.ymin,
|
|
this.xmax,
|
|
this.ymin,
|
|
this.xmax,
|
|
this.ymax,
|
|
this.xmin,
|
|
this.ymax
|
|
]);
|
|
return P;
|
|
}
|
|
_edge(i, e0, e1, P, j) {
|
|
for(; e0 !== e1;){
|
|
let x, y;
|
|
switch(e0){
|
|
case 0b0101:
|
|
e0 = 0b0100;
|
|
continue;
|
|
case 0b0100:
|
|
e0 = 0b0110, x = this.xmax, y = this.ymin;
|
|
break;
|
|
case 0b0110:
|
|
e0 = 0b0010;
|
|
continue;
|
|
case 0b0010:
|
|
e0 = 0b1010, x = this.xmax, y = this.ymax;
|
|
break;
|
|
case 0b1010:
|
|
e0 = 0b1000;
|
|
continue;
|
|
case 0b1000:
|
|
e0 = 0b1001, x = this.xmin, y = this.ymax;
|
|
break;
|
|
case 0b1001:
|
|
e0 = 0b0001;
|
|
continue;
|
|
case 0b0001:
|
|
e0 = 0b0101, x = this.xmin, y = this.ymin;
|
|
}
|
|
(P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y) && (P.splice(j, 0, x, y), j += 2);
|
|
}
|
|
if (P.length > 4) for(let i = 0; i < P.length; i += 2){
|
|
const j = (i + 2) % P.length, k = (i + 4) % P.length;
|
|
(P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) && (P.splice(j, 2), i -= 2);
|
|
}
|
|
return j;
|
|
}
|
|
_project(x0, y0, vx, vy) {
|
|
let t = 1 / 0, c, x, y;
|
|
if (vy < 0) {
|
|
if (y0 <= this.ymin) return null;
|
|
(c = (this.ymin - y0) / vy) < t && (y = this.ymin, x = x0 + (t = c) * vx);
|
|
} else if (vy > 0) {
|
|
if (y0 >= this.ymax) return null;
|
|
(c = (this.ymax - y0) / vy) < t && (y = this.ymax, x = x0 + (t = c) * vx);
|
|
}
|
|
if (vx > 0) {
|
|
if (x0 >= this.xmax) return null;
|
|
(c = (this.xmax - x0) / vx) < t && (x = this.xmax, y = y0 + (t = c) * vy);
|
|
} else if (vx < 0) {
|
|
if (x0 <= this.xmin) return null;
|
|
(c = (this.xmin - x0) / vx) < t && (x = this.xmin, y = y0 + (t = c) * vy);
|
|
}
|
|
return [
|
|
x,
|
|
y
|
|
];
|
|
}
|
|
_edgecode(x, y) {
|
|
return (x === this.xmin ? 0b0001 : x === this.xmax ? 0b0010 : 0b0000) | (y === this.ymin ? 0b0100 : y === this.ymax ? 0b1000 : 0b0000);
|
|
}
|
|
_regioncode(x, y) {
|
|
return (x < this.xmin ? 0b0001 : x > this.xmax ? 0b0010 : 0b0000) | (y < this.ymin ? 0b0100 : y > this.ymax ? 0b1000 : 0b0000);
|
|
}
|
|
}
|
|
const tau$3 = 2 * Math.PI, pow = Math.pow;
|
|
function pointX(p) {
|
|
return p[0];
|
|
}
|
|
function pointY(p) {
|
|
return p[1];
|
|
}
|
|
class Delaunay {
|
|
static from(points, fx = pointX, fy = pointY, that) {
|
|
return new Delaunay("length" in points ? function(points, fx, fy, that) {
|
|
const n = points.length, array = new Float64Array(2 * n);
|
|
for(let i = 0; i < n; ++i){
|
|
const p = points[i];
|
|
array[2 * i] = fx.call(that, p, i, points), array[2 * i + 1] = fy.call(that, p, i, points);
|
|
}
|
|
return array;
|
|
}(points, fx, fy, that) : Float64Array.from(function*(points, fx, fy, that) {
|
|
let i = 0;
|
|
for (const p of points)yield fx.call(that, p, i, points), yield fy.call(that, p, i, points), ++i;
|
|
}(points, fx, fy, that)));
|
|
}
|
|
constructor(points){
|
|
this._delaunator = new Delaunator(points), this.inedges = new Int32Array(points.length / 2), this._hullIndex = new Int32Array(points.length / 2), this.points = this._delaunator.coords, this._init();
|
|
}
|
|
update() {
|
|
return this._delaunator.update(), this._init(), this;
|
|
}
|
|
_init() {
|
|
const d = this._delaunator, points = this.points;
|
|
if (d.hull && d.hull.length > 2 && function(d) {
|
|
const { triangles, coords } = d;
|
|
for(let i = 0; i < triangles.length; i += 3){
|
|
const a = 2 * triangles[i], b = 2 * triangles[i + 1], c = 2 * triangles[i + 2], cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]);
|
|
if (cross > 1e-10) return !1;
|
|
}
|
|
return !0;
|
|
}(d)) {
|
|
this.collinear = Int32Array.from({
|
|
length: points.length / 2
|
|
}, (_, i)=>i).sort((i, j)=>points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]);
|
|
const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds = [
|
|
points[2 * e],
|
|
points[2 * e + 1],
|
|
points[2 * f],
|
|
points[2 * f + 1]
|
|
], r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]);
|
|
for(let i = 0, n = points.length / 2; i < n; ++i){
|
|
var x, y;
|
|
const p = [
|
|
(x = points[2 * i]) + Math.sin(x + (y = points[2 * i + 1])) * r,
|
|
y + Math.cos(x - y) * r
|
|
];
|
|
points[2 * i] = p[0], points[2 * i + 1] = p[1];
|
|
}
|
|
this._delaunator = new Delaunator(points);
|
|
} else delete this.collinear;
|
|
const halfedges = this.halfedges = this._delaunator.halfedges, hull = this.hull = this._delaunator.hull, triangles = this.triangles = this._delaunator.triangles, inedges = this.inedges.fill(-1), hullIndex = this._hullIndex.fill(-1);
|
|
for(let e = 0, n = halfedges.length; e < n; ++e){
|
|
const p = triangles[e % 3 == 2 ? e - 2 : e + 1];
|
|
(-1 === halfedges[e] || -1 === inedges[p]) && (inedges[p] = e);
|
|
}
|
|
for(let i = 0, n = hull.length; i < n; ++i)hullIndex[hull[i]] = i;
|
|
hull.length <= 2 && hull.length > 0 && (this.triangles = new Int32Array(3).fill(-1), this.halfedges = new Int32Array(3).fill(-1), this.triangles[0] = hull[0], this.triangles[1] = hull[1], this.triangles[2] = hull[1], inedges[hull[0]] = 1, 2 === hull.length && (inedges[hull[1]] = 0));
|
|
}
|
|
voronoi(bounds) {
|
|
return new Voronoi(this, bounds);
|
|
}
|
|
*neighbors(i) {
|
|
const { inedges, hull, _hullIndex, halfedges, triangles, collinear } = this;
|
|
if (collinear) {
|
|
const l = collinear.indexOf(i);
|
|
l > 0 && (yield collinear[l - 1]), l < collinear.length - 1 && (yield collinear[l + 1]);
|
|
return;
|
|
}
|
|
const e0 = inedges[i];
|
|
if (-1 === e0) return;
|
|
let e = e0, p0 = -1;
|
|
do {
|
|
if (yield p0 = triangles[e], triangles[e = e % 3 == 2 ? e - 2 : e + 1] !== i) return;
|
|
if (-1 === (e = halfedges[e])) {
|
|
const p = hull[(_hullIndex[i] + 1) % hull.length];
|
|
p !== p0 && (yield p);
|
|
return;
|
|
}
|
|
}while (e !== e0)
|
|
}
|
|
find(x, y, i = 0) {
|
|
let c;
|
|
if ((x = +x) != x || (y = +y) != y) return -1;
|
|
const i0 = i;
|
|
for(; (c = this._step(i, x, y)) >= 0 && c !== i && c !== i0;)i = c;
|
|
return c;
|
|
}
|
|
_step(i, x, y) {
|
|
const { inedges, hull, _hullIndex, halfedges, triangles, points } = this;
|
|
if (-1 === inedges[i] || !points.length) return (i + 1) % (points.length >> 1);
|
|
let c = i, dc = pow(x - points[2 * i], 2) + pow(y - points[2 * i + 1], 2);
|
|
const e0 = inedges[i];
|
|
let e = e0;
|
|
do {
|
|
let t = triangles[e];
|
|
const dt = pow(x - points[2 * t], 2) + pow(y - points[2 * t + 1], 2);
|
|
if (dt < dc && (dc = dt, c = t), triangles[e = e % 3 == 2 ? e - 2 : e + 1] !== i) break;
|
|
if (-1 === (e = halfedges[e])) {
|
|
if ((e = hull[(_hullIndex[i] + 1) % hull.length]) !== t && pow(x - points[2 * e], 2) + pow(y - points[2 * e + 1], 2) < dc) return e;
|
|
break;
|
|
}
|
|
}while (e !== e0)
|
|
return c;
|
|
}
|
|
render(context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, { points, halfedges, triangles } = this;
|
|
for(let i = 0, n = halfedges.length; i < n; ++i){
|
|
const j = halfedges[i];
|
|
if (j < i) continue;
|
|
const ti = 2 * triangles[i], tj = 2 * triangles[j];
|
|
context.moveTo(points[ti], points[ti + 1]), context.lineTo(points[tj], points[tj + 1]);
|
|
}
|
|
return this.renderHull(context), buffer && buffer.value();
|
|
}
|
|
renderPoints(context, r = 2) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, { points } = this;
|
|
for(let i = 0, n = points.length; i < n; i += 2){
|
|
const x = points[i], y = points[i + 1];
|
|
context.moveTo(x + r, y), context.arc(x, y, r, 0, tau$3);
|
|
}
|
|
return buffer && buffer.value();
|
|
}
|
|
renderHull(context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, { hull, points } = this, h = 2 * hull[0], n = hull.length;
|
|
context.moveTo(points[h], points[h + 1]);
|
|
for(let i = 1; i < n; ++i){
|
|
const h = 2 * hull[i];
|
|
context.lineTo(points[h], points[h + 1]);
|
|
}
|
|
return context.closePath(), buffer && buffer.value();
|
|
}
|
|
hullPolygon() {
|
|
const polygon = new Polygon;
|
|
return this.renderHull(polygon), polygon.value();
|
|
}
|
|
renderTriangle(i, context) {
|
|
const buffer = null == context ? context = new Path$1 : void 0, { points, triangles } = this, t0 = 2 * triangles[i *= 3], t1 = 2 * triangles[i + 1], t2 = 2 * triangles[i + 2];
|
|
return context.moveTo(points[t0], points[t0 + 1]), context.lineTo(points[t1], points[t1 + 1]), context.lineTo(points[t2], points[t2 + 1]), context.closePath(), buffer && buffer.value();
|
|
}
|
|
*trianglePolygons() {
|
|
const { triangles } = this;
|
|
for(let i = 0, n = triangles.length / 3; i < n; ++i)yield this.trianglePolygon(i);
|
|
}
|
|
trianglePolygon(i) {
|
|
const polygon = new Polygon;
|
|
return this.renderTriangle(i, polygon), polygon.value();
|
|
}
|
|
}
|
|
var EOL = {}, EOF = {};
|
|
function objectConverter(columns) {
|
|
return Function("d", "return {" + columns.map(function(name, i) {
|
|
return JSON.stringify(name) + ": d[" + i + "] || \"\"";
|
|
}).join(",") + "}");
|
|
}
|
|
function inferColumns(rows) {
|
|
var columnSet = Object.create(null), columns = [];
|
|
return rows.forEach(function(row) {
|
|
for(var column in row)column in columnSet || columns.push(columnSet[column] = column);
|
|
}), columns;
|
|
}
|
|
function pad(value, width) {
|
|
var s = value + "", length = s.length;
|
|
return length < width ? Array(width - length + 1).join(0) + s : s;
|
|
}
|
|
function dsvFormat(delimiter) {
|
|
var reFormat = RegExp("[\"" + delimiter + "\n\r]"), DELIMITER = delimiter.charCodeAt(0);
|
|
function parseRows(text, f) {
|
|
var t, rows = [], N = text.length, I = 0, n = 0, eof = N <= 0, eol = !1;
|
|
function token() {
|
|
if (eof) return EOF;
|
|
if (eol) return eol = !1, EOL;
|
|
var i, c, j = I;
|
|
if (34 === text.charCodeAt(j)) {
|
|
for(; I++ < N && 34 !== text.charCodeAt(I) || 34 === text.charCodeAt(++I););
|
|
return (i = I) >= N ? eof = !0 : 10 === (c = text.charCodeAt(I++)) ? eol = !0 : 13 === c && (eol = !0, 10 === text.charCodeAt(I) && ++I), text.slice(j + 1, i - 1).replace(/""/g, "\"");
|
|
}
|
|
for(; I < N;){
|
|
if (10 === (c = text.charCodeAt(i = I++))) eol = !0;
|
|
else if (13 === c) eol = !0, 10 === text.charCodeAt(I) && ++I;
|
|
else if (c !== DELIMITER) continue;
|
|
return text.slice(j, i);
|
|
}
|
|
return eof = !0, text.slice(j, N);
|
|
}
|
|
for(10 === text.charCodeAt(N - 1) && --N, 13 === text.charCodeAt(N - 1) && --N; (t = token()) !== EOF;){
|
|
for(var row = []; t !== EOL && t !== EOF;)row.push(t), t = token();
|
|
f && null == (row = f(row, n++)) || rows.push(row);
|
|
}
|
|
return rows;
|
|
}
|
|
function preformatBody(rows, columns) {
|
|
return rows.map(function(row) {
|
|
return columns.map(function(column) {
|
|
return formatValue(row[column]);
|
|
}).join(delimiter);
|
|
});
|
|
}
|
|
function formatRow(row) {
|
|
return row.map(formatValue).join(delimiter);
|
|
}
|
|
function formatValue(value) {
|
|
var date, hours, minutes, seconds, milliseconds, year;
|
|
return null == value ? "" : value instanceof Date ? (hours = (date = value).getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds(), isNaN(date) ? "Invalid Date" : ((year = date.getUTCFullYear()) < 0 ? "-" + pad(-year, 6) : year > 9999 ? "+" + pad(year, 6) : pad(year, 4)) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" : "")) : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" : value;
|
|
}
|
|
return {
|
|
parse: function(text, f) {
|
|
var convert, columns, rows = parseRows(text, function(row, i) {
|
|
var object;
|
|
if (convert) return convert(row, i - 1);
|
|
columns = row, convert = f ? (object = objectConverter(row), function(row1, i) {
|
|
return f(object(row1), i, row);
|
|
}) : objectConverter(row);
|
|
});
|
|
return rows.columns = columns || [], rows;
|
|
},
|
|
parseRows: parseRows,
|
|
format: function(rows, columns) {
|
|
return null == columns && (columns = inferColumns(rows)), [
|
|
columns.map(formatValue).join(delimiter)
|
|
].concat(preformatBody(rows, columns)).join("\n");
|
|
},
|
|
formatBody: function(rows, columns) {
|
|
return null == columns && (columns = inferColumns(rows)), preformatBody(rows, columns).join("\n");
|
|
},
|
|
formatRows: function(rows) {
|
|
return rows.map(formatRow).join("\n");
|
|
},
|
|
formatRow: formatRow,
|
|
formatValue: formatValue
|
|
};
|
|
}
|
|
var csv = dsvFormat(","), csvParse = csv.parse, csvParseRows = csv.parseRows, csvFormat = csv.format, csvFormatBody = csv.formatBody, csvFormatRows = csv.formatRows, csvFormatRow = csv.formatRow, csvFormatValue = csv.formatValue, tsv = dsvFormat("\t"), tsvParse = tsv.parse, tsvParseRows = tsv.parseRows, tsvFormat = tsv.format, tsvFormatBody = tsv.formatBody, tsvFormatRows = tsv.formatRows, tsvFormatRow = tsv.formatRow, tsvFormatValue = tsv.formatValue;
|
|
const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours();
|
|
function responseBlob(response) {
|
|
if (!response.ok) throw Error(response.status + " " + response.statusText);
|
|
return response.blob();
|
|
}
|
|
function responseArrayBuffer(response) {
|
|
if (!response.ok) throw Error(response.status + " " + response.statusText);
|
|
return response.arrayBuffer();
|
|
}
|
|
function responseText(response) {
|
|
if (!response.ok) throw Error(response.status + " " + response.statusText);
|
|
return response.text();
|
|
}
|
|
function text(input, init) {
|
|
return fetch(input, init).then(responseText);
|
|
}
|
|
function dsvParse(parse) {
|
|
return function(input, init, row) {
|
|
return 2 == arguments.length && "function" == typeof init && (row = init, init = void 0), text(input, init).then(function(response) {
|
|
return parse(response, row);
|
|
});
|
|
};
|
|
}
|
|
var csv$1 = dsvParse(csvParse), tsv$1 = dsvParse(tsvParse);
|
|
function responseJson(response) {
|
|
if (!response.ok) throw Error(response.status + " " + response.statusText);
|
|
if (204 !== response.status && 205 !== response.status) return response.json();
|
|
}
|
|
function parser(type) {
|
|
return (input, init)=>text(input, init).then((text)=>(new DOMParser).parseFromString(text, type));
|
|
}
|
|
var xml = parser("application/xml"), html = parser("text/html"), svg = parser("image/svg+xml");
|
|
function add(tree, x, y, d) {
|
|
if (isNaN(x) || isNaN(y)) return tree;
|
|
var parent, xm, ym, xp, yp, right, bottom, i, j, node = tree._root, leaf = {
|
|
data: d
|
|
}, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1;
|
|
if (!node) return tree._root = leaf, tree;
|
|
for(; node.length;)if ((right = x >= (xm = (x0 + x1) / 2)) ? x0 = xm : x1 = xm, (bottom = y >= (ym = (y0 + y1) / 2)) ? y0 = ym : y1 = ym, parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
|
|
if (xp = +tree._x.call(null, node.data), yp = +tree._y.call(null, node.data), x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
|
|
do parent = parent ? parent[i] = [
|
|
,
|
|
,
|
|
,
|
|
,
|
|
] : tree._root = [
|
|
,
|
|
,
|
|
,
|
|
,
|
|
], (right = x >= (xm = (x0 + x1) / 2)) ? x0 = xm : x1 = xm, (bottom = y >= (ym = (y0 + y1) / 2)) ? y0 = ym : y1 = ym;
|
|
while ((i = bottom << 1 | right) == (j = (yp >= ym) << 1 | xp >= xm))
|
|
return parent[j] = node, parent[i] = leaf, tree;
|
|
}
|
|
function Quad(node, x0, y0, x1, y1) {
|
|
this.node = node, this.x0 = x0, this.y0 = y0, this.x1 = x1, this.y1 = y1;
|
|
}
|
|
function defaultX$1(d) {
|
|
return d[0];
|
|
}
|
|
function defaultY$1(d) {
|
|
return d[1];
|
|
}
|
|
function quadtree(nodes, x, y) {
|
|
var tree = new Quadtree(null == x ? defaultX$1 : x, null == y ? defaultY$1 : y, NaN, NaN, NaN, NaN);
|
|
return null == nodes ? tree : tree.addAll(nodes);
|
|
}
|
|
function Quadtree(x, y, x0, y0, x1, y1) {
|
|
this._x = x, this._y = y, this._x0 = x0, this._y0 = y0, this._x1 = x1, this._y1 = y1, this._root = void 0;
|
|
}
|
|
function leaf_copy(leaf) {
|
|
for(var copy = {
|
|
data: leaf.data
|
|
}, next = copy; leaf = leaf.next;)next = next.next = {
|
|
data: leaf.data
|
|
};
|
|
return copy;
|
|
}
|
|
var treeProto = quadtree.prototype = Quadtree.prototype;
|
|
function constant$7(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
function jiggle(random) {
|
|
return (random() - 0.5) * 1e-6;
|
|
}
|
|
function x(d) {
|
|
return d.x + d.vx;
|
|
}
|
|
function y(d) {
|
|
return d.y + d.vy;
|
|
}
|
|
function index$1(d) {
|
|
return d.index;
|
|
}
|
|
function find$1(nodeById, nodeId) {
|
|
var node = nodeById.get(nodeId);
|
|
if (!node) throw Error("node not found: " + nodeId);
|
|
return node;
|
|
}
|
|
function x$1(d) {
|
|
return d.x;
|
|
}
|
|
function y$1(d) {
|
|
return d.y;
|
|
}
|
|
treeProto.copy = function() {
|
|
var nodes, child, copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root;
|
|
if (!node) return copy;
|
|
if (!node.length) return copy._root = leaf_copy(node), copy;
|
|
for(nodes = [
|
|
{
|
|
source: node,
|
|
target: copy._root = [
|
|
,
|
|
,
|
|
,
|
|
,
|
|
]
|
|
}
|
|
]; node = nodes.pop();)for(var i = 0; i < 4; ++i)(child = node.source[i]) && (child.length ? nodes.push({
|
|
source: child,
|
|
target: node.target[i] = [
|
|
,
|
|
,
|
|
,
|
|
,
|
|
]
|
|
}) : node.target[i] = leaf_copy(child));
|
|
return copy;
|
|
}, treeProto.add = function(d) {
|
|
const x = +this._x.call(null, d), y = +this._y.call(null, d);
|
|
return add(this.cover(x, y), x, y, d);
|
|
}, treeProto.addAll = function(data) {
|
|
var d, i, x, y, n = data.length, xz = Array(n), yz = Array(n), x0 = 1 / 0, y0 = 1 / 0, x1 = -1 / 0, y1 = -1 / 0;
|
|
for(i = 0; i < n; ++i)!(isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) && (xz[i] = x, yz[i] = y, x < x0 && (x0 = x), x > x1 && (x1 = x), y < y0 && (y0 = y), y > y1 && (y1 = y));
|
|
if (x0 > x1 || y0 > y1) return this;
|
|
for(this.cover(x0, y0).cover(x1, y1), i = 0; i < n; ++i)add(this, xz[i], yz[i], data[i]);
|
|
return this;
|
|
}, treeProto.cover = function(x, y) {
|
|
if (isNaN(x = +x) || isNaN(y = +y)) return this;
|
|
var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;
|
|
if (isNaN(x0)) x1 = (x0 = Math.floor(x)) + 1, y1 = (y0 = Math.floor(y)) + 1;
|
|
else {
|
|
for(var parent, i, z = x1 - x0 || 1, node = this._root; x0 > x || x >= x1 || y0 > y || y >= y1;)switch(i = (y < y0) << 1 | x < x0, (parent = [
|
|
,
|
|
,
|
|
,
|
|
,
|
|
])[i] = node, node = parent, z *= 2, i){
|
|
case 0:
|
|
x1 = x0 + z, y1 = y0 + z;
|
|
break;
|
|
case 1:
|
|
x0 = x1 - z, y1 = y0 + z;
|
|
break;
|
|
case 2:
|
|
x1 = x0 + z, y0 = y1 - z;
|
|
break;
|
|
case 3:
|
|
x0 = x1 - z, y0 = y1 - z;
|
|
}
|
|
this._root && this._root.length && (this._root = node);
|
|
}
|
|
return this._x0 = x0, this._y0 = y0, this._x1 = x1, this._y1 = y1, this;
|
|
}, treeProto.data = function() {
|
|
var data = [];
|
|
return this.visit(function(node) {
|
|
if (!node.length) do data.push(node.data);
|
|
while (node = node.next)
|
|
}), data;
|
|
}, treeProto.extent = function(_) {
|
|
return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [
|
|
[
|
|
this._x0,
|
|
this._y0
|
|
],
|
|
[
|
|
this._x1,
|
|
this._y1
|
|
]
|
|
];
|
|
}, treeProto.find = function(x, y, radius) {
|
|
var data, x1, y1, x2, y2, q, i, x0 = this._x0, y0 = this._y0, x3 = this._x1, y3 = this._y1, quads = [], node = this._root;
|
|
for(node && quads.push(new Quad(node, x0, y0, x3, y3)), null == radius ? radius = 1 / 0 : (x0 = x - radius, y0 = y - radius, x3 = x + radius, y3 = y + radius, radius *= radius); q = quads.pop();)if ((node = q.node) && !((x1 = q.x0) > x3) && !((y1 = q.y0) > y3) && !((x2 = q.x1) < x0) && !((y2 = q.y1) < y0)) {
|
|
if (node.length) {
|
|
var xm = (x1 + x2) / 2, ym = (y1 + y2) / 2;
|
|
quads.push(new Quad(node[3], xm, ym, x2, y2), new Quad(node[2], x1, ym, xm, y2), new Quad(node[1], xm, y1, x2, ym), new Quad(node[0], x1, y1, xm, ym)), (i = (y >= ym) << 1 | x >= xm) && (q = quads[quads.length - 1], quads[quads.length - 1] = quads[quads.length - 1 - i], quads[quads.length - 1 - i] = q);
|
|
} else {
|
|
var dx = x - +this._x.call(null, node.data), dy = y - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;
|
|
if (d2 < radius) {
|
|
var d = Math.sqrt(radius = d2);
|
|
x0 = x - d, y0 = y - d, x3 = x + d, y3 = y + d, data = node.data;
|
|
}
|
|
}
|
|
}
|
|
return data;
|
|
}, treeProto.remove = function(d) {
|
|
if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this;
|
|
var parent, retainer, previous, next, x, y, xm, ym, right, bottom, i, j, node = this._root, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;
|
|
if (!node) return this;
|
|
if (node.length) for(;;){
|
|
if ((right = x >= (xm = (x0 + x1) / 2)) ? x0 = xm : x1 = xm, (bottom = y >= (ym = (y0 + y1) / 2)) ? y0 = ym : y1 = ym, parent = node, !(node = node[i = bottom << 1 | right])) return this;
|
|
if (!node.length) break;
|
|
(parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) && (retainer = parent, j = i);
|
|
}
|
|
for(; node.data !== d;)if (previous = node, !(node = node.next)) return this;
|
|
return ((next = node.next) && delete node.next, previous) ? (next ? previous.next = next : delete previous.next, this) : parent ? (next ? parent[i] = next : delete parent[i], (node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length && (retainer ? retainer[j] = node : this._root = node), this) : (this._root = next, this);
|
|
}, treeProto.removeAll = function(data) {
|
|
for(var i = 0, n = data.length; i < n; ++i)this.remove(data[i]);
|
|
return this;
|
|
}, treeProto.root = function() {
|
|
return this._root;
|
|
}, treeProto.size = function() {
|
|
var size = 0;
|
|
return this.visit(function(node) {
|
|
if (!node.length) do ++size;
|
|
while (node = node.next)
|
|
}), size;
|
|
}, treeProto.visit = function(callback) {
|
|
var q, child, x0, y0, x1, y1, quads = [], node = this._root;
|
|
for(node && quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); q = quads.pop();)if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
|
|
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
|
(child = node[3]) && quads.push(new Quad(child, xm, ym, x1, y1)), (child = node[2]) && quads.push(new Quad(child, x0, ym, xm, y1)), (child = node[1]) && quads.push(new Quad(child, xm, y0, x1, ym)), (child = node[0]) && quads.push(new Quad(child, x0, y0, xm, ym));
|
|
}
|
|
return this;
|
|
}, treeProto.visitAfter = function(callback) {
|
|
var q, quads = [], next = [];
|
|
for(this._root && quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); q = quads.pop();){
|
|
var node = q.node;
|
|
if (node.length) {
|
|
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
|
(child = node[0]) && quads.push(new Quad(child, x0, y0, xm, ym)), (child = node[1]) && quads.push(new Quad(child, xm, y0, x1, ym)), (child = node[2]) && quads.push(new Quad(child, x0, ym, xm, y1)), (child = node[3]) && quads.push(new Quad(child, xm, ym, x1, y1));
|
|
}
|
|
next.push(q);
|
|
}
|
|
for(; q = next.pop();)callback(q.node, q.x0, q.y0, q.x1, q.y1);
|
|
return this;
|
|
}, treeProto.x = function(_) {
|
|
return arguments.length ? (this._x = _, this) : this._x;
|
|
}, treeProto.y = function(_) {
|
|
return arguments.length ? (this._y = _, this) : this._y;
|
|
};
|
|
var initialAngle = Math.PI * (3 - Math.sqrt(5));
|
|
function formatDecimalParts(x, p) {
|
|
if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null;
|
|
var i, coefficient = x.slice(0, i);
|
|
return [
|
|
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
|
|
+x.slice(i + 1)
|
|
];
|
|
}
|
|
function exponent$1(x) {
|
|
return (x = formatDecimalParts(Math.abs(x))) ? x[1] : NaN;
|
|
}
|
|
var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
|
|
function formatSpecifier(specifier) {
|
|
var match;
|
|
if (!(match = re.exec(specifier))) throw Error("invalid format: " + specifier);
|
|
return new FormatSpecifier({
|
|
fill: match[1],
|
|
align: match[2],
|
|
sign: match[3],
|
|
symbol: match[4],
|
|
zero: match[5],
|
|
width: match[6],
|
|
comma: match[7],
|
|
precision: match[8] && match[8].slice(1),
|
|
trim: match[9],
|
|
type: match[10]
|
|
});
|
|
}
|
|
function FormatSpecifier(specifier) {
|
|
this.fill = void 0 === specifier.fill ? " " : specifier.fill + "", this.align = void 0 === specifier.align ? ">" : specifier.align + "", this.sign = void 0 === specifier.sign ? "-" : specifier.sign + "", this.symbol = void 0 === specifier.symbol ? "" : specifier.symbol + "", this.zero = !!specifier.zero, this.width = void 0 === specifier.width ? void 0 : +specifier.width, this.comma = !!specifier.comma, this.precision = void 0 === specifier.precision ? void 0 : +specifier.precision, this.trim = !!specifier.trim, this.type = void 0 === specifier.type ? "" : specifier.type + "";
|
|
}
|
|
function formatRounded(x, p) {
|
|
var d = formatDecimalParts(x, p);
|
|
if (!d) return x + "";
|
|
var coefficient = d[0], exponent = d[1];
|
|
return exponent < 0 ? "0." + Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + Array(exponent - coefficient.length + 2).join("0");
|
|
}
|
|
formatSpecifier.prototype = FormatSpecifier.prototype, FormatSpecifier.prototype.toString = function() {
|
|
return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (void 0 === this.width ? "" : Math.max(1, 0 | this.width)) + (this.comma ? "," : "") + (void 0 === this.precision ? "" : "." + Math.max(0, 0 | this.precision)) + (this.trim ? "~" : "") + this.type;
|
|
};
|
|
var formatTypes = {
|
|
"%": (x, p)=>(100 * x).toFixed(p),
|
|
b: (x)=>Math.round(x).toString(2),
|
|
c: (x)=>x + "",
|
|
d: function(x) {
|
|
return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
|
|
},
|
|
e: (x, p)=>x.toExponential(p),
|
|
f: (x, p)=>x.toFixed(p),
|
|
g: (x, p)=>x.toPrecision(p),
|
|
o: (x)=>Math.round(x).toString(8),
|
|
p: (x, p)=>formatRounded(100 * x, p),
|
|
r: formatRounded,
|
|
s: function(x, p) {
|
|
var d = formatDecimalParts(x, p);
|
|
if (!d) return x + "";
|
|
var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = 3 * Math.max(-8, Math.min(8, Math.floor(exponent / 3)))) + 1, n = coefficient.length;
|
|
return i === n ? coefficient : i > n ? coefficient + Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0];
|
|
},
|
|
X: (x)=>Math.round(x).toString(16).toUpperCase(),
|
|
x: (x)=>Math.round(x).toString(16)
|
|
};
|
|
function identity$3(x) {
|
|
return x;
|
|
}
|
|
var map$1 = Array.prototype.map, prefixes = [
|
|
"y",
|
|
"z",
|
|
"a",
|
|
"f",
|
|
"p",
|
|
"n",
|
|
"\xB5",
|
|
"m",
|
|
"",
|
|
"k",
|
|
"M",
|
|
"G",
|
|
"T",
|
|
"P",
|
|
"E",
|
|
"Z",
|
|
"Y"
|
|
];
|
|
function formatLocale(locale) {
|
|
var grouping, thousands, numerals, group = void 0 === locale.grouping || void 0 === locale.thousands ? identity$3 : (grouping = map$1.call(locale.grouping, Number), thousands = locale.thousands + "", function(value, width) {
|
|
for(var i = value.length, t = [], j = 0, g = grouping[0], length = 0; i > 0 && g > 0 && (length + g + 1 > width && (g = Math.max(1, width - length)), t.push(value.substring(i -= g, i + g)), !((length += g + 1) > width));)g = grouping[j = (j + 1) % grouping.length];
|
|
return t.reverse().join(thousands);
|
|
}), currencyPrefix = void 0 === locale.currency ? "" : locale.currency[0] + "", currencySuffix = void 0 === locale.currency ? "" : locale.currency[1] + "", decimal = void 0 === locale.decimal ? "." : locale.decimal + "", numerals1 = void 0 === locale.numerals ? identity$3 : (numerals = map$1.call(locale.numerals, String), function(value) {
|
|
return value.replace(/[0-9]/g, function(i) {
|
|
return numerals[+i];
|
|
});
|
|
}), percent = void 0 === locale.percent ? "%" : locale.percent + "", minus = void 0 === locale.minus ? "\u2212" : locale.minus + "", nan = void 0 === locale.nan ? "NaN" : locale.nan + "";
|
|
function newFormat(specifier) {
|
|
var fill = (specifier = formatSpecifier(specifier)).fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;
|
|
"n" === type ? (comma = !0, type = "g") : formatTypes[type] || (void 0 === precision && (precision = 12), trim = !0, type = "g"), (zero || "0" === fill && "=" === align) && (zero = !0, fill = "0", align = "=");
|
|
var prefix = "$" === symbol ? currencyPrefix : "#" === symbol && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", suffix = "$" === symbol ? currencySuffix : /[%p]/.test(type) ? percent : "", formatType = formatTypes[type], maybeSuffix = /[defgprs%]/.test(type);
|
|
function format(value) {
|
|
var i, n, c, valuePrefix = prefix, valueSuffix = suffix;
|
|
if ("c" === type) valueSuffix = formatType(value) + valueSuffix, value = "";
|
|
else {
|
|
var valueNegative = (value = +value) < 0 || 1 / value < 0;
|
|
if (value = isNaN(value) ? nan : formatType(Math.abs(value), precision), trim && (value = function(s) {
|
|
out: for(var i1, n = s.length, i = 1, i0 = -1; i < n; ++i)switch(s[i]){
|
|
case ".":
|
|
i0 = i1 = i;
|
|
break;
|
|
case "0":
|
|
0 === i0 && (i0 = i), i1 = i;
|
|
break;
|
|
default:
|
|
if (!+s[i]) break out;
|
|
i0 > 0 && (i0 = 0);
|
|
}
|
|
return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
|
|
}(value)), valueNegative && 0 == +value && "+" !== sign && (valueNegative = !1), valuePrefix = (valueNegative ? "(" === sign ? sign : minus : "-" === sign || "(" === sign ? "" : sign) + valuePrefix, valueSuffix = ("s" === type ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && "(" === sign ? ")" : ""), maybeSuffix) {
|
|
for(i = -1, n = value.length; ++i < n;)if (48 > (c = value.charCodeAt(i)) || c > 57) {
|
|
valueSuffix = (46 === c ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix, value = value.slice(0, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
comma && !zero && (value = group(value, 1 / 0));
|
|
var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? Array(width - length + 1).join(fill) : "";
|
|
switch(comma && zero && (value = group(padding + value, padding.length ? width - valueSuffix.length : 1 / 0), padding = ""), align){
|
|
case "<":
|
|
value = valuePrefix + value + valueSuffix + padding;
|
|
break;
|
|
case "=":
|
|
value = valuePrefix + padding + value + valueSuffix;
|
|
break;
|
|
case "^":
|
|
value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
|
|
break;
|
|
default:
|
|
value = padding + valuePrefix + value + valueSuffix;
|
|
}
|
|
return numerals1(value);
|
|
}
|
|
return precision = void 0 === precision ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision)), format.toString = function() {
|
|
return specifier + "";
|
|
}, format;
|
|
}
|
|
return {
|
|
format: newFormat,
|
|
formatPrefix: function(specifier, value) {
|
|
var f = newFormat(((specifier = formatSpecifier(specifier)).type = "f", specifier)), e = 3 * Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))), k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
|
|
return function(value) {
|
|
return f(k * value) + prefix;
|
|
};
|
|
}
|
|
};
|
|
}
|
|
function defaultLocale(definition) {
|
|
return locale = formatLocale(definition), exports1.format = locale.format, exports1.formatPrefix = locale.formatPrefix, locale;
|
|
}
|
|
function precisionFixed(step) {
|
|
return Math.max(0, -exponent$1(Math.abs(step)));
|
|
}
|
|
function precisionPrefix(step, value) {
|
|
return Math.max(0, 3 * Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) - exponent$1(Math.abs(step)));
|
|
}
|
|
function precisionRound(step, max) {
|
|
return Math.max(0, exponent$1(max = Math.abs(max) - (step = Math.abs(step))) - exponent$1(step)) + 1;
|
|
}
|
|
defaultLocale({
|
|
thousands: ",",
|
|
grouping: [
|
|
3
|
|
],
|
|
currency: [
|
|
"$",
|
|
""
|
|
]
|
|
});
|
|
var pi$3 = Math.PI, halfPi$2 = pi$3 / 2, quarterPi = pi$3 / 4, tau$4 = 2 * pi$3, degrees$2 = 180 / pi$3, radians$1 = pi$3 / 180, abs$2 = Math.abs, atan = Math.atan, atan2 = Math.atan2, cos$1 = Math.cos, ceil = Math.ceil, exp = Math.exp, hypot = Math.hypot, log = Math.log, pow$1 = Math.pow, sin$1 = Math.sin, sign = Math.sign || function(x) {
|
|
return x > 0 ? 1 : x < 0 ? -1 : 0;
|
|
}, sqrt = Math.sqrt, tan = Math.tan;
|
|
function acos(x) {
|
|
return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
|
|
}
|
|
function asin(x) {
|
|
return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
|
|
}
|
|
function noop$2() {}
|
|
function streamGeometry(geometry, stream) {
|
|
geometry && streamGeometryType.hasOwnProperty(geometry.type) && streamGeometryType[geometry.type](geometry, stream);
|
|
}
|
|
var streamObjectType = {
|
|
Feature: function(object, stream) {
|
|
streamGeometry(object.geometry, stream);
|
|
},
|
|
FeatureCollection: function(object, stream) {
|
|
for(var features = object.features, i = -1, n = features.length; ++i < n;)streamGeometry(features[i].geometry, stream);
|
|
}
|
|
}, streamGeometryType = {
|
|
Sphere: function(object, stream) {
|
|
stream.sphere();
|
|
},
|
|
Point: function(object, stream) {
|
|
object = object.coordinates, stream.point(object[0], object[1], object[2]);
|
|
},
|
|
MultiPoint: function(object, stream) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)object = coordinates[i], stream.point(object[0], object[1], object[2]);
|
|
},
|
|
LineString: function(object, stream) {
|
|
streamLine(object.coordinates, stream, 0);
|
|
},
|
|
MultiLineString: function(object, stream) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)streamLine(coordinates[i], stream, 0);
|
|
},
|
|
Polygon: function(object, stream) {
|
|
streamPolygon(object.coordinates, stream);
|
|
},
|
|
MultiPolygon: function(object, stream) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)streamPolygon(coordinates[i], stream);
|
|
},
|
|
GeometryCollection: function(object, stream) {
|
|
for(var geometries = object.geometries, i = -1, n = geometries.length; ++i < n;)streamGeometry(geometries[i], stream);
|
|
}
|
|
};
|
|
function streamLine(coordinates, stream, closed) {
|
|
var coordinate, i = -1, n = coordinates.length - closed;
|
|
for(stream.lineStart(); ++i < n;)coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
|
|
stream.lineEnd();
|
|
}
|
|
function streamPolygon(coordinates, stream) {
|
|
var i = -1, n = coordinates.length;
|
|
for(stream.polygonStart(); ++i < n;)streamLine(coordinates[i], stream, 1);
|
|
stream.polygonEnd();
|
|
}
|
|
function geoStream(object, stream) {
|
|
object && streamObjectType.hasOwnProperty(object.type) ? streamObjectType[object.type](object, stream) : streamGeometry(object, stream);
|
|
}
|
|
var prefixExponent, locale, lambda00, phi00, lambda0, cosPhi0, sinPhi0, areaRingSum = new Adder(), areaSum = new Adder(), areaStream = {
|
|
point: noop$2,
|
|
lineStart: noop$2,
|
|
lineEnd: noop$2,
|
|
polygonStart: function() {
|
|
areaRingSum = new Adder(), areaStream.lineStart = areaRingStart, areaStream.lineEnd = areaRingEnd;
|
|
},
|
|
polygonEnd: function() {
|
|
var areaRing = +areaRingSum;
|
|
areaSum.add(areaRing < 0 ? tau$4 + areaRing : areaRing), this.lineStart = this.lineEnd = this.point = noop$2;
|
|
},
|
|
sphere: function() {
|
|
areaSum.add(tau$4);
|
|
}
|
|
};
|
|
function areaRingStart() {
|
|
areaStream.point = areaPointFirst;
|
|
}
|
|
function areaRingEnd() {
|
|
areaPoint(lambda00, phi00);
|
|
}
|
|
function areaPointFirst(lambda, phi) {
|
|
areaStream.point = areaPoint, lambda00 = lambda, phi00 = phi, lambda *= radians$1, phi *= radians$1, lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
|
|
}
|
|
function areaPoint(lambda, phi) {
|
|
lambda *= radians$1, phi *= radians$1;
|
|
var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi = phi / 2 + quarterPi), sinPhi = sin$1(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda);
|
|
areaRingSum.add(atan2(v, u)), lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
|
|
}
|
|
function spherical(cartesian) {
|
|
return [
|
|
atan2(cartesian[1], cartesian[0]),
|
|
asin(cartesian[2])
|
|
];
|
|
}
|
|
function cartesian(spherical) {
|
|
var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
|
|
return [
|
|
cosPhi * cos$1(lambda),
|
|
cosPhi * sin$1(lambda),
|
|
sin$1(phi)
|
|
];
|
|
}
|
|
function cartesianDot(a, b) {
|
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
}
|
|
function cartesianCross(a, b) {
|
|
return [
|
|
a[1] * b[2] - a[2] * b[1],
|
|
a[2] * b[0] - a[0] * b[2],
|
|
a[0] * b[1] - a[1] * b[0]
|
|
];
|
|
}
|
|
function cartesianAddInPlace(a, b) {
|
|
a[0] += b[0], a[1] += b[1], a[2] += b[2];
|
|
}
|
|
function cartesianScale(vector, k) {
|
|
return [
|
|
vector[0] * k,
|
|
vector[1] * k,
|
|
vector[2] * k
|
|
];
|
|
}
|
|
function cartesianNormalizeInPlace(d) {
|
|
var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
|
|
d[0] /= l, d[1] /= l, d[2] /= l;
|
|
}
|
|
var boundsStream = {
|
|
point: boundsPoint,
|
|
lineStart: boundsLineStart,
|
|
lineEnd: boundsLineEnd,
|
|
polygonStart: function() {
|
|
boundsStream.point = boundsRingPoint, boundsStream.lineStart = boundsRingStart, boundsStream.lineEnd = boundsRingEnd, deltaSum = new Adder(), areaStream.polygonStart();
|
|
},
|
|
polygonEnd: function() {
|
|
areaStream.polygonEnd(), boundsStream.point = boundsPoint, boundsStream.lineStart = boundsLineStart, boundsStream.lineEnd = boundsLineEnd, areaRingSum < 0 ? (lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90)) : deltaSum > 1e-6 ? phi1 = 90 : deltaSum < -0.000001 && (phi0 = -90), range$1[0] = lambda0$1, range$1[1] = lambda1;
|
|
},
|
|
sphere: function() {
|
|
lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
|
|
}
|
|
};
|
|
function boundsPoint(lambda, phi) {
|
|
ranges.push(range$1 = [
|
|
lambda0$1 = lambda,
|
|
lambda1 = lambda
|
|
]), phi < phi0 && (phi0 = phi), phi > phi1 && (phi1 = phi);
|
|
}
|
|
function linePoint(lambda, phi) {
|
|
var p = cartesian([
|
|
lambda * radians$1,
|
|
phi * radians$1
|
|
]);
|
|
if (p0) {
|
|
var normal = cartesianCross(p0, p), inflection = cartesianCross([
|
|
normal[1],
|
|
-normal[0],
|
|
0
|
|
], normal);
|
|
cartesianNormalizeInPlace(inflection);
|
|
var phii, delta = lambda - lambda2, sign = delta > 0 ? 1 : -1, lambdai = (inflection = spherical(inflection))[0] * degrees$2 * sign, antimeridian = abs$2(delta) > 180;
|
|
antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda) ? (phii = inflection[1] * degrees$2) > phi1 && (phi1 = phii) : antimeridian ^ (sign * lambda2 < (lambdai = (lambdai + 360) % 360 - 180) && lambdai < sign * lambda) ? (phii = -inflection[1] * degrees$2) < phi0 && (phi0 = phii) : (phi < phi0 && (phi0 = phi), phi > phi1 && (phi1 = phi)), antimeridian ? lambda < lambda2 ? angle(lambda0$1, lambda) > angle(lambda0$1, lambda1) && (lambda1 = lambda) : angle(lambda, lambda1) > angle(lambda0$1, lambda1) && (lambda0$1 = lambda) : lambda1 >= lambda0$1 ? (lambda < lambda0$1 && (lambda0$1 = lambda), lambda > lambda1 && (lambda1 = lambda)) : lambda > lambda2 ? angle(lambda0$1, lambda) > angle(lambda0$1, lambda1) && (lambda1 = lambda) : angle(lambda, lambda1) > angle(lambda0$1, lambda1) && (lambda0$1 = lambda);
|
|
} else ranges.push(range$1 = [
|
|
lambda0$1 = lambda,
|
|
lambda1 = lambda
|
|
]);
|
|
phi < phi0 && (phi0 = phi), phi > phi1 && (phi1 = phi), p0 = p, lambda2 = lambda;
|
|
}
|
|
function boundsLineStart() {
|
|
boundsStream.point = linePoint;
|
|
}
|
|
function boundsLineEnd() {
|
|
range$1[0] = lambda0$1, range$1[1] = lambda1, boundsStream.point = boundsPoint, p0 = null;
|
|
}
|
|
function boundsRingPoint(lambda, phi) {
|
|
if (p0) {
|
|
var delta = lambda - lambda2;
|
|
deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
|
|
} else lambda00$1 = lambda, phi00$1 = phi;
|
|
areaStream.point(lambda, phi), linePoint(lambda, phi);
|
|
}
|
|
function boundsRingStart() {
|
|
areaStream.lineStart();
|
|
}
|
|
function boundsRingEnd() {
|
|
boundsRingPoint(lambda00$1, phi00$1), areaStream.lineEnd(), abs$2(deltaSum) > 1e-6 && (lambda0$1 = -(lambda1 = 180)), range$1[0] = lambda0$1, range$1[1] = lambda1, p0 = null;
|
|
}
|
|
function angle(lambda0, lambda1) {
|
|
return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
|
|
}
|
|
function rangeCompare(a, b) {
|
|
return a[0] - b[0];
|
|
}
|
|
function rangeContains(range, x) {
|
|
return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
|
|
}
|
|
var centroidStream = {
|
|
sphere: noop$2,
|
|
point: centroidPoint,
|
|
lineStart: centroidLineStart,
|
|
lineEnd: centroidLineEnd,
|
|
polygonStart: function() {
|
|
centroidStream.lineStart = centroidRingStart, centroidStream.lineEnd = centroidRingEnd;
|
|
},
|
|
polygonEnd: function() {
|
|
centroidStream.lineStart = centroidLineStart, centroidStream.lineEnd = centroidLineEnd;
|
|
}
|
|
};
|
|
function centroidPoint(lambda, phi) {
|
|
lambda *= radians$1;
|
|
var cosPhi = cos$1(phi *= radians$1);
|
|
centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
|
|
}
|
|
function centroidPointCartesian(x, y, z) {
|
|
++W0, X0 += (x - X0) / W0, Y0 += (y - Y0) / W0, Z0 += (z - Z0) / W0;
|
|
}
|
|
function centroidLineStart() {
|
|
centroidStream.point = centroidLinePointFirst;
|
|
}
|
|
function centroidLinePointFirst(lambda, phi) {
|
|
lambda *= radians$1;
|
|
var cosPhi = cos$1(phi *= radians$1);
|
|
x0 = cosPhi * cos$1(lambda), y0 = cosPhi * sin$1(lambda), z0 = sin$1(phi), centroidStream.point = centroidLinePoint, centroidPointCartesian(x0, y0, z0);
|
|
}
|
|
function centroidLinePoint(lambda, phi) {
|
|
lambda *= radians$1;
|
|
var cosPhi = cos$1(phi *= radians$1), x = cosPhi * cos$1(lambda), y = cosPhi * sin$1(lambda), z = sin$1(phi), w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
|
|
W1 += w, X1 += w * (x0 + (x0 = x)), Y1 += w * (y0 + (y0 = y)), Z1 += w * (z0 + (z0 = z)), centroidPointCartesian(x0, y0, z0);
|
|
}
|
|
function centroidLineEnd() {
|
|
centroidStream.point = centroidPoint;
|
|
}
|
|
function centroidRingStart() {
|
|
centroidStream.point = centroidRingPointFirst;
|
|
}
|
|
function centroidRingEnd() {
|
|
centroidRingPoint(lambda00$2, phi00$2), centroidStream.point = centroidPoint;
|
|
}
|
|
function centroidRingPointFirst(lambda, phi) {
|
|
lambda00$2 = lambda, phi00$2 = phi, lambda *= radians$1, phi *= radians$1, centroidStream.point = centroidRingPoint;
|
|
var cosPhi = cos$1(phi);
|
|
centroidPointCartesian(x0 = cosPhi * cos$1(lambda), y0 = cosPhi * sin$1(lambda), z0 = sin$1(phi));
|
|
}
|
|
function centroidRingPoint(lambda, phi) {
|
|
lambda *= radians$1;
|
|
var cosPhi = cos$1(phi *= radians$1), x = cosPhi * cos$1(lambda), y = cosPhi * sin$1(lambda), z = sin$1(phi), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = hypot(cx, cy, cz), w = asin(m), v = m && -w / m;
|
|
X2.add(v * cx), Y2.add(v * cy), Z2.add(v * cz), W1 += w, X1 += w * (x0 + (x0 = x)), Y1 += w * (y0 + (y0 = y)), Z1 += w * (z0 + (z0 = z)), centroidPointCartesian(x0, y0, z0);
|
|
}
|
|
function constant$8(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
function compose(a, b) {
|
|
function compose(x, y) {
|
|
return b((x = a(x, y))[0], x[1]);
|
|
}
|
|
return a.invert && b.invert && (compose.invert = function(x, y) {
|
|
return (x = b.invert(x, y)) && a.invert(x[0], x[1]);
|
|
}), compose;
|
|
}
|
|
function rotationIdentity(lambda, phi) {
|
|
return [
|
|
abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$4) * tau$4 : lambda,
|
|
phi
|
|
];
|
|
}
|
|
function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
|
|
return (deltaLambda %= tau$4) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;
|
|
}
|
|
function forwardRotationLambda(deltaLambda) {
|
|
return function(lambda, phi) {
|
|
return [
|
|
(lambda += deltaLambda) > pi$3 ? lambda - tau$4 : lambda < -pi$3 ? lambda + tau$4 : lambda,
|
|
phi
|
|
];
|
|
};
|
|
}
|
|
function rotationLambda(deltaLambda) {
|
|
var rotation = forwardRotationLambda(deltaLambda);
|
|
return rotation.invert = forwardRotationLambda(-deltaLambda), rotation;
|
|
}
|
|
function rotationPhiGamma(deltaPhi, deltaGamma) {
|
|
var cosDeltaPhi = cos$1(deltaPhi), sinDeltaPhi = sin$1(deltaPhi), cosDeltaGamma = cos$1(deltaGamma), sinDeltaGamma = sin$1(deltaGamma);
|
|
function rotation(lambda, phi) {
|
|
var cosPhi = cos$1(phi), x = cos$1(lambda) * cosPhi, y = sin$1(lambda) * cosPhi, z = sin$1(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;
|
|
return [
|
|
atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
|
|
asin(k * cosDeltaGamma + y * sinDeltaGamma)
|
|
];
|
|
}
|
|
return rotation.invert = function(lambda, phi) {
|
|
var cosPhi = cos$1(phi), x = cos$1(lambda) * cosPhi, y = sin$1(lambda) * cosPhi, z = sin$1(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;
|
|
return [
|
|
atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
|
|
asin(k * cosDeltaPhi - x * sinDeltaPhi)
|
|
];
|
|
}, rotation;
|
|
}
|
|
function rotation(rotate) {
|
|
function forward(coordinates) {
|
|
return coordinates = rotate(coordinates[0] * radians$1, coordinates[1] * radians$1), coordinates[0] *= degrees$2, coordinates[1] *= degrees$2, coordinates;
|
|
}
|
|
return rotate = rotateRadians(rotate[0] * radians$1, rotate[1] * radians$1, rotate.length > 2 ? rotate[2] * radians$1 : 0), forward.invert = function(coordinates) {
|
|
return coordinates = rotate.invert(coordinates[0] * radians$1, coordinates[1] * radians$1), coordinates[0] *= degrees$2, coordinates[1] *= degrees$2, coordinates;
|
|
}, forward;
|
|
}
|
|
function circleStream(stream, radius, delta, direction, t0, t1) {
|
|
if (delta) {
|
|
var cosRadius = cos$1(radius), sinRadius = sin$1(radius), step = direction * delta;
|
|
null == t0 ? (t0 = radius + direction * tau$4, t1 = radius - step / 2) : (t0 = circleRadius(cosRadius, t0), t1 = circleRadius(cosRadius, t1), (direction > 0 ? t0 < t1 : t0 > t1) && (t0 += direction * tau$4));
|
|
for(var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step)point = spherical([
|
|
cosRadius,
|
|
-sinRadius * cos$1(t),
|
|
-sinRadius * sin$1(t)
|
|
]), stream.point(point[0], point[1]);
|
|
}
|
|
}
|
|
function circleRadius(cosRadius, point) {
|
|
point = cartesian(point), point[0] -= cosRadius, cartesianNormalizeInPlace(point);
|
|
var radius = acos(-point[1]);
|
|
return ((0 > -point[2] ? -radius : radius) + tau$4 - 1e-6) % tau$4;
|
|
}
|
|
function clipBuffer() {
|
|
var line, lines = [];
|
|
return {
|
|
point: function(x, y, m) {
|
|
line.push([
|
|
x,
|
|
y,
|
|
m
|
|
]);
|
|
},
|
|
lineStart: function() {
|
|
lines.push(line = []);
|
|
},
|
|
lineEnd: noop$2,
|
|
rejoin: function() {
|
|
lines.length > 1 && lines.push(lines.pop().concat(lines.shift()));
|
|
},
|
|
result: function() {
|
|
var result = lines;
|
|
return lines = [], line = null, result;
|
|
}
|
|
};
|
|
}
|
|
function pointEqual(a, b) {
|
|
return 1e-6 > abs$2(a[0] - b[0]) && 1e-6 > abs$2(a[1] - b[1]);
|
|
}
|
|
function Intersection(point, points, other, entry) {
|
|
this.x = point, this.z = points, this.o = other, this.e = entry, this.v = !1, this.n = this.p = null;
|
|
}
|
|
function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
|
|
var i, n, subject = [], clip = [];
|
|
if (segments.forEach(function(segment) {
|
|
if (!((n = segment.length - 1) <= 0)) {
|
|
var n, x, p0 = segment[0], p1 = segment[n];
|
|
if (pointEqual(p0, p1)) {
|
|
if (!p0[2] && !p1[2]) {
|
|
for(stream.lineStart(), i = 0; i < n; ++i)stream.point((p0 = segment[i])[0], p0[1]);
|
|
stream.lineEnd();
|
|
return;
|
|
}
|
|
p1[0] += 0.000002;
|
|
}
|
|
subject.push(x = new Intersection(p0, segment, null, !0)), clip.push(x.o = new Intersection(p0, null, x, !1)), subject.push(x = new Intersection(p1, segment, null, !1)), clip.push(x.o = new Intersection(p1, null, x, !0));
|
|
}
|
|
}), subject.length) {
|
|
for(clip.sort(compareIntersection), link$1(subject), link$1(clip), i = 0, n = clip.length; i < n; ++i)clip[i].e = startInside = !startInside;
|
|
for(var points, point, start = subject[0];;){
|
|
for(var current = start, isSubject = !0; current.v;)if ((current = current.n) === start) return;
|
|
points = current.z, stream.lineStart();
|
|
do {
|
|
if (current.v = current.o.v = !0, current.e) {
|
|
if (isSubject) for(i = 0, n = points.length; i < n; ++i)stream.point((point = points[i])[0], point[1]);
|
|
else interpolate(current.x, current.n.x, 1, stream);
|
|
current = current.n;
|
|
} else {
|
|
if (isSubject) for(i = (points = current.p.z).length - 1; i >= 0; --i)stream.point((point = points[i])[0], point[1]);
|
|
else interpolate(current.x, current.p.x, -1, stream);
|
|
current = current.p;
|
|
}
|
|
points = (current = current.o).z, isSubject = !isSubject;
|
|
}while (!current.v)
|
|
stream.lineEnd();
|
|
}
|
|
}
|
|
}
|
|
function link$1(array) {
|
|
if (n = array.length) {
|
|
for(var n, b, i = 0, a = array[0]; ++i < n;)a.n = b = array[i], b.p = a, a = b;
|
|
a.n = b = array[0], b.p = a;
|
|
}
|
|
}
|
|
function longitude(point) {
|
|
return abs$2(point[0]) <= pi$3 ? point[0] : sign(point[0]) * ((abs$2(point[0]) + pi$3) % tau$4 - pi$3);
|
|
}
|
|
function polygonContains(polygon, point) {
|
|
var lambda = longitude(point), phi = point[1], sinPhi = sin$1(phi), normal = [
|
|
sin$1(lambda),
|
|
-cos$1(lambda),
|
|
0
|
|
], angle = 0, winding = 0, sum = new Adder();
|
|
1 === sinPhi ? phi = halfPi$2 + 1e-6 : -1 === sinPhi && (phi = -halfPi$2 - 1e-6);
|
|
for(var i = 0, n = polygon.length; i < n; ++i)if (m = (ring = polygon[i]).length) for(var ring, m, point0 = ring[m - 1], lambda0 = longitude(point0), phi0 = point0[1] / 2 + quarterPi, sinPhi0 = sin$1(phi0), cosPhi0 = cos$1(phi0), j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1){
|
|
var point1 = ring[j], lambda1 = longitude(point1), phi1 = point1[1] / 2 + quarterPi, sinPhi1 = sin$1(phi1), cosPhi1 = cos$1(phi1), delta = lambda1 - lambda0, sign = delta >= 0 ? 1 : -1, absDelta = sign * delta, antimeridian = absDelta > pi$3, k = sinPhi0 * sinPhi1;
|
|
if (sum.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))), angle += antimeridian ? delta + sign * tau$4 : delta, antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
|
|
var arc = cartesianCross(cartesian(point0), cartesian(point1));
|
|
cartesianNormalizeInPlace(arc);
|
|
var intersection = cartesianCross(normal, arc);
|
|
cartesianNormalizeInPlace(intersection);
|
|
var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
|
|
(phi > phiArc || phi === phiArc && (arc[0] || arc[1])) && (winding += antimeridian ^ delta >= 0 ? 1 : -1);
|
|
}
|
|
}
|
|
return (angle < -0.000001 || angle < 1e-6 && sum < -0.000000000001) ^ 1 & winding;
|
|
}
|
|
function clip(pointVisible, clipLine, interpolate, start) {
|
|
return function(sink) {
|
|
var polygon, segments, ring, line = clipLine(sink), ringBuffer = clipBuffer(), ringSink = clipLine(ringBuffer), polygonStarted = !1, clip = {
|
|
point: point,
|
|
lineStart: lineStart,
|
|
lineEnd: lineEnd,
|
|
polygonStart: function() {
|
|
clip.point = pointRing, clip.lineStart = ringStart, clip.lineEnd = ringEnd, segments = [], polygon = [];
|
|
},
|
|
polygonEnd: function() {
|
|
clip.point = point, clip.lineStart = lineStart, clip.lineEnd = lineEnd, segments = merge(segments);
|
|
var startInside = polygonContains(polygon, start);
|
|
segments.length ? (polygonStarted || (sink.polygonStart(), polygonStarted = !0), clipRejoin(segments, compareIntersection, startInside, interpolate, sink)) : startInside && (polygonStarted || (sink.polygonStart(), polygonStarted = !0), sink.lineStart(), interpolate(null, null, 1, sink), sink.lineEnd()), polygonStarted && (sink.polygonEnd(), polygonStarted = !1), segments = polygon = null;
|
|
},
|
|
sphere: function() {
|
|
sink.polygonStart(), sink.lineStart(), interpolate(null, null, 1, sink), sink.lineEnd(), sink.polygonEnd();
|
|
}
|
|
};
|
|
function point(lambda, phi) {
|
|
pointVisible(lambda, phi) && sink.point(lambda, phi);
|
|
}
|
|
function pointLine(lambda, phi) {
|
|
line.point(lambda, phi);
|
|
}
|
|
function lineStart() {
|
|
clip.point = pointLine, line.lineStart();
|
|
}
|
|
function lineEnd() {
|
|
clip.point = point, line.lineEnd();
|
|
}
|
|
function pointRing(lambda, phi) {
|
|
ring.push([
|
|
lambda,
|
|
phi
|
|
]), ringSink.point(lambda, phi);
|
|
}
|
|
function ringStart() {
|
|
ringSink.lineStart(), ring = [];
|
|
}
|
|
function ringEnd() {
|
|
pointRing(ring[0][0], ring[0][1]), ringSink.lineEnd();
|
|
var i, m, segment, point, clean = ringSink.clean(), ringSegments = ringBuffer.result(), n = ringSegments.length;
|
|
if (ring.pop(), polygon.push(ring), ring = null, n) {
|
|
if (1 & clean) {
|
|
if ((m = (segment = ringSegments[0]).length - 1) > 0) {
|
|
for(polygonStarted || (sink.polygonStart(), polygonStarted = !0), sink.lineStart(), i = 0; i < m; ++i)sink.point((point = segment[i])[0], point[1]);
|
|
sink.lineEnd();
|
|
}
|
|
return;
|
|
}
|
|
n > 1 && 2 & clean && ringSegments.push(ringSegments.pop().concat(ringSegments.shift())), segments.push(ringSegments.filter(validSegment));
|
|
}
|
|
}
|
|
return clip;
|
|
};
|
|
}
|
|
function validSegment(segment) {
|
|
return segment.length > 1;
|
|
}
|
|
function compareIntersection(a, b) {
|
|
return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - 1e-6 : halfPi$2 - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - 1e-6 : halfPi$2 - b[1]);
|
|
}
|
|
rotationIdentity.invert = rotationIdentity;
|
|
var clipAntimeridian = clip(function() {
|
|
return !0;
|
|
}, function(stream) {
|
|
var clean, lambda0 = NaN, phi0 = NaN, sign0 = NaN;
|
|
return {
|
|
lineStart: function() {
|
|
stream.lineStart(), clean = 1;
|
|
},
|
|
point: function(lambda1, phi1) {
|
|
var lambda01, phi01, lambda11, cosPhi0, cosPhi1, sinLambda0Lambda1, sign1 = lambda1 > 0 ? pi$3 : -pi$3, delta = abs$2(lambda1 - lambda0);
|
|
1e-6 > abs$2(delta - pi$3) ? (stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2), stream.point(sign0, phi0), stream.lineEnd(), stream.lineStart(), stream.point(sign1, phi0), stream.point(lambda1, phi0), clean = 0) : sign0 !== sign1 && delta >= pi$3 && (1e-6 > abs$2(lambda0 - sign0) && (lambda0 -= 1e-6 * sign0), 1e-6 > abs$2(lambda1 - sign1) && (lambda1 -= 1e-6 * sign1), lambda01 = lambda0, phi01 = phi0, phi0 = abs$2(sinLambda0Lambda1 = sin$1(lambda01 - (lambda11 = lambda1))) > 1e-6 ? atan((sin$1(phi01) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda11) - sin$1(phi1) * (cosPhi0 = cos$1(phi01)) * sin$1(lambda01)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi01 + phi1) / 2, stream.point(sign0, phi0), stream.lineEnd(), stream.lineStart(), stream.point(sign1, phi0), clean = 0), stream.point(lambda0 = lambda1, phi0 = phi1), sign0 = sign1;
|
|
},
|
|
lineEnd: function() {
|
|
stream.lineEnd(), lambda0 = phi0 = NaN;
|
|
},
|
|
clean: function() {
|
|
return 2 - clean;
|
|
}
|
|
};
|
|
}, function(from, to, direction, stream) {
|
|
var phi;
|
|
if (null == from) phi = direction * halfPi$2, stream.point(-pi$3, phi), stream.point(0, phi), stream.point(pi$3, phi), stream.point(pi$3, 0), stream.point(pi$3, -phi), stream.point(0, -phi), stream.point(-pi$3, -phi), stream.point(-pi$3, 0), stream.point(-pi$3, phi);
|
|
else if (abs$2(from[0] - to[0]) > 1e-6) {
|
|
var lambda = from[0] < to[0] ? pi$3 : -pi$3;
|
|
phi = direction * lambda / 2, stream.point(-lambda, phi), stream.point(0, phi), stream.point(lambda, phi);
|
|
} else stream.point(to[0], to[1]);
|
|
}, [
|
|
-pi$3,
|
|
-halfPi$2
|
|
]);
|
|
function clipCircle(radius) {
|
|
var cr = cos$1(radius), delta = 6 * radians$1, smallRadius = cr > 0, notHemisphere = abs$2(cr) > 1e-6;
|
|
function visible(lambda, phi) {
|
|
return cos$1(lambda) * cos$1(phi) > cr;
|
|
}
|
|
function intersect(a, b, two) {
|
|
var pa = cartesian(a), pb = cartesian(b), n1 = [
|
|
1,
|
|
0,
|
|
0
|
|
], n2 = cartesianCross(pa, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
|
|
if (!determinant) return !two && a;
|
|
var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A = cartesianScale(n1, c1);
|
|
cartesianAddInPlace(A, cartesianScale(n2, c2));
|
|
var w = cartesianDot(A, n1xn2), uu = cartesianDot(n1xn2, n1xn2), t2 = w * w - uu * (cartesianDot(A, A) - 1);
|
|
if (!(t2 < 0)) {
|
|
var t = sqrt(t2), q = cartesianScale(n1xn2, (-w - t) / uu);
|
|
if (cartesianAddInPlace(q, A), q = spherical(q), !two) return q;
|
|
var z, lambda0 = a[0], lambda1 = b[0], phi0 = a[1], phi1 = b[1];
|
|
lambda1 < lambda0 && (z = lambda0, lambda0 = lambda1, lambda1 = z);
|
|
var delta = lambda1 - lambda0, polar = 1e-6 > abs$2(delta - pi$3), meridian = polar || delta < 1e-6;
|
|
if (!polar && phi1 < phi0 && (z = phi0, phi0 = phi1, phi1 = z), meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (1e-6 > abs$2(q[0] - lambda0) ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
|
|
var q1 = cartesianScale(n1xn2, (-w + t) / uu);
|
|
return cartesianAddInPlace(q1, A), [
|
|
q,
|
|
spherical(q1)
|
|
];
|
|
}
|
|
}
|
|
}
|
|
function code(lambda, phi) {
|
|
var r = smallRadius ? radius : pi$3 - radius, code = 0;
|
|
return lambda < -r ? code |= 1 : lambda > r && (code |= 2), phi < -r ? code |= 4 : phi > r && (code |= 8), code;
|
|
}
|
|
return clip(visible, function(stream) {
|
|
var point0, c0, v0, v00, clean;
|
|
return {
|
|
lineStart: function() {
|
|
v00 = v0 = !1, clean = 1;
|
|
},
|
|
point: function(lambda, phi) {
|
|
var t, point2, point1 = [
|
|
lambda,
|
|
phi
|
|
], v = visible(lambda, phi), c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
|
|
!point0 && (v00 = v0 = v) && stream.lineStart(), v !== v0 && (!(point2 = intersect(point0, point1)) || pointEqual(point0, point2) || pointEqual(point1, point2)) && (point1[2] = 1), v !== v0 ? (clean = 0, v ? (stream.lineStart(), point2 = intersect(point1, point0), stream.point(point2[0], point2[1])) : (point2 = intersect(point0, point1), stream.point(point2[0], point2[1], 2), stream.lineEnd()), point0 = point2) : notHemisphere && point0 && smallRadius ^ v && !(c & c0) && (t = intersect(point1, point0, !0)) && (clean = 0, smallRadius ? (stream.lineStart(), stream.point(t[0][0], t[0][1]), stream.point(t[1][0], t[1][1]), stream.lineEnd()) : (stream.point(t[1][0], t[1][1]), stream.lineEnd(), stream.lineStart(), stream.point(t[0][0], t[0][1], 3))), !v || point0 && pointEqual(point0, point1) || stream.point(point1[0], point1[1]), point0 = point1, v0 = v, c0 = c;
|
|
},
|
|
lineEnd: function() {
|
|
v0 && stream.lineEnd(), point0 = null;
|
|
},
|
|
clean: function() {
|
|
return clean | (v00 && v0) << 1;
|
|
}
|
|
};
|
|
}, function(from, to, direction, stream) {
|
|
circleStream(stream, radius, delta, direction, from, to);
|
|
}, smallRadius ? [
|
|
0,
|
|
-radius
|
|
] : [
|
|
-pi$3,
|
|
radius - pi$3
|
|
]);
|
|
}
|
|
function clipRectangle(x0, y0, x1, y1) {
|
|
function visible(x, y) {
|
|
return x0 <= x && x <= x1 && y0 <= y && y <= y1;
|
|
}
|
|
function interpolate(from, to, direction, stream) {
|
|
var a = 0, a1 = 0;
|
|
if (null == from || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || 0 > comparePoint(from, to) ^ direction > 0) do stream.point(0 === a || 3 === a ? x0 : x1, a > 1 ? y1 : y0);
|
|
while ((a = (a + direction + 4) % 4) !== a1)
|
|
else stream.point(to[0], to[1]);
|
|
}
|
|
function corner(p, direction) {
|
|
return 1e-6 > abs$2(p[0] - x0) ? direction > 0 ? 0 : 3 : 1e-6 > abs$2(p[0] - x1) ? direction > 0 ? 2 : 1 : 1e-6 > abs$2(p[1] - y0) ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
|
|
}
|
|
function compareIntersection(a, b) {
|
|
return comparePoint(a.x, b.x);
|
|
}
|
|
function comparePoint(a, b) {
|
|
var ca = corner(a, 1), cb = corner(b, 1);
|
|
return ca !== cb ? ca - cb : 0 === ca ? b[1] - a[1] : 1 === ca ? a[0] - b[0] : 2 === ca ? a[1] - b[1] : b[0] - a[0];
|
|
}
|
|
return function(stream) {
|
|
var segments, polygon, ring, x__, y__, v__, x_, y_, v_, first, clean, activeStream = stream, bufferStream = clipBuffer(), clipStream = {
|
|
point: point,
|
|
lineStart: function() {
|
|
clipStream.point = linePoint, polygon && polygon.push(ring = []), first = !0, v_ = !1, x_ = y_ = NaN;
|
|
},
|
|
lineEnd: function() {
|
|
segments && (linePoint(x__, y__), v__ && v_ && bufferStream.rejoin(), segments.push(bufferStream.result())), clipStream.point = point, v_ && activeStream.lineEnd();
|
|
},
|
|
polygonStart: function() {
|
|
activeStream = bufferStream, segments = [], polygon = [], clean = !0;
|
|
},
|
|
polygonEnd: function() {
|
|
var startInside = function() {
|
|
for(var winding = 0, i = 0, n = polygon.length; i < n; ++i)for(var a0, a1, ring = polygon[i], j = 1, m = ring.length, point = ring[0], b0 = point[0], b1 = point[1]; j < m; ++j)a0 = b0, a1 = b1, b0 = (point = ring[j])[0], b1 = point[1], a1 <= y1 ? b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0) && ++winding : b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0) && --winding;
|
|
return winding;
|
|
}(), cleanInside = clean && startInside, visible = (segments = merge(segments)).length;
|
|
(cleanInside || visible) && (stream.polygonStart(), cleanInside && (stream.lineStart(), interpolate(null, null, 1, stream), stream.lineEnd()), visible && clipRejoin(segments, compareIntersection, startInside, interpolate, stream), stream.polygonEnd()), activeStream = stream, segments = polygon = ring = null;
|
|
}
|
|
};
|
|
function point(x, y) {
|
|
visible(x, y) && activeStream.point(x, y);
|
|
}
|
|
function linePoint(x, y) {
|
|
var v = visible(x, y);
|
|
if (polygon && ring.push([
|
|
x,
|
|
y
|
|
]), first) x__ = x, y__ = y, v__ = v, first = !1, v && (activeStream.lineStart(), activeStream.point(x, y));
|
|
else if (v && v_) activeStream.point(x, y);
|
|
else {
|
|
var a = [
|
|
x_ = Math.max(-1000000000, Math.min(1e9, x_)),
|
|
y_ = Math.max(-1000000000, Math.min(1e9, y_))
|
|
], b = [
|
|
x = Math.max(-1000000000, Math.min(1e9, x)),
|
|
y = Math.max(-1000000000, Math.min(1e9, y))
|
|
];
|
|
!function(a, b, x0, y0, x1, y1) {
|
|
var r, ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay;
|
|
if (r = x0 - ax, dx || !(r > 0)) {
|
|
if (r /= dx, dx < 0) {
|
|
if (r < t0) return;
|
|
r < t1 && (t1 = r);
|
|
} else if (dx > 0) {
|
|
if (r > t1) return;
|
|
r > t0 && (t0 = r);
|
|
}
|
|
if (r = x1 - ax, dx || !(r < 0)) {
|
|
if (r /= dx, dx < 0) {
|
|
if (r > t1) return;
|
|
r > t0 && (t0 = r);
|
|
} else if (dx > 0) {
|
|
if (r < t0) return;
|
|
r < t1 && (t1 = r);
|
|
}
|
|
if (r = y0 - ay, dy || !(r > 0)) {
|
|
if (r /= dy, dy < 0) {
|
|
if (r < t0) return;
|
|
r < t1 && (t1 = r);
|
|
} else if (dy > 0) {
|
|
if (r > t1) return;
|
|
r > t0 && (t0 = r);
|
|
}
|
|
if (r = y1 - ay, dy || !(r < 0)) {
|
|
if (r /= dy, dy < 0) {
|
|
if (r > t1) return;
|
|
r > t0 && (t0 = r);
|
|
} else if (dy > 0) {
|
|
if (r < t0) return;
|
|
r < t1 && (t1 = r);
|
|
}
|
|
return t0 > 0 && (a[0] = ax + t0 * dx, a[1] = ay + t0 * dy), t1 < 1 && (b[0] = ax + t1 * dx, b[1] = ay + t1 * dy), !0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}(a, b, x0, y0, x1, y1) ? v && (activeStream.lineStart(), activeStream.point(x, y), clean = !1) : (v_ || (activeStream.lineStart(), activeStream.point(a[0], a[1])), activeStream.point(b[0], b[1]), v || activeStream.lineEnd(), clean = !1);
|
|
}
|
|
x_ = x, y_ = y, v_ = v;
|
|
}
|
|
return clipStream;
|
|
};
|
|
}
|
|
var lengthStream = {
|
|
sphere: noop$2,
|
|
point: noop$2,
|
|
lineStart: function() {
|
|
lengthStream.point = lengthPointFirst, lengthStream.lineEnd = lengthLineEnd;
|
|
},
|
|
lineEnd: noop$2,
|
|
polygonStart: noop$2,
|
|
polygonEnd: noop$2
|
|
};
|
|
function lengthLineEnd() {
|
|
lengthStream.point = lengthStream.lineEnd = noop$2;
|
|
}
|
|
function lengthPointFirst(lambda, phi) {
|
|
lambda *= radians$1, phi *= radians$1, lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi), lengthStream.point = lengthPoint;
|
|
}
|
|
function lengthPoint(lambda, phi) {
|
|
lambda *= radians$1;
|
|
var sinPhi = sin$1(phi *= radians$1), cosPhi = cos$1(phi), delta = abs$2(lambda - lambda0$2), cosDelta = cos$1(delta), x = cosPhi * sin$1(delta), y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
|
|
lengthSum.add(atan2(sqrt(x * x + y * y), z)), lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
|
|
}
|
|
function length$2(object) {
|
|
return lengthSum = new Adder(), geoStream(object, lengthStream), +lengthSum;
|
|
}
|
|
var coordinates = [
|
|
null,
|
|
null
|
|
], object$1 = {
|
|
type: "LineString",
|
|
coordinates: coordinates
|
|
};
|
|
function distance(a, b) {
|
|
return coordinates[0] = a, coordinates[1] = b, length$2(object$1);
|
|
}
|
|
var containsObjectType = {
|
|
Feature: function(object, point) {
|
|
return containsGeometry(object.geometry, point);
|
|
},
|
|
FeatureCollection: function(object, point) {
|
|
for(var features = object.features, i = -1, n = features.length; ++i < n;)if (containsGeometry(features[i].geometry, point)) return !0;
|
|
return !1;
|
|
}
|
|
}, containsGeometryType = {
|
|
Sphere: function() {
|
|
return !0;
|
|
},
|
|
Point: function(object, point) {
|
|
return 0 === distance(object.coordinates, point);
|
|
},
|
|
MultiPoint: function(object, point) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)if (0 === distance(coordinates[i], point)) return !0;
|
|
return !1;
|
|
},
|
|
LineString: function(object, point) {
|
|
return containsLine(object.coordinates, point);
|
|
},
|
|
MultiLineString: function(object, point) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)if (containsLine(coordinates[i], point)) return !0;
|
|
return !1;
|
|
},
|
|
Polygon: function(object, point) {
|
|
return containsPolygon(object.coordinates, point);
|
|
},
|
|
MultiPolygon: function(object, point) {
|
|
for(var coordinates = object.coordinates, i = -1, n = coordinates.length; ++i < n;)if (containsPolygon(coordinates[i], point)) return !0;
|
|
return !1;
|
|
},
|
|
GeometryCollection: function(object, point) {
|
|
for(var geometries = object.geometries, i = -1, n = geometries.length; ++i < n;)if (containsGeometry(geometries[i], point)) return !0;
|
|
return !1;
|
|
}
|
|
};
|
|
function containsGeometry(geometry, point) {
|
|
return !!(geometry && containsGeometryType.hasOwnProperty(geometry.type)) && containsGeometryType[geometry.type](geometry, point);
|
|
}
|
|
function containsLine(coordinates, point) {
|
|
for(var ao, bo, ab, i = 0, n = coordinates.length; i < n; i++){
|
|
if (0 === (bo = distance(coordinates[i], point)) || i > 0 && (ab = distance(coordinates[i], coordinates[i - 1])) > 0 && ao <= ab && bo <= ab && (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < 1e-12 * ab) return !0;
|
|
ao = bo;
|
|
}
|
|
return !1;
|
|
}
|
|
function containsPolygon(coordinates, point) {
|
|
return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
|
|
}
|
|
function ringRadians(ring) {
|
|
return (ring = ring.map(pointRadians)).pop(), ring;
|
|
}
|
|
function pointRadians(point) {
|
|
return [
|
|
point[0] * radians$1,
|
|
point[1] * radians$1
|
|
];
|
|
}
|
|
function graticuleX(y0, y1, dy) {
|
|
var y = sequence(y0, y1 - 1e-6, dy).concat(y1);
|
|
return function(x) {
|
|
return y.map(function(y) {
|
|
return [
|
|
x,
|
|
y
|
|
];
|
|
});
|
|
};
|
|
}
|
|
function graticuleY(x0, x1, dx) {
|
|
var x = sequence(x0, x1 - 1e-6, dx).concat(x1);
|
|
return function(y) {
|
|
return x.map(function(x) {
|
|
return [
|
|
x,
|
|
y
|
|
];
|
|
});
|
|
};
|
|
}
|
|
function graticule() {
|
|
var x1, x0, X1, X0, y1, y0, Y1, Y0, x, y, X, Y, dx = 10, dy = 10, DX = 90, DY = 360, precision = 2.5;
|
|
function graticule() {
|
|
return {
|
|
type: "MultiLineString",
|
|
coordinates: lines()
|
|
};
|
|
}
|
|
function lines() {
|
|
return sequence(ceil(X0 / DX) * DX, X1, DX).map(X).concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
|
|
return abs$2(x % DX) > 1e-6;
|
|
}).map(x)).concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
|
|
return abs$2(y % DY) > 1e-6;
|
|
}).map(y));
|
|
}
|
|
return graticule.lines = function() {
|
|
return lines().map(function(coordinates) {
|
|
return {
|
|
type: "LineString",
|
|
coordinates: coordinates
|
|
};
|
|
});
|
|
}, graticule.outline = function() {
|
|
return {
|
|
type: "Polygon",
|
|
coordinates: [
|
|
X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1))
|
|
]
|
|
};
|
|
}, graticule.extent = function(_) {
|
|
return arguments.length ? graticule.extentMajor(_).extentMinor(_) : graticule.extentMinor();
|
|
}, graticule.extentMajor = function(_) {
|
|
return arguments.length ? (X0 = +_[0][0], X1 = +_[1][0], Y0 = +_[0][1], Y1 = +_[1][1], X0 > X1 && (_ = X0, X0 = X1, X1 = _), Y0 > Y1 && (_ = Y0, Y0 = Y1, Y1 = _), graticule.precision(precision)) : [
|
|
[
|
|
X0,
|
|
Y0
|
|
],
|
|
[
|
|
X1,
|
|
Y1
|
|
]
|
|
];
|
|
}, graticule.extentMinor = function(_) {
|
|
return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], x0 > x1 && (_ = x0, x0 = x1, x1 = _), y0 > y1 && (_ = y0, y0 = y1, y1 = _), graticule.precision(precision)) : [
|
|
[
|
|
x0,
|
|
y0
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
}, graticule.step = function(_) {
|
|
return arguments.length ? graticule.stepMajor(_).stepMinor(_) : graticule.stepMinor();
|
|
}, graticule.stepMajor = function(_) {
|
|
return arguments.length ? (DX = +_[0], DY = +_[1], graticule) : [
|
|
DX,
|
|
DY
|
|
];
|
|
}, graticule.stepMinor = function(_) {
|
|
return arguments.length ? (dx = +_[0], dy = +_[1], graticule) : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, graticule.precision = function(_) {
|
|
return arguments.length ? (precision = +_, x = graticuleX(y0, y1, 90), y = graticuleY(x0, x1, precision), X = graticuleX(Y0, Y1, 90), Y = graticuleY(X0, X1, precision), graticule) : precision;
|
|
}, graticule.extentMajor([
|
|
[
|
|
-180,
|
|
-89.999999
|
|
],
|
|
[
|
|
180,
|
|
89.999999
|
|
]
|
|
]).extentMinor([
|
|
[
|
|
-180,
|
|
-80.000001
|
|
],
|
|
[
|
|
180,
|
|
80.000001
|
|
]
|
|
]);
|
|
}
|
|
var lambda0$1, phi0, lambda1, phi1, lambda2, lambda00$1, phi00$1, p0, deltaSum, ranges, range$1, W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00$2, phi00$2, x0, y0, z0, lengthSum, lambda0$2, sinPhi0$1, cosPhi0$1, x00, y00, x0$1, y0$1, identity$4 = (x)=>x, areaSum$1 = new Adder(), areaRingSum$1 = new Adder(), areaStream$1 = {
|
|
point: noop$2,
|
|
lineStart: noop$2,
|
|
lineEnd: noop$2,
|
|
polygonStart: function() {
|
|
areaStream$1.lineStart = areaRingStart$1, areaStream$1.lineEnd = areaRingEnd$1;
|
|
},
|
|
polygonEnd: function() {
|
|
areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2, areaSum$1.add(abs$2(areaRingSum$1)), areaRingSum$1 = new Adder();
|
|
},
|
|
result: function() {
|
|
var area = areaSum$1 / 2;
|
|
return areaSum$1 = new Adder(), area;
|
|
}
|
|
};
|
|
function areaRingStart$1() {
|
|
areaStream$1.point = areaPointFirst$1;
|
|
}
|
|
function areaPointFirst$1(x, y) {
|
|
areaStream$1.point = areaPoint$1, x00 = x0$1 = x, y00 = y0$1 = y;
|
|
}
|
|
function areaPoint$1(x, y) {
|
|
areaRingSum$1.add(y0$1 * x - x0$1 * y), x0$1 = x, y0$1 = y;
|
|
}
|
|
function areaRingEnd$1() {
|
|
areaPoint$1(x00, y00);
|
|
}
|
|
var x00$1, y00$1, x0$3, y0$3, x0$2 = 1 / 0, y0$2 = 1 / 0, x1 = -1 / 0, y1 = x1, boundsStream$1 = {
|
|
point: function(x, y) {
|
|
x < x0$2 && (x0$2 = x), x > x1 && (x1 = x), y < y0$2 && (y0$2 = y), y > y1 && (y1 = y);
|
|
},
|
|
lineStart: noop$2,
|
|
lineEnd: noop$2,
|
|
polygonStart: noop$2,
|
|
polygonEnd: noop$2,
|
|
result: function() {
|
|
var bounds = [
|
|
[
|
|
x0$2,
|
|
y0$2
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
return x1 = y1 = -(y0$2 = x0$2 = 1 / 0), bounds;
|
|
}
|
|
}, X0$1 = 0, Y0$1 = 0, Z0$1 = 0, X1$1 = 0, Y1$1 = 0, Z1$1 = 0, X2$1 = 0, Y2$1 = 0, Z2$1 = 0, centroidStream$1 = {
|
|
point: centroidPoint$1,
|
|
lineStart: centroidLineStart$1,
|
|
lineEnd: centroidLineEnd$1,
|
|
polygonStart: function() {
|
|
centroidStream$1.lineStart = centroidRingStart$1, centroidStream$1.lineEnd = centroidRingEnd$1;
|
|
},
|
|
polygonEnd: function() {
|
|
centroidStream$1.point = centroidPoint$1, centroidStream$1.lineStart = centroidLineStart$1, centroidStream$1.lineEnd = centroidLineEnd$1;
|
|
},
|
|
result: function() {
|
|
var centroid = Z2$1 ? [
|
|
X2$1 / Z2$1,
|
|
Y2$1 / Z2$1
|
|
] : Z1$1 ? [
|
|
X1$1 / Z1$1,
|
|
Y1$1 / Z1$1
|
|
] : Z0$1 ? [
|
|
X0$1 / Z0$1,
|
|
Y0$1 / Z0$1
|
|
] : [
|
|
NaN,
|
|
NaN
|
|
];
|
|
return X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = X2$1 = Y2$1 = Z2$1 = 0, centroid;
|
|
}
|
|
};
|
|
function centroidPoint$1(x, y) {
|
|
X0$1 += x, Y0$1 += y, ++Z0$1;
|
|
}
|
|
function centroidLineStart$1() {
|
|
centroidStream$1.point = centroidPointFirstLine;
|
|
}
|
|
function centroidPointFirstLine(x, y) {
|
|
centroidStream$1.point = centroidPointLine, centroidPoint$1(x0$3 = x, y0$3 = y);
|
|
}
|
|
function centroidPointLine(x, y) {
|
|
var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
|
|
X1$1 += z * (x0$3 + x) / 2, Y1$1 += z * (y0$3 + y) / 2, Z1$1 += z, centroidPoint$1(x0$3 = x, y0$3 = y);
|
|
}
|
|
function centroidLineEnd$1() {
|
|
centroidStream$1.point = centroidPoint$1;
|
|
}
|
|
function centroidRingStart$1() {
|
|
centroidStream$1.point = centroidPointFirstRing;
|
|
}
|
|
function centroidRingEnd$1() {
|
|
centroidPointRing(x00$1, y00$1);
|
|
}
|
|
function centroidPointFirstRing(x, y) {
|
|
centroidStream$1.point = centroidPointRing, centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
|
|
}
|
|
function centroidPointRing(x, y) {
|
|
var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
|
|
X1$1 += z * (x0$3 + x) / 2, Y1$1 += z * (y0$3 + y) / 2, Z1$1 += z, X2$1 += (z = y0$3 * x - x0$3 * y) * (x0$3 + x), Y2$1 += z * (y0$3 + y), Z2$1 += 3 * z, centroidPoint$1(x0$3 = x, y0$3 = y);
|
|
}
|
|
function PathContext(context) {
|
|
this._context = context;
|
|
}
|
|
PathContext.prototype = {
|
|
_radius: 4.5,
|
|
pointRadius: function(_) {
|
|
return this._radius = _, this;
|
|
},
|
|
polygonStart: function() {
|
|
this._line = 0;
|
|
},
|
|
polygonEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
0 === this._line && this._context.closePath(), this._point = NaN;
|
|
},
|
|
point: function(x, y) {
|
|
switch(this._point){
|
|
case 0:
|
|
this._context.moveTo(x, y), this._point = 1;
|
|
break;
|
|
case 1:
|
|
this._context.lineTo(x, y);
|
|
break;
|
|
default:
|
|
this._context.moveTo(x + this._radius, y), this._context.arc(x, y, this._radius, 0, tau$4);
|
|
}
|
|
},
|
|
result: noop$2
|
|
};
|
|
var lengthRing, x00$2, y00$2, x0$4, y0$4, lengthSum$1 = new Adder(), lengthStream$1 = {
|
|
point: noop$2,
|
|
lineStart: function() {
|
|
lengthStream$1.point = lengthPointFirst$1;
|
|
},
|
|
lineEnd: function() {
|
|
lengthRing && lengthPoint$1(x00$2, y00$2), lengthStream$1.point = noop$2;
|
|
},
|
|
polygonStart: function() {
|
|
lengthRing = !0;
|
|
},
|
|
polygonEnd: function() {
|
|
lengthRing = null;
|
|
},
|
|
result: function() {
|
|
var length = +lengthSum$1;
|
|
return lengthSum$1 = new Adder(), length;
|
|
}
|
|
};
|
|
function lengthPointFirst$1(x, y) {
|
|
lengthStream$1.point = lengthPoint$1, x00$2 = x0$4 = x, y00$2 = y0$4 = y;
|
|
}
|
|
function lengthPoint$1(x, y) {
|
|
x0$4 -= x, y0$4 -= y, lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)), x0$4 = x, y0$4 = y;
|
|
}
|
|
function PathString() {
|
|
this._string = [];
|
|
}
|
|
function circle$1(radius) {
|
|
return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
|
|
}
|
|
function transformer(methods) {
|
|
return function(stream) {
|
|
var s = new TransformStream;
|
|
for(var key in methods)s[key] = methods[key];
|
|
return s.stream = stream, s;
|
|
};
|
|
}
|
|
function TransformStream() {}
|
|
function fit(projection, fitBounds, object) {
|
|
var clip = projection.clipExtent && projection.clipExtent();
|
|
return projection.scale(150).translate([
|
|
0,
|
|
0
|
|
]), null != clip && projection.clipExtent(null), geoStream(object, projection.stream(boundsStream$1)), fitBounds(boundsStream$1.result()), null != clip && projection.clipExtent(clip), projection;
|
|
}
|
|
function fitExtent(projection, extent, object) {
|
|
return fit(projection, function(b) {
|
|
var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
|
|
projection.scale(150 * k).translate([
|
|
x,
|
|
y
|
|
]);
|
|
}, object);
|
|
}
|
|
function fitSize(projection, size, object) {
|
|
return fitExtent(projection, [
|
|
[
|
|
0,
|
|
0
|
|
],
|
|
size
|
|
], object);
|
|
}
|
|
function fitWidth(projection, width, object) {
|
|
return fit(projection, function(b) {
|
|
var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1];
|
|
projection.scale(150 * k).translate([
|
|
x,
|
|
y
|
|
]);
|
|
}, object);
|
|
}
|
|
function fitHeight(projection, height, object) {
|
|
return fit(projection, function(b) {
|
|
var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2;
|
|
projection.scale(150 * k).translate([
|
|
x,
|
|
y
|
|
]);
|
|
}, object);
|
|
}
|
|
PathString.prototype = {
|
|
_radius: 4.5,
|
|
_circle: circle$1(4.5),
|
|
pointRadius: function(_) {
|
|
return (_ = +_) !== this._radius && (this._radius = _, this._circle = null), this;
|
|
},
|
|
polygonStart: function() {
|
|
this._line = 0;
|
|
},
|
|
polygonEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
0 === this._line && this._string.push("Z"), this._point = NaN;
|
|
},
|
|
point: function(x, y) {
|
|
switch(this._point){
|
|
case 0:
|
|
this._string.push("M", x, ",", y), this._point = 1;
|
|
break;
|
|
case 1:
|
|
this._string.push("L", x, ",", y);
|
|
break;
|
|
default:
|
|
null == this._circle && (this._circle = circle$1(this._radius)), this._string.push("M", x, ",", y, this._circle);
|
|
}
|
|
},
|
|
result: function() {
|
|
if (!this._string.length) return null;
|
|
var result = this._string.join("");
|
|
return this._string = [], result;
|
|
}
|
|
}, TransformStream.prototype = {
|
|
constructor: TransformStream,
|
|
point: function(x, y) {
|
|
this.stream.point(x, y);
|
|
},
|
|
sphere: function() {
|
|
this.stream.sphere();
|
|
},
|
|
lineStart: function() {
|
|
this.stream.lineStart();
|
|
},
|
|
lineEnd: function() {
|
|
this.stream.lineEnd();
|
|
},
|
|
polygonStart: function() {
|
|
this.stream.polygonStart();
|
|
},
|
|
polygonEnd: function() {
|
|
this.stream.polygonEnd();
|
|
}
|
|
};
|
|
var cosMinDistance = cos$1(30 * radians$1);
|
|
function resample(project, delta2) {
|
|
return +delta2 ? function(project, delta2) {
|
|
function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
|
|
var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
|
|
if (d2 > 4 * delta2 && depth--) {
|
|
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = sqrt(a * a + b * b + c * c), phi2 = asin(c /= m), lambda2 = 1e-6 > abs$2(abs$2(c) - 1) || 1e-6 > abs$2(lambda0 - lambda1) ? (lambda0 + lambda1) / 2 : atan2(b, a), p = project(lambda2, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
|
|
(dz * dz / d2 > delta2 || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) && (resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream), stream.point(x2, y2), resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream));
|
|
}
|
|
}
|
|
return function(stream) {
|
|
var lambda00, x00, y00, a00, b00, c00, lambda0, x0, y0, a0, b0, c0, resampleStream = {
|
|
point: point,
|
|
lineStart: lineStart,
|
|
lineEnd: lineEnd,
|
|
polygonStart: function() {
|
|
stream.polygonStart(), resampleStream.lineStart = ringStart;
|
|
},
|
|
polygonEnd: function() {
|
|
stream.polygonEnd(), resampleStream.lineStart = lineStart;
|
|
}
|
|
};
|
|
function point(x, y) {
|
|
x = project(x, y), stream.point(x[0], x[1]);
|
|
}
|
|
function lineStart() {
|
|
x0 = NaN, resampleStream.point = linePoint, stream.lineStart();
|
|
}
|
|
function linePoint(lambda, phi) {
|
|
var c = cartesian([
|
|
lambda,
|
|
phi
|
|
]), p = project(lambda, phi);
|
|
resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], 16, stream), stream.point(x0, y0);
|
|
}
|
|
function lineEnd() {
|
|
resampleStream.point = point, stream.lineEnd();
|
|
}
|
|
function ringStart() {
|
|
lineStart(), resampleStream.point = ringPoint, resampleStream.lineEnd = ringEnd;
|
|
}
|
|
function ringPoint(lambda, phi) {
|
|
linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0, resampleStream.point = linePoint;
|
|
}
|
|
function ringEnd() {
|
|
resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, 16, stream), resampleStream.lineEnd = lineEnd, lineEnd();
|
|
}
|
|
return resampleStream;
|
|
};
|
|
}(project, delta2) : transformer({
|
|
point: function(x, y) {
|
|
x = project(x, y), this.stream.point(x[0], x[1]);
|
|
}
|
|
});
|
|
}
|
|
var transformRadians = transformer({
|
|
point: function(x, y) {
|
|
this.stream.point(x * radians$1, y * radians$1);
|
|
}
|
|
});
|
|
function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {
|
|
if (!alpha) return function(k, dx, dy, sx, sy) {
|
|
function transform(x, y) {
|
|
return [
|
|
dx + k * (x *= sx),
|
|
dy - k * (y *= sy)
|
|
];
|
|
}
|
|
return transform.invert = function(x, y) {
|
|
return [
|
|
(x - dx) / k * sx,
|
|
(dy - y) / k * sy
|
|
];
|
|
}, transform;
|
|
}(k, dx, dy, sx, sy);
|
|
var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;
|
|
function transform(x, y) {
|
|
return [
|
|
a * (x *= sx) - b * (y *= sy) + dx,
|
|
dy - b * x - a * y
|
|
];
|
|
}
|
|
return transform.invert = function(x, y) {
|
|
return [
|
|
sx * (ai * x - bi * y + ci),
|
|
sy * (fi - bi * x - ai * y)
|
|
];
|
|
}, transform;
|
|
}
|
|
function projection(project) {
|
|
return projectionMutator(function() {
|
|
return project;
|
|
})();
|
|
}
|
|
function projectionMutator(projectAt) {
|
|
var project, rotate, y0, x1, y1, projectResample, projectTransform, projectRotateTransform, cache, cacheStream, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, alpha = 0, sx = 1, sy = 1, theta = null, preclip = clipAntimeridian, x0 = null, postclip = identity$4, delta2 = 0.5;
|
|
function projection(point) {
|
|
return projectRotateTransform(point[0] * radians$1, point[1] * radians$1);
|
|
}
|
|
function invert(point) {
|
|
return (point = projectRotateTransform.invert(point[0], point[1])) && [
|
|
point[0] * degrees$2,
|
|
point[1] * degrees$2
|
|
];
|
|
}
|
|
function recenter() {
|
|
var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);
|
|
return rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), projectTransform = compose(project, transform), projectRotateTransform = compose(rotate, projectTransform), projectResample = resample(projectTransform, delta2), reset();
|
|
}
|
|
function reset() {
|
|
return cache = cacheStream = null, projection;
|
|
}
|
|
return projection.stream = function(stream) {
|
|
var rotate1;
|
|
return cache && cacheStream === stream ? cache : cache = transformRadians((rotate1 = rotate, transformer({
|
|
point: function(x, y) {
|
|
var r = rotate1(x, y);
|
|
return this.stream.point(r[0], r[1]);
|
|
}
|
|
}))(preclip(projectResample(postclip(cacheStream = stream)))));
|
|
}, projection.preclip = function(_) {
|
|
return arguments.length ? (preclip = _, theta = void 0, reset()) : preclip;
|
|
}, projection.postclip = function(_) {
|
|
return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
|
|
}, projection.clipAngle = function(_) {
|
|
return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians$1) : (theta = null, clipAntimeridian), reset()) : theta * degrees$2;
|
|
}, projection.clipExtent = function(_) {
|
|
return arguments.length ? (postclip = null == _ ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : null == x0 ? null : [
|
|
[
|
|
x0,
|
|
y0
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
}, projection.scale = function(_) {
|
|
return arguments.length ? (k = +_, recenter()) : k;
|
|
}, projection.translate = function(_) {
|
|
return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [
|
|
x,
|
|
y
|
|
];
|
|
}, projection.center = function(_) {
|
|
return arguments.length ? (lambda = _[0] % 360 * radians$1, phi = _[1] % 360 * radians$1, recenter()) : [
|
|
lambda * degrees$2,
|
|
phi * degrees$2
|
|
];
|
|
}, projection.rotate = function(_) {
|
|
return arguments.length ? (deltaLambda = _[0] % 360 * radians$1, deltaPhi = _[1] % 360 * radians$1, deltaGamma = _.length > 2 ? _[2] % 360 * radians$1 : 0, recenter()) : [
|
|
deltaLambda * degrees$2,
|
|
deltaPhi * degrees$2,
|
|
deltaGamma * degrees$2
|
|
];
|
|
}, projection.angle = function(_) {
|
|
return arguments.length ? (alpha = _ % 360 * radians$1, recenter()) : alpha * degrees$2;
|
|
}, projection.reflectX = function(_) {
|
|
return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;
|
|
}, projection.reflectY = function(_) {
|
|
return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;
|
|
}, projection.precision = function(_) {
|
|
return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
|
|
}, projection.fitExtent = function(extent, object) {
|
|
return fitExtent(projection, extent, object);
|
|
}, projection.fitSize = function(size, object) {
|
|
return fitSize(projection, size, object);
|
|
}, projection.fitWidth = function(width, object) {
|
|
return fitWidth(projection, width, object);
|
|
}, projection.fitHeight = function(height, object) {
|
|
return fitHeight(projection, height, object);
|
|
}, function() {
|
|
return project = projectAt.apply(this, arguments), projection.invert = project.invert && invert, recenter();
|
|
};
|
|
}
|
|
function conicProjection(projectAt) {
|
|
var phi0 = 0, phi1 = pi$3 / 3, m = projectionMutator(projectAt), p = m(phi0, phi1);
|
|
return p.parallels = function(_) {
|
|
return arguments.length ? m(phi0 = _[0] * radians$1, phi1 = _[1] * radians$1) : [
|
|
phi0 * degrees$2,
|
|
phi1 * degrees$2
|
|
];
|
|
}, p;
|
|
}
|
|
function conicEqualAreaRaw(y0, y1) {
|
|
var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
|
|
if (1e-6 > abs$2(n)) return function(phi0) {
|
|
var cosPhi0 = cos$1(phi0);
|
|
function forward(lambda, phi) {
|
|
return [
|
|
lambda * cosPhi0,
|
|
sin$1(phi) / cosPhi0
|
|
];
|
|
}
|
|
return forward.invert = function(x, y) {
|
|
return [
|
|
x / cosPhi0,
|
|
asin(y * cosPhi0)
|
|
];
|
|
}, forward;
|
|
}(y0);
|
|
var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
|
|
function project(x, y) {
|
|
var r = sqrt(c - 2 * n * sin$1(y)) / n;
|
|
return [
|
|
r * sin$1(x *= n),
|
|
r0 - r * cos$1(x)
|
|
];
|
|
}
|
|
return project.invert = function(x, y) {
|
|
var r0y = r0 - y, l = atan2(x, abs$2(r0y)) * sign(r0y);
|
|
return r0y * n < 0 && (l -= pi$3 * sign(x) * sign(r0y)), [
|
|
l / n,
|
|
asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))
|
|
];
|
|
}, project;
|
|
}
|
|
function conicEqualArea() {
|
|
return conicProjection(conicEqualAreaRaw).scale(155.424).center([
|
|
0,
|
|
33.6442
|
|
]);
|
|
}
|
|
function albers() {
|
|
return conicEqualArea().parallels([
|
|
29.5,
|
|
45.5
|
|
]).scale(1070).translate([
|
|
480,
|
|
250
|
|
]).rotate([
|
|
96,
|
|
0
|
|
]).center([
|
|
-0.6,
|
|
38.7
|
|
]);
|
|
}
|
|
function azimuthalRaw(scale) {
|
|
return function(x, y) {
|
|
var cx = cos$1(x), cy = cos$1(y), k = scale(cx * cy);
|
|
return k === 1 / 0 ? [
|
|
2,
|
|
0
|
|
] : [
|
|
k * cy * sin$1(x),
|
|
k * sin$1(y)
|
|
];
|
|
};
|
|
}
|
|
function azimuthalInvert(angle) {
|
|
return function(x, y) {
|
|
var z = sqrt(x * x + y * y), c = angle(z), sc = sin$1(c), cc = cos$1(c);
|
|
return [
|
|
atan2(x * sc, z * cc),
|
|
asin(z && y * sc / z)
|
|
];
|
|
};
|
|
}
|
|
var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
|
|
return sqrt(2 / (1 + cxcy));
|
|
});
|
|
azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
|
|
return 2 * asin(z / 2);
|
|
});
|
|
var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
|
|
return (c = acos(c)) && c / sin$1(c);
|
|
});
|
|
function mercatorRaw(lambda, phi) {
|
|
return [
|
|
lambda,
|
|
log(tan((halfPi$2 + phi) / 2))
|
|
];
|
|
}
|
|
function mercatorProjection(project) {
|
|
var y0, x1, y1, m = projection(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x0 = null;
|
|
function reclip() {
|
|
var k = pi$3 * scale(), t = m(rotation(m.rotate()).invert([
|
|
0,
|
|
0
|
|
]));
|
|
return clipExtent(null == x0 ? [
|
|
[
|
|
t[0] - k,
|
|
t[1] - k
|
|
],
|
|
[
|
|
t[0] + k,
|
|
t[1] + k
|
|
]
|
|
] : project === mercatorRaw ? [
|
|
[
|
|
Math.max(t[0] - k, x0),
|
|
y0
|
|
],
|
|
[
|
|
Math.min(t[0] + k, x1),
|
|
y1
|
|
]
|
|
] : [
|
|
[
|
|
x0,
|
|
Math.max(t[1] - k, y0)
|
|
],
|
|
[
|
|
x1,
|
|
Math.min(t[1] + k, y1)
|
|
]
|
|
]);
|
|
}
|
|
return m.scale = function(_) {
|
|
return arguments.length ? (scale(_), reclip()) : scale();
|
|
}, m.translate = function(_) {
|
|
return arguments.length ? (translate(_), reclip()) : translate();
|
|
}, m.center = function(_) {
|
|
return arguments.length ? (center(_), reclip()) : center();
|
|
}, m.clipExtent = function(_) {
|
|
return arguments.length ? (null == _ ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reclip()) : null == x0 ? null : [
|
|
[
|
|
x0,
|
|
y0
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
}, reclip();
|
|
}
|
|
function tany(y) {
|
|
return tan((halfPi$2 + y) / 2);
|
|
}
|
|
function conicConformalRaw(y0, y1) {
|
|
var cy0 = cos$1(y0), n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), f = cy0 * pow$1(tany(y0), n) / n;
|
|
if (!n) return mercatorRaw;
|
|
function project(x, y) {
|
|
f > 0 ? y < -halfPi$2 + 1e-6 && (y = -halfPi$2 + 1e-6) : y > halfPi$2 - 1e-6 && (y = halfPi$2 - 1e-6);
|
|
var r = f / pow$1(tany(y), n);
|
|
return [
|
|
r * sin$1(n * x),
|
|
f - r * cos$1(n * x)
|
|
];
|
|
}
|
|
return project.invert = function(x, y) {
|
|
var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), l = atan2(x, abs$2(fy)) * sign(fy);
|
|
return fy * n < 0 && (l -= pi$3 * sign(x) * sign(fy)), [
|
|
l / n,
|
|
2 * atan(pow$1(f / r, 1 / n)) - halfPi$2
|
|
];
|
|
}, project;
|
|
}
|
|
function equirectangularRaw(lambda, phi) {
|
|
return [
|
|
lambda,
|
|
phi
|
|
];
|
|
}
|
|
function conicEquidistantRaw(y0, y1) {
|
|
var cy0 = cos$1(y0), n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), g = cy0 / n + y0;
|
|
if (1e-6 > abs$2(n)) return equirectangularRaw;
|
|
function project(x, y) {
|
|
var gy = g - y, nx = n * x;
|
|
return [
|
|
gy * sin$1(nx),
|
|
g - gy * cos$1(nx)
|
|
];
|
|
}
|
|
return project.invert = function(x, y) {
|
|
var gy = g - y, l = atan2(x, abs$2(gy)) * sign(gy);
|
|
return gy * n < 0 && (l -= pi$3 * sign(x) * sign(gy)), [
|
|
l / n,
|
|
g - sign(n) * sqrt(x * x + gy * gy)
|
|
];
|
|
}, project;
|
|
}
|
|
azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
|
|
return z;
|
|
}), mercatorRaw.invert = function(x, y) {
|
|
return [
|
|
x,
|
|
2 * atan(exp(y)) - halfPi$2
|
|
];
|
|
}, equirectangularRaw.invert = equirectangularRaw;
|
|
var M = sqrt(3) / 2;
|
|
function equalEarthRaw(lambda, phi) {
|
|
var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
|
|
return [
|
|
lambda * cos$1(l) / (M * (1.340264 + -0.24331799999999998 * l2 + l6 * (0.0062510000000000005 + 0.034164 * l2))),
|
|
l * (1.340264 + -0.081106 * l2 + l6 * (0.000893 + 0.003796 * l2))
|
|
];
|
|
}
|
|
function gnomonicRaw(x, y) {
|
|
var cy = cos$1(y), k = cos$1(x) * cy;
|
|
return [
|
|
cy * sin$1(x) / k,
|
|
sin$1(y) / k
|
|
];
|
|
}
|
|
function naturalEarth1Raw(lambda, phi) {
|
|
var phi2 = phi * phi, phi4 = phi2 * phi2;
|
|
return [
|
|
lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
|
|
phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
|
|
];
|
|
}
|
|
function orthographicRaw(x, y) {
|
|
return [
|
|
cos$1(y) * sin$1(x),
|
|
sin$1(y)
|
|
];
|
|
}
|
|
function stereographicRaw(x, y) {
|
|
var cy = cos$1(y), k = 1 + cos$1(x) * cy;
|
|
return [
|
|
cy * sin$1(x) / k,
|
|
sin$1(y) / k
|
|
];
|
|
}
|
|
function transverseMercatorRaw(lambda, phi) {
|
|
return [
|
|
log(tan((halfPi$2 + phi) / 2)),
|
|
-lambda
|
|
];
|
|
}
|
|
function defaultSeparation(a, b) {
|
|
return a.parent === b.parent ? 1 : 2;
|
|
}
|
|
function meanXReduce(x, c) {
|
|
return x + c.x;
|
|
}
|
|
function maxYReduce(y, c) {
|
|
return Math.max(y, c.y);
|
|
}
|
|
function count$1(node) {
|
|
var sum = 0, children = node.children, i = children && children.length;
|
|
if (i) for(; --i >= 0;)sum += children[i].value;
|
|
else sum = 1;
|
|
node.value = sum;
|
|
}
|
|
function hierarchy(data, children) {
|
|
data instanceof Map ? (data = [
|
|
void 0,
|
|
data
|
|
], void 0 === children && (children = mapChildren)) : void 0 === children && (children = objectChildren);
|
|
for(var node, child, childs, i, n, root = new Node(data), nodes = [
|
|
root
|
|
]; node = nodes.pop();)if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) for(node.children = childs, i = n - 1; i >= 0; --i)nodes.push(child = childs[i] = new Node(childs[i])), child.parent = node, child.depth = node.depth + 1;
|
|
return root.eachBefore(computeHeight);
|
|
}
|
|
function objectChildren(d) {
|
|
return d.children;
|
|
}
|
|
function mapChildren(d) {
|
|
return Array.isArray(d) ? d[1] : null;
|
|
}
|
|
function copyData(node) {
|
|
void 0 !== node.data.value && (node.value = node.data.value), node.data = node.data.data;
|
|
}
|
|
function computeHeight(node) {
|
|
var height = 0;
|
|
do node.height = height;
|
|
while ((node = node.parent) && node.height < ++height)
|
|
}
|
|
function Node(data) {
|
|
this.data = data, this.depth = this.height = 0, this.parent = null;
|
|
}
|
|
function enclose(circles) {
|
|
for(var p, e, i = 0, n = (circles = function(array) {
|
|
for(var t, i, m = array.length; m;)i = Math.random() * m-- | 0, t = array[m], array[m] = array[i], array[i] = t;
|
|
return array;
|
|
}(Array.from(circles))).length, B = []; i < n;)p = circles[i], e && enclosesWeak(e, p) ? ++i : (e = function(B) {
|
|
switch(B.length){
|
|
case 1:
|
|
var a;
|
|
return {
|
|
x: (a = B[0]).x,
|
|
y: a.y,
|
|
r: a.r
|
|
};
|
|
case 2:
|
|
return encloseBasis2(B[0], B[1]);
|
|
case 3:
|
|
return encloseBasis3(B[0], B[1], B[2]);
|
|
}
|
|
}(B = function(B, p) {
|
|
var i, j;
|
|
if (enclosesWeakAll(p, B)) return [
|
|
p
|
|
];
|
|
for(i = 0; i < B.length; ++i)if (enclosesNot(p, B[i]) && enclosesWeakAll(encloseBasis2(B[i], p), B)) return [
|
|
B[i],
|
|
p
|
|
];
|
|
for(i = 0; i < B.length - 1; ++i)for(j = i + 1; j < B.length; ++j)if (enclosesNot(encloseBasis2(B[i], B[j]), p) && enclosesNot(encloseBasis2(B[i], p), B[j]) && enclosesNot(encloseBasis2(B[j], p), B[i]) && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) return [
|
|
B[i],
|
|
B[j],
|
|
p
|
|
];
|
|
throw Error();
|
|
}(B, p)), i = 0);
|
|
return e;
|
|
}
|
|
function enclosesNot(a, b) {
|
|
var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
|
|
return dr < 0 || dr * dr < dx * dx + dy * dy;
|
|
}
|
|
function enclosesWeak(a, b) {
|
|
var dr = a.r - b.r + 1e-9 * Math.max(a.r, b.r, 1), dx = b.x - a.x, dy = b.y - a.y;
|
|
return dr > 0 && dr * dr > dx * dx + dy * dy;
|
|
}
|
|
function enclosesWeakAll(a, B) {
|
|
for(var i = 0; i < B.length; ++i)if (!enclosesWeak(a, B[i])) return !1;
|
|
return !0;
|
|
}
|
|
function encloseBasis2(a, b) {
|
|
var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);
|
|
return {
|
|
x: (x1 + x2 + x21 / l * r21) / 2,
|
|
y: (y1 + y2 + y21 / l * r21) / 2,
|
|
r: (l + r1 + r2) / 2
|
|
};
|
|
}
|
|
function encloseBasis3(a, b, c) {
|
|
var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x3 = c.x, y3 = c.y, r3 = c.r, a2 = x1 - x2, a3 = x1 - x3, b2 = y1 - y2, b3 = y1 - y3, c2 = r2 - r1, c3 = r3 - r1, d1 = x1 * x1 + y1 * y1 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b2 - a2 * b3, xa = (b2 * d3 - b3 * d2) / (2 * ab) - x1, xb = (b3 * c2 - b2 * c3) / ab, ya = (a3 * d2 - a2 * d3) / (2 * ab) - y1, yb = (a2 * c3 - a3 * c2) / ab, A = xb * xb + yb * yb - 1, B = 2 * (r1 + xa * xb + ya * yb), C = xa * xa + ya * ya - r1 * r1, r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
|
|
return {
|
|
x: x1 + xa + xb * r,
|
|
y: y1 + ya + yb * r,
|
|
r: r
|
|
};
|
|
}
|
|
function place(b, a, c) {
|
|
var x, a2, y, b2, dx = b.x - a.x, dy = b.y - a.y, d2 = dx * dx + dy * dy;
|
|
d2 ? (a2 = a.r + c.r, a2 *= a2, b2 = b.r + c.r, a2 > (b2 *= b2) ? (x = (d2 + b2 - a2) / (2 * d2), y = Math.sqrt(Math.max(0, b2 / d2 - x * x)), c.x = b.x - x * dx - y * dy, c.y = b.y - x * dy + y * dx) : (x = (d2 + a2 - b2) / (2 * d2), y = Math.sqrt(Math.max(0, a2 / d2 - x * x)), c.x = a.x + x * dx - y * dy, c.y = a.y + x * dy + y * dx)) : (c.x = a.x + c.r, c.y = a.y);
|
|
}
|
|
function intersects(a, b) {
|
|
var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
|
|
return dr > 0 && dr * dr > dx * dx + dy * dy;
|
|
}
|
|
function score(node) {
|
|
var a = node._, b = node.next._, ab = a.r + b.r, dx = (a.x * b.r + b.x * a.r) / ab, dy = (a.y * b.r + b.y * a.r) / ab;
|
|
return dx * dx + dy * dy;
|
|
}
|
|
function Node$1(circle) {
|
|
this._ = circle, this.next = null, this.previous = null;
|
|
}
|
|
function packEnclose(circles) {
|
|
var a, b, c, n, aa, ca, i, j, k, sj, sk, x;
|
|
if (!(n = (circles = "object" == typeof (x = circles) && "length" in x ? x : Array.from(x)).length)) return 0;
|
|
if ((a = circles[0]).x = 0, a.y = 0, !(n > 1)) return a.r;
|
|
if (b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0, !(n > 2)) return a.r + b.r;
|
|
place(b, a, c = circles[2]), a = new Node$1(a), b = new Node$1(b), c = new Node$1(c), a.next = c.previous = b, b.next = a.previous = c, c.next = b.previous = a;
|
|
pack: for(i = 3; i < n; ++i){
|
|
place(a._, b._, c = circles[i]), c = new Node$1(c), j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
|
|
do if (sj <= sk) {
|
|
if (intersects(j._, c._)) {
|
|
b = j, a.next = b, b.previous = a, --i;
|
|
continue pack;
|
|
}
|
|
sj += j._.r, j = j.next;
|
|
} else {
|
|
if (intersects(k._, c._)) {
|
|
(a = k).next = b, b.previous = a, --i;
|
|
continue pack;
|
|
}
|
|
sk += k._.r, k = k.previous;
|
|
}
|
|
while (j !== k.next)
|
|
for(c.previous = a, c.next = b, a.next = b.previous = b = c, aa = score(a); (c = c.next) !== b;)(ca = score(c)) < aa && (a = c, aa = ca);
|
|
b = a.next;
|
|
}
|
|
for(a = [
|
|
b._
|
|
], c = b; (c = c.next) !== b;)a.push(c._);
|
|
for(i = 0, c = enclose(a); i < n; ++i)a = circles[i], a.x -= c.x, a.y -= c.y;
|
|
return c.r;
|
|
}
|
|
function required(f) {
|
|
if ("function" != typeof f) throw Error();
|
|
return f;
|
|
}
|
|
function constantZero() {
|
|
return 0;
|
|
}
|
|
function constant$9(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
function defaultRadius$1(d) {
|
|
return Math.sqrt(d.value);
|
|
}
|
|
function radiusLeaf(radius) {
|
|
return function(node) {
|
|
node.children || (node.r = Math.max(0, +radius(node) || 0));
|
|
};
|
|
}
|
|
function packChildren(padding, k) {
|
|
return function(node) {
|
|
if (children = node.children) {
|
|
var children, i, e, n = children.length, r = padding(node) * k || 0;
|
|
if (r) for(i = 0; i < n; ++i)children[i].r += r;
|
|
if (e = packEnclose(children), r) for(i = 0; i < n; ++i)children[i].r -= r;
|
|
node.r = e + r;
|
|
}
|
|
};
|
|
}
|
|
function translateChild(k) {
|
|
return function(node) {
|
|
var parent = node.parent;
|
|
node.r *= k, parent && (node.x = parent.x + k * node.x, node.y = parent.y + k * node.y);
|
|
};
|
|
}
|
|
function roundNode(node) {
|
|
node.x0 = Math.round(node.x0), node.y0 = Math.round(node.y0), node.x1 = Math.round(node.x1), node.y1 = Math.round(node.y1);
|
|
}
|
|
function treemapDice(parent, x0, y0, x1, y1) {
|
|
for(var node, nodes = parent.children, i = -1, n = nodes.length, k = parent.value && (x1 - x0) / parent.value; ++i < n;)(node = nodes[i]).y0 = y0, node.y1 = y1, node.x0 = x0, node.x1 = x0 += node.value * k;
|
|
}
|
|
equalEarthRaw.invert = function(x, y) {
|
|
for(var delta, fy, l = y, l2 = l * l, l6 = l2 * l2 * l2, i = 0; i < 12 && (fy = l * (1.340264 + -0.081106 * l2 + l6 * (0.000893 + 0.003796 * l2)) - y, l -= delta = fy / (1.340264 + -0.24331799999999998 * l2 + l6 * (0.0062510000000000005 + 0.034164 * l2)), l6 = (l2 = l * l) * l2 * l2, !(1e-12 > abs$2(delta))); ++i);
|
|
return [
|
|
M * x * (1.340264 + -0.24331799999999998 * l2 + l6 * (0.0062510000000000005 + 0.034164 * l2)) / cos$1(l),
|
|
asin(sin$1(l) / M)
|
|
];
|
|
}, gnomonicRaw.invert = azimuthalInvert(atan), naturalEarth1Raw.invert = function(x, y) {
|
|
var delta, phi = y, i = 25;
|
|
do {
|
|
var phi2 = phi * phi, phi4 = phi2 * phi2;
|
|
phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.045255 + phi4 * (-0.311325 + 0.259866 * phi2 - 0.005916 * 11 * phi4)));
|
|
}while (abs$2(delta) > 1e-6 && --i > 0)
|
|
return [
|
|
x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
|
|
phi
|
|
];
|
|
}, orthographicRaw.invert = azimuthalInvert(asin), stereographicRaw.invert = azimuthalInvert(function(z) {
|
|
return 2 * atan(z);
|
|
}), transverseMercatorRaw.invert = function(x, y) {
|
|
return [
|
|
-y,
|
|
2 * atan(exp(x)) - halfPi$2
|
|
];
|
|
}, Node.prototype = hierarchy.prototype = {
|
|
constructor: Node,
|
|
count: function() {
|
|
return this.eachAfter(count$1);
|
|
},
|
|
each: function(callback, that) {
|
|
let index = -1;
|
|
for (const node of this)callback.call(that, node, ++index, this);
|
|
return this;
|
|
},
|
|
eachAfter: function(callback, that) {
|
|
for(var children, i, n, node = this, nodes = [
|
|
node
|
|
], next = [], index = -1; node = nodes.pop();)if (next.push(node), children = node.children) for(i = 0, n = children.length; i < n; ++i)nodes.push(children[i]);
|
|
for(; node = next.pop();)callback.call(that, node, ++index, this);
|
|
return this;
|
|
},
|
|
eachBefore: function(callback, that) {
|
|
for(var children, i, node = this, nodes = [
|
|
node
|
|
], index = -1; node = nodes.pop();)if (callback.call(that, node, ++index, this), children = node.children) for(i = children.length - 1; i >= 0; --i)nodes.push(children[i]);
|
|
return this;
|
|
},
|
|
find: function(callback, that) {
|
|
let index = -1;
|
|
for (const node of this)if (callback.call(that, node, ++index, this)) return node;
|
|
},
|
|
sum: function(value) {
|
|
return this.eachAfter(function(node) {
|
|
for(var sum = +value(node.data) || 0, children = node.children, i = children && children.length; --i >= 0;)sum += children[i].value;
|
|
node.value = sum;
|
|
});
|
|
},
|
|
sort: function(compare) {
|
|
return this.eachBefore(function(node) {
|
|
node.children && node.children.sort(compare);
|
|
});
|
|
},
|
|
path: function(end) {
|
|
for(var start = this, ancestor = function(a, b) {
|
|
if (a === b) return a;
|
|
var aNodes = a.ancestors(), bNodes = b.ancestors(), c = null;
|
|
for(a = aNodes.pop(), b = bNodes.pop(); a === b;)c = a, a = aNodes.pop(), b = bNodes.pop();
|
|
return c;
|
|
}(start, end), nodes = [
|
|
start
|
|
]; start !== ancestor;)nodes.push(start = start.parent);
|
|
for(var k = nodes.length; end !== ancestor;)nodes.splice(k, 0, end), end = end.parent;
|
|
return nodes;
|
|
},
|
|
ancestors: function() {
|
|
for(var node = this, nodes = [
|
|
node
|
|
]; node = node.parent;)nodes.push(node);
|
|
return nodes;
|
|
},
|
|
descendants: function() {
|
|
return Array.from(this);
|
|
},
|
|
leaves: function() {
|
|
var leaves = [];
|
|
return this.eachBefore(function(node) {
|
|
node.children || leaves.push(node);
|
|
}), leaves;
|
|
},
|
|
links: function() {
|
|
var root = this, links = [];
|
|
return root.each(function(node) {
|
|
node !== root && links.push({
|
|
source: node.parent,
|
|
target: node
|
|
});
|
|
}), links;
|
|
},
|
|
copy: function() {
|
|
return hierarchy(this).eachBefore(copyData);
|
|
},
|
|
[Symbol.iterator]: function*() {
|
|
var current, children, i, n, node = this, next = [
|
|
node
|
|
];
|
|
do for(current = next.reverse(), next = []; node = current.pop();)if (yield node, children = node.children) for(i = 0, n = children.length; i < n; ++i)next.push(children[i]);
|
|
while (next.length)
|
|
}
|
|
};
|
|
var preroot = {
|
|
depth: -1
|
|
}, ambiguous = {};
|
|
function defaultId(d) {
|
|
return d.id;
|
|
}
|
|
function defaultParentId(d) {
|
|
return d.parentId;
|
|
}
|
|
function defaultSeparation$1(a, b) {
|
|
return a.parent === b.parent ? 1 : 2;
|
|
}
|
|
function nextLeft(v) {
|
|
var children = v.children;
|
|
return children ? children[0] : v.t;
|
|
}
|
|
function nextRight(v) {
|
|
var children = v.children;
|
|
return children ? children[children.length - 1] : v.t;
|
|
}
|
|
function TreeNode(node, i) {
|
|
this._ = node, this.parent = null, this.children = null, this.A = null, this.a = this, this.z = 0, this.m = 0, this.c = 0, this.s = 0, this.t = null, this.i = i;
|
|
}
|
|
function treemapSlice(parent, x0, y0, x1, y1) {
|
|
for(var node, nodes = parent.children, i = -1, n = nodes.length, k = parent.value && (y1 - y0) / parent.value; ++i < n;)(node = nodes[i]).x0 = x0, node.x1 = x1, node.y0 = y0, node.y1 = y0 += node.value * k;
|
|
}
|
|
TreeNode.prototype = Object.create(Node.prototype);
|
|
var phi = (1 + Math.sqrt(5)) / 2;
|
|
function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
|
|
for(var row, nodeValue, dx, dy, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta, rows = [], nodes = parent.children, i0 = 0, i1 = 0, n = nodes.length, value = parent.value; i0 < n;){
|
|
dx = x1 - x0, dy = y1 - y0;
|
|
do sumValue = nodes[i1++].value;
|
|
while (!sumValue && i1 < n)
|
|
for(minValue = maxValue = sumValue, minRatio = Math.max(maxValue / (beta = sumValue * sumValue * (alpha = Math.max(dy / dx, dx / dy) / (value * ratio))), beta / minValue); i1 < n; ++i1){
|
|
if (sumValue += nodeValue = nodes[i1].value, nodeValue < minValue && (minValue = nodeValue), nodeValue > maxValue && (maxValue = nodeValue), (newRatio = Math.max(maxValue / (beta = sumValue * sumValue * alpha), beta / minValue)) > minRatio) {
|
|
sumValue -= nodeValue;
|
|
break;
|
|
}
|
|
minRatio = newRatio;
|
|
}
|
|
rows.push(row = {
|
|
value: sumValue,
|
|
dice: dx < dy,
|
|
children: nodes.slice(i0, i1)
|
|
}), row.dice ? treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1) : treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1), value -= sumValue, i0 = i1;
|
|
}
|
|
return rows;
|
|
}
|
|
var squarify = function custom(ratio) {
|
|
function squarify(parent, x0, y0, x1, y1) {
|
|
squarifyRatio(ratio, parent, x0, y0, x1, y1);
|
|
}
|
|
return squarify.ratio = function(x) {
|
|
return custom((x = +x) > 1 ? x : 1);
|
|
}, squarify;
|
|
}(phi), resquarify = function custom(ratio) {
|
|
function resquarify(parent, x0, y0, x1, y1) {
|
|
if ((rows = parent._squarify) && rows.ratio === ratio) for(var rows, row, nodes, i, n, j = -1, m = rows.length, value = parent.value; ++j < m;){
|
|
for(nodes = (row = rows[j]).children, i = row.value = 0, n = nodes.length; i < n; ++i)row.value += nodes[i].value;
|
|
row.dice ? treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1) : treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1), value -= row.value;
|
|
}
|
|
else parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1), rows.ratio = ratio;
|
|
}
|
|
return resquarify.ratio = function(x) {
|
|
return custom((x = +x) > 1 ? x : 1);
|
|
}, resquarify;
|
|
}(phi);
|
|
function lexicographicOrder(a, b) {
|
|
return a[0] - b[0] || a[1] - b[1];
|
|
}
|
|
function computeUpperHullIndexes(points) {
|
|
const n = points.length, indexes = [
|
|
0,
|
|
1
|
|
];
|
|
let size = 2, i;
|
|
for(i = 2; i < n; ++i){
|
|
for(var a, b, c; size > 1 && 0 >= (a = points[indexes[size - 2]], b = points[indexes[size - 1]], c = points[i], (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]));)--size;
|
|
indexes[size++] = i;
|
|
}
|
|
return indexes.slice(0, size);
|
|
}
|
|
var defaultSource$1 = Math.random, uniform = function sourceRandomUniform(source) {
|
|
function randomUniform(min, max) {
|
|
return min = null == min ? 0 : +min, max = null == max ? 1 : +max, 1 == arguments.length ? (max = min, min = 0) : max -= min, function() {
|
|
return source() * max + min;
|
|
};
|
|
}
|
|
return randomUniform.source = sourceRandomUniform, randomUniform;
|
|
}(defaultSource$1), int = function sourceRandomInt(source) {
|
|
function randomInt(min, max) {
|
|
return arguments.length < 2 && (max = min, min = 0), max = Math.floor(max) - (min = Math.floor(min)), function() {
|
|
return Math.floor(source() * max + min);
|
|
};
|
|
}
|
|
return randomInt.source = sourceRandomInt, randomInt;
|
|
}(defaultSource$1), normal = function sourceRandomNormal(source) {
|
|
function randomNormal(mu, sigma) {
|
|
var x, r;
|
|
return mu = null == mu ? 0 : +mu, sigma = null == sigma ? 1 : +sigma, function() {
|
|
var y;
|
|
if (null != x) y = x, x = null;
|
|
else do r = (x = 2 * source() - 1) * x + (y = 2 * source() - 1) * y;
|
|
while (!r || r > 1)
|
|
return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
|
|
};
|
|
}
|
|
return randomNormal.source = sourceRandomNormal, randomNormal;
|
|
}(defaultSource$1), logNormal = function sourceRandomLogNormal(source) {
|
|
var N = normal.source(source);
|
|
function randomLogNormal() {
|
|
var randomNormal = N.apply(this, arguments);
|
|
return function() {
|
|
return Math.exp(randomNormal());
|
|
};
|
|
}
|
|
return randomLogNormal.source = sourceRandomLogNormal, randomLogNormal;
|
|
}(defaultSource$1), irwinHall = function sourceRandomIrwinHall(source) {
|
|
function randomIrwinHall(n) {
|
|
return (n = +n) <= 0 ? ()=>0 : function() {
|
|
for(var sum = 0, i = n; i > 1; --i)sum += source();
|
|
return sum + i * source();
|
|
};
|
|
}
|
|
return randomIrwinHall.source = sourceRandomIrwinHall, randomIrwinHall;
|
|
}(defaultSource$1), bates = function sourceRandomBates(source) {
|
|
var I = irwinHall.source(source);
|
|
function randomBates(n) {
|
|
if (0 == (n = +n)) return source;
|
|
var randomIrwinHall = I(n);
|
|
return function() {
|
|
return randomIrwinHall() / n;
|
|
};
|
|
}
|
|
return randomBates.source = sourceRandomBates, randomBates;
|
|
}(defaultSource$1), exponential$1 = function sourceRandomExponential(source) {
|
|
function randomExponential(lambda) {
|
|
return function() {
|
|
return -Math.log1p(-source()) / lambda;
|
|
};
|
|
}
|
|
return randomExponential.source = sourceRandomExponential, randomExponential;
|
|
}(defaultSource$1), pareto = function sourceRandomPareto(source) {
|
|
function randomPareto(alpha) {
|
|
if ((alpha = +alpha) < 0) throw RangeError("invalid alpha");
|
|
return alpha = -(1 / alpha), function() {
|
|
return Math.pow(1 - source(), alpha);
|
|
};
|
|
}
|
|
return randomPareto.source = sourceRandomPareto, randomPareto;
|
|
}(defaultSource$1), bernoulli = function sourceRandomBernoulli(source) {
|
|
function randomBernoulli(p) {
|
|
if ((p = +p) < 0 || p > 1) throw RangeError("invalid p");
|
|
return function() {
|
|
return Math.floor(source() + p);
|
|
};
|
|
}
|
|
return randomBernoulli.source = sourceRandomBernoulli, randomBernoulli;
|
|
}(defaultSource$1), geometric = function sourceRandomGeometric(source) {
|
|
function randomGeometric(p) {
|
|
if ((p = +p) < 0 || p > 1) throw RangeError("invalid p");
|
|
return 0 === p ? ()=>1 / 0 : 1 === p ? ()=>1 : (p = Math.log1p(-p), function() {
|
|
return 1 + Math.floor(Math.log1p(-source()) / p);
|
|
});
|
|
}
|
|
return randomGeometric.source = sourceRandomGeometric, randomGeometric;
|
|
}(defaultSource$1), gamma$1 = function sourceRandomGamma(source) {
|
|
var randomNormal = normal.source(source)();
|
|
function randomGamma(k, theta) {
|
|
if ((k = +k) < 0) throw RangeError("invalid k");
|
|
if (0 === k) return ()=>0;
|
|
if (theta = null == theta ? 1 : +theta, 1 === k) return ()=>-Math.log1p(-source()) * theta;
|
|
var d = (k < 1 ? k + 1 : k) - 1 / 3, c = 1 / (3 * Math.sqrt(d)), multiplier = k < 1 ? ()=>Math.pow(source(), 1 / k) : ()=>1;
|
|
return function() {
|
|
do {
|
|
do var x = randomNormal(), v = 1 + c * x;
|
|
while (v <= 0)
|
|
v *= v * v;
|
|
var u = 1 - source();
|
|
}while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v)))
|
|
return d * v * multiplier() * theta;
|
|
};
|
|
}
|
|
return randomGamma.source = sourceRandomGamma, randomGamma;
|
|
}(defaultSource$1), beta = function sourceRandomBeta(source) {
|
|
var G = gamma$1.source(source);
|
|
function randomBeta(alpha, beta) {
|
|
var X = G(alpha), Y = G(beta);
|
|
return function() {
|
|
var x = X();
|
|
return 0 === x ? 0 : x / (x + Y());
|
|
};
|
|
}
|
|
return randomBeta.source = sourceRandomBeta, randomBeta;
|
|
}(defaultSource$1), binomial = function sourceRandomBinomial(source) {
|
|
var G = geometric.source(source), B = beta.source(source);
|
|
function randomBinomial(n, p) {
|
|
return (n = +n, (p = +p) >= 1) ? ()=>n : p <= 0 ? ()=>0 : function() {
|
|
for(var acc = 0, nn = n, pp = p; nn * pp > 16 && nn * (1 - pp) > 16;){
|
|
var i = Math.floor((nn + 1) * pp), y = B(i, nn - i + 1)();
|
|
y <= pp ? (acc += i, nn -= i, pp = (pp - y) / (1 - y)) : (nn = i - 1, pp /= y);
|
|
}
|
|
for(var sign = pp < 0.5, g = G(sign ? pp : 1 - pp), s = g(), k = 0; s <= nn; ++k)s += g();
|
|
return acc + (sign ? k : nn - k);
|
|
};
|
|
}
|
|
return randomBinomial.source = sourceRandomBinomial, randomBinomial;
|
|
}(defaultSource$1), weibull = function sourceRandomWeibull(source) {
|
|
function randomWeibull(k, a, b) {
|
|
var outerFunc;
|
|
return 0 == (k = +k) ? outerFunc = (x)=>-Math.log(x) : (k = 1 / k, outerFunc = (x)=>Math.pow(x, k)), a = null == a ? 0 : +a, b = null == b ? 1 : +b, function() {
|
|
return a + b * outerFunc(-Math.log1p(-source()));
|
|
};
|
|
}
|
|
return randomWeibull.source = sourceRandomWeibull, randomWeibull;
|
|
}(defaultSource$1), cauchy = function sourceRandomCauchy(source) {
|
|
function randomCauchy(a, b) {
|
|
return a = null == a ? 0 : +a, b = null == b ? 1 : +b, function() {
|
|
return a + b * Math.tan(Math.PI * source());
|
|
};
|
|
}
|
|
return randomCauchy.source = sourceRandomCauchy, randomCauchy;
|
|
}(defaultSource$1), logistic = function sourceRandomLogistic(source) {
|
|
function randomLogistic(a, b) {
|
|
return a = null == a ? 0 : +a, b = null == b ? 1 : +b, function() {
|
|
var u = source();
|
|
return a + b * Math.log(u / (1 - u));
|
|
};
|
|
}
|
|
return randomLogistic.source = sourceRandomLogistic, randomLogistic;
|
|
}(defaultSource$1), poisson = function sourceRandomPoisson(source) {
|
|
var G = gamma$1.source(source), B = binomial.source(source);
|
|
function randomPoisson(lambda) {
|
|
return function() {
|
|
for(var acc = 0, l = lambda; l > 16;){
|
|
var n = Math.floor(0.875 * l), t = G(n)();
|
|
if (t > l) return acc + B(n - 1, l / t)();
|
|
acc += n, l -= t;
|
|
}
|
|
for(var s = -Math.log1p(-source()), k = 0; s <= l; ++k)s -= Math.log1p(-source());
|
|
return acc + k;
|
|
};
|
|
}
|
|
return randomPoisson.source = sourceRandomPoisson, randomPoisson;
|
|
}(defaultSource$1);
|
|
const eps = 1 / 0x100000000;
|
|
function initRange(domain, range) {
|
|
switch(arguments.length){
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
this.range(domain);
|
|
break;
|
|
default:
|
|
this.range(range).domain(domain);
|
|
}
|
|
return this;
|
|
}
|
|
function initInterpolator(domain, interpolator) {
|
|
switch(arguments.length){
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
"function" == typeof domain ? this.interpolator(domain) : this.range(domain);
|
|
break;
|
|
default:
|
|
this.domain(domain), "function" == typeof interpolator ? this.interpolator(interpolator) : this.range(interpolator);
|
|
}
|
|
return this;
|
|
}
|
|
const implicit = Symbol("implicit");
|
|
function ordinal() {
|
|
var index = new Map(), domain = [], range = [], unknown = implicit;
|
|
function scale(d) {
|
|
var key = d + "", i = index.get(key);
|
|
if (!i) {
|
|
if (unknown !== implicit) return unknown;
|
|
index.set(key, i = domain.push(d));
|
|
}
|
|
return range[(i - 1) % range.length];
|
|
}
|
|
return scale.domain = function(_) {
|
|
if (!arguments.length) return domain.slice();
|
|
for (const value of (domain = [], index = new Map(), _)){
|
|
const key = value + "";
|
|
index.has(key) || index.set(key, domain.push(value));
|
|
}
|
|
return scale;
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), scale) : range.slice();
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, scale.copy = function() {
|
|
return ordinal(domain, range).unknown(unknown);
|
|
}, initRange.apply(scale, arguments), scale;
|
|
}
|
|
function band() {
|
|
var step, bandwidth, scale = ordinal().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, r0 = 0, r1 = 1, round = !1, paddingInner = 0, paddingOuter = 0, align = 0.5;
|
|
function rescale() {
|
|
var n = domain().length, reverse = r1 < r0, start = reverse ? r1 : r0, stop = reverse ? r0 : r1;
|
|
step = (stop - start) / Math.max(1, n - paddingInner + 2 * paddingOuter), round && (step = Math.floor(step)), start += (stop - start - step * (n - paddingInner)) * align, bandwidth = step * (1 - paddingInner), round && (start = Math.round(start), bandwidth = Math.round(bandwidth));
|
|
var values = sequence(n).map(function(i) {
|
|
return start + step * i;
|
|
});
|
|
return ordinalRange(reverse ? values.reverse() : values);
|
|
}
|
|
return delete scale.unknown, scale.domain = function(_) {
|
|
return arguments.length ? (domain(_), rescale()) : domain();
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [
|
|
r0,
|
|
r1
|
|
];
|
|
}, scale.rangeRound = function(_) {
|
|
return [r0, r1] = _, r0 = +r0, r1 = +r1, round = !0, rescale();
|
|
}, scale.bandwidth = function() {
|
|
return bandwidth;
|
|
}, scale.step = function() {
|
|
return step;
|
|
}, scale.round = function(_) {
|
|
return arguments.length ? (round = !!_, rescale()) : round;
|
|
}, scale.padding = function(_) {
|
|
return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
|
|
}, scale.paddingInner = function(_) {
|
|
return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
|
|
}, scale.paddingOuter = function(_) {
|
|
return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
|
|
}, scale.align = function(_) {
|
|
return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
|
|
}, scale.copy = function() {
|
|
return band(domain(), [
|
|
r0,
|
|
r1
|
|
]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);
|
|
}, initRange.apply(rescale(), arguments);
|
|
}
|
|
function number$2(x) {
|
|
return +x;
|
|
}
|
|
var unit = [
|
|
0,
|
|
1
|
|
];
|
|
function identity$6(x) {
|
|
return x;
|
|
}
|
|
function normalize(a, b) {
|
|
var x;
|
|
return (b -= a = +a) ? function(x) {
|
|
return (x - a) / b;
|
|
} : (x = isNaN(b) ? NaN : 0.5, function() {
|
|
return x;
|
|
});
|
|
}
|
|
function bimap(domain, range, interpolate) {
|
|
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
|
|
return d1 < d0 ? (d0 = normalize(d1, d0), r0 = interpolate(r1, r0)) : (d0 = normalize(d0, d1), r0 = interpolate(r0, r1)), function(x) {
|
|
return r0(d0(x));
|
|
};
|
|
}
|
|
function polymap(domain, range, interpolate) {
|
|
var j = Math.min(domain.length, range.length) - 1, d = Array(j), r = Array(j), i = -1;
|
|
for(domain[j] < domain[0] && (domain = domain.slice().reverse(), range = range.slice().reverse()); ++i < j;)d[i] = normalize(domain[i], domain[i + 1]), r[i] = interpolate(range[i], range[i + 1]);
|
|
return function(x) {
|
|
var i = bisectRight(domain, x, 1, j) - 1;
|
|
return r[i](d[i](x));
|
|
};
|
|
}
|
|
function copy(source, target) {
|
|
return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
|
|
}
|
|
function transformer$1() {
|
|
var transform, untransform, unknown, piecewise, output, input, domain = unit, range = unit, interpolate$1 = interpolate, clamp = identity$6;
|
|
function rescale() {
|
|
var a, b, t, n = Math.min(domain.length, range.length);
|
|
return clamp !== identity$6 && ((a = domain[0]) > (b = domain[n - 1]) && (t = a, a = b, b = t), clamp = function(x) {
|
|
return Math.max(a, Math.min(b, x));
|
|
}), piecewise = n > 2 ? polymap : bimap, output = input = null, scale;
|
|
}
|
|
function scale(x) {
|
|
return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate$1)))(transform(clamp(x)));
|
|
}
|
|
return scale.invert = function(y) {
|
|
return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
|
|
}, scale.domain = function(_) {
|
|
return arguments.length ? (domain = Array.from(_, number$2), rescale()) : domain.slice();
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
|
|
}, scale.rangeRound = function(_) {
|
|
return range = Array.from(_), interpolate$1 = interpolateRound, rescale();
|
|
}, scale.clamp = function(_) {
|
|
return arguments.length ? (clamp = !!_ || identity$6, rescale()) : clamp !== identity$6;
|
|
}, scale.interpolate = function(_) {
|
|
return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1;
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, function(t, u) {
|
|
return transform = t, untransform = u, rescale();
|
|
};
|
|
}
|
|
function continuous() {
|
|
return transformer$1()(identity$6, identity$6);
|
|
}
|
|
function tickFormat(start, stop, count, specifier) {
|
|
var precision, step = tickStep(start, stop, count);
|
|
switch((specifier = formatSpecifier(null == specifier ? ",f" : specifier)).type){
|
|
case "s":
|
|
var value = Math.max(Math.abs(start), Math.abs(stop));
|
|
return null != specifier.precision || isNaN(precision = precisionPrefix(step, value)) || (specifier.precision = precision), exports1.formatPrefix(specifier, value);
|
|
case "":
|
|
case "e":
|
|
case "g":
|
|
case "p":
|
|
case "r":
|
|
null != specifier.precision || isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop)))) || (specifier.precision = precision - ("e" === specifier.type));
|
|
break;
|
|
case "f":
|
|
case "%":
|
|
null != specifier.precision || isNaN(precision = precisionFixed(step)) || (specifier.precision = precision - ("%" === specifier.type) * 2);
|
|
}
|
|
return exports1.format(specifier);
|
|
}
|
|
function linearish(scale) {
|
|
var domain = scale.domain;
|
|
return scale.ticks = function(count) {
|
|
var d = domain();
|
|
return ticks(d[0], d[d.length - 1], null == count ? 10 : count);
|
|
}, scale.tickFormat = function(count, specifier) {
|
|
var d = domain();
|
|
return tickFormat(d[0], d[d.length - 1], null == count ? 10 : count, specifier);
|
|
}, scale.nice = function(count) {
|
|
null == count && (count = 10);
|
|
var prestep, step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1], maxIter = 10;
|
|
for(stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1, i1 = step); maxIter-- > 0;){
|
|
if ((step = tickIncrement(start, stop, count)) === prestep) return d[i0] = start, d[i1] = stop, domain(d);
|
|
if (step > 0) start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step;
|
|
else if (step < 0) start = Math.ceil(start * step) / step, stop = Math.floor(stop * step) / step;
|
|
else break;
|
|
prestep = step;
|
|
}
|
|
return scale;
|
|
}, scale;
|
|
}
|
|
function nice$1(domain, interval) {
|
|
domain = domain.slice();
|
|
var t, i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1];
|
|
return x1 < x0 && (t = i0, i0 = i1, i1 = t, t = x0, x0 = x1, x1 = t), domain[i0] = interval.floor(x0), domain[i1] = interval.ceil(x1), domain;
|
|
}
|
|
function transformLog(x) {
|
|
return Math.log(x);
|
|
}
|
|
function transformExp(x) {
|
|
return Math.exp(x);
|
|
}
|
|
function transformLogn(x) {
|
|
return -Math.log(-x);
|
|
}
|
|
function transformExpn(x) {
|
|
return -Math.exp(-x);
|
|
}
|
|
function pow10(x) {
|
|
return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
|
|
}
|
|
function reflect(f) {
|
|
return function(x) {
|
|
return -f(-x);
|
|
};
|
|
}
|
|
function loggish(transform) {
|
|
var logs, pows, scale = transform(transformLog, transformExp), domain = scale.domain, base = 10;
|
|
function rescale() {
|
|
var base1, base2;
|
|
return logs = (base1 = base) === Math.E ? Math.log : 10 === base1 && Math.log10 || 2 === base1 && Math.log2 || (base1 = Math.log(base1), function(x) {
|
|
return Math.log(x) / base1;
|
|
}), pows = 10 === (base2 = base) ? pow10 : base2 === Math.E ? Math.exp : function(x) {
|
|
return Math.pow(base2, x);
|
|
}, domain()[0] < 0 ? (logs = reflect(logs), pows = reflect(pows), transform(transformLogn, transformExpn)) : transform(transformLog, transformExp), scale;
|
|
}
|
|
return scale.base = function(_) {
|
|
return arguments.length ? (base = +_, rescale()) : base;
|
|
}, scale.domain = function(_) {
|
|
return arguments.length ? (domain(_), rescale()) : domain();
|
|
}, scale.ticks = function(count) {
|
|
var r, d = domain(), u = d[0], v = d[d.length - 1];
|
|
(r = v < u) && (i = u, u = v, v = i);
|
|
var p, k, t, i = logs(u), j = logs(v), n = null == count ? 10 : +count, z = [];
|
|
if (!(base % 1) && j - i < n) {
|
|
if (i = Math.floor(i), j = Math.ceil(j), u > 0) {
|
|
for(; i <= j; ++i)for(k = 1, p = pows(i); k < base; ++k)if (!((t = p * k) < u)) {
|
|
if (t > v) break;
|
|
z.push(t);
|
|
}
|
|
} else for(; i <= j; ++i)for(k = base - 1, p = pows(i); k >= 1; --k)if (!((t = p * k) < u)) {
|
|
if (t > v) break;
|
|
z.push(t);
|
|
}
|
|
2 * z.length < n && (z = ticks(u, v, n));
|
|
} else z = ticks(i, j, Math.min(j - i, n)).map(pows);
|
|
return r ? z.reverse() : z;
|
|
}, scale.tickFormat = function(count, specifier) {
|
|
if (null == specifier && (specifier = 10 === base ? ".0e" : ","), "function" != typeof specifier && (specifier = exports1.format(specifier)), count === 1 / 0) return specifier;
|
|
null == count && (count = 10);
|
|
var k = Math.max(1, base * count / scale.ticks().length);
|
|
return function(d) {
|
|
var i = d / pows(Math.round(logs(d)));
|
|
return i * base < base - 0.5 && (i *= base), i <= k ? specifier(d) : "";
|
|
};
|
|
}, scale.nice = function() {
|
|
return domain(nice$1(domain(), {
|
|
floor: function(x) {
|
|
return pows(Math.floor(logs(x)));
|
|
},
|
|
ceil: function(x) {
|
|
return pows(Math.ceil(logs(x)));
|
|
}
|
|
}));
|
|
}, scale;
|
|
}
|
|
function transformSymlog(c) {
|
|
return function(x) {
|
|
return Math.sign(x) * Math.log1p(Math.abs(x / c));
|
|
};
|
|
}
|
|
function transformSymexp(c) {
|
|
return function(x) {
|
|
return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
|
|
};
|
|
}
|
|
function symlogish(transform) {
|
|
var c = 1, scale = transform(transformSymlog(1), transformSymexp(c));
|
|
return scale.constant = function(_) {
|
|
return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
|
|
}, linearish(scale);
|
|
}
|
|
function transformPow(exponent) {
|
|
return function(x) {
|
|
return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
|
|
};
|
|
}
|
|
function transformSqrt(x) {
|
|
return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
|
|
}
|
|
function transformSquare(x) {
|
|
return x < 0 ? -x * x : x * x;
|
|
}
|
|
function powish(transform) {
|
|
var scale = transform(identity$6, identity$6), exponent = 1;
|
|
return scale.exponent = function(_) {
|
|
return arguments.length ? 1 == (exponent = +_) ? transform(identity$6, identity$6) : 0.5 === exponent ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent)) : exponent;
|
|
}, linearish(scale);
|
|
}
|
|
function pow$2() {
|
|
var scale = powish(transformer$1());
|
|
return scale.copy = function() {
|
|
return copy(scale, pow$2()).exponent(scale.exponent());
|
|
}, initRange.apply(scale, arguments), scale;
|
|
}
|
|
function square(x) {
|
|
return Math.sign(x) * x * x;
|
|
}
|
|
var t0$1 = new Date, t1$1 = new Date;
|
|
function newInterval(floori, offseti, count, field) {
|
|
function interval(date) {
|
|
return floori(date = 0 == arguments.length ? new Date : new Date(+date)), date;
|
|
}
|
|
return interval.floor = function(date) {
|
|
return floori(date = new Date(+date)), date;
|
|
}, interval.ceil = function(date) {
|
|
return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
|
|
}, interval.round = function(date) {
|
|
var d0 = interval(date), d1 = interval.ceil(date);
|
|
return date - d0 < d1 - date ? d0 : d1;
|
|
}, interval.offset = function(date, step) {
|
|
return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date;
|
|
}, interval.range = function(start, stop, step) {
|
|
var previous, range = [];
|
|
if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop) || !(step > 0)) return range;
|
|
do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
|
|
while (previous < start && start < stop)
|
|
return range;
|
|
}, interval.filter = function(test) {
|
|
return newInterval(function(date) {
|
|
if (date >= date) for(; floori(date), !test(date);)date.setTime(date - 1);
|
|
}, function(date, step) {
|
|
if (date >= date) {
|
|
if (step < 0) for(; ++step <= 0;)for(; offseti(date, -1), !test(date););
|
|
else for(; --step >= 0;)for(; offseti(date, 1), !test(date););
|
|
}
|
|
});
|
|
}, count && (interval.count = function(start, end) {
|
|
return t0$1.setTime(+start), t1$1.setTime(+end), floori(t0$1), floori(t1$1), Math.floor(count(t0$1, t1$1));
|
|
}, interval.every = function(step) {
|
|
return isFinite(step = Math.floor(step)) && step > 0 ? step > 1 ? interval.filter(field ? function(d) {
|
|
return field(d) % step == 0;
|
|
} : function(d) {
|
|
return interval.count(0, d) % step == 0;
|
|
}) : interval : null;
|
|
}), interval;
|
|
}
|
|
var millisecond = newInterval(function() {}, function(date, step) {
|
|
date.setTime(+date + step);
|
|
}, function(start, end) {
|
|
return end - start;
|
|
});
|
|
millisecond.every = function(k) {
|
|
return isFinite(k = Math.floor(k)) && k > 0 ? k > 1 ? 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;
|
|
}) : millisecond : null;
|
|
};
|
|
var milliseconds = millisecond.range, second = newInterval(function(date) {
|
|
date.setTime(date - date.getMilliseconds());
|
|
}, function(date, step) {
|
|
date.setTime(+date + 1e3 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 1e3;
|
|
}, function(date) {
|
|
return date.getUTCSeconds();
|
|
}), seconds = second.range, minute = newInterval(function(date) {
|
|
date.setTime(date - date.getMilliseconds() - 1e3 * date.getSeconds());
|
|
}, function(date, step) {
|
|
date.setTime(+date + 6e4 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 6e4;
|
|
}, function(date) {
|
|
return date.getMinutes();
|
|
}), minutes = minute.range, hour = newInterval(function(date) {
|
|
date.setTime(date - date.getMilliseconds() - 1e3 * date.getSeconds() - 6e4 * date.getMinutes());
|
|
}, function(date, step) {
|
|
date.setTime(+date + 36e5 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 36e5;
|
|
}, function(date) {
|
|
return date.getHours();
|
|
}), hours = hour.range, day = newInterval((date)=>date.setHours(0, 0, 0, 0), (date, step)=>date.setDate(date.getDate() + step), (start, end)=>(end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 864e5, (date)=>date.getDate() - 1), days = day.range;
|
|
function weekday(i) {
|
|
return newInterval(function(date) {
|
|
date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7), date.setHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setDate(date.getDate() + 7 * step);
|
|
}, function(start, end) {
|
|
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * 6e4) / 6048e5;
|
|
});
|
|
}
|
|
var sunday = weekday(0), monday = weekday(1), tuesday = weekday(2), wednesday = weekday(3), thursday = weekday(4), friday = weekday(5), saturday = weekday(6), sundays = sunday.range, mondays = monday.range, tuesdays = tuesday.range, wednesdays = wednesday.range, thursdays = thursday.range, fridays = friday.range, saturdays = saturday.range, month = newInterval(function(date) {
|
|
date.setDate(1), date.setHours(0, 0, 0, 0);
|
|
}, 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();
|
|
}), months = month.range, year = newInterval(function(date) {
|
|
date.setMonth(0, 1), date.setHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setFullYear(date.getFullYear() + step);
|
|
}, function(start, end) {
|
|
return end.getFullYear() - start.getFullYear();
|
|
}, function(date) {
|
|
return date.getFullYear();
|
|
});
|
|
year.every = function(k) {
|
|
return isFinite(k = Math.floor(k)) && k > 0 ? newInterval(function(date) {
|
|
date.setFullYear(Math.floor(date.getFullYear() / k) * k), date.setMonth(0, 1), date.setHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setFullYear(date.getFullYear() + step * k);
|
|
}) : null;
|
|
};
|
|
var years = year.range, utcMinute = newInterval(function(date) {
|
|
date.setUTCSeconds(0, 0);
|
|
}, function(date, step) {
|
|
date.setTime(+date + 6e4 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 6e4;
|
|
}, function(date) {
|
|
return date.getUTCMinutes();
|
|
}), utcMinutes = utcMinute.range, utcHour = newInterval(function(date) {
|
|
date.setUTCMinutes(0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setTime(+date + 36e5 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 36e5;
|
|
}, function(date) {
|
|
return date.getUTCHours();
|
|
}), utcHours = utcHour.range, 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;
|
|
}), utcDays = utcDay.range;
|
|
function utcWeekday(i) {
|
|
return newInterval(function(date) {
|
|
date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7), date.setUTCHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setUTCDate(date.getUTCDate() + 7 * step);
|
|
}, function(start, end) {
|
|
return (end - start) / 6048e5;
|
|
});
|
|
}
|
|
var utcSunday = utcWeekday(0), utcMonday = utcWeekday(1), utcTuesday = utcWeekday(2), utcWednesday = utcWeekday(3), utcThursday = utcWeekday(4), utcFriday = utcWeekday(5), utcSaturday = utcWeekday(6), utcSundays = utcSunday.range, utcMondays = utcMonday.range, utcTuesdays = utcTuesday.range, utcWednesdays = utcWednesday.range, utcThursdays = utcThursday.range, utcFridays = utcFriday.range, utcSaturdays = utcSaturday.range, utcMonth = newInterval(function(date) {
|
|
date.setUTCDate(1), date.setUTCHours(0, 0, 0, 0);
|
|
}, 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();
|
|
}), utcMonths = utcMonth.range, utcYear = newInterval(function(date) {
|
|
date.setUTCMonth(0, 1), date.setUTCHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setUTCFullYear(date.getUTCFullYear() + step);
|
|
}, function(start, end) {
|
|
return end.getUTCFullYear() - start.getUTCFullYear();
|
|
}, function(date) {
|
|
return date.getUTCFullYear();
|
|
});
|
|
utcYear.every = function(k) {
|
|
return isFinite(k = Math.floor(k)) && k > 0 ? newInterval(function(date) {
|
|
date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k), date.setUTCMonth(0, 1), date.setUTCHours(0, 0, 0, 0);
|
|
}, function(date, step) {
|
|
date.setUTCFullYear(date.getUTCFullYear() + step * k);
|
|
}) : null;
|
|
};
|
|
var utcYears = utcYear.range;
|
|
function localDate(d) {
|
|
if (0 <= d.y && d.y < 100) {
|
|
var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
|
|
return date.setFullYear(d.y), date;
|
|
}
|
|
return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
|
|
}
|
|
function utcDate(d) {
|
|
if (0 <= d.y && d.y < 100) {
|
|
var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
|
|
return date.setUTCFullYear(d.y), date;
|
|
}
|
|
return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
|
|
}
|
|
function newDate(y, m, d) {
|
|
return {
|
|
y: y,
|
|
m: m,
|
|
d: d,
|
|
H: 0,
|
|
M: 0,
|
|
S: 0,
|
|
L: 0
|
|
};
|
|
}
|
|
function formatLocale$1(locale) {
|
|
var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths, periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths), formats = {
|
|
a: function(d) {
|
|
return locale_shortWeekdays[d.getDay()];
|
|
},
|
|
A: function(d) {
|
|
return locale_weekdays[d.getDay()];
|
|
},
|
|
b: function(d) {
|
|
return locale_shortMonths[d.getMonth()];
|
|
},
|
|
B: function(d) {
|
|
return locale_months[d.getMonth()];
|
|
},
|
|
c: null,
|
|
d: formatDayOfMonth,
|
|
e: formatDayOfMonth,
|
|
f: formatMicroseconds,
|
|
g: formatYearISO,
|
|
G: formatFullYearISO,
|
|
H: formatHour24,
|
|
I: formatHour12,
|
|
j: formatDayOfYear,
|
|
L: formatMilliseconds,
|
|
m: formatMonthNumber,
|
|
M: formatMinutes,
|
|
p: function(d) {
|
|
return locale_periods[+(d.getHours() >= 12)];
|
|
},
|
|
q: function(d) {
|
|
return 1 + ~~(d.getMonth() / 3);
|
|
},
|
|
Q: formatUnixTimestamp,
|
|
s: formatUnixTimestampSeconds,
|
|
S: formatSeconds,
|
|
u: formatWeekdayNumberMonday,
|
|
U: formatWeekNumberSunday,
|
|
V: formatWeekNumberISO,
|
|
w: formatWeekdayNumberSunday,
|
|
W: formatWeekNumberMonday,
|
|
x: null,
|
|
X: null,
|
|
y: formatYear$1,
|
|
Y: formatFullYear,
|
|
Z: formatZone,
|
|
"%": formatLiteralPercent
|
|
}, utcFormats = {
|
|
a: function(d) {
|
|
return locale_shortWeekdays[d.getUTCDay()];
|
|
},
|
|
A: function(d) {
|
|
return locale_weekdays[d.getUTCDay()];
|
|
},
|
|
b: function(d) {
|
|
return locale_shortMonths[d.getUTCMonth()];
|
|
},
|
|
B: function(d) {
|
|
return locale_months[d.getUTCMonth()];
|
|
},
|
|
c: null,
|
|
d: formatUTCDayOfMonth,
|
|
e: formatUTCDayOfMonth,
|
|
f: formatUTCMicroseconds,
|
|
g: formatUTCYearISO,
|
|
G: formatUTCFullYearISO,
|
|
H: formatUTCHour24,
|
|
I: formatUTCHour12,
|
|
j: formatUTCDayOfYear,
|
|
L: formatUTCMilliseconds,
|
|
m: formatUTCMonthNumber,
|
|
M: formatUTCMinutes,
|
|
p: function(d) {
|
|
return locale_periods[+(d.getUTCHours() >= 12)];
|
|
},
|
|
q: function(d) {
|
|
return 1 + ~~(d.getUTCMonth() / 3);
|
|
},
|
|
Q: formatUnixTimestamp,
|
|
s: formatUnixTimestampSeconds,
|
|
S: formatUTCSeconds,
|
|
u: formatUTCWeekdayNumberMonday,
|
|
U: formatUTCWeekNumberSunday,
|
|
V: formatUTCWeekNumberISO,
|
|
w: formatUTCWeekdayNumberSunday,
|
|
W: formatUTCWeekNumberMonday,
|
|
x: null,
|
|
X: null,
|
|
y: formatUTCYear,
|
|
Y: formatUTCFullYear,
|
|
Z: formatUTCZone,
|
|
"%": formatLiteralPercent
|
|
}, parses = {
|
|
a: function(d, string, i) {
|
|
var n = shortWeekdayRe.exec(string.slice(i));
|
|
return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
|
},
|
|
A: function(d, string, i) {
|
|
var n = weekdayRe.exec(string.slice(i));
|
|
return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
|
},
|
|
b: function(d, string, i) {
|
|
var n = shortMonthRe.exec(string.slice(i));
|
|
return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
|
},
|
|
B: function(d, string, i) {
|
|
var n = monthRe.exec(string.slice(i));
|
|
return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
|
},
|
|
c: function(d, string, i) {
|
|
return parseSpecifier(d, locale_dateTime, string, i);
|
|
},
|
|
d: parseDayOfMonth,
|
|
e: parseDayOfMonth,
|
|
f: parseMicroseconds,
|
|
g: parseYear,
|
|
G: parseFullYear,
|
|
H: parseHour24,
|
|
I: parseHour24,
|
|
j: parseDayOfYear,
|
|
L: parseMilliseconds,
|
|
m: parseMonthNumber,
|
|
M: parseMinutes,
|
|
p: function(d, string, i) {
|
|
var n = periodRe.exec(string.slice(i));
|
|
return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
|
|
},
|
|
q: parseQuarter,
|
|
Q: parseUnixTimestamp,
|
|
s: parseUnixTimestampSeconds,
|
|
S: parseSeconds,
|
|
u: parseWeekdayNumberMonday,
|
|
U: parseWeekNumberSunday,
|
|
V: parseWeekNumberISO,
|
|
w: parseWeekdayNumberSunday,
|
|
W: parseWeekNumberMonday,
|
|
x: function(d, string, i) {
|
|
return parseSpecifier(d, locale_date, string, i);
|
|
},
|
|
X: function(d, string, i) {
|
|
return parseSpecifier(d, locale_time, string, i);
|
|
},
|
|
y: parseYear,
|
|
Y: parseFullYear,
|
|
Z: parseZone,
|
|
"%": parseLiteralPercent
|
|
};
|
|
function newFormat(specifier, formats) {
|
|
return function(date) {
|
|
var c, pad, format, string = [], i = -1, j = 0, n = specifier.length;
|
|
for(date instanceof Date || (date = new Date(+date)); ++i < n;)37 === specifier.charCodeAt(i) && (string.push(specifier.slice(j, i)), null != (pad = pads[c = specifier.charAt(++i)]) ? c = specifier.charAt(++i) : pad = "e" === c ? " " : "0", (format = formats[c]) && (c = format(date, pad)), string.push(c), j = i + 1);
|
|
return string.push(specifier.slice(j, i)), string.join("");
|
|
};
|
|
}
|
|
function newParse(specifier, Z) {
|
|
return function(string) {
|
|
var week, day$1, d = newDate(1900, void 0, 1);
|
|
if (parseSpecifier(d, specifier, string += "", 0) != string.length) return null;
|
|
if ("Q" in d) return new Date(d.Q);
|
|
if ("s" in d) return new Date(1000 * d.s + ("L" in d ? d.L : 0));
|
|
if (!Z || "Z" in d || (d.Z = 0), "p" in d && (d.H = d.H % 12 + 12 * d.p), void 0 === d.m && (d.m = "q" in d ? d.q : 0), "V" in d) {
|
|
if (d.V < 1 || d.V > 53) return null;
|
|
"w" in d || (d.w = 1), "Z" in d ? (week = (day$1 = (week = utcDate(newDate(d.y, 0, 1))).getUTCDay()) > 4 || 0 === day$1 ? utcMonday.ceil(week) : utcMonday(week), week = utcDay.offset(week, (d.V - 1) * 7), d.y = week.getUTCFullYear(), d.m = week.getUTCMonth(), d.d = week.getUTCDate() + (d.w + 6) % 7) : (week = (day$1 = (week = localDate(newDate(d.y, 0, 1))).getDay()) > 4 || 0 === day$1 ? monday.ceil(week) : monday(week), week = day.offset(week, (d.V - 1) * 7), d.y = week.getFullYear(), d.m = week.getMonth(), d.d = week.getDate() + (d.w + 6) % 7);
|
|
} else ("W" in d || "U" in d) && ("w" in d || (d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0), day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(), d.m = 0, d.d = "W" in d ? (d.w + 6) % 7 + 7 * d.W - (day$1 + 5) % 7 : d.w + 7 * d.U - (day$1 + 6) % 7);
|
|
return "Z" in d ? (d.H += d.Z / 100 | 0, d.M += d.Z % 100, utcDate(d)) : localDate(d);
|
|
};
|
|
}
|
|
function parseSpecifier(d, specifier, string, j) {
|
|
for(var c, parse, i = 0, n = specifier.length, m = string.length; i < n;){
|
|
if (j >= m) return -1;
|
|
if (37 === (c = specifier.charCodeAt(i++))) {
|
|
if (!(parse = parses[(c = specifier.charAt(i++)) in pads ? specifier.charAt(i++) : c]) || (j = parse(d, string, j)) < 0) return -1;
|
|
} else if (c != string.charCodeAt(j++)) return -1;
|
|
}
|
|
return j;
|
|
}
|
|
return formats.x = newFormat(locale_date, formats), formats.X = newFormat(locale_time, formats), formats.c = newFormat(locale_dateTime, formats), utcFormats.x = newFormat(locale_date, utcFormats), utcFormats.X = newFormat(locale_time, utcFormats), utcFormats.c = newFormat(locale_dateTime, utcFormats), {
|
|
format: function(specifier) {
|
|
var f = newFormat(specifier += "", formats);
|
|
return f.toString = function() {
|
|
return specifier;
|
|
}, f;
|
|
},
|
|
parse: function(specifier) {
|
|
var p = newParse(specifier += "", !1);
|
|
return p.toString = function() {
|
|
return specifier;
|
|
}, p;
|
|
},
|
|
utcFormat: function(specifier) {
|
|
var f = newFormat(specifier += "", utcFormats);
|
|
return f.toString = function() {
|
|
return specifier;
|
|
}, f;
|
|
},
|
|
utcParse: function(specifier) {
|
|
var p = newParse(specifier += "", !0);
|
|
return p.toString = function() {
|
|
return specifier;
|
|
}, p;
|
|
}
|
|
};
|
|
}
|
|
var pads = {
|
|
"-": "",
|
|
_: " ",
|
|
0: "0"
|
|
}, numberRe = /^\s*\d+/, percentRe = /^%/, requoteRe = /[\\^$*+?|[\]().{}]/g;
|
|
function pad$1(value, fill, width) {
|
|
var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
|
|
return sign + (length < width ? Array(width - length + 1).join(fill) + string : string);
|
|
}
|
|
function requote(s) {
|
|
return s.replace(requoteRe, "\\$&");
|
|
}
|
|
function formatRe(names) {
|
|
return RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
|
|
}
|
|
function formatLookup(names) {
|
|
return new Map(names.map((name, i)=>[
|
|
name.toLowerCase(),
|
|
i
|
|
]));
|
|
}
|
|
function parseWeekdayNumberSunday(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 1));
|
|
return n ? (d.w = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseWeekdayNumberMonday(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 1));
|
|
return n ? (d.u = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseWeekNumberSunday(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.U = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseWeekNumberISO(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.V = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseWeekNumberMonday(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.W = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseFullYear(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 4));
|
|
return n ? (d.y = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseYear(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
|
|
}
|
|
function parseZone(d, string, i) {
|
|
var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
|
|
return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
|
|
}
|
|
function parseQuarter(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 1));
|
|
return n ? (d.q = 3 * n[0] - 3, i + n[0].length) : -1;
|
|
}
|
|
function parseMonthNumber(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
|
|
}
|
|
function parseDayOfMonth(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.d = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseDayOfYear(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 3));
|
|
return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseHour24(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.H = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseMinutes(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.M = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseSeconds(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 2));
|
|
return n ? (d.S = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseMilliseconds(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 3));
|
|
return n ? (d.L = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseMicroseconds(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i, i + 6));
|
|
return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
|
|
}
|
|
function parseLiteralPercent(d, string, i) {
|
|
var n = percentRe.exec(string.slice(i, i + 1));
|
|
return n ? i + n[0].length : -1;
|
|
}
|
|
function parseUnixTimestamp(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i));
|
|
return n ? (d.Q = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function parseUnixTimestampSeconds(d, string, i) {
|
|
var n = numberRe.exec(string.slice(i));
|
|
return n ? (d.s = +n[0], i + n[0].length) : -1;
|
|
}
|
|
function formatDayOfMonth(d, p) {
|
|
return pad$1(d.getDate(), p, 2);
|
|
}
|
|
function formatHour24(d, p) {
|
|
return pad$1(d.getHours(), p, 2);
|
|
}
|
|
function formatHour12(d, p) {
|
|
return pad$1(d.getHours() % 12 || 12, p, 2);
|
|
}
|
|
function formatDayOfYear(d, p) {
|
|
return pad$1(1 + day.count(year(d), d), p, 3);
|
|
}
|
|
function formatMilliseconds(d, p) {
|
|
return pad$1(d.getMilliseconds(), p, 3);
|
|
}
|
|
function formatMicroseconds(d, p) {
|
|
return formatMilliseconds(d, p) + "000";
|
|
}
|
|
function formatMonthNumber(d, p) {
|
|
return pad$1(d.getMonth() + 1, p, 2);
|
|
}
|
|
function formatMinutes(d, p) {
|
|
return pad$1(d.getMinutes(), p, 2);
|
|
}
|
|
function formatSeconds(d, p) {
|
|
return pad$1(d.getSeconds(), p, 2);
|
|
}
|
|
function formatWeekdayNumberMonday(d) {
|
|
var day = d.getDay();
|
|
return 0 === day ? 7 : day;
|
|
}
|
|
function formatWeekNumberSunday(d, p) {
|
|
return pad$1(sunday.count(year(d) - 1, d), p, 2);
|
|
}
|
|
function dISO(d) {
|
|
var day = d.getDay();
|
|
return day >= 4 || 0 === day ? thursday(d) : thursday.ceil(d);
|
|
}
|
|
function formatWeekNumberISO(d, p) {
|
|
return d = dISO(d), pad$1(thursday.count(year(d), d) + (4 === year(d).getDay()), p, 2);
|
|
}
|
|
function formatWeekdayNumberSunday(d) {
|
|
return d.getDay();
|
|
}
|
|
function formatWeekNumberMonday(d, p) {
|
|
return pad$1(monday.count(year(d) - 1, d), p, 2);
|
|
}
|
|
function formatYear$1(d, p) {
|
|
return pad$1(d.getFullYear() % 100, p, 2);
|
|
}
|
|
function formatYearISO(d, p) {
|
|
return pad$1((d = dISO(d)).getFullYear() % 100, p, 2);
|
|
}
|
|
function formatFullYear(d, p) {
|
|
return pad$1(d.getFullYear() % 10000, p, 4);
|
|
}
|
|
function formatFullYearISO(d, p) {
|
|
var day = d.getDay();
|
|
return pad$1((d = day >= 4 || 0 === day ? thursday(d) : thursday.ceil(d)).getFullYear() % 10000, p, 4);
|
|
}
|
|
function formatZone(d) {
|
|
var z = d.getTimezoneOffset();
|
|
return (z > 0 ? "-" : (z *= -1, "+")) + pad$1(z / 60 | 0, "0", 2) + pad$1(z % 60, "0", 2);
|
|
}
|
|
function formatUTCDayOfMonth(d, p) {
|
|
return pad$1(d.getUTCDate(), p, 2);
|
|
}
|
|
function formatUTCHour24(d, p) {
|
|
return pad$1(d.getUTCHours(), p, 2);
|
|
}
|
|
function formatUTCHour12(d, p) {
|
|
return pad$1(d.getUTCHours() % 12 || 12, p, 2);
|
|
}
|
|
function formatUTCDayOfYear(d, p) {
|
|
return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
|
|
}
|
|
function formatUTCMilliseconds(d, p) {
|
|
return pad$1(d.getUTCMilliseconds(), p, 3);
|
|
}
|
|
function formatUTCMicroseconds(d, p) {
|
|
return formatUTCMilliseconds(d, p) + "000";
|
|
}
|
|
function formatUTCMonthNumber(d, p) {
|
|
return pad$1(d.getUTCMonth() + 1, p, 2);
|
|
}
|
|
function formatUTCMinutes(d, p) {
|
|
return pad$1(d.getUTCMinutes(), p, 2);
|
|
}
|
|
function formatUTCSeconds(d, p) {
|
|
return pad$1(d.getUTCSeconds(), p, 2);
|
|
}
|
|
function formatUTCWeekdayNumberMonday(d) {
|
|
var dow = d.getUTCDay();
|
|
return 0 === dow ? 7 : dow;
|
|
}
|
|
function formatUTCWeekNumberSunday(d, p) {
|
|
return pad$1(utcSunday.count(utcYear(d) - 1, d), p, 2);
|
|
}
|
|
function UTCdISO(d) {
|
|
var day = d.getUTCDay();
|
|
return day >= 4 || 0 === day ? utcThursday(d) : utcThursday.ceil(d);
|
|
}
|
|
function formatUTCWeekNumberISO(d, p) {
|
|
return d = UTCdISO(d), pad$1(utcThursday.count(utcYear(d), d) + (4 === utcYear(d).getUTCDay()), p, 2);
|
|
}
|
|
function formatUTCWeekdayNumberSunday(d) {
|
|
return d.getUTCDay();
|
|
}
|
|
function formatUTCWeekNumberMonday(d, p) {
|
|
return pad$1(utcMonday.count(utcYear(d) - 1, d), p, 2);
|
|
}
|
|
function formatUTCYear(d, p) {
|
|
return pad$1(d.getUTCFullYear() % 100, p, 2);
|
|
}
|
|
function formatUTCYearISO(d, p) {
|
|
return pad$1((d = UTCdISO(d)).getUTCFullYear() % 100, p, 2);
|
|
}
|
|
function formatUTCFullYear(d, p) {
|
|
return pad$1(d.getUTCFullYear() % 10000, p, 4);
|
|
}
|
|
function formatUTCFullYearISO(d, p) {
|
|
var day = d.getUTCDay();
|
|
return pad$1((d = day >= 4 || 0 === day ? utcThursday(d) : utcThursday.ceil(d)).getUTCFullYear() % 10000, p, 4);
|
|
}
|
|
function formatUTCZone() {
|
|
return "+0000";
|
|
}
|
|
function formatLiteralPercent() {
|
|
return "%";
|
|
}
|
|
function formatUnixTimestamp(d) {
|
|
return +d;
|
|
}
|
|
function formatUnixTimestampSeconds(d) {
|
|
return Math.floor(+d / 1000);
|
|
}
|
|
function defaultLocale$1(definition) {
|
|
return locale$1 = formatLocale$1(definition), exports1.timeFormat = locale$1.format, exports1.timeParse = locale$1.parse, exports1.utcFormat = locale$1.utcFormat, exports1.utcParse = locale$1.utcParse, locale$1;
|
|
}
|
|
defaultLocale$1({
|
|
dateTime: "%x, %X",
|
|
date: "%-m/%-d/%Y",
|
|
time: "%-I:%M:%S %p",
|
|
periods: [
|
|
"AM",
|
|
"PM"
|
|
],
|
|
days: [
|
|
"Sunday",
|
|
"Monday",
|
|
"Tuesday",
|
|
"Wednesday",
|
|
"Thursday",
|
|
"Friday",
|
|
"Saturday"
|
|
],
|
|
shortDays: [
|
|
"Sun",
|
|
"Mon",
|
|
"Tue",
|
|
"Wed",
|
|
"Thu",
|
|
"Fri",
|
|
"Sat"
|
|
],
|
|
months: [
|
|
"January",
|
|
"February",
|
|
"March",
|
|
"April",
|
|
"May",
|
|
"June",
|
|
"July",
|
|
"August",
|
|
"September",
|
|
"October",
|
|
"November",
|
|
"December"
|
|
],
|
|
shortMonths: [
|
|
"Jan",
|
|
"Feb",
|
|
"Mar",
|
|
"Apr",
|
|
"May",
|
|
"Jun",
|
|
"Jul",
|
|
"Aug",
|
|
"Sep",
|
|
"Oct",
|
|
"Nov",
|
|
"Dec"
|
|
]
|
|
});
|
|
var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ", formatIso = Date.prototype.toISOString ? function(date) {
|
|
return date.toISOString();
|
|
} : exports1.utcFormat(isoSpecifier), parseIso = +new Date("2000-01-01T00:00:00.000Z") ? function(string) {
|
|
var date = new Date(string);
|
|
return isNaN(date) ? null : date;
|
|
} : exports1.utcParse(isoSpecifier);
|
|
function date$1(t) {
|
|
return new Date(t);
|
|
}
|
|
function number$3(t) {
|
|
return t instanceof Date ? +t : +new Date(+t);
|
|
}
|
|
function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
|
|
var scale = continuous(), invert = scale.invert, domain = scale.domain, formatMillisecond = format(".%L"), formatSecond = format(":%S"), formatMinute = format("%I:%M"), formatHour = format("%I %p"), formatDay = format("%a %d"), formatWeek = format("%b %d"), formatMonth = format("%B"), formatYear = format("%Y"), tickIntervals = [
|
|
[
|
|
second,
|
|
1,
|
|
1000
|
|
],
|
|
[
|
|
second,
|
|
5,
|
|
5000
|
|
],
|
|
[
|
|
second,
|
|
15,
|
|
15000
|
|
],
|
|
[
|
|
second,
|
|
30,
|
|
30000
|
|
],
|
|
[
|
|
minute,
|
|
1,
|
|
60000
|
|
],
|
|
[
|
|
minute,
|
|
5,
|
|
300000
|
|
],
|
|
[
|
|
minute,
|
|
15,
|
|
900000
|
|
],
|
|
[
|
|
minute,
|
|
30,
|
|
1800000
|
|
],
|
|
[
|
|
hour,
|
|
1,
|
|
3600000
|
|
],
|
|
[
|
|
hour,
|
|
3,
|
|
10800000
|
|
],
|
|
[
|
|
hour,
|
|
6,
|
|
21600000
|
|
],
|
|
[
|
|
hour,
|
|
12,
|
|
43200000
|
|
],
|
|
[
|
|
day,
|
|
1,
|
|
86400000
|
|
],
|
|
[
|
|
day,
|
|
2,
|
|
172800000
|
|
],
|
|
[
|
|
week,
|
|
1,
|
|
604800000
|
|
],
|
|
[
|
|
month,
|
|
1,
|
|
2592000000
|
|
],
|
|
[
|
|
month,
|
|
3,
|
|
7776000000
|
|
],
|
|
[
|
|
year,
|
|
1,
|
|
31536000000
|
|
]
|
|
];
|
|
function tickFormat(date) {
|
|
return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond : hour(date) < date ? formatMinute : day(date) < date ? formatHour : month(date) < date ? week(date) < date ? formatDay : formatWeek : year(date) < date ? formatMonth : formatYear)(date);
|
|
}
|
|
function tickInterval(interval, start, stop) {
|
|
if (null == interval && (interval = 10), "number" == typeof interval) {
|
|
var step, target = Math.abs(stop - start) / interval, i = bisector(function(i) {
|
|
return i[2];
|
|
}).right(tickIntervals, target);
|
|
return i === tickIntervals.length ? (step = tickStep(start / 31536000000, stop / 31536000000, interval), interval = year) : i ? (step = (i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i])[1], interval = i[0]) : (step = Math.max(tickStep(start, stop, interval), 1), interval = millisecond), interval.every(step);
|
|
}
|
|
return interval;
|
|
}
|
|
return scale.invert = function(y) {
|
|
return new Date(invert(y));
|
|
}, scale.domain = function(_) {
|
|
return arguments.length ? domain(Array.from(_, number$3)) : domain().map(date$1);
|
|
}, scale.ticks = function(interval) {
|
|
var t, d = domain(), t0 = d[0], t1 = d[d.length - 1], r = t1 < t0;
|
|
return r && (t = t0, t0 = t1, t1 = t), t = (t = tickInterval(interval, t0, t1)) ? t.range(t0, t1 + 1) : [], r ? t.reverse() : t;
|
|
}, scale.tickFormat = function(count, specifier) {
|
|
return null == specifier ? tickFormat : format(specifier);
|
|
}, scale.nice = function(interval) {
|
|
var d = domain();
|
|
return (interval = tickInterval(interval, d[0], d[d.length - 1])) ? domain(nice$1(d, interval)) : scale;
|
|
}, scale.copy = function() {
|
|
return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
|
|
}, scale;
|
|
}
|
|
function transformer$2() {
|
|
var t0, t1, k10, transform, unknown, x0 = 0, x1 = 1, interpolator = identity$6, clamp = !1;
|
|
function scale(x) {
|
|
return isNaN(x = +x) ? unknown : interpolator(0 === k10 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
|
|
}
|
|
function range(interpolate) {
|
|
return function(_) {
|
|
var r0, r1;
|
|
return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [
|
|
interpolator(0),
|
|
interpolator(1)
|
|
];
|
|
};
|
|
}
|
|
return scale.domain = function(_) {
|
|
return arguments.length ? ([x0, x1] = _, k10 = (t0 = transform(x0 = +x0)) === (t1 = transform(x1 = +x1)) ? 0 : 1 / (t1 - t0), scale) : [
|
|
x0,
|
|
x1
|
|
];
|
|
}, scale.clamp = function(_) {
|
|
return arguments.length ? (clamp = !!_, scale) : clamp;
|
|
}, scale.interpolator = function(_) {
|
|
return arguments.length ? (interpolator = _, scale) : interpolator;
|
|
}, scale.range = range(interpolate), scale.rangeRound = range(interpolateRound), scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, function(t) {
|
|
return transform = t, k10 = (t0 = t(x0)) === (t1 = t(x1)) ? 0 : 1 / (t1 - t0), scale;
|
|
};
|
|
}
|
|
function copy$1(source, target) {
|
|
return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());
|
|
}
|
|
function sequentialPow() {
|
|
var scale = powish(transformer$2());
|
|
return scale.copy = function() {
|
|
return copy$1(scale, sequentialPow()).exponent(scale.exponent());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}
|
|
function transformer$3() {
|
|
var t0, t1, t2, k10, k21, transform, unknown, x0 = 0, x1 = 0.5, x2 = 1, s = 1, interpolator = identity$6, clamp = !1;
|
|
function scale(x) {
|
|
return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
|
|
}
|
|
function range(interpolate) {
|
|
return function(_) {
|
|
var r0, r1, r2;
|
|
return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate, [
|
|
r0,
|
|
r1,
|
|
r2
|
|
]), scale) : [
|
|
interpolator(0),
|
|
interpolator(0.5),
|
|
interpolator(1)
|
|
];
|
|
};
|
|
}
|
|
return scale.domain = function(_) {
|
|
return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [
|
|
x0,
|
|
x1,
|
|
x2
|
|
];
|
|
}, scale.clamp = function(_) {
|
|
return arguments.length ? (clamp = !!_, scale) : clamp;
|
|
}, scale.interpolator = function(_) {
|
|
return arguments.length ? (interpolator = _, scale) : interpolator;
|
|
}, scale.range = range(interpolate), scale.rangeRound = range(interpolateRound), scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, function(t) {
|
|
return transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale;
|
|
};
|
|
}
|
|
function divergingPow() {
|
|
var scale = powish(transformer$3());
|
|
return scale.copy = function() {
|
|
return copy$1(scale, divergingPow()).exponent(scale.exponent());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}
|
|
function colors(specifier) {
|
|
for(var n = specifier.length / 6 | 0, colors = Array(n), i = 0; i < n;)colors[i] = "#" + specifier.slice(6 * i, 6 * ++i);
|
|
return colors;
|
|
}
|
|
var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"), Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"), Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"), Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"), Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"), Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"), Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"), Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"), Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"), Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"), ramp = (scheme)=>rgbBasis(scheme[scheme.length - 1]), scheme = [
|
|
,
|
|
,
|
|
,
|
|
].concat("d8b365f5f5f55ab4ac", "a6611adfc27d80cdc1018571", "a6611adfc27df5f5f580cdc1018571", "8c510ad8b365f6e8c3c7eae55ab4ac01665e", "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(colors), BrBG = ramp(scheme), scheme$1 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("af8dc3f7f7f77fbf7b", "7b3294c2a5cfa6dba0008837", "7b3294c2a5cff7f7f7a6dba0008837", "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(colors), PRGn = ramp(scheme$1), scheme$2 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e9a3c9f7f7f7a1d76a", "d01c8bf1b6dab8e1864dac26", "d01c8bf1b6daf7f7f7b8e1864dac26", "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(colors), PiYG = ramp(scheme$2), scheme$3 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("998ec3f7f7f7f1a340", "5e3c99b2abd2fdb863e66101", "5e3c99b2abd2f7f7f7fdb863e66101", "542788998ec3d8daebfee0b6f1a340b35806", "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(colors), PuOr = ramp(scheme$3), scheme$4 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("ef8a62f7f7f767a9cf", "ca0020f4a58292c5de0571b0", "ca0020f4a582f7f7f792c5de0571b0", "b2182bef8a62fddbc7d1e5f067a9cf2166ac", "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(colors), RdBu = ramp(scheme$4), scheme$5 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("ef8a62ffffff999999", "ca0020f4a582bababa404040", "ca0020f4a582ffffffbababa404040", "b2182bef8a62fddbc7e0e0e09999994d4d4d", "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(colors), RdGy = ramp(scheme$5), scheme$6 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fc8d59ffffbf91bfdb", "d7191cfdae61abd9e92c7bb6", "d7191cfdae61ffffbfabd9e92c7bb6", "d73027fc8d59fee090e0f3f891bfdb4575b4", "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(colors), RdYlBu = ramp(scheme$6), scheme$7 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fc8d59ffffbf91cf60", "d7191cfdae61a6d96a1a9641", "d7191cfdae61ffffbfa6d96a1a9641", "d73027fc8d59fee08bd9ef8b91cf601a9850", "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(colors), RdYlGn = ramp(scheme$7), scheme$8 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fc8d59ffffbf99d594", "d7191cfdae61abdda42b83ba", "d7191cfdae61ffffbfabdda42b83ba", "d53e4ffc8d59fee08be6f59899d5943288bd", "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(colors), Spectral = ramp(scheme$8), scheme$9 = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e5f5f999d8c92ca25f", "edf8fbb2e2e266c2a4238b45", "edf8fbb2e2e266c2a42ca25f006d2c", "edf8fbccece699d8c966c2a42ca25f006d2c", "edf8fbccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(colors), BuGn = ramp(scheme$9), scheme$a = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e0ecf49ebcda8856a7", "edf8fbb3cde38c96c688419d", "edf8fbb3cde38c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(colors), BuPu = ramp(scheme$a), scheme$b = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e0f3dba8ddb543a2ca", "f0f9e8bae4bc7bccc42b8cbe", "f0f9e8bae4bc7bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(colors), GnBu = ramp(scheme$b), scheme$c = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fee8c8fdbb84e34a33", "fef0d9fdcc8afc8d59d7301f", "fef0d9fdcc8afc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(colors), OrRd = ramp(scheme$c), scheme$d = [
|
|
,
|
|
,
|
|
,
|
|
].concat("ece2f0a6bddb1c9099", "f6eff7bdc9e167a9cf02818a", "f6eff7bdc9e167a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(colors), PuBuGn = ramp(scheme$d), scheme$e = [
|
|
,
|
|
,
|
|
,
|
|
].concat("ece7f2a6bddb2b8cbe", "f1eef6bdc9e174a9cf0570b0", "f1eef6bdc9e174a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(colors), PuBu = ramp(scheme$e), scheme$f = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e7e1efc994c7dd1c77", "f1eef6d7b5d8df65b0ce1256", "f1eef6d7b5d8df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(colors), PuRd = ramp(scheme$f), scheme$g = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fde0ddfa9fb5c51b8a", "feebe2fbb4b9f768a1ae017e", "feebe2fbb4b9f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(colors), RdPu = ramp(scheme$g), scheme$h = [
|
|
,
|
|
,
|
|
,
|
|
].concat("edf8b17fcdbb2c7fb8", "ffffcca1dab441b6c4225ea8", "ffffcca1dab441b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(colors), YlGnBu = ramp(scheme$h), scheme$i = [
|
|
,
|
|
,
|
|
,
|
|
].concat("f7fcb9addd8e31a354", "ffffccc2e69978c679238443", "ffffccc2e69978c67931a354006837", "ffffccd9f0a3addd8e78c67931a354006837", "ffffccd9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(colors), YlGn = ramp(scheme$i), scheme$j = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fff7bcfec44fd95f0e", "ffffd4fed98efe9929cc4c02", "ffffd4fed98efe9929d95f0e993404", "ffffd4fee391fec44ffe9929d95f0e993404", "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(colors), YlOrBr = ramp(scheme$j), scheme$k = [
|
|
,
|
|
,
|
|
,
|
|
].concat("ffeda0feb24cf03b20", "ffffb2fecc5cfd8d3ce31a1c", "ffffb2fecc5cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(colors), YlOrRd = ramp(scheme$k), scheme$l = [
|
|
,
|
|
,
|
|
,
|
|
].concat("deebf79ecae13182bd", "eff3ffbdd7e76baed62171b5", "eff3ffbdd7e76baed63182bd08519c", "eff3ffc6dbef9ecae16baed63182bd08519c", "eff3ffc6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(colors), Blues = ramp(scheme$l), scheme$m = [
|
|
,
|
|
,
|
|
,
|
|
].concat("e5f5e0a1d99b31a354", "edf8e9bae4b374c476238b45", "edf8e9bae4b374c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(colors), Greens = ramp(scheme$m), scheme$n = [
|
|
,
|
|
,
|
|
,
|
|
].concat("f0f0f0bdbdbd636363", "f7f7f7cccccc969696525252", "f7f7f7cccccc969696636363252525", "f7f7f7d9d9d9bdbdbd969696636363252525", "f7f7f7d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(colors), Greys = ramp(scheme$n), scheme$o = [
|
|
,
|
|
,
|
|
,
|
|
].concat("efedf5bcbddc756bb1", "f2f0f7cbc9e29e9ac86a51a3", "f2f0f7cbc9e29e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(colors), Purples = ramp(scheme$o), scheme$p = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fee0d2fc9272de2d26", "fee5d9fcae91fb6a4acb181d", "fee5d9fcae91fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(colors), Reds = ramp(scheme$p), scheme$q = [
|
|
,
|
|
,
|
|
,
|
|
].concat("fee6cefdae6be6550d", "feeddefdbe85fd8d3cd94701", "feeddefdbe85fd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(colors), Oranges = ramp(scheme$q), cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)), warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)), cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)), c$1 = cubehelix(), c$2 = rgb(), pi_1_3 = Math.PI / 3, pi_2_3 = 2 * Math.PI / 3;
|
|
function ramp$1(range) {
|
|
var n = range.length;
|
|
return function(t) {
|
|
return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
|
|
};
|
|
}
|
|
var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")), magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")), inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")), plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
|
|
function constant$a(x) {
|
|
return function() {
|
|
return x;
|
|
};
|
|
}
|
|
var abs$3 = Math.abs, atan2$1 = Math.atan2, cos$2 = Math.cos, max$3 = Math.max, min$2 = Math.min, sin$2 = Math.sin, sqrt$2 = Math.sqrt, pi$4 = Math.PI, halfPi$3 = pi$4 / 2, tau$5 = 2 * pi$4;
|
|
function asin$1(x) {
|
|
return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
|
|
}
|
|
function arcInnerRadius(d) {
|
|
return d.innerRadius;
|
|
}
|
|
function arcOuterRadius(d) {
|
|
return d.outerRadius;
|
|
}
|
|
function arcStartAngle(d) {
|
|
return d.startAngle;
|
|
}
|
|
function arcEndAngle(d) {
|
|
return d.endAngle;
|
|
}
|
|
function arcPadAngle(d) {
|
|
return d && d.padAngle;
|
|
}
|
|
function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
|
|
var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt$2(max$3(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00;
|
|
return dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1 && (cx0 = cx1, cy0 = cy1), {
|
|
cx: cx0,
|
|
cy: cy0,
|
|
x01: -ox,
|
|
y01: -oy,
|
|
x11: cx0 * (r1 / r - 1),
|
|
y11: cy0 * (r1 / r - 1)
|
|
};
|
|
}
|
|
var slice$4 = Array.prototype.slice;
|
|
function array$5(x) {
|
|
return "object" == typeof x && "length" in x ? x : Array.from(x);
|
|
}
|
|
function Linear(context) {
|
|
this._context = context;
|
|
}
|
|
function curveLinear(context) {
|
|
return new Linear(context);
|
|
}
|
|
function x$3(p) {
|
|
return p[0];
|
|
}
|
|
function y$3(p) {
|
|
return p[1];
|
|
}
|
|
function line(x, y) {
|
|
var defined = constant$a(!0), context = null, curve = curveLinear, output = null;
|
|
function line(data) {
|
|
var i, d, buffer, n = (data = array$5(data)).length, defined0 = !1;
|
|
for(null == context && (output = curve(buffer = path())), i = 0; i <= n; ++i)!(i < n && defined(d = data[i], i, data)) === defined0 && ((defined0 = !defined0) ? output.lineStart() : output.lineEnd()), defined0 && output.point(+x(d, i, data), +y(d, i, data));
|
|
if (buffer) return output = null, buffer + "" || null;
|
|
}
|
|
return x = "function" == typeof x ? x : void 0 === x ? x$3 : constant$a(x), y = "function" == typeof y ? y : void 0 === y ? y$3 : constant$a(y), line.x = function(_) {
|
|
return arguments.length ? (x = "function" == typeof _ ? _ : constant$a(+_), line) : x;
|
|
}, line.y = function(_) {
|
|
return arguments.length ? (y = "function" == typeof _ ? _ : constant$a(+_), line) : y;
|
|
}, line.defined = function(_) {
|
|
return arguments.length ? (defined = "function" == typeof _ ? _ : constant$a(!!_), line) : defined;
|
|
}, line.curve = function(_) {
|
|
return arguments.length ? (curve = _, null != context && (output = curve(context)), line) : curve;
|
|
}, line.context = function(_) {
|
|
return arguments.length ? (null == _ ? context = output = null : output = curve(context = _), line) : context;
|
|
}, line;
|
|
}
|
|
function area$3(x0, y0, y1) {
|
|
var x1 = null, defined = constant$a(!0), context = null, curve = curveLinear, output = null;
|
|
function area(data) {
|
|
var i, j, k, d, buffer, n = (data = array$5(data)).length, defined0 = !1, x0z = Array(n), y0z = Array(n);
|
|
for(null == context && (output = curve(buffer = path())), i = 0; i <= n; ++i){
|
|
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
|
|
if (defined0 = !defined0) j = i, output.areaStart(), output.lineStart();
|
|
else {
|
|
for(output.lineEnd(), output.lineStart(), k = i - 1; k >= j; --k)output.point(x0z[k], y0z[k]);
|
|
output.lineEnd(), output.areaEnd();
|
|
}
|
|
}
|
|
defined0 && (x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data), output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]));
|
|
}
|
|
if (buffer) return output = null, buffer + "" || null;
|
|
}
|
|
function arealine() {
|
|
return line().defined(defined).curve(curve).context(context);
|
|
}
|
|
return x0 = "function" == typeof x0 ? x0 : void 0 === x0 ? x$3 : constant$a(+x0), y0 = "function" == typeof y0 ? y0 : void 0 === y0 ? constant$a(0) : constant$a(+y0), y1 = "function" == typeof y1 ? y1 : void 0 === y1 ? y$3 : constant$a(+y1), area.x = function(_) {
|
|
return arguments.length ? (x0 = "function" == typeof _ ? _ : constant$a(+_), x1 = null, area) : x0;
|
|
}, area.x0 = function(_) {
|
|
return arguments.length ? (x0 = "function" == typeof _ ? _ : constant$a(+_), area) : x0;
|
|
}, area.x1 = function(_) {
|
|
return arguments.length ? (x1 = null == _ ? null : "function" == typeof _ ? _ : constant$a(+_), area) : x1;
|
|
}, area.y = function(_) {
|
|
return arguments.length ? (y0 = "function" == typeof _ ? _ : constant$a(+_), y1 = null, area) : y0;
|
|
}, area.y0 = function(_) {
|
|
return arguments.length ? (y0 = "function" == typeof _ ? _ : constant$a(+_), area) : y0;
|
|
}, area.y1 = function(_) {
|
|
return arguments.length ? (y1 = null == _ ? null : "function" == typeof _ ? _ : constant$a(+_), area) : y1;
|
|
}, area.lineX0 = area.lineY0 = function() {
|
|
return arealine().x(x0).y(y0);
|
|
}, area.lineY1 = function() {
|
|
return arealine().x(x0).y(y1);
|
|
}, area.lineX1 = function() {
|
|
return arealine().x(x1).y(y0);
|
|
}, area.defined = function(_) {
|
|
return arguments.length ? (defined = "function" == typeof _ ? _ : constant$a(!!_), area) : defined;
|
|
}, area.curve = function(_) {
|
|
return arguments.length ? (curve = _, null != context && (output = curve(context)), area) : curve;
|
|
}, area.context = function(_) {
|
|
return arguments.length ? (null == _ ? context = output = null : output = curve(context = _), area) : context;
|
|
}, area;
|
|
}
|
|
function descending$1(a, b) {
|
|
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
|
|
}
|
|
function identity$8(d) {
|
|
return d;
|
|
}
|
|
Linear.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
default:
|
|
this._context.lineTo(x, y);
|
|
}
|
|
}
|
|
};
|
|
var curveRadialLinear = curveRadial(curveLinear);
|
|
function Radial(curve) {
|
|
this._curve = curve;
|
|
}
|
|
function curveRadial(curve) {
|
|
function radial(context) {
|
|
return new Radial(curve(context));
|
|
}
|
|
return radial._curve = curve, radial;
|
|
}
|
|
function lineRadial(l) {
|
|
var c = l.curve;
|
|
return l.angle = l.x, delete l.x, l.radius = l.y, delete l.y, l.curve = function(_) {
|
|
return arguments.length ? c(curveRadial(_)) : c()._curve;
|
|
}, l;
|
|
}
|
|
function lineRadial$1() {
|
|
return lineRadial(line().curve(curveRadialLinear));
|
|
}
|
|
function areaRadial() {
|
|
var a = area$3().curve(curveRadialLinear), c = a.curve, x0 = a.lineX0, x1 = a.lineX1, y0 = a.lineY0, y1 = a.lineY1;
|
|
return a.angle = a.x, delete a.x, a.startAngle = a.x0, delete a.x0, a.endAngle = a.x1, delete a.x1, a.radius = a.y, delete a.y, a.innerRadius = a.y0, delete a.y0, a.outerRadius = a.y1, delete a.y1, a.lineStartAngle = function() {
|
|
return lineRadial(x0());
|
|
}, delete a.lineX0, a.lineEndAngle = function() {
|
|
return lineRadial(x1());
|
|
}, delete a.lineX1, a.lineInnerRadius = function() {
|
|
return lineRadial(y0());
|
|
}, delete a.lineY0, a.lineOuterRadius = function() {
|
|
return lineRadial(y1());
|
|
}, delete a.lineY1, a.curve = function(_) {
|
|
return arguments.length ? c(curveRadial(_)) : c()._curve;
|
|
}, a;
|
|
}
|
|
function pointRadial(x, y) {
|
|
return [
|
|
(y = +y) * Math.cos(x -= Math.PI / 2),
|
|
y * Math.sin(x)
|
|
];
|
|
}
|
|
function linkSource(d) {
|
|
return d.source;
|
|
}
|
|
function linkTarget(d) {
|
|
return d.target;
|
|
}
|
|
function link$2(curve) {
|
|
var source = linkSource, target = linkTarget, x = x$3, y = y$3, context = null;
|
|
function link() {
|
|
var buffer, argv = slice$4.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
|
|
if (context || (context = buffer = path()), curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)), buffer) return context = null, buffer + "" || null;
|
|
}
|
|
return link.source = function(_) {
|
|
return arguments.length ? (source = _, link) : source;
|
|
}, link.target = function(_) {
|
|
return arguments.length ? (target = _, link) : target;
|
|
}, link.x = function(_) {
|
|
return arguments.length ? (x = "function" == typeof _ ? _ : constant$a(+_), link) : x;
|
|
}, link.y = function(_) {
|
|
return arguments.length ? (y = "function" == typeof _ ? _ : constant$a(+_), link) : y;
|
|
}, link.context = function(_) {
|
|
return arguments.length ? (context = null == _ ? null : _, link) : context;
|
|
}, link;
|
|
}
|
|
function curveHorizontal(context, x0, y0, x1, y1) {
|
|
context.moveTo(x0, y0), context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
|
|
}
|
|
function curveVertical(context, x0, y0, x1, y1) {
|
|
context.moveTo(x0, y0), context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
|
|
}
|
|
function curveRadial$1(context, x0, y0, x1, y1) {
|
|
var p0 = pointRadial(x0, y0), p1 = pointRadial(x0, y0 = (y0 + y1) / 2), p2 = pointRadial(x1, y0), p3 = pointRadial(x1, y1);
|
|
context.moveTo(p0[0], p0[1]), context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
|
|
}
|
|
Radial.prototype = {
|
|
areaStart: function() {
|
|
this._curve.areaStart();
|
|
},
|
|
areaEnd: function() {
|
|
this._curve.areaEnd();
|
|
},
|
|
lineStart: function() {
|
|
this._curve.lineStart();
|
|
},
|
|
lineEnd: function() {
|
|
this._curve.lineEnd();
|
|
},
|
|
point: function(a, r) {
|
|
this._curve.point(r * Math.sin(a), -(r * Math.cos(a)));
|
|
}
|
|
};
|
|
var circle$2 = {
|
|
draw: function(context, size) {
|
|
var r = Math.sqrt(size / pi$4);
|
|
context.moveTo(r, 0), context.arc(0, 0, r, 0, tau$5);
|
|
}
|
|
}, cross$2 = {
|
|
draw: function(context, size) {
|
|
var r = Math.sqrt(size / 5) / 2;
|
|
context.moveTo(-3 * r, -r), context.lineTo(-r, -r), context.lineTo(-r, -3 * r), context.lineTo(r, -3 * r), context.lineTo(r, -r), context.lineTo(3 * r, -r), context.lineTo(3 * r, r), context.lineTo(r, r), context.lineTo(r, 3 * r), context.lineTo(-r, 3 * r), context.lineTo(-r, r), context.lineTo(-3 * r, r), context.closePath();
|
|
}
|
|
}, tan30 = Math.sqrt(1 / 3), tan30_2 = 2 * tan30, diamond = {
|
|
draw: function(context, size) {
|
|
var y = Math.sqrt(size / tan30_2), x = y * tan30;
|
|
context.moveTo(0, -y), context.lineTo(x, 0), context.lineTo(0, y), context.lineTo(-x, 0), context.closePath();
|
|
}
|
|
}, kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), kx = Math.sin(tau$5 / 10) * kr, ky = -Math.cos(tau$5 / 10) * kr, star = {
|
|
draw: function(context, size) {
|
|
var r = Math.sqrt(0.89081309152928522810 * size), x = kx * r, y = ky * r;
|
|
context.moveTo(0, -r), context.lineTo(x, y);
|
|
for(var i = 1; i < 5; ++i){
|
|
var a = tau$5 * i / 5, c = Math.cos(a), s = Math.sin(a);
|
|
context.lineTo(s * r, -c * r), context.lineTo(c * x - s * y, s * x + c * y);
|
|
}
|
|
context.closePath();
|
|
}
|
|
}, square$1 = {
|
|
draw: function(context, size) {
|
|
var w = Math.sqrt(size), x = -w / 2;
|
|
context.rect(x, x, w, w);
|
|
}
|
|
}, sqrt3 = Math.sqrt(3), triangle = {
|
|
draw: function(context, size) {
|
|
var y = -Math.sqrt(size / (3 * sqrt3));
|
|
context.moveTo(0, 2 * y), context.lineTo(-sqrt3 * y, -y), context.lineTo(sqrt3 * y, -y), context.closePath();
|
|
}
|
|
}, s = Math.sqrt(3) / 2, k = 1 / Math.sqrt(12), a$1 = (k / 2 + 1) * 3, wye = {
|
|
draw: function(context, size) {
|
|
var r = Math.sqrt(size / a$1), x0 = r / 2, y0 = r * k, y1 = r * k + r, x2 = -x0;
|
|
context.moveTo(x0, y0), context.lineTo(x0, y1), context.lineTo(x2, y1), context.lineTo(-0.5 * x0 - s * y0, s * x0 + -0.5 * y0), context.lineTo(-0.5 * x0 - s * y1, s * x0 + -0.5 * y1), context.lineTo(-0.5 * x2 - s * y1, s * x2 + -0.5 * y1), context.lineTo(-0.5 * x0 + s * y0, -0.5 * y0 - s * x0), context.lineTo(-0.5 * x0 + s * y1, -0.5 * y1 - s * x0), context.lineTo(-0.5 * x2 + s * y1, -0.5 * y1 - s * x2), context.closePath();
|
|
}
|
|
}, symbols = [
|
|
circle$2,
|
|
cross$2,
|
|
diamond,
|
|
square$1,
|
|
star,
|
|
triangle,
|
|
wye
|
|
];
|
|
function noop$3() {}
|
|
function point$1(that, x, y) {
|
|
that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);
|
|
}
|
|
function Basis(context) {
|
|
this._context = context;
|
|
}
|
|
function BasisClosed(context) {
|
|
this._context = context;
|
|
}
|
|
function BasisOpen(context) {
|
|
this._context = context;
|
|
}
|
|
function Bundle(context, beta) {
|
|
this._basis = new Basis(context), this._beta = beta;
|
|
}
|
|
Basis.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 3:
|
|
point$1(this, this._x1, this._y1);
|
|
case 2:
|
|
this._context.lineTo(this._x1, this._y1);
|
|
}
|
|
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);
|
|
default:
|
|
point$1(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
|
|
}
|
|
}, BasisClosed.prototype = {
|
|
areaStart: noop$3,
|
|
areaEnd: noop$3,
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 1:
|
|
this._context.moveTo(this._x2, this._y2), this._context.closePath();
|
|
break;
|
|
case 2:
|
|
this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3), this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3), this._context.closePath();
|
|
break;
|
|
case 3:
|
|
this.point(this._x2, this._y2), this.point(this._x3, this._y3), this.point(this._x4, this._y4);
|
|
}
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._x2 = x, this._y2 = y;
|
|
break;
|
|
case 1:
|
|
this._point = 2, this._x3 = x, this._y3 = y;
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._x4 = x, this._y4 = y, this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);
|
|
break;
|
|
default:
|
|
point$1(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
|
|
}
|
|
}, BasisOpen.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
(this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1;
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3;
|
|
var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;
|
|
this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);
|
|
break;
|
|
case 3:
|
|
this._point = 4;
|
|
default:
|
|
point$1(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;
|
|
}
|
|
}, Bundle.prototype = {
|
|
lineStart: function() {
|
|
this._x = [], this._y = [], this._basis.lineStart();
|
|
},
|
|
lineEnd: function() {
|
|
var x = this._x, y = this._y, j = x.length - 1;
|
|
if (j > 0) for(var t, x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1; ++i <= j;)t = i / j, this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));
|
|
this._x = this._y = null, this._basis.lineEnd();
|
|
},
|
|
point: function(x, y) {
|
|
this._x.push(+x), this._y.push(+y);
|
|
}
|
|
};
|
|
var bundle = function custom(beta) {
|
|
function bundle(context) {
|
|
return 1 === beta ? new Basis(context) : new Bundle(context, beta);
|
|
}
|
|
return bundle.beta = function(beta) {
|
|
return custom(+beta);
|
|
}, bundle;
|
|
}(0.85);
|
|
function point$2(that, x, y) {
|
|
that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);
|
|
}
|
|
function Cardinal(context, tension) {
|
|
this._context = context, this._k = (1 - tension) / 6;
|
|
}
|
|
Cardinal.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 2:
|
|
this._context.lineTo(this._x2, this._y2);
|
|
break;
|
|
case 3:
|
|
point$2(this, this._x1, this._y1);
|
|
}
|
|
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2, this._x1 = x, this._y1 = y;
|
|
break;
|
|
case 2:
|
|
this._point = 3;
|
|
default:
|
|
point$2(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var cardinal = function custom(tension) {
|
|
function cardinal(context) {
|
|
return new Cardinal(context, tension);
|
|
}
|
|
return cardinal.tension = function(tension) {
|
|
return custom(+tension);
|
|
}, cardinal;
|
|
}(0);
|
|
function CardinalClosed(context, tension) {
|
|
this._context = context, this._k = (1 - tension) / 6;
|
|
}
|
|
CardinalClosed.prototype = {
|
|
areaStart: noop$3,
|
|
areaEnd: noop$3,
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 1:
|
|
this._context.moveTo(this._x3, this._y3), this._context.closePath();
|
|
break;
|
|
case 2:
|
|
this._context.lineTo(this._x3, this._y3), this._context.closePath();
|
|
break;
|
|
case 3:
|
|
this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);
|
|
}
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._x3 = x, this._y3 = y;
|
|
break;
|
|
case 1:
|
|
this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._x5 = x, this._y5 = y;
|
|
break;
|
|
default:
|
|
point$2(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var cardinalClosed = function custom(tension) {
|
|
function cardinal(context) {
|
|
return new CardinalClosed(context, tension);
|
|
}
|
|
return cardinal.tension = function(tension) {
|
|
return custom(+tension);
|
|
}, cardinal;
|
|
}(0);
|
|
function CardinalOpen(context, tension) {
|
|
this._context = context, this._k = (1 - tension) / 6;
|
|
}
|
|
CardinalOpen.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
(this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1;
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
|
|
break;
|
|
case 3:
|
|
this._point = 4;
|
|
default:
|
|
point$2(this, x, y);
|
|
}
|
|
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var cardinalOpen = function custom(tension) {
|
|
function cardinal(context) {
|
|
return new CardinalOpen(context, tension);
|
|
}
|
|
return cardinal.tension = function(tension) {
|
|
return custom(+tension);
|
|
}, cardinal;
|
|
}(0);
|
|
function point$3(that, x, y) {
|
|
var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;
|
|
if (that._l01_a > 1e-12) {
|
|
var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);
|
|
x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n, y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
|
|
}
|
|
if (that._l23_a > 1e-12) {
|
|
var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);
|
|
x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m, y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
|
|
}
|
|
that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
|
|
}
|
|
function CatmullRom(context, alpha) {
|
|
this._context = context, this._alpha = alpha;
|
|
}
|
|
CatmullRom.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 2:
|
|
this._context.lineTo(this._x2, this._y2);
|
|
break;
|
|
case 3:
|
|
this.point(this._x2, this._y2);
|
|
}
|
|
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
if (x = +x, y = +y, this._point) {
|
|
var x23 = this._x2 - x, y23 = this._y2 - y;
|
|
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
|
}
|
|
switch(this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3;
|
|
default:
|
|
point$3(this, x, y);
|
|
}
|
|
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var catmullRom = function custom(alpha) {
|
|
function catmullRom(context) {
|
|
return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
|
|
}
|
|
return catmullRom.alpha = function(alpha) {
|
|
return custom(+alpha);
|
|
}, catmullRom;
|
|
}(0.5);
|
|
function CatmullRomClosed(context, alpha) {
|
|
this._context = context, this._alpha = alpha;
|
|
}
|
|
CatmullRomClosed.prototype = {
|
|
areaStart: noop$3,
|
|
areaEnd: noop$3,
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 1:
|
|
this._context.moveTo(this._x3, this._y3), this._context.closePath();
|
|
break;
|
|
case 2:
|
|
this._context.lineTo(this._x3, this._y3), this._context.closePath();
|
|
break;
|
|
case 3:
|
|
this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);
|
|
}
|
|
},
|
|
point: function(x, y) {
|
|
if (x = +x, y = +y, this._point) {
|
|
var x23 = this._x2 - x, y23 = this._y2 - y;
|
|
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
|
}
|
|
switch(this._point){
|
|
case 0:
|
|
this._point = 1, this._x3 = x, this._y3 = y;
|
|
break;
|
|
case 1:
|
|
this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._x5 = x, this._y5 = y;
|
|
break;
|
|
default:
|
|
point$3(this, x, y);
|
|
}
|
|
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var catmullRomClosed = function custom(alpha) {
|
|
function catmullRom(context) {
|
|
return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
|
|
}
|
|
return catmullRom.alpha = function(alpha) {
|
|
return custom(+alpha);
|
|
}, catmullRom;
|
|
}(0.5);
|
|
function CatmullRomOpen(context, alpha) {
|
|
this._context = context, this._alpha = alpha;
|
|
}
|
|
CatmullRomOpen.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
(this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
if (x = +x, y = +y, this._point) {
|
|
var x23 = this._x2 - x, y23 = this._y2 - y;
|
|
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
|
|
}
|
|
switch(this._point){
|
|
case 0:
|
|
this._point = 1;
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
|
|
break;
|
|
case 3:
|
|
this._point = 4;
|
|
default:
|
|
point$3(this, x, y);
|
|
}
|
|
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
|
|
}
|
|
};
|
|
var catmullRomOpen = function custom(alpha) {
|
|
function catmullRom(context) {
|
|
return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
|
|
}
|
|
return catmullRom.alpha = function(alpha) {
|
|
return custom(+alpha);
|
|
}, catmullRom;
|
|
}(0.5);
|
|
function LinearClosed(context) {
|
|
this._context = context;
|
|
}
|
|
function slope3(that, x2, y2) {
|
|
var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0);
|
|
return ((s0 < 0 ? -1 : 1) + (s1 < 0 ? -1 : 1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs((s0 * h1 + s1 * h0) / (h0 + h1))) || 0;
|
|
}
|
|
function slope2(that, t) {
|
|
var h = that._x1 - that._x0;
|
|
return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
|
|
}
|
|
function point$4(that, t0, t1) {
|
|
var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;
|
|
that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
|
|
}
|
|
function MonotoneX(context) {
|
|
this._context = context;
|
|
}
|
|
function MonotoneY(context) {
|
|
this._context = new ReflectContext(context);
|
|
}
|
|
function ReflectContext(context) {
|
|
this._context = context;
|
|
}
|
|
function Natural(context) {
|
|
this._context = context;
|
|
}
|
|
function controlPoints(x) {
|
|
var i, m, n = x.length - 1, a = Array(n), b = Array(n), r = Array(n);
|
|
for(a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1], i = 1; i < n - 1; ++i)a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
|
|
for(a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n], i = 1; i < n; ++i)m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
|
|
for(a[n - 1] = r[n - 1] / b[n - 1], i = n - 2; i >= 0; --i)a[i] = (r[i] - a[i + 1]) / b[i];
|
|
for(i = 0, b[n - 1] = (x[n] + a[n - 1]) / 2; i < n - 1; ++i)b[i] = 2 * x[i + 1] - a[i + 1];
|
|
return [
|
|
a,
|
|
b
|
|
];
|
|
}
|
|
function Step(context, t) {
|
|
this._context = context, this._t = t;
|
|
}
|
|
function none$1(series, order) {
|
|
if ((n = series.length) > 1) for(var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i)for(s0 = s1, s1 = series[order[i]], j = 0; j < m; ++j)s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
|
|
}
|
|
function none$2(series) {
|
|
for(var n = series.length, o = Array(n); --n >= 0;)o[n] = n;
|
|
return o;
|
|
}
|
|
function stackValue(d, key) {
|
|
return d[key];
|
|
}
|
|
function stackSeries(key) {
|
|
const series = [];
|
|
return series.key = key, series;
|
|
}
|
|
function appearance(series) {
|
|
var peaks = series.map(peak);
|
|
return none$2(series).sort(function(a, b) {
|
|
return peaks[a] - peaks[b];
|
|
});
|
|
}
|
|
function peak(series) {
|
|
for(var vi, i = -1, j = 0, n = series.length, vj = -1 / 0; ++i < n;)(vi = +series[i][1]) > vj && (vj = vi, j = i);
|
|
return j;
|
|
}
|
|
function ascending$3(series) {
|
|
var sums = series.map(sum$1);
|
|
return none$2(series).sort(function(a, b) {
|
|
return sums[a] - sums[b];
|
|
});
|
|
}
|
|
function sum$1(series) {
|
|
for(var v, s = 0, i = -1, n = series.length; ++i < n;)(v = +series[i][1]) && (s += v);
|
|
return s;
|
|
}
|
|
LinearClosed.prototype = {
|
|
areaStart: noop$3,
|
|
areaEnd: noop$3,
|
|
lineStart: function() {
|
|
this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
this._point && this._context.closePath();
|
|
},
|
|
point: function(x, y) {
|
|
x = +x, y = +y, this._point ? this._context.lineTo(x, y) : (this._point = 1, this._context.moveTo(x, y));
|
|
}
|
|
}, MonotoneX.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
switch(this._point){
|
|
case 2:
|
|
this._context.lineTo(this._x1, this._y1);
|
|
break;
|
|
case 3:
|
|
point$4(this, this._t0, slope2(this, this._t0));
|
|
}
|
|
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line;
|
|
},
|
|
point: function(x, y) {
|
|
var t1 = NaN;
|
|
if (y = +y, (x = +x) !== this._x1 || y !== this._y1) {
|
|
switch(this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
break;
|
|
case 2:
|
|
this._point = 3, point$4(this, slope2(this, t1 = slope3(this, x, y)), t1);
|
|
break;
|
|
default:
|
|
point$4(this, this._t0, t1 = slope3(this, x, y));
|
|
}
|
|
this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y, this._t0 = t1;
|
|
}
|
|
}
|
|
}, (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
|
|
MonotoneX.prototype.point.call(this, y, x);
|
|
}, ReflectContext.prototype = {
|
|
moveTo: function(x, y) {
|
|
this._context.moveTo(y, x);
|
|
},
|
|
closePath: function() {
|
|
this._context.closePath();
|
|
},
|
|
lineTo: function(x, y) {
|
|
this._context.lineTo(y, x);
|
|
},
|
|
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
|
|
this._context.bezierCurveTo(y1, x1, y2, x2, y, x);
|
|
}
|
|
}, Natural.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x = [], this._y = [];
|
|
},
|
|
lineEnd: function() {
|
|
var x = this._x, y = this._y, n = x.length;
|
|
if (n) {
|
|
if (this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]), 2 === n) this._context.lineTo(x[1], y[1]);
|
|
else for(var px = controlPoints(x), py = controlPoints(y), i0 = 0, i1 = 1; i1 < n; ++i0, ++i1)this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
|
|
}
|
|
(this._line || 0 !== this._line && 1 === n) && this._context.closePath(), this._line = 1 - this._line, this._x = this._y = null;
|
|
},
|
|
point: function(x, y) {
|
|
this._x.push(+x), this._y.push(+y);
|
|
}
|
|
}, Step.prototype = {
|
|
areaStart: function() {
|
|
this._line = 0;
|
|
},
|
|
areaEnd: function() {
|
|
this._line = NaN;
|
|
},
|
|
lineStart: function() {
|
|
this._x = this._y = NaN, this._point = 0;
|
|
},
|
|
lineEnd: function() {
|
|
0 < this._t && this._t < 1 && 2 === this._point && this._context.lineTo(this._x, this._y), (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line >= 0 && (this._t = 1 - this._t, this._line = 1 - this._line);
|
|
},
|
|
point: function(x, y) {
|
|
switch(x = +x, y = +y, this._point){
|
|
case 0:
|
|
this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);
|
|
break;
|
|
case 1:
|
|
this._point = 2;
|
|
default:
|
|
if (this._t <= 0) this._context.lineTo(this._x, y), this._context.lineTo(x, y);
|
|
else {
|
|
var x1 = this._x * (1 - this._t) + x * this._t;
|
|
this._context.lineTo(x1, this._y), this._context.lineTo(x1, y);
|
|
}
|
|
}
|
|
this._x = x, this._y = y;
|
|
}
|
|
};
|
|
var constant$b = (x)=>()=>x;
|
|
function ZoomEvent(type, { sourceEvent, target, transform, dispatch }) {
|
|
Object.defineProperties(this, {
|
|
type: {
|
|
value: type,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
sourceEvent: {
|
|
value: sourceEvent,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
target: {
|
|
value: target,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
transform: {
|
|
value: transform,
|
|
enumerable: !0,
|
|
configurable: !0
|
|
},
|
|
_: {
|
|
value: dispatch
|
|
}
|
|
});
|
|
}
|
|
function Transform(k, x, y) {
|
|
this.k = k, this.x = x, this.y = y;
|
|
}
|
|
Transform.prototype = {
|
|
constructor: Transform,
|
|
scale: function(k) {
|
|
return 1 === k ? this : new Transform(this.k * k, this.x, this.y);
|
|
},
|
|
translate: function(x, y) {
|
|
return 0 === x & 0 === y ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
|
|
},
|
|
apply: function(point) {
|
|
return [
|
|
point[0] * this.k + this.x,
|
|
point[1] * this.k + this.y
|
|
];
|
|
},
|
|
applyX: function(x) {
|
|
return x * this.k + this.x;
|
|
},
|
|
applyY: function(y) {
|
|
return y * this.k + this.y;
|
|
},
|
|
invert: function(location) {
|
|
return [
|
|
(location[0] - this.x) / this.k,
|
|
(location[1] - this.y) / this.k
|
|
];
|
|
},
|
|
invertX: function(x) {
|
|
return (x - this.x) / this.k;
|
|
},
|
|
invertY: function(y) {
|
|
return (y - this.y) / this.k;
|
|
},
|
|
rescaleX: function(x) {
|
|
return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
|
|
},
|
|
rescaleY: function(y) {
|
|
return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
|
|
},
|
|
toString: function() {
|
|
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
|
|
}
|
|
};
|
|
var identity$9 = new Transform(1, 0, 0);
|
|
function transform$1(node) {
|
|
for(; !node.__zoom;)if (!(node = node.parentNode)) return identity$9;
|
|
return node.__zoom;
|
|
}
|
|
function nopropagation$2(event) {
|
|
event.stopImmediatePropagation();
|
|
}
|
|
function noevent$2(event) {
|
|
event.preventDefault(), event.stopImmediatePropagation();
|
|
}
|
|
function defaultFilter$2(event) {
|
|
return (!event.ctrlKey || 'wheel' === event.type) && !event.button;
|
|
}
|
|
function defaultExtent$1() {
|
|
var e = this;
|
|
return e instanceof SVGElement ? (e = e.ownerSVGElement || e).hasAttribute("viewBox") ? [
|
|
[
|
|
(e = e.viewBox.baseVal).x,
|
|
e.y
|
|
],
|
|
[
|
|
e.x + e.width,
|
|
e.y + e.height
|
|
]
|
|
] : [
|
|
[
|
|
0,
|
|
0
|
|
],
|
|
[
|
|
e.width.baseVal.value,
|
|
e.height.baseVal.value
|
|
]
|
|
] : [
|
|
[
|
|
0,
|
|
0
|
|
],
|
|
[
|
|
e.clientWidth,
|
|
e.clientHeight
|
|
]
|
|
];
|
|
}
|
|
function defaultTransform() {
|
|
return this.__zoom || identity$9;
|
|
}
|
|
function defaultWheelDelta(event) {
|
|
return -event.deltaY * (1 === event.deltaMode ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);
|
|
}
|
|
function defaultTouchable$2() {
|
|
return navigator.maxTouchPoints || "ontouchstart" in this;
|
|
}
|
|
function defaultConstrain(transform, extent, translateExtent) {
|
|
var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
|
|
return transform.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
|
|
}
|
|
transform$1.prototype = Transform.prototype, exports1.Adder = Adder, exports1.Delaunay = Delaunay, exports1.FormatSpecifier = FormatSpecifier, exports1.Voronoi = Voronoi, exports1.active = function(node, name) {
|
|
var schedule, i, schedules = node.__transition;
|
|
if (schedules) {
|
|
for(i in name = null == name ? null : name + "", schedules)if ((schedule = schedules[i]).state > 1 && schedule.name === name) return new Transition([
|
|
[
|
|
node
|
|
]
|
|
], root$1, name, +i);
|
|
}
|
|
return null;
|
|
}, exports1.arc = function() {
|
|
var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant$a(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null;
|
|
function arc() {
|
|
var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi$3, a1 = endAngle.apply(this, arguments) - halfPi$3, da = abs$3(a1 - a0), cw = a1 > a0;
|
|
if (context || (context = buffer = path()), r1 < r0 && (r = r1, r1 = r0, r0 = r), r1 > 1e-12) {
|
|
if (da > tau$5 - 1e-12) context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)), context.arc(0, 0, r1, a0, a1, !cw), r0 > 1e-12 && (context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)), context.arc(0, 0, r0, a1, a0, cw));
|
|
else {
|
|
var t0, t1, a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > 1e-12 && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), rc = min$2(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc;
|
|
if (rp > 1e-12) {
|
|
var p0 = asin$1(rp / r0 * sin$2(ap)), p1 = asin$1(rp / r1 * sin$2(ap));
|
|
(da0 -= 2 * p0) > 1e-12 ? (p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0) : (da0 = 0, a00 = a10 = (a0 + a1) / 2), (da1 -= 2 * p1) > 1e-12 ? (p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1) : (da1 = 0, a01 = a11 = (a0 + a1) / 2);
|
|
}
|
|
var x01 = r1 * cos$2(a01), y01 = r1 * sin$2(a01), x10 = r0 * cos$2(a10), y10 = r0 * sin$2(a10);
|
|
if (rc > 1e-12) {
|
|
var oc, x11 = r1 * cos$2(a11), y11 = r1 * sin$2(a11), x00 = r0 * cos$2(a00), y00 = r0 * sin$2(a00);
|
|
if (da < pi$4 && (oc = function(x0, y0, x1, y1, x2, y2, x3, y3) {
|
|
var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;
|
|
if (!(t * t < 1e-12)) return t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t, [
|
|
x0 + t * x10,
|
|
y0 + t * y10
|
|
];
|
|
}(x01, y01, x00, y00, x11, y11, x10, y10))) {
|
|
var x, ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin$2(((x = (ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x)) / 2), lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
|
|
rc0 = min$2(rc, (r0 - lc) / (kc - 1)), rc1 = min$2(rc, (r1 - lc) / (kc + 1));
|
|
}
|
|
}
|
|
da1 > 1e-12 ? rc1 > 1e-12 ? (t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw), t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw), context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01), rc1 < rc ? context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw) : (context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw), context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw), context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw))) : (context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw)) : context.moveTo(x01, y01), r0 > 1e-12 && da0 > 1e-12 ? rc0 > 1e-12 ? (t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw), t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw), context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01), rc0 < rc ? context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw) : (context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw), context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw), context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw))) : context.arc(0, 0, r0, a10, a00, cw) : context.lineTo(x10, y10);
|
|
}
|
|
} else context.moveTo(0, 0);
|
|
if (context.closePath(), buffer) return context = null, buffer + "" || null;
|
|
}
|
|
return arc.centroid = function() {
|
|
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
|
|
return [
|
|
cos$2(a) * r,
|
|
sin$2(a) * r
|
|
];
|
|
}, arc.innerRadius = function(_) {
|
|
return arguments.length ? (innerRadius = "function" == typeof _ ? _ : constant$a(+_), arc) : innerRadius;
|
|
}, arc.outerRadius = function(_) {
|
|
return arguments.length ? (outerRadius = "function" == typeof _ ? _ : constant$a(+_), arc) : outerRadius;
|
|
}, arc.cornerRadius = function(_) {
|
|
return arguments.length ? (cornerRadius = "function" == typeof _ ? _ : constant$a(+_), arc) : cornerRadius;
|
|
}, arc.padRadius = function(_) {
|
|
return arguments.length ? (padRadius = null == _ ? null : "function" == typeof _ ? _ : constant$a(+_), arc) : padRadius;
|
|
}, arc.startAngle = function(_) {
|
|
return arguments.length ? (startAngle = "function" == typeof _ ? _ : constant$a(+_), arc) : startAngle;
|
|
}, arc.endAngle = function(_) {
|
|
return arguments.length ? (endAngle = "function" == typeof _ ? _ : constant$a(+_), arc) : endAngle;
|
|
}, arc.padAngle = function(_) {
|
|
return arguments.length ? (padAngle = "function" == typeof _ ? _ : constant$a(+_), arc) : padAngle;
|
|
}, arc.context = function(_) {
|
|
return arguments.length ? (context = null == _ ? null : _, arc) : context;
|
|
}, arc;
|
|
}, exports1.area = area$3, exports1.areaRadial = areaRadial, exports1.ascending = ascending, exports1.autoType = function(object) {
|
|
for(var key in object){
|
|
var number, m, value = object[key].trim();
|
|
if (value) {
|
|
if ("true" === value) value = !0;
|
|
else if ("false" === value) value = !1;
|
|
else if ("NaN" === value) value = NaN;
|
|
else if (isNaN(number = +value)) {
|
|
if (!(m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/))) continue;
|
|
fixtz && m[4] && !m[7] && (value = value.replace(/-/g, "/").replace(/T/, " ")), value = new Date(value);
|
|
} else value = number;
|
|
} else value = null;
|
|
object[key] = value;
|
|
}
|
|
return object;
|
|
}, exports1.axisBottom = function(scale) {
|
|
return axis(3, scale);
|
|
}, exports1.axisLeft = function(scale) {
|
|
return axis(4, scale);
|
|
}, exports1.axisRight = function(scale) {
|
|
return axis(2, scale);
|
|
}, exports1.axisTop = function(scale) {
|
|
return axis(1, scale);
|
|
}, exports1.bin = bin, exports1.bisect = bisectRight, exports1.bisectCenter = bisectCenter, exports1.bisectLeft = bisectLeft, exports1.bisectRight = bisectRight, exports1.bisector = bisector, exports1.blob = function(input, init) {
|
|
return fetch(input, init).then(responseBlob);
|
|
}, exports1.brush = function() {
|
|
return brush$1(XY);
|
|
}, exports1.brushSelection = function(node) {
|
|
var state = node.__brush;
|
|
return state ? state.dim.output(state.selection) : null;
|
|
}, exports1.brushX = function() {
|
|
return brush$1(X);
|
|
}, exports1.brushY = function() {
|
|
return brush$1(Y);
|
|
}, exports1.buffer = function(input, init) {
|
|
return fetch(input, init).then(responseArrayBuffer);
|
|
}, exports1.chord = function() {
|
|
return chord$1(!1, !1);
|
|
}, exports1.chordDirected = function() {
|
|
return chord$1(!0, !1);
|
|
}, exports1.chordTranspose = function() {
|
|
return chord$1(!1, !0);
|
|
}, exports1.cluster = function() {
|
|
var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = !1;
|
|
function cluster(root) {
|
|
var previousNode, x = 0;
|
|
root.eachAfter(function(node) {
|
|
var children = node.children;
|
|
children ? (node.x = children.reduce(meanXReduce, 0) / children.length, node.y = 1 + children.reduce(maxYReduce, 0)) : (node.x = previousNode ? x += separation(node, previousNode) : 0, node.y = 0, previousNode = node);
|
|
});
|
|
var left = function(node) {
|
|
for(var children; children = node.children;)node = children[0];
|
|
return node;
|
|
}(root), right = function(node) {
|
|
for(var children; children = node.children;)node = children[children.length - 1];
|
|
return node;
|
|
}(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
|
|
return root.eachAfter(nodeSize ? function(node) {
|
|
node.x = (node.x - root.x) * dx, node.y = (root.y - node.y) * dy;
|
|
} : function(node) {
|
|
node.x = (node.x - x0) / (x1 - x0) * dx, node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
|
|
});
|
|
}
|
|
return cluster.separation = function(x) {
|
|
return arguments.length ? (separation = x, cluster) : separation;
|
|
}, cluster.size = function(x) {
|
|
return arguments.length ? (nodeSize = !1, dx = +x[0], dy = +x[1], cluster) : nodeSize ? null : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, cluster.nodeSize = function(x) {
|
|
return arguments.length ? (nodeSize = !0, dx = +x[0], dy = +x[1], cluster) : nodeSize ? [
|
|
dx,
|
|
dy
|
|
] : null;
|
|
}, cluster;
|
|
}, exports1.color = color, exports1.contourDensity = function() {
|
|
var x = defaultX, y = defaultY, weight = defaultWeight, dx = 960, dy = 500, r = 20, k = 2, o = 60, n = 270, m = 155, threshold = constant$6(20);
|
|
function density(data) {
|
|
var values0 = new Float32Array(n * m), values1 = new Float32Array(n * m);
|
|
data.forEach(function(d, i, data) {
|
|
var xi = +x(d, i, data) + o >> k, yi = +y(d, i, data) + o >> k, wi = +weight(d, i, data);
|
|
xi >= 0 && xi < n && yi >= 0 && yi < m && (values0[xi + yi * n] += wi);
|
|
}), blurX({
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, r >> k), blurY({
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, r >> k), blurX({
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, r >> k), blurY({
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, r >> k), blurX({
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, r >> k), blurY({
|
|
width: n,
|
|
height: m,
|
|
data: values1
|
|
}, {
|
|
width: n,
|
|
height: m,
|
|
data: values0
|
|
}, r >> k);
|
|
var tz = threshold(values0);
|
|
if (!Array.isArray(tz)) {
|
|
var stop = max(values0);
|
|
tz = tickStep(0, stop, tz), (tz = sequence(0, Math.floor(stop / tz) * tz, tz)).shift();
|
|
}
|
|
return contours().thresholds(tz).size([
|
|
n,
|
|
m
|
|
])(values0).map(transform);
|
|
}
|
|
function transform(geometry) {
|
|
return geometry.value *= Math.pow(2, -2 * k), geometry.coordinates.forEach(transformPolygon), geometry;
|
|
}
|
|
function transformPolygon(coordinates) {
|
|
coordinates.forEach(transformRing);
|
|
}
|
|
function transformRing(coordinates) {
|
|
coordinates.forEach(transformPoint);
|
|
}
|
|
function transformPoint(coordinates) {
|
|
coordinates[0] = coordinates[0] * Math.pow(2, k) - o, coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
|
|
}
|
|
function resize() {
|
|
return n = dx + 2 * (o = 3 * r) >> k, m = dy + 2 * o >> k, density;
|
|
}
|
|
return density.x = function(_) {
|
|
return arguments.length ? (x = "function" == typeof _ ? _ : constant$6(+_), density) : x;
|
|
}, density.y = function(_) {
|
|
return arguments.length ? (y = "function" == typeof _ ? _ : constant$6(+_), density) : y;
|
|
}, density.weight = function(_) {
|
|
return arguments.length ? (weight = "function" == typeof _ ? _ : constant$6(+_), density) : weight;
|
|
}, density.size = function(_) {
|
|
if (!arguments.length) return [
|
|
dx,
|
|
dy
|
|
];
|
|
var _0 = +_[0], _1 = +_[1];
|
|
if (!(_0 >= 0 && _1 >= 0)) throw Error("invalid size");
|
|
return dx = _0, dy = _1, resize();
|
|
}, density.cellSize = function(_) {
|
|
if (!arguments.length) return 1 << k;
|
|
if (!((_ = +_) >= 1)) throw Error("invalid cell size");
|
|
return k = Math.floor(Math.log(_) / Math.LN2), resize();
|
|
}, density.thresholds = function(_) {
|
|
return arguments.length ? (threshold = "function" == typeof _ ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), density) : threshold;
|
|
}, density.bandwidth = function(_) {
|
|
if (!arguments.length) return Math.sqrt(r * (r + 1));
|
|
if (!((_ = +_) >= 0)) throw Error("invalid bandwidth");
|
|
return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
|
|
}, density;
|
|
}, exports1.contours = contours, exports1.count = count, exports1.create = function(name) {
|
|
return select(creator(name).call(document.documentElement));
|
|
}, exports1.creator = creator, exports1.cross = function(...values) {
|
|
var reduce;
|
|
const reduce1 = "function" == typeof values[values.length - 1] && (reduce = values.pop(), (values)=>reduce(...values));
|
|
values = values.map(arrayify);
|
|
const lengths = values.map(length), j = values.length - 1, index = Array(j + 1).fill(0), product = [];
|
|
if (j < 0 || lengths.some(empty)) return product;
|
|
for(;;){
|
|
product.push(index.map((j, i)=>values[i][j]));
|
|
let i = j;
|
|
for(; ++index[i] === lengths[i];){
|
|
if (0 === i) return reduce1 ? product.map(reduce1) : product;
|
|
index[i--] = 0;
|
|
}
|
|
}
|
|
}, exports1.csv = csv$1, exports1.csvFormat = csvFormat, exports1.csvFormatBody = csvFormatBody, exports1.csvFormatRow = csvFormatRow, exports1.csvFormatRows = csvFormatRows, exports1.csvFormatValue = csvFormatValue, exports1.csvParse = csvParse, exports1.csvParseRows = csvParseRows, exports1.cubehelix = cubehelix, exports1.cumsum = function(values, valueof) {
|
|
var sum = 0, index = 0;
|
|
return Float64Array.from(values, void 0 === valueof ? (v)=>sum += +v || 0 : (v)=>sum += +valueof(v, index++, values) || 0);
|
|
}, exports1.curveBasis = function(context) {
|
|
return new Basis(context);
|
|
}, exports1.curveBasisClosed = function(context) {
|
|
return new BasisClosed(context);
|
|
}, exports1.curveBasisOpen = function(context) {
|
|
return new BasisOpen(context);
|
|
}, exports1.curveBundle = bundle, exports1.curveCardinal = cardinal, exports1.curveCardinalClosed = cardinalClosed, exports1.curveCardinalOpen = cardinalOpen, exports1.curveCatmullRom = catmullRom, exports1.curveCatmullRomClosed = catmullRomClosed, exports1.curveCatmullRomOpen = catmullRomOpen, exports1.curveLinear = curveLinear, exports1.curveLinearClosed = function(context) {
|
|
return new LinearClosed(context);
|
|
}, exports1.curveMonotoneX = function(context) {
|
|
return new MonotoneX(context);
|
|
}, exports1.curveMonotoneY = function(context) {
|
|
return new MonotoneY(context);
|
|
}, exports1.curveNatural = function(context) {
|
|
return new Natural(context);
|
|
}, exports1.curveStep = function(context) {
|
|
return new Step(context, 0.5);
|
|
}, exports1.curveStepAfter = function(context) {
|
|
return new Step(context, 1);
|
|
}, exports1.curveStepBefore = function(context) {
|
|
return new Step(context, 0);
|
|
}, exports1.descending = function(a, b) {
|
|
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
|
|
}, exports1.deviation = deviation, exports1.difference = function(values, ...others) {
|
|
for (const other of (values = new Set(values), others))for (const value of other)values.delete(value);
|
|
return values;
|
|
}, exports1.disjoint = function(values, other) {
|
|
const iterator = other[Symbol.iterator](), set = new Set();
|
|
for (const v of values){
|
|
let value, done;
|
|
if (set.has(v)) return !1;
|
|
for(; ({ value, done } = iterator.next()) && !done;){
|
|
if (Object.is(v, value)) return !1;
|
|
set.add(value);
|
|
}
|
|
}
|
|
return !0;
|
|
}, exports1.dispatch = dispatch, exports1.drag = function() {
|
|
var mousedownx, mousedowny, mousemoving, touchending, filter = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch("start", "drag", "end"), active = 0, clickDistance2 = 0;
|
|
function drag(selection) {
|
|
selection.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
|
|
}
|
|
function mousedowned(event, d) {
|
|
if (!touchending && filter.call(this, event, d)) {
|
|
var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
|
|
gesture && (select(event.view).on("mousemove.drag", mousemoved, !0).on("mouseup.drag", mouseupped, !0), dragDisable(event.view), nopropagation(event), mousemoving = !1, mousedownx = event.clientX, mousedowny = event.clientY, gesture("start", event));
|
|
}
|
|
}
|
|
function mousemoved(event) {
|
|
if (noevent(event), !mousemoving) {
|
|
var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
|
|
mousemoving = dx * dx + dy * dy > clickDistance2;
|
|
}
|
|
gestures.mouse("drag", event);
|
|
}
|
|
function mouseupped(event) {
|
|
select(event.view).on("mousemove.drag mouseup.drag", null), yesdrag(event.view, mousemoving), noevent(event), gestures.mouse("end", event);
|
|
}
|
|
function touchstarted(event, d) {
|
|
if (filter.call(this, event, d)) {
|
|
var i, gesture, touches = event.changedTouches, c = container.call(this, event, d), n = touches.length;
|
|
for(i = 0; i < n; ++i)(gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) && (nopropagation(event), gesture("start", event, touches[i]));
|
|
}
|
|
}
|
|
function touchmoved(event) {
|
|
var i, gesture, touches = event.changedTouches, n = touches.length;
|
|
for(i = 0; i < n; ++i)(gesture = gestures[touches[i].identifier]) && (noevent(event), gesture("drag", event, touches[i]));
|
|
}
|
|
function touchended(event) {
|
|
var i, gesture, touches = event.changedTouches, n = touches.length;
|
|
for(touchending && clearTimeout(touchending), touchending = setTimeout(function() {
|
|
touchending = null;
|
|
}, 500), i = 0; i < n; ++i)(gesture = gestures[touches[i].identifier]) && (nopropagation(event), gesture("end", event, touches[i]));
|
|
}
|
|
function beforestart(that, container, event, d, identifier, touch) {
|
|
var dx, dy, s, dispatch = listeners.copy(), p = pointer(touch || event, container);
|
|
if (null != (s = subject.call(that, new DragEvent("beforestart", {
|
|
sourceEvent: event,
|
|
target: drag,
|
|
identifier,
|
|
active,
|
|
x: p[0],
|
|
y: p[1],
|
|
dx: 0,
|
|
dy: 0,
|
|
dispatch
|
|
}), d))) return dx = s.x - p[0] || 0, dy = s.y - p[1] || 0, function gesture(type, event, touch) {
|
|
var n, p0 = p;
|
|
switch(type){
|
|
case "start":
|
|
gestures[identifier] = gesture, n = active++;
|
|
break;
|
|
case "end":
|
|
delete gestures[identifier], --active;
|
|
case "drag":
|
|
p = pointer(touch || event, container), n = active;
|
|
}
|
|
dispatch.call(type, that, new DragEvent(type, {
|
|
sourceEvent: event,
|
|
subject: s,
|
|
target: drag,
|
|
identifier,
|
|
active: n,
|
|
x: p[0] + dx,
|
|
y: p[1] + dy,
|
|
dx: p[0] - p0[0],
|
|
dy: p[1] - p0[1],
|
|
dispatch
|
|
}), d);
|
|
};
|
|
}
|
|
return drag.filter = function(_) {
|
|
return arguments.length ? (filter = "function" == typeof _ ? _ : constant$2(!!_), drag) : filter;
|
|
}, drag.container = function(_) {
|
|
return arguments.length ? (container = "function" == typeof _ ? _ : constant$2(_), drag) : container;
|
|
}, drag.subject = function(_) {
|
|
return arguments.length ? (subject = "function" == typeof _ ? _ : constant$2(_), drag) : subject;
|
|
}, drag.touchable = function(_) {
|
|
return arguments.length ? (touchable = "function" == typeof _ ? _ : constant$2(!!_), drag) : touchable;
|
|
}, drag.on = function() {
|
|
var value = listeners.on.apply(listeners, arguments);
|
|
return value === listeners ? drag : value;
|
|
}, drag.clickDistance = function(_) {
|
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
|
|
}, drag;
|
|
}, exports1.dragDisable = dragDisable, exports1.dragEnable = yesdrag, exports1.dsv = function(delimiter, input, init, row) {
|
|
3 == arguments.length && "function" == typeof init && (row = init, init = void 0);
|
|
var format = dsvFormat(delimiter);
|
|
return text(input, init).then(function(response) {
|
|
return format.parse(response, row);
|
|
});
|
|
}, exports1.dsvFormat = dsvFormat, exports1.easeBack = backInOut, exports1.easeBackIn = backIn, exports1.easeBackInOut = backInOut, exports1.easeBackOut = backOut, exports1.easeBounce = bounceOut, exports1.easeBounceIn = function(t) {
|
|
return 1 - bounceOut(1 - t);
|
|
}, exports1.easeBounceInOut = function(t) {
|
|
return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
|
|
}, exports1.easeBounceOut = bounceOut, exports1.easeCircle = circleInOut, exports1.easeCircleIn = function(t) {
|
|
return 1 - Math.sqrt(1 - t * t);
|
|
}, exports1.easeCircleInOut = circleInOut, exports1.easeCircleOut = function(t) {
|
|
return Math.sqrt(1 - --t * t);
|
|
}, exports1.easeCubic = cubicInOut, exports1.easeCubicIn = function(t) {
|
|
return t * t * t;
|
|
}, exports1.easeCubicInOut = cubicInOut, exports1.easeCubicOut = function(t) {
|
|
return --t * t * t + 1;
|
|
}, exports1.easeElastic = elasticOut, exports1.easeElasticIn = elasticIn, exports1.easeElasticInOut = elasticInOut, exports1.easeElasticOut = elasticOut, exports1.easeExp = expInOut, exports1.easeExpIn = function(t) {
|
|
return tpmt(1 - +t);
|
|
}, exports1.easeExpInOut = expInOut, exports1.easeExpOut = function(t) {
|
|
return 1 - tpmt(t);
|
|
}, exports1.easeLinear = (t)=>+t, exports1.easePoly = polyInOut, exports1.easePolyIn = polyIn, exports1.easePolyInOut = polyInOut, exports1.easePolyOut = polyOut, exports1.easeQuad = quadInOut, exports1.easeQuadIn = function(t) {
|
|
return t * t;
|
|
}, exports1.easeQuadInOut = quadInOut, exports1.easeQuadOut = function(t) {
|
|
return t * (2 - t);
|
|
}, exports1.easeSin = sinInOut, exports1.easeSinIn = function(t) {
|
|
return 1 == +t ? 1 : 1 - Math.cos(t * halfPi);
|
|
}, exports1.easeSinInOut = sinInOut, exports1.easeSinOut = function(t) {
|
|
return Math.sin(t * halfPi);
|
|
}, exports1.every = function(values, test) {
|
|
if ("function" != typeof test) throw TypeError("test is not a function");
|
|
let index = -1;
|
|
for (const value of values)if (!test(value, ++index, values)) return !1;
|
|
return !0;
|
|
}, exports1.extent = extent, exports1.filter = function(values, test) {
|
|
if ("function" != typeof test) throw TypeError("test is not a function");
|
|
const array = [];
|
|
let index = -1;
|
|
for (const value of values)test(value, ++index, values) && array.push(value);
|
|
return array;
|
|
}, exports1.forceCenter = function(x, y) {
|
|
var nodes, strength = 1;
|
|
function force() {
|
|
var i, node, n = nodes.length, sx = 0, sy = 0;
|
|
for(i = 0; i < n; ++i)sx += (node = nodes[i]).x, sy += node.y;
|
|
for(sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i)node = nodes[i], node.x -= sx, node.y -= sy;
|
|
}
|
|
return null == x && (x = 0), null == y && (y = 0), force.initialize = function(_) {
|
|
nodes = _;
|
|
}, force.x = function(_) {
|
|
return arguments.length ? (x = +_, force) : x;
|
|
}, force.y = function(_) {
|
|
return arguments.length ? (y = +_, force) : y;
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = +_, force) : strength;
|
|
}, force;
|
|
}, exports1.forceCollide = function(radius) {
|
|
var nodes, radii, random, strength = 1, iterations = 1;
|
|
function force() {
|
|
for(var i, tree, node, xi, yi, ri, ri2, n = nodes.length, k = 0; k < iterations; ++k)for(i = 0, tree = quadtree(nodes, x, y).visitAfter(prepare); i < n; ++i)ri2 = (ri = radii[(node = nodes[i]).index]) * ri, xi = node.x + node.vx, yi = node.y + node.vy, tree.visit(apply);
|
|
function apply(quad, x0, y0, x1, y1) {
|
|
var data = quad.data, rj = quad.r, r = ri + rj;
|
|
if (data) {
|
|
if (data.index > node.index) {
|
|
var x = xi - data.x - data.vx, y = yi - data.y - data.vy, l = x * x + y * y;
|
|
l < r * r && (0 === x && (l += (x = jiggle(random)) * x), 0 === y && (l += (y = jiggle(random)) * y), l = (r - (l = Math.sqrt(l))) / l * strength, node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)), node.vy += (y *= l) * r, data.vx -= x * (r = 1 - r), data.vy -= y * r);
|
|
}
|
|
return;
|
|
}
|
|
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
|
|
}
|
|
}
|
|
function prepare(quad) {
|
|
if (quad.data) return quad.r = radii[quad.data.index];
|
|
for(var i = quad.r = 0; i < 4; ++i)quad[i] && quad[i].r > quad.r && (quad.r = quad[i].r);
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, node, n = nodes.length;
|
|
for(i = 0, radii = Array(n); i < n; ++i)radii[(node = nodes[i]).index] = +radius(node, i, nodes);
|
|
}
|
|
}
|
|
return "function" != typeof radius && (radius = constant$7(null == radius ? 1 : +radius)), force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes, random = _random, initialize();
|
|
}, force.iterations = function(_) {
|
|
return arguments.length ? (iterations = +_, force) : iterations;
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = +_, force) : strength;
|
|
}, force.radius = function(_) {
|
|
return arguments.length ? (radius = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : radius;
|
|
}, force;
|
|
}, exports1.forceLink = function(links) {
|
|
var strengths, distances, nodes, count, bias, random, id = index$1, strength = function(link) {
|
|
return 1 / Math.min(count[link.source.index], count[link.target.index]);
|
|
}, distance = constant$7(30), iterations = 1;
|
|
function force(alpha) {
|
|
for(var k = 0, n = links.length; k < iterations; ++k)for(var link, source, target, x, y, l, b, i = 0; i < n; ++i)source = (link = links[i]).source, l = ((l = Math.sqrt((x = (target = link.target).x + target.vx - source.x - source.vx || jiggle(random)) * x + (y = target.y + target.vy - source.y - source.vy || jiggle(random)) * y)) - distances[i]) / l * alpha * strengths[i], x *= l, y *= l, target.vx -= x * (b = bias[i]), target.vy -= y * b, source.vx += x * (b = 1 - b), source.vy += y * b;
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, link, n = nodes.length, m = links.length, nodeById = new Map(nodes.map((d, i)=>[
|
|
id(d, i, nodes),
|
|
d
|
|
]));
|
|
for(i = 0, count = Array(n); i < m; ++i)(link = links[i]).index = i, "object" != typeof link.source && (link.source = find$1(nodeById, link.source)), "object" != typeof link.target && (link.target = find$1(nodeById, link.target)), count[link.source.index] = (count[link.source.index] || 0) + 1, count[link.target.index] = (count[link.target.index] || 0) + 1;
|
|
for(i = 0, bias = Array(m); i < m; ++i)link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
|
|
strengths = Array(m), initializeStrength(), distances = Array(m), initializeDistance();
|
|
}
|
|
}
|
|
function initializeStrength() {
|
|
if (nodes) for(var i = 0, n = links.length; i < n; ++i)strengths[i] = +strength(links[i], i, links);
|
|
}
|
|
function initializeDistance() {
|
|
if (nodes) for(var i = 0, n = links.length; i < n; ++i)distances[i] = +distance(links[i], i, links);
|
|
}
|
|
return null == links && (links = []), force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes, random = _random, initialize();
|
|
}, force.links = function(_) {
|
|
return arguments.length ? (links = _, initialize(), force) : links;
|
|
}, force.id = function(_) {
|
|
return arguments.length ? (id = _, force) : id;
|
|
}, force.iterations = function(_) {
|
|
return arguments.length ? (iterations = +_, force) : iterations;
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = "function" == typeof _ ? _ : constant$7(+_), initializeStrength(), force) : strength;
|
|
}, force.distance = function(_) {
|
|
return arguments.length ? (distance = "function" == typeof _ ? _ : constant$7(+_), initializeDistance(), force) : distance;
|
|
}, force;
|
|
}, exports1.forceManyBody = function() {
|
|
var nodes, node, random, alpha, strengths, strength = constant$7(-30), distanceMin2 = 1, distanceMax2 = 1 / 0, theta2 = 0.81;
|
|
function force(_) {
|
|
var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
|
|
for(alpha = _, i = 0; i < n; ++i)node = nodes[i], tree.visit(apply);
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, node, n = nodes.length;
|
|
for(i = 0, strengths = Array(n); i < n; ++i)strengths[(node = nodes[i]).index] = +strength(node, i, nodes);
|
|
}
|
|
}
|
|
function accumulate(quad) {
|
|
var q, c, x, y, i, strength = 0, weight = 0;
|
|
if (quad.length) {
|
|
for(x = y = i = 0; i < 4; ++i)(q = quad[i]) && (c = Math.abs(q.value)) && (strength += q.value, weight += c, x += c * q.x, y += c * q.y);
|
|
quad.x = x / weight, quad.y = y / weight;
|
|
} else {
|
|
(q = quad).x = q.data.x, q.y = q.data.y;
|
|
do strength += strengths[q.data.index];
|
|
while (q = q.next)
|
|
}
|
|
quad.value = strength;
|
|
}
|
|
function apply(quad, x1, _, x2) {
|
|
if (!quad.value) return !0;
|
|
var x = quad.x - node.x, y = quad.y - node.y, w = x2 - x1, l = x * x + y * y;
|
|
if (w * w / theta2 < l) return l < distanceMax2 && (0 === x && (l += (x = jiggle(random)) * x), 0 === y && (l += (y = jiggle(random)) * y), l < distanceMin2 && (l = Math.sqrt(distanceMin2 * l)), node.vx += x * quad.value * alpha / l, node.vy += y * quad.value * alpha / l), !0;
|
|
if (!quad.length && !(l >= distanceMax2)) {
|
|
(quad.data !== node || quad.next) && (0 === x && (l += (x = jiggle(random)) * x), 0 === y && (l += (y = jiggle(random)) * y), l < distanceMin2 && (l = Math.sqrt(distanceMin2 * l)));
|
|
do quad.data !== node && (w = strengths[quad.data.index] * alpha / l, node.vx += x * w, node.vy += y * w);
|
|
while (quad = quad.next)
|
|
}
|
|
}
|
|
return force.initialize = function(_nodes, _random) {
|
|
nodes = _nodes, random = _random, initialize();
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : strength;
|
|
}, force.distanceMin = function(_) {
|
|
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
|
|
}, force.distanceMax = function(_) {
|
|
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
|
|
}, force.theta = function(_) {
|
|
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
|
|
}, force;
|
|
}, exports1.forceRadial = function(radius, x, y) {
|
|
var nodes, strengths, radiuses, strength = constant$7(0.1);
|
|
function force(alpha) {
|
|
for(var i = 0, n = nodes.length; i < n; ++i){
|
|
var node = nodes[i], dx = node.x - x || 1e-6, dy = node.y - y || 1e-6, r = Math.sqrt(dx * dx + dy * dy), k = (radiuses[i] - r) * strengths[i] * alpha / r;
|
|
node.vx += dx * k, node.vy += dy * k;
|
|
}
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, n = nodes.length;
|
|
for(i = 0, strengths = Array(n), radiuses = Array(n); i < n; ++i)radiuses[i] = +radius(nodes[i], i, nodes), strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
|
|
}
|
|
}
|
|
return "function" != typeof radius && (radius = constant$7(+radius)), null == x && (x = 0), null == y && (y = 0), force.initialize = function(_) {
|
|
nodes = _, initialize();
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : strength;
|
|
}, force.radius = function(_) {
|
|
return arguments.length ? (radius = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : radius;
|
|
}, force.x = function(_) {
|
|
return arguments.length ? (x = +_, force) : x;
|
|
}, force.y = function(_) {
|
|
return arguments.length ? (y = +_, force) : y;
|
|
}, force;
|
|
}, exports1.forceSimulation = function(nodes) {
|
|
let s;
|
|
var simulation, alpha = 1, alphaMin = 0.001, alphaDecay = 1 - Math.pow(0.001, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = new Map(), stepper = timer(step), event = dispatch("tick", "end"), random = (s = 1, ()=>(s = (1664525 * s + 1013904223) % 4294967296) / 4294967296);
|
|
function step() {
|
|
tick(), event.call("tick", simulation), alpha < alphaMin && (stepper.stop(), event.call("end", simulation));
|
|
}
|
|
function tick(iterations) {
|
|
var i, node, n = nodes.length;
|
|
void 0 === iterations && (iterations = 1);
|
|
for(var k = 0; k < iterations; ++k)for(alpha += (alphaTarget - alpha) * alphaDecay, forces.forEach(function(force) {
|
|
force(alpha);
|
|
}), i = 0; i < n; ++i)null == (node = nodes[i]).fx ? node.x += node.vx *= velocityDecay : (node.x = node.fx, node.vx = 0), null == node.fy ? node.y += node.vy *= velocityDecay : (node.y = node.fy, node.vy = 0);
|
|
return simulation;
|
|
}
|
|
function initializeNodes() {
|
|
for(var node, i = 0, n = nodes.length; i < n; ++i){
|
|
if ((node = nodes[i]).index = i, null != node.fx && (node.x = node.fx), null != node.fy && (node.y = node.fy), isNaN(node.x) || isNaN(node.y)) {
|
|
var radius = 10 * Math.sqrt(0.5 + i), angle = i * initialAngle;
|
|
node.x = radius * Math.cos(angle), node.y = radius * Math.sin(angle);
|
|
}
|
|
(isNaN(node.vx) || isNaN(node.vy)) && (node.vx = node.vy = 0);
|
|
}
|
|
}
|
|
function initializeForce(force) {
|
|
return force.initialize && force.initialize(nodes, random), force;
|
|
}
|
|
return null == nodes && (nodes = []), initializeNodes(), simulation = {
|
|
tick: tick,
|
|
restart: function() {
|
|
return stepper.restart(step), simulation;
|
|
},
|
|
stop: function() {
|
|
return stepper.stop(), simulation;
|
|
},
|
|
nodes: function(_) {
|
|
return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;
|
|
},
|
|
alpha: function(_) {
|
|
return arguments.length ? (alpha = +_, simulation) : alpha;
|
|
},
|
|
alphaMin: function(_) {
|
|
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
|
|
},
|
|
alphaDecay: function(_) {
|
|
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
|
|
},
|
|
alphaTarget: function(_) {
|
|
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
|
|
},
|
|
velocityDecay: function(_) {
|
|
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
|
|
},
|
|
randomSource: function(_) {
|
|
return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;
|
|
},
|
|
force: function(name, _) {
|
|
return arguments.length > 1 ? (null == _ ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);
|
|
},
|
|
find: function(x, y, radius) {
|
|
var dx, dy, d2, node, closest, i = 0, n = nodes.length;
|
|
for(null == radius ? radius = 1 / 0 : radius *= radius, i = 0; i < n; ++i)(d2 = (dx = x - (node = nodes[i]).x) * dx + (dy = y - node.y) * dy) < radius && (closest = node, radius = d2);
|
|
return closest;
|
|
},
|
|
on: function(name, _) {
|
|
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
|
|
}
|
|
};
|
|
}, exports1.forceX = function(x) {
|
|
var nodes, strengths, xz, strength = constant$7(0.1);
|
|
function force(alpha) {
|
|
for(var node, i = 0, n = nodes.length; i < n; ++i)node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, n = nodes.length;
|
|
for(i = 0, strengths = Array(n), xz = Array(n); i < n; ++i)strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
|
|
}
|
|
}
|
|
return "function" != typeof x && (x = constant$7(null == x ? 0 : +x)), force.initialize = function(_) {
|
|
nodes = _, initialize();
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : strength;
|
|
}, force.x = function(_) {
|
|
return arguments.length ? (x = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : x;
|
|
}, force;
|
|
}, exports1.forceY = function(y) {
|
|
var nodes, strengths, yz, strength = constant$7(0.1);
|
|
function force(alpha) {
|
|
for(var node, i = 0, n = nodes.length; i < n; ++i)node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
|
|
}
|
|
function initialize() {
|
|
if (nodes) {
|
|
var i, n = nodes.length;
|
|
for(i = 0, strengths = Array(n), yz = Array(n); i < n; ++i)strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
|
|
}
|
|
}
|
|
return "function" != typeof y && (y = constant$7(null == y ? 0 : +y)), force.initialize = function(_) {
|
|
nodes = _, initialize();
|
|
}, force.strength = function(_) {
|
|
return arguments.length ? (strength = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : strength;
|
|
}, force.y = function(_) {
|
|
return arguments.length ? (y = "function" == typeof _ ? _ : constant$7(+_), initialize(), force) : y;
|
|
}, force;
|
|
}, exports1.formatDefaultLocale = defaultLocale, exports1.formatLocale = formatLocale, exports1.formatSpecifier = formatSpecifier, exports1.fsum = function(values, valueof) {
|
|
const adder = new Adder();
|
|
if (void 0 === valueof) for (let value of values)(value = +value) && adder.add(value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)(value = +valueof(value, ++index, values)) && adder.add(value);
|
|
}
|
|
return +adder;
|
|
}, exports1.geoAlbers = albers, exports1.geoAlbersUsa = function() {
|
|
var cache, cacheStream, lower48Point, alaskaPoint, hawaiiPoint, point, lower48 = albers(), alaska = conicEqualArea().rotate([
|
|
154,
|
|
0
|
|
]).center([
|
|
-2,
|
|
58.5
|
|
]).parallels([
|
|
55,
|
|
65
|
|
]), hawaii = conicEqualArea().rotate([
|
|
157,
|
|
0
|
|
]).center([
|
|
-3,
|
|
19.9
|
|
]).parallels([
|
|
8,
|
|
18
|
|
]), pointStream = {
|
|
point: function(x, y) {
|
|
point = [
|
|
x,
|
|
y
|
|
];
|
|
}
|
|
};
|
|
function albersUsa(coordinates) {
|
|
var x = coordinates[0], y = coordinates[1];
|
|
return point = null, lower48Point.point(x, y), point || (alaskaPoint.point(x, y), point) || (hawaiiPoint.point(x, y), point);
|
|
}
|
|
function reset() {
|
|
return cache = cacheStream = null, albersUsa;
|
|
}
|
|
return albersUsa.invert = function(coordinates) {
|
|
var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
|
|
return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii : lower48).invert(coordinates);
|
|
}, albersUsa.stream = function(stream) {
|
|
var streams, n;
|
|
return cache && cacheStream === stream ? cache : (n = (streams = [
|
|
lower48.stream(cacheStream = stream),
|
|
alaska.stream(stream),
|
|
hawaii.stream(stream)
|
|
]).length, cache = {
|
|
point: function(x, y) {
|
|
for(var i = -1; ++i < n;)streams[i].point(x, y);
|
|
},
|
|
sphere: function() {
|
|
for(var i = -1; ++i < n;)streams[i].sphere();
|
|
},
|
|
lineStart: function() {
|
|
for(var i = -1; ++i < n;)streams[i].lineStart();
|
|
},
|
|
lineEnd: function() {
|
|
for(var i = -1; ++i < n;)streams[i].lineEnd();
|
|
},
|
|
polygonStart: function() {
|
|
for(var i = -1; ++i < n;)streams[i].polygonStart();
|
|
},
|
|
polygonEnd: function() {
|
|
for(var i = -1; ++i < n;)streams[i].polygonEnd();
|
|
}
|
|
});
|
|
}, albersUsa.precision = function(_) {
|
|
return arguments.length ? (lower48.precision(_), alaska.precision(_), hawaii.precision(_), reset()) : lower48.precision();
|
|
}, albersUsa.scale = function(_) {
|
|
return arguments.length ? (lower48.scale(_), alaska.scale(0.35 * _), hawaii.scale(_), albersUsa.translate(lower48.translate())) : lower48.scale();
|
|
}, albersUsa.translate = function(_) {
|
|
if (!arguments.length) return lower48.translate();
|
|
var k = lower48.scale(), x = +_[0], y = +_[1];
|
|
return lower48Point = lower48.translate(_).clipExtent([
|
|
[
|
|
x - 0.455 * k,
|
|
y - 0.238 * k
|
|
],
|
|
[
|
|
x + 0.455 * k,
|
|
y + 0.238 * k
|
|
]
|
|
]).stream(pointStream), alaskaPoint = alaska.translate([
|
|
x - 0.307 * k,
|
|
y + 0.201 * k
|
|
]).clipExtent([
|
|
[
|
|
x - 0.425 * k + 1e-6,
|
|
y + 0.120 * k + 1e-6
|
|
],
|
|
[
|
|
x - 0.214 * k - 1e-6,
|
|
y + 0.234 * k - 1e-6
|
|
]
|
|
]).stream(pointStream), hawaiiPoint = hawaii.translate([
|
|
x - 0.205 * k,
|
|
y + 0.212 * k
|
|
]).clipExtent([
|
|
[
|
|
x - 0.214 * k + 1e-6,
|
|
y + 0.166 * k + 1e-6
|
|
],
|
|
[
|
|
x - 0.115 * k - 1e-6,
|
|
y + 0.234 * k - 1e-6
|
|
]
|
|
]).stream(pointStream), reset();
|
|
}, albersUsa.fitExtent = function(extent, object) {
|
|
return fitExtent(albersUsa, extent, object);
|
|
}, albersUsa.fitSize = function(size, object) {
|
|
return fitSize(albersUsa, size, object);
|
|
}, albersUsa.fitWidth = function(width, object) {
|
|
return fitWidth(albersUsa, width, object);
|
|
}, albersUsa.fitHeight = function(height, object) {
|
|
return fitHeight(albersUsa, height, object);
|
|
}, albersUsa.scale(1070);
|
|
}, exports1.geoArea = function(object) {
|
|
return areaSum = new Adder(), geoStream(object, areaStream), 2 * areaSum;
|
|
}, exports1.geoAzimuthalEqualArea = function() {
|
|
return projection(azimuthalEqualAreaRaw).scale(124.75).clipAngle(179.999);
|
|
}, exports1.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw, exports1.geoAzimuthalEquidistant = function() {
|
|
return projection(azimuthalEquidistantRaw).scale(79.4188).clipAngle(179.999);
|
|
}, exports1.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw, exports1.geoBounds = function(feature) {
|
|
var i, n, a, b, merged, deltaMax, delta;
|
|
if (phi1 = lambda1 = -(lambda0$1 = phi0 = 1 / 0), ranges = [], geoStream(feature, boundsStream), n = ranges.length) {
|
|
for(ranges.sort(rangeCompare), i = 1, merged = [
|
|
a = ranges[0]
|
|
]; i < n; ++i)rangeContains(a, (b = ranges[i])[0]) || rangeContains(a, b[1]) ? (angle(a[0], b[1]) > angle(a[0], a[1]) && (a[1] = b[1]), angle(b[0], a[1]) > angle(a[0], a[1]) && (a[0] = b[0])) : merged.push(a = b);
|
|
for(deltaMax = -1 / 0, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i)b = merged[i], (delta = angle(a[1], b[0])) > deltaMax && (deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]);
|
|
}
|
|
return ranges = range$1 = null, lambda0$1 === 1 / 0 || phi0 === 1 / 0 ? [
|
|
[
|
|
NaN,
|
|
NaN
|
|
],
|
|
[
|
|
NaN,
|
|
NaN
|
|
]
|
|
] : [
|
|
[
|
|
lambda0$1,
|
|
phi0
|
|
],
|
|
[
|
|
lambda1,
|
|
phi1
|
|
]
|
|
];
|
|
}, exports1.geoCentroid = function(object) {
|
|
W0 = W1 = X0 = Y0 = Z0 = X1 = Y1 = Z1 = 0, X2 = new Adder(), Y2 = new Adder(), Z2 = new Adder(), geoStream(object, centroidStream);
|
|
var x = +X2, y = +Y2, z = +Z2, m = hypot(x, y, z);
|
|
return m < 1e-12 && (x = X1, y = Y1, z = Z1, W1 < 1e-6 && (x = X0, y = Y0, z = Z0), (m = hypot(x, y, z)) < 1e-12) ? [
|
|
NaN,
|
|
NaN
|
|
] : [
|
|
atan2(y, x) * degrees$2,
|
|
asin(z / m) * degrees$2
|
|
];
|
|
}, exports1.geoCircle = function() {
|
|
var ring, rotate, center = constant$8([
|
|
0,
|
|
0
|
|
]), radius = constant$8(90), precision = constant$8(6), stream = {
|
|
point: function(x, y) {
|
|
ring.push(x = rotate(x, y)), x[0] *= degrees$2, x[1] *= degrees$2;
|
|
}
|
|
};
|
|
function circle() {
|
|
var c = center.apply(this, arguments), r = radius.apply(this, arguments) * radians$1, p = precision.apply(this, arguments) * radians$1;
|
|
return ring = [], rotate = rotateRadians(-c[0] * radians$1, -c[1] * radians$1, 0).invert, circleStream(stream, r, p, 1), c = {
|
|
type: "Polygon",
|
|
coordinates: [
|
|
ring
|
|
]
|
|
}, ring = rotate = null, c;
|
|
}
|
|
return circle.center = function(_) {
|
|
return arguments.length ? (center = "function" == typeof _ ? _ : constant$8([
|
|
+_[0],
|
|
+_[1]
|
|
]), circle) : center;
|
|
}, circle.radius = function(_) {
|
|
return arguments.length ? (radius = "function" == typeof _ ? _ : constant$8(+_), circle) : radius;
|
|
}, circle.precision = function(_) {
|
|
return arguments.length ? (precision = "function" == typeof _ ? _ : constant$8(+_), circle) : precision;
|
|
}, circle;
|
|
}, exports1.geoClipAntimeridian = clipAntimeridian, exports1.geoClipCircle = clipCircle, exports1.geoClipExtent = function() {
|
|
var cache, cacheStream, clip, x0 = 0, y0 = 0, x1 = 960, y1 = 500;
|
|
return clip = {
|
|
stream: function(stream) {
|
|
return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
|
|
},
|
|
extent: function(_) {
|
|
return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [
|
|
[
|
|
x0,
|
|
y0
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
}
|
|
};
|
|
}, exports1.geoClipRectangle = clipRectangle, exports1.geoConicConformal = function() {
|
|
return conicProjection(conicConformalRaw).scale(109.5).parallels([
|
|
30,
|
|
30
|
|
]);
|
|
}, exports1.geoConicConformalRaw = conicConformalRaw, exports1.geoConicEqualArea = conicEqualArea, exports1.geoConicEqualAreaRaw = conicEqualAreaRaw, exports1.geoConicEquidistant = function() {
|
|
return conicProjection(conicEquidistantRaw).scale(131.154).center([
|
|
0,
|
|
13.9389
|
|
]);
|
|
}, exports1.geoConicEquidistantRaw = conicEquidistantRaw, exports1.geoContains = function(object, point) {
|
|
return (object && containsObjectType.hasOwnProperty(object.type) ? containsObjectType[object.type] : containsGeometry)(object, point);
|
|
}, exports1.geoDistance = distance, exports1.geoEqualEarth = function() {
|
|
return projection(equalEarthRaw).scale(177.158);
|
|
}, exports1.geoEqualEarthRaw = equalEarthRaw, exports1.geoEquirectangular = function() {
|
|
return projection(equirectangularRaw).scale(152.63);
|
|
}, exports1.geoEquirectangularRaw = equirectangularRaw, exports1.geoGnomonic = function() {
|
|
return projection(gnomonicRaw).scale(144.049).clipAngle(60);
|
|
}, exports1.geoGnomonicRaw = gnomonicRaw, exports1.geoGraticule = graticule, exports1.geoGraticule10 = function() {
|
|
return graticule()();
|
|
}, exports1.geoIdentity = function() {
|
|
var ca, sa, y0, x1, y1, cache, cacheStream, k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, x0 = null, kx = 1, ky = 1, transform = transformer({
|
|
point: function(x, y) {
|
|
var p = projection([
|
|
x,
|
|
y
|
|
]);
|
|
this.stream.point(p[0], p[1]);
|
|
}
|
|
}), postclip = identity$4;
|
|
function reset() {
|
|
return kx = k * sx, ky = k * sy, cache = cacheStream = null, projection;
|
|
}
|
|
function projection(p) {
|
|
var x = p[0] * kx, y = p[1] * ky;
|
|
if (alpha) {
|
|
var t = y * ca - x * sa;
|
|
x = x * ca + y * sa, y = t;
|
|
}
|
|
return [
|
|
x + tx,
|
|
y + ty
|
|
];
|
|
}
|
|
return projection.invert = function(p) {
|
|
var x = p[0] - tx, y = p[1] - ty;
|
|
if (alpha) {
|
|
var t = y * ca + x * sa;
|
|
x = x * ca - y * sa, y = t;
|
|
}
|
|
return [
|
|
x / kx,
|
|
y / ky
|
|
];
|
|
}, projection.stream = function(stream) {
|
|
return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
|
|
}, projection.postclip = function(_) {
|
|
return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
|
|
}, projection.clipExtent = function(_) {
|
|
return arguments.length ? (postclip = null == _ ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : null == x0 ? null : [
|
|
[
|
|
x0,
|
|
y0
|
|
],
|
|
[
|
|
x1,
|
|
y1
|
|
]
|
|
];
|
|
}, projection.scale = function(_) {
|
|
return arguments.length ? (k = +_, reset()) : k;
|
|
}, projection.translate = function(_) {
|
|
return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [
|
|
tx,
|
|
ty
|
|
];
|
|
}, projection.angle = function(_) {
|
|
return arguments.length ? (sa = sin$1(alpha = _ % 360 * radians$1), ca = cos$1(alpha), reset()) : alpha * degrees$2;
|
|
}, projection.reflectX = function(_) {
|
|
return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;
|
|
}, projection.reflectY = function(_) {
|
|
return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;
|
|
}, projection.fitExtent = function(extent, object) {
|
|
return fitExtent(projection, extent, object);
|
|
}, projection.fitSize = function(size, object) {
|
|
return fitSize(projection, size, object);
|
|
}, projection.fitWidth = function(width, object) {
|
|
return fitWidth(projection, width, object);
|
|
}, projection.fitHeight = function(height, object) {
|
|
return fitHeight(projection, height, object);
|
|
}, projection;
|
|
}, exports1.geoInterpolate = function(a, b) {
|
|
var x, x1, x0 = a[0] * radians$1, y0 = a[1] * radians$1, x11 = b[0] * radians$1, y1 = b[1] * radians$1, cy0 = cos$1(y0), sy0 = sin$1(y0), cy1 = cos$1(y1), sy1 = sin$1(y1), kx0 = cy0 * cos$1(x0), ky0 = cy0 * sin$1(x0), kx1 = cy1 * cos$1(x11), ky1 = cy1 * sin$1(x11), d = 2 * asin(sqrt((x = sin$1((x = y1 - y0) / 2)) * x + cy0 * cy1 * ((x1 = sin$1((x1 = x11 - x0) / 2)) * x1))), k = sin$1(d), interpolate = d ? function(t) {
|
|
var B = sin$1(t *= d) / k, A = sin$1(d - t) / k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1;
|
|
return [
|
|
atan2(y, x) * degrees$2,
|
|
atan2(A * sy0 + B * sy1, sqrt(x * x + y * y)) * degrees$2
|
|
];
|
|
} : function() {
|
|
return [
|
|
x0 * degrees$2,
|
|
y0 * degrees$2
|
|
];
|
|
};
|
|
return interpolate.distance = d, interpolate;
|
|
}, exports1.geoLength = length$2, exports1.geoMercator = function() {
|
|
return mercatorProjection(mercatorRaw).scale(961 / tau$4);
|
|
}, exports1.geoMercatorRaw = mercatorRaw, exports1.geoNaturalEarth1 = function() {
|
|
return projection(naturalEarth1Raw).scale(175.295);
|
|
}, exports1.geoNaturalEarth1Raw = naturalEarth1Raw, exports1.geoOrthographic = function() {
|
|
return projection(orthographicRaw).scale(249.5).clipAngle(90.000001);
|
|
}, exports1.geoOrthographicRaw = orthographicRaw, exports1.geoPath = function(projection, context) {
|
|
var projectionStream, contextStream, pointRadius = 4.5;
|
|
function path(object) {
|
|
return object && ("function" == typeof pointRadius && contextStream.pointRadius(+pointRadius.apply(this, arguments)), geoStream(object, projectionStream(contextStream))), contextStream.result();
|
|
}
|
|
return path.area = function(object) {
|
|
return geoStream(object, projectionStream(areaStream$1)), areaStream$1.result();
|
|
}, path.measure = function(object) {
|
|
return geoStream(object, projectionStream(lengthStream$1)), lengthStream$1.result();
|
|
}, path.bounds = function(object) {
|
|
return geoStream(object, projectionStream(boundsStream$1)), boundsStream$1.result();
|
|
}, path.centroid = function(object) {
|
|
return geoStream(object, projectionStream(centroidStream$1)), centroidStream$1.result();
|
|
}, path.projection = function(_) {
|
|
return arguments.length ? (projectionStream = null == _ ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
|
|
}, path.context = function(_) {
|
|
return arguments.length ? (contextStream = null == _ ? (context = null, new PathString) : new PathContext(context = _), "function" != typeof pointRadius && contextStream.pointRadius(pointRadius), path) : context;
|
|
}, path.pointRadius = function(_) {
|
|
return arguments.length ? (pointRadius = "function" == typeof _ ? _ : (contextStream.pointRadius(+_), +_), path) : pointRadius;
|
|
}, path.projection(projection).context(context);
|
|
}, exports1.geoProjection = projection, exports1.geoProjectionMutator = projectionMutator, exports1.geoRotation = rotation, exports1.geoStereographic = function() {
|
|
return projection(stereographicRaw).scale(250).clipAngle(142);
|
|
}, exports1.geoStereographicRaw = stereographicRaw, exports1.geoStream = geoStream, exports1.geoTransform = function(methods) {
|
|
return {
|
|
stream: transformer(methods)
|
|
};
|
|
}, exports1.geoTransverseMercator = function() {
|
|
var m = mercatorProjection(transverseMercatorRaw), center = m.center, rotate = m.rotate;
|
|
return m.center = function(_) {
|
|
return arguments.length ? center([
|
|
-_[1],
|
|
_[0]
|
|
]) : [
|
|
(_ = center())[1],
|
|
-_[0]
|
|
];
|
|
}, m.rotate = function(_) {
|
|
return arguments.length ? rotate([
|
|
_[0],
|
|
_[1],
|
|
_.length > 2 ? _[2] + 90 : 90
|
|
]) : [
|
|
(_ = rotate())[0],
|
|
_[1],
|
|
_[2] - 90
|
|
];
|
|
}, rotate([
|
|
0,
|
|
0,
|
|
90
|
|
]).scale(159.155);
|
|
}, exports1.geoTransverseMercatorRaw = transverseMercatorRaw, exports1.gray = function(l, opacity) {
|
|
return new Lab(l, 0, 0, null == opacity ? 1 : opacity);
|
|
}, exports1.greatest = function(values, compare = ascending) {
|
|
let max;
|
|
let defined = !1;
|
|
if (1 === compare.length) {
|
|
let maxValue;
|
|
for (const element of values){
|
|
const value = compare(element);
|
|
(defined ? ascending(value, maxValue) > 0 : 0 === ascending(value, value)) && (max = element, maxValue = value, defined = !0);
|
|
}
|
|
} else for (const value of values)(defined ? compare(value, max) > 0 : 0 === compare(value, value)) && (max = value, defined = !0);
|
|
return max;
|
|
}, exports1.greatestIndex = function(values, compare = ascending) {
|
|
let maxValue;
|
|
if (1 === compare.length) return maxIndex(values, compare);
|
|
let max = -1, index = -1;
|
|
for (const value of values)++index, (max < 0 ? 0 === compare(value, value) : compare(value, maxValue) > 0) && (maxValue = value, max = index);
|
|
return max;
|
|
}, exports1.group = function(values, ...keys) {
|
|
return nest(values, identity, identity, keys);
|
|
}, exports1.groups = function(values, ...keys) {
|
|
return nest(values, Array.from, identity, keys);
|
|
}, exports1.hcl = hcl, exports1.hierarchy = hierarchy, exports1.histogram = bin, exports1.hsl = hsl, exports1.html = html, exports1.image = function(input, init) {
|
|
return new Promise(function(resolve, reject) {
|
|
var image = new Image;
|
|
for(var key in init)image[key] = init[key];
|
|
image.onerror = reject, image.onload = function() {
|
|
resolve(image);
|
|
}, image.src = input;
|
|
});
|
|
}, exports1.index = function(values, ...keys) {
|
|
return nest(values, identity, unique, keys);
|
|
}, exports1.indexes = function(values, ...keys) {
|
|
return nest(values, Array.from, unique, keys);
|
|
}, exports1.interpolate = interpolate, exports1.interpolateArray = function(a, b) {
|
|
return (isNumberArray(b) ? numberArray : genericArray)(a, b);
|
|
}, exports1.interpolateBasis = basis$1, exports1.interpolateBasisClosed = basisClosed, exports1.interpolateBlues = Blues, exports1.interpolateBrBG = BrBG, exports1.interpolateBuGn = BuGn, exports1.interpolateBuPu = BuPu, exports1.interpolateCividis = function(t) {
|
|
return "rgb(" + Math.max(0, Math.min(255, Math.round(-4.54 - (t = Math.max(0, Math.min(1, t))) * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - 2710.57 * t))))))) + ", " + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - 67.37 * t))))))) + ", " + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - 2475.67 * t))))))) + ")";
|
|
}, exports1.interpolateCool = cool, exports1.interpolateCubehelix = cubehelix$2, exports1.interpolateCubehelixDefault = cubehelix$3, exports1.interpolateCubehelixLong = cubehelixLong, exports1.interpolateDate = date, exports1.interpolateDiscrete = function(range) {
|
|
var n = range.length;
|
|
return function(t) {
|
|
return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
|
|
};
|
|
}, exports1.interpolateGnBu = GnBu, exports1.interpolateGreens = Greens, exports1.interpolateGreys = Greys, exports1.interpolateHcl = hcl$2, exports1.interpolateHclLong = hclLong, exports1.interpolateHsl = hsl$2, exports1.interpolateHslLong = hslLong, exports1.interpolateHue = function(a, b) {
|
|
var i = hue(+a, +b);
|
|
return function(t) {
|
|
var x = i(t);
|
|
return x - 360 * Math.floor(x / 360);
|
|
};
|
|
}, exports1.interpolateInferno = inferno, exports1.interpolateLab = function(start, end) {
|
|
var l = nogamma((start = lab(start)).l, (end = lab(end)).l), a = nogamma(start.a, end.a), b = nogamma(start.b, end.b), opacity = nogamma(start.opacity, end.opacity);
|
|
return function(t) {
|
|
return start.l = l(t), start.a = a(t), start.b = b(t), start.opacity = opacity(t), start + "";
|
|
};
|
|
}, exports1.interpolateMagma = magma, exports1.interpolateNumber = interpolateNumber, exports1.interpolateNumberArray = numberArray, exports1.interpolateObject = object, exports1.interpolateOrRd = OrRd, exports1.interpolateOranges = Oranges, exports1.interpolatePRGn = PRGn, exports1.interpolatePiYG = PiYG, exports1.interpolatePlasma = plasma, exports1.interpolatePuBu = PuBu, exports1.interpolatePuBuGn = PuBuGn, exports1.interpolatePuOr = PuOr, exports1.interpolatePuRd = PuRd, exports1.interpolatePurples = Purples, exports1.interpolateRainbow = function(t) {
|
|
(t < 0 || t > 1) && (t -= Math.floor(t));
|
|
var ts = Math.abs(t - 0.5);
|
|
return c$1.h = 360 * t - 100, c$1.s = 1.5 - 1.5 * ts, c$1.l = 0.8 - 0.9 * ts, c$1 + "";
|
|
}, exports1.interpolateRdBu = RdBu, exports1.interpolateRdGy = RdGy, exports1.interpolateRdPu = RdPu, exports1.interpolateRdYlBu = RdYlBu, exports1.interpolateRdYlGn = RdYlGn, exports1.interpolateReds = Reds, exports1.interpolateRgb = interpolateRgb, exports1.interpolateRgbBasis = rgbBasis, exports1.interpolateRgbBasisClosed = rgbBasisClosed, exports1.interpolateRound = interpolateRound, exports1.interpolateSinebow = function(t) {
|
|
var x;
|
|
return t = (0.5 - t) * Math.PI, c$2.r = 255 * (x = Math.sin(t)) * x, c$2.g = 255 * (x = Math.sin(t + pi_1_3)) * x, c$2.b = 255 * (x = Math.sin(t + pi_2_3)) * x, c$2 + "";
|
|
}, exports1.interpolateSpectral = Spectral, exports1.interpolateString = interpolateString, exports1.interpolateTransformCss = interpolateTransformCss, exports1.interpolateTransformSvg = interpolateTransformSvg, exports1.interpolateTurbo = function(t) {
|
|
return "rgb(" + Math.max(0, Math.min(255, Math.round(34.61 + (t = Math.max(0, Math.min(1, t))) * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - 14825.05 * t))))))) + ", " + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + 707.56 * t))))))) + ", " + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - 6838.66 * t))))))) + ")";
|
|
}, exports1.interpolateViridis = viridis, exports1.interpolateWarm = warm, exports1.interpolateYlGn = YlGn, exports1.interpolateYlGnBu = YlGnBu, exports1.interpolateYlOrBr = YlOrBr, exports1.interpolateYlOrRd = YlOrRd, exports1.interpolateZoom = interpolateZoom, exports1.interrupt = interrupt, exports1.intersection = function(values, ...others) {
|
|
values = new Set(values), others = others.map(set);
|
|
out: for (const value of values)for (const other of others)if (!other.has(value)) {
|
|
values.delete(value);
|
|
continue out;
|
|
}
|
|
return values;
|
|
}, exports1.interval = function(callback, delay, time) {
|
|
var t = new Timer, total = delay;
|
|
return null == delay ? (t.restart(callback, delay, time), t) : (t._restart = t.restart, t.restart = function(callback, delay, time) {
|
|
delay = +delay, time = null == time ? now() : +time, t._restart(function tick(elapsed) {
|
|
elapsed += total, t._restart(tick, total += delay, time), callback(elapsed);
|
|
}, delay, time);
|
|
}, t.restart(callback, delay, time), t);
|
|
}, exports1.isoFormat = formatIso, exports1.isoParse = parseIso, exports1.json = function(input, init) {
|
|
return fetch(input, init).then(responseJson);
|
|
}, exports1.lab = lab, exports1.lch = function(l, c, h, opacity) {
|
|
return 1 == arguments.length ? hclConvert(l) : new Hcl(h, c, l, null == opacity ? 1 : opacity);
|
|
}, exports1.least = function(values, compare = ascending) {
|
|
let min;
|
|
let defined = !1;
|
|
if (1 === compare.length) {
|
|
let minValue;
|
|
for (const element of values){
|
|
const value = compare(element);
|
|
(defined ? 0 > ascending(value, minValue) : 0 === ascending(value, value)) && (min = element, minValue = value, defined = !0);
|
|
}
|
|
} else for (const value of values)(defined ? 0 > compare(value, min) : 0 === compare(value, value)) && (min = value, defined = !0);
|
|
return min;
|
|
}, exports1.leastIndex = leastIndex, exports1.line = line, exports1.lineRadial = lineRadial$1, exports1.linkHorizontal = function() {
|
|
return link$2(curveHorizontal);
|
|
}, exports1.linkRadial = function() {
|
|
var l = link$2(curveRadial$1);
|
|
return l.angle = l.x, delete l.x, l.radius = l.y, delete l.y, l;
|
|
}, exports1.linkVertical = function() {
|
|
return link$2(curveVertical);
|
|
}, exports1.local = local, exports1.map = function(values, mapper) {
|
|
if ("function" != typeof values[Symbol.iterator]) throw TypeError("values is not iterable");
|
|
if ("function" != typeof mapper) throw TypeError("mapper is not a function");
|
|
return Array.from(values, (value, index)=>mapper(value, index, values));
|
|
}, exports1.matcher = matcher, exports1.max = max, exports1.maxIndex = maxIndex, exports1.mean = function(values, valueof) {
|
|
let count = 0, sum = 0;
|
|
if (void 0 === valueof) for (let value of values)null != value && (value = +value) >= value && (++count, sum += value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)null != (value = valueof(value, ++index, values)) && (value = +value) >= value && (++count, sum += value);
|
|
}
|
|
if (count) return sum / count;
|
|
}, exports1.median = function(values, valueof) {
|
|
return quantile(values, 0.5, valueof);
|
|
}, exports1.merge = merge, exports1.min = min, exports1.minIndex = minIndex, exports1.namespace = namespace, exports1.namespaces = namespaces, exports1.nice = nice, exports1.now = now, exports1.pack = function() {
|
|
var radius = null, dx = 1, dy = 1, padding = constantZero;
|
|
function pack(root) {
|
|
return root.x = dx / 2, root.y = dy / 2, radius ? root.eachBefore(radiusLeaf(radius)).eachAfter(packChildren(padding, 0.5)).eachBefore(translateChild(1)) : root.eachBefore(radiusLeaf(defaultRadius$1)).eachAfter(packChildren(constantZero, 1)).eachAfter(packChildren(padding, root.r / Math.min(dx, dy))).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))), root;
|
|
}
|
|
return pack.radius = function(x) {
|
|
return arguments.length ? (radius = null == x ? null : required(x), pack) : radius;
|
|
}, pack.size = function(x) {
|
|
return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, pack.padding = function(x) {
|
|
return arguments.length ? (padding = "function" == typeof x ? x : constant$9(+x), pack) : padding;
|
|
}, pack;
|
|
}, exports1.packEnclose = enclose, exports1.packSiblings = function(circles) {
|
|
return packEnclose(circles), circles;
|
|
}, exports1.pairs = function(values, pairof = pair) {
|
|
let previous;
|
|
const pairs = [];
|
|
let first = !1;
|
|
for (const value of values)first && pairs.push(pairof(previous, value)), previous = value, first = !0;
|
|
return pairs;
|
|
}, exports1.partition = function() {
|
|
var dx = 1, dy = 1, padding = 0, round = !1;
|
|
function partition(root) {
|
|
var dy1, n = root.height + 1;
|
|
return root.x0 = root.y0 = padding, root.x1 = dx, root.y1 = dy / n, root.eachBefore((dy1 = dy, function(node) {
|
|
node.children && treemapDice(node, node.x0, dy1 * (node.depth + 1) / n, node.x1, dy1 * (node.depth + 2) / n);
|
|
var x0 = node.x0, y0 = node.y0, x1 = node.x1 - padding, y1 = node.y1 - padding;
|
|
x1 < x0 && (x0 = x1 = (x0 + x1) / 2), y1 < y0 && (y0 = y1 = (y0 + y1) / 2), node.x0 = x0, node.y0 = y0, node.x1 = x1, node.y1 = y1;
|
|
})), round && root.eachBefore(roundNode), root;
|
|
}
|
|
return partition.round = function(x) {
|
|
return arguments.length ? (round = !!x, partition) : round;
|
|
}, partition.size = function(x) {
|
|
return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, partition.padding = function(x) {
|
|
return arguments.length ? (padding = +x, partition) : padding;
|
|
}, partition;
|
|
}, exports1.path = path, exports1.permute = permute, exports1.pie = function() {
|
|
var value = identity$8, sortValues = descending$1, sort = null, startAngle = constant$a(0), endAngle = constant$a(tau$5), padAngle = constant$a(0);
|
|
function pie(data) {
|
|
var i, j, k, a1, v, n = (data = array$5(data)).length, sum = 0, index = Array(n), arcs = Array(n), a0 = +startAngle.apply(this, arguments), da = Math.min(tau$5, Math.max(-tau$5, endAngle.apply(this, arguments) - a0)), p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), pa = p * (da < 0 ? -1 : 1);
|
|
for(i = 0; i < n; ++i)(v = arcs[index[i] = i] = +value(data[i], i, data)) > 0 && (sum += v);
|
|
for(null != sortValues ? index.sort(function(i, j) {
|
|
return sortValues(arcs[i], arcs[j]);
|
|
}) : null != sort && index.sort(function(i, j) {
|
|
return sort(data[i], data[j]);
|
|
}), i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1)v = arcs[j = index[i]], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
|
|
data: data[j],
|
|
index: i,
|
|
value: v,
|
|
startAngle: a0,
|
|
endAngle: a1,
|
|
padAngle: p
|
|
};
|
|
return arcs;
|
|
}
|
|
return pie.value = function(_) {
|
|
return arguments.length ? (value = "function" == typeof _ ? _ : constant$a(+_), pie) : value;
|
|
}, pie.sortValues = function(_) {
|
|
return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
|
|
}, pie.sort = function(_) {
|
|
return arguments.length ? (sort = _, sortValues = null, pie) : sort;
|
|
}, pie.startAngle = function(_) {
|
|
return arguments.length ? (startAngle = "function" == typeof _ ? _ : constant$a(+_), pie) : startAngle;
|
|
}, pie.endAngle = function(_) {
|
|
return arguments.length ? (endAngle = "function" == typeof _ ? _ : constant$a(+_), pie) : endAngle;
|
|
}, pie.padAngle = function(_) {
|
|
return arguments.length ? (padAngle = "function" == typeof _ ? _ : constant$a(+_), pie) : padAngle;
|
|
}, pie;
|
|
}, exports1.piecewise = piecewise, exports1.pointRadial = pointRadial, exports1.pointer = pointer, exports1.pointers = function(events, node) {
|
|
return events.target && (events = sourceEvent(events), void 0 === node && (node = events.currentTarget), events = events.touches || [
|
|
events
|
|
]), Array.from(events, (event)=>pointer(event, node));
|
|
}, exports1.polygonArea = function(polygon) {
|
|
for(var a, i = -1, n = polygon.length, b = polygon[n - 1], area = 0; ++i < n;)a = b, b = polygon[i], area += a[1] * b[0] - a[0] * b[1];
|
|
return area / 2;
|
|
}, exports1.polygonCentroid = function(polygon) {
|
|
for(var a, c, i = -1, n = polygon.length, x = 0, y = 0, b = polygon[n - 1], k = 0; ++i < n;)a = b, b = polygon[i], k += c = a[0] * b[1] - b[0] * a[1], x += (a[0] + b[0]) * c, y += (a[1] + b[1]) * c;
|
|
return [
|
|
x / (k *= 3),
|
|
y / k
|
|
];
|
|
}, exports1.polygonContains = function(polygon, point) {
|
|
for(var x1, y1, n = polygon.length, p = polygon[n - 1], x = point[0], y = point[1], x0 = p[0], y0 = p[1], inside = !1, i = 0; i < n; ++i)x1 = (p = polygon[i])[0], (y1 = p[1]) > y != y0 > y && x < (x0 - x1) * (y - y1) / (y0 - y1) + x1 && (inside = !inside), x0 = x1, y0 = y1;
|
|
return inside;
|
|
}, exports1.polygonHull = function(points) {
|
|
if ((n = points.length) < 3) return null;
|
|
var i, n, sortedPoints = Array(n), flippedPoints = Array(n);
|
|
for(i = 0; i < n; ++i)sortedPoints[i] = [
|
|
+points[i][0],
|
|
+points[i][1],
|
|
i
|
|
];
|
|
for(sortedPoints.sort(lexicographicOrder), i = 0; i < n; ++i)flippedPoints[i] = [
|
|
sortedPoints[i][0],
|
|
-sortedPoints[i][1]
|
|
];
|
|
var upperIndexes = computeUpperHullIndexes(sortedPoints), lowerIndexes = computeUpperHullIndexes(flippedPoints), skipLeft = lowerIndexes[0] === upperIndexes[0], skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], hull = [];
|
|
for(i = upperIndexes.length - 1; i >= 0; --i)hull.push(points[sortedPoints[upperIndexes[i]][2]]);
|
|
for(i = +skipLeft; i < lowerIndexes.length - skipRight; ++i)hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
|
|
return hull;
|
|
}, exports1.polygonLength = function(polygon) {
|
|
for(var xa, ya, i = -1, n = polygon.length, b = polygon[n - 1], xb = b[0], yb = b[1], perimeter = 0; ++i < n;)xa = xb, ya = yb, xb = (b = polygon[i])[0], yb = b[1], xa -= xb, ya -= yb, perimeter += Math.hypot(xa, ya);
|
|
return perimeter;
|
|
}, exports1.precisionFixed = precisionFixed, exports1.precisionPrefix = precisionPrefix, exports1.precisionRound = precisionRound, exports1.quadtree = quadtree, exports1.quantile = quantile, exports1.quantileSorted = quantileSorted, exports1.quantize = function(interpolator, n) {
|
|
for(var samples = Array(n), i = 0; i < n; ++i)samples[i] = interpolator(i / (n - 1));
|
|
return samples;
|
|
}, exports1.quickselect = quickselect, exports1.radialArea = areaRadial, exports1.radialLine = lineRadial$1, exports1.randomBates = bates, exports1.randomBernoulli = bernoulli, exports1.randomBeta = beta, exports1.randomBinomial = binomial, exports1.randomCauchy = cauchy, exports1.randomExponential = exponential$1, exports1.randomGamma = gamma$1, exports1.randomGeometric = geometric, exports1.randomInt = int, exports1.randomIrwinHall = irwinHall, exports1.randomLcg = function(seed = Math.random()) {
|
|
let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0;
|
|
return ()=>eps * ((state = 0x19660D * state + 0x3C6EF35F | 0) >>> 0);
|
|
}, exports1.randomLogNormal = logNormal, exports1.randomLogistic = logistic, exports1.randomNormal = normal, exports1.randomPareto = pareto, exports1.randomPoisson = poisson, exports1.randomUniform = uniform, exports1.randomWeibull = weibull, exports1.range = sequence, exports1.reduce = function(values, reducer, value) {
|
|
if ("function" != typeof reducer) throw TypeError("reducer is not a function");
|
|
const iterator = values[Symbol.iterator]();
|
|
let done, next, index = -1;
|
|
if (arguments.length < 3) {
|
|
if ({ done, value } = iterator.next(), done) return;
|
|
++index;
|
|
}
|
|
for(; { done, value: next } = iterator.next(), !done;)value = reducer(value, next, ++index, values);
|
|
return value;
|
|
}, exports1.reverse = function(values) {
|
|
if ("function" != typeof values[Symbol.iterator]) throw TypeError("values is not iterable");
|
|
return Array.from(values).reverse();
|
|
}, exports1.rgb = rgb, exports1.ribbon = function() {
|
|
return ribbon();
|
|
}, exports1.ribbonArrow = function() {
|
|
return ribbon(defaultArrowheadRadius);
|
|
}, exports1.rollup = function(values, reduce, ...keys) {
|
|
return nest(values, identity, reduce, keys);
|
|
}, exports1.rollups = function(values, reduce, ...keys) {
|
|
return nest(values, Array.from, reduce, keys);
|
|
}, exports1.scaleBand = band, exports1.scaleDiverging = function diverging() {
|
|
var scale = linearish(transformer$3()(identity$6));
|
|
return scale.copy = function() {
|
|
return copy$1(scale, diverging());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleDivergingLog = function divergingLog() {
|
|
var scale = loggish(transformer$3()).domain([
|
|
0.1,
|
|
1,
|
|
10
|
|
]);
|
|
return scale.copy = function() {
|
|
return copy$1(scale, divergingLog()).base(scale.base());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleDivergingPow = divergingPow, exports1.scaleDivergingSqrt = function() {
|
|
return divergingPow.apply(null, arguments).exponent(0.5);
|
|
}, exports1.scaleDivergingSymlog = function divergingSymlog() {
|
|
var scale = symlogish(transformer$3());
|
|
return scale.copy = function() {
|
|
return copy$1(scale, divergingSymlog()).constant(scale.constant());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleIdentity = function identity$7(domain) {
|
|
var unknown;
|
|
function scale(x) {
|
|
return isNaN(x = +x) ? unknown : x;
|
|
}
|
|
return scale.invert = scale, scale.domain = scale.range = function(_) {
|
|
return arguments.length ? (domain = Array.from(_, number$2), scale) : domain.slice();
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, scale.copy = function() {
|
|
return identity$7(domain).unknown(unknown);
|
|
}, domain = arguments.length ? Array.from(domain, number$2) : [
|
|
0,
|
|
1
|
|
], linearish(scale);
|
|
}, exports1.scaleImplicit = implicit, exports1.scaleLinear = function linear$2() {
|
|
var scale = continuous();
|
|
return scale.copy = function() {
|
|
return copy(scale, linear$2());
|
|
}, initRange.apply(scale, arguments), linearish(scale);
|
|
}, exports1.scaleLog = function log$1() {
|
|
var scale = loggish(transformer$1()).domain([
|
|
1,
|
|
10
|
|
]);
|
|
return scale.copy = function() {
|
|
return copy(scale, log$1()).base(scale.base());
|
|
}, initRange.apply(scale, arguments), scale;
|
|
}, exports1.scaleOrdinal = ordinal, exports1.scalePoint = function() {
|
|
return function pointish(scale) {
|
|
var copy = scale.copy;
|
|
return scale.padding = scale.paddingOuter, delete scale.paddingInner, delete scale.paddingOuter, scale.copy = function() {
|
|
return pointish(copy());
|
|
}, scale;
|
|
}(band.apply(null, arguments).paddingInner(1));
|
|
}, exports1.scalePow = pow$2, exports1.scaleQuantile = function quantile$1() {
|
|
var unknown, domain = [], range = [], thresholds = [];
|
|
function rescale() {
|
|
var i = 0, n = Math.max(1, range.length);
|
|
for(thresholds = Array(n - 1); ++i < n;)thresholds[i - 1] = quantileSorted(domain, i / n);
|
|
return scale;
|
|
}
|
|
function scale(x) {
|
|
return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
|
|
}
|
|
return scale.invertExtent = function(y) {
|
|
var i = range.indexOf(y);
|
|
return i < 0 ? [
|
|
NaN,
|
|
NaN
|
|
] : [
|
|
i > 0 ? thresholds[i - 1] : domain[0],
|
|
i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
|
|
];
|
|
}, scale.domain = function(_) {
|
|
if (!arguments.length) return domain.slice();
|
|
for (let d of (domain = [], _))null == d || isNaN(d = +d) || domain.push(d);
|
|
return domain.sort(ascending), rescale();
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, scale.quantiles = function() {
|
|
return thresholds.slice();
|
|
}, scale.copy = function() {
|
|
return quantile$1().domain(domain).range(range).unknown(unknown);
|
|
}, initRange.apply(scale, arguments);
|
|
}, exports1.scaleQuantize = function quantize$1() {
|
|
var unknown, x0 = 0, x1 = 1, n = 1, domain = [
|
|
0.5
|
|
], range = [
|
|
0,
|
|
1
|
|
];
|
|
function scale(x) {
|
|
return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
|
|
}
|
|
function rescale() {
|
|
var i = -1;
|
|
for(domain = Array(n); ++i < n;)domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
|
|
return scale;
|
|
}
|
|
return scale.domain = function(_) {
|
|
return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [
|
|
x0,
|
|
x1
|
|
];
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();
|
|
}, scale.invertExtent = function(y) {
|
|
var i = range.indexOf(y);
|
|
return i < 0 ? [
|
|
NaN,
|
|
NaN
|
|
] : i < 1 ? [
|
|
x0,
|
|
domain[0]
|
|
] : i >= n ? [
|
|
domain[n - 1],
|
|
x1
|
|
] : [
|
|
domain[i - 1],
|
|
domain[i]
|
|
];
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length && (unknown = _), scale;
|
|
}, scale.thresholds = function() {
|
|
return domain.slice();
|
|
}, scale.copy = function() {
|
|
return quantize$1().domain([
|
|
x0,
|
|
x1
|
|
]).range(range).unknown(unknown);
|
|
}, initRange.apply(linearish(scale), arguments);
|
|
}, exports1.scaleRadial = function radial$1() {
|
|
var unknown, squared = continuous(), range = [
|
|
0,
|
|
1
|
|
], round = !1;
|
|
function scale(x) {
|
|
var x1, y = Math.sign(x1 = squared(x)) * Math.sqrt(Math.abs(x1));
|
|
return isNaN(y) ? unknown : round ? Math.round(y) : y;
|
|
}
|
|
return scale.invert = function(y) {
|
|
return squared.invert(square(y));
|
|
}, scale.domain = function(_) {
|
|
return arguments.length ? (squared.domain(_), scale) : squared.domain();
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (squared.range((range = Array.from(_, number$2)).map(square)), scale) : range.slice();
|
|
}, scale.rangeRound = function(_) {
|
|
return scale.range(_).round(!0);
|
|
}, scale.round = function(_) {
|
|
return arguments.length ? (round = !!_, scale) : round;
|
|
}, scale.clamp = function(_) {
|
|
return arguments.length ? (squared.clamp(_), scale) : squared.clamp();
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, scale.copy = function() {
|
|
return radial$1(squared.domain(), range).round(round).clamp(squared.clamp()).unknown(unknown);
|
|
}, initRange.apply(scale, arguments), linearish(scale);
|
|
}, exports1.scaleSequential = function sequential() {
|
|
var scale = linearish(transformer$2()(identity$6));
|
|
return scale.copy = function() {
|
|
return copy$1(scale, sequential());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleSequentialLog = function sequentialLog() {
|
|
var scale = loggish(transformer$2()).domain([
|
|
1,
|
|
10
|
|
]);
|
|
return scale.copy = function() {
|
|
return copy$1(scale, sequentialLog()).base(scale.base());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleSequentialPow = sequentialPow, exports1.scaleSequentialQuantile = function sequentialQuantile() {
|
|
var domain = [], interpolator = identity$6;
|
|
function scale(x) {
|
|
if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x, 1) - 1) / (domain.length - 1));
|
|
}
|
|
return scale.domain = function(_) {
|
|
if (!arguments.length) return domain.slice();
|
|
for (let d of (domain = [], _))null == d || isNaN(d = +d) || domain.push(d);
|
|
return domain.sort(ascending), scale;
|
|
}, scale.interpolator = function(_) {
|
|
return arguments.length ? (interpolator = _, scale) : interpolator;
|
|
}, scale.range = function() {
|
|
return domain.map((d, i)=>interpolator(i / (domain.length - 1)));
|
|
}, scale.quantiles = function(n) {
|
|
return Array.from({
|
|
length: n + 1
|
|
}, (_, i)=>quantile(domain, i / n));
|
|
}, scale.copy = function() {
|
|
return sequentialQuantile(interpolator).domain(domain);
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleSequentialSqrt = function() {
|
|
return sequentialPow.apply(null, arguments).exponent(0.5);
|
|
}, exports1.scaleSequentialSymlog = function sequentialSymlog() {
|
|
var scale = symlogish(transformer$2());
|
|
return scale.copy = function() {
|
|
return copy$1(scale, sequentialSymlog()).constant(scale.constant());
|
|
}, initInterpolator.apply(scale, arguments);
|
|
}, exports1.scaleSqrt = function() {
|
|
return pow$2.apply(null, arguments).exponent(0.5);
|
|
}, exports1.scaleSymlog = function symlog() {
|
|
var scale = symlogish(transformer$1());
|
|
return scale.copy = function() {
|
|
return copy(scale, symlog()).constant(scale.constant());
|
|
}, initRange.apply(scale, arguments);
|
|
}, exports1.scaleThreshold = function threshold() {
|
|
var unknown, domain = [
|
|
0.5
|
|
], range = [
|
|
0,
|
|
1
|
|
], n = 1;
|
|
function scale(x) {
|
|
return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
|
|
}
|
|
return scale.domain = function(_) {
|
|
return arguments.length ? (n = Math.min((domain = Array.from(_)).length, range.length - 1), scale) : domain.slice();
|
|
}, scale.range = function(_) {
|
|
return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
|
|
}, scale.invertExtent = function(y) {
|
|
var i = range.indexOf(y);
|
|
return [
|
|
domain[i - 1],
|
|
domain[i]
|
|
];
|
|
}, scale.unknown = function(_) {
|
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|
}, scale.copy = function() {
|
|
return threshold().domain(domain).range(range).unknown(unknown);
|
|
}, initRange.apply(scale, arguments);
|
|
}, exports1.scaleTime = function() {
|
|
return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports1.timeFormat).domain([
|
|
new Date(2000, 0, 1),
|
|
new Date(2000, 0, 2)
|
|
]), arguments);
|
|
}, exports1.scaleUtc = function() {
|
|
return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports1.utcFormat).domain([
|
|
Date.UTC(2000, 0, 1),
|
|
Date.UTC(2000, 0, 2)
|
|
]), arguments);
|
|
}, exports1.scan = function(values, compare) {
|
|
const index = leastIndex(values, compare);
|
|
return index < 0 ? void 0 : index;
|
|
}, exports1.schemeAccent = Accent, exports1.schemeBlues = scheme$l, exports1.schemeBrBG = scheme, exports1.schemeBuGn = scheme$9, exports1.schemeBuPu = scheme$a, exports1.schemeCategory10 = category10, exports1.schemeDark2 = Dark2, exports1.schemeGnBu = scheme$b, exports1.schemeGreens = scheme$m, exports1.schemeGreys = scheme$n, exports1.schemeOrRd = scheme$c, exports1.schemeOranges = scheme$q, exports1.schemePRGn = scheme$1, exports1.schemePaired = Paired, exports1.schemePastel1 = Pastel1, exports1.schemePastel2 = Pastel2, exports1.schemePiYG = scheme$2, exports1.schemePuBu = scheme$e, exports1.schemePuBuGn = scheme$d, exports1.schemePuOr = scheme$3, exports1.schemePuRd = scheme$f, exports1.schemePurples = scheme$o, exports1.schemeRdBu = scheme$4, exports1.schemeRdGy = scheme$5, exports1.schemeRdPu = scheme$g, exports1.schemeRdYlBu = scheme$6, exports1.schemeRdYlGn = scheme$7, exports1.schemeReds = scheme$p, exports1.schemeSet1 = Set1, exports1.schemeSet2 = Set2, exports1.schemeSet3 = Set3, exports1.schemeSpectral = scheme$8, exports1.schemeTableau10 = Tableau10, exports1.schemeYlGn = scheme$i, exports1.schemeYlGnBu = scheme$h, exports1.schemeYlOrBr = scheme$j, exports1.schemeYlOrRd = scheme$k, exports1.select = select, exports1.selectAll = function(selector) {
|
|
return "string" == typeof selector ? new Selection([
|
|
document.querySelectorAll(selector)
|
|
], [
|
|
document.documentElement
|
|
]) : new Selection([
|
|
null == selector ? [] : array$1(selector)
|
|
], root);
|
|
}, exports1.selection = selection, exports1.selector = selector, exports1.selectorAll = selectorAll, exports1.shuffle = shuffle, exports1.shuffler = shuffler, exports1.some = function(values, test) {
|
|
if ("function" != typeof test) throw TypeError("test is not a function");
|
|
let index = -1;
|
|
for (const value of values)if (test(value, ++index, values)) return !0;
|
|
return !1;
|
|
}, exports1.sort = function(values, f = ascending) {
|
|
if ("function" != typeof values[Symbol.iterator]) throw TypeError("values is not iterable");
|
|
return (values = Array.from(values), 1 === f.length) ? (f = values.map(f), permute(values, values.map((d, i)=>i).sort((i, j)=>ascending(f[i], f[j])))) : values.sort(f);
|
|
}, exports1.stack = function() {
|
|
var keys = constant$a([]), order = none$2, offset = none$1, value = stackValue;
|
|
function stack(data) {
|
|
var i, oz, sz = Array.from(keys.apply(this, arguments), stackSeries), n = sz.length, j = -1;
|
|
for (const d of data)for(i = 0, ++j; i < n; ++i)(sz[i][j] = [
|
|
0,
|
|
+value(d, sz[i].key, j, data)
|
|
]).data = d;
|
|
for(i = 0, oz = array$5(order(sz)); i < n; ++i)sz[oz[i]].index = i;
|
|
return offset(sz, oz), sz;
|
|
}
|
|
return stack.keys = function(_) {
|
|
return arguments.length ? (keys = "function" == typeof _ ? _ : constant$a(Array.from(_)), stack) : keys;
|
|
}, stack.value = function(_) {
|
|
return arguments.length ? (value = "function" == typeof _ ? _ : constant$a(+_), stack) : value;
|
|
}, stack.order = function(_) {
|
|
return arguments.length ? (order = null == _ ? none$2 : "function" == typeof _ ? _ : constant$a(Array.from(_)), stack) : order;
|
|
}, stack.offset = function(_) {
|
|
return arguments.length ? (offset = null == _ ? none$1 : _, stack) : offset;
|
|
}, stack;
|
|
}, exports1.stackOffsetDiverging = function(series, order) {
|
|
if ((n = series.length) > 0) for(var i, d, dy, yp, yn, n, j = 0, m = series[order[0]].length; j < m; ++j)for(yp = yn = 0, i = 0; i < n; ++i)(dy = (d = series[order[i]][j])[1] - d[0]) > 0 ? (d[0] = yp, d[1] = yp += dy) : dy < 0 ? (d[1] = yn, d[0] = yn += dy) : (d[0] = 0, d[1] = dy);
|
|
}, exports1.stackOffsetExpand = function(series, order) {
|
|
if ((n = series.length) > 0) {
|
|
for(var i, n, y, j = 0, m = series[0].length; j < m; ++j){
|
|
for(y = i = 0; i < n; ++i)y += series[i][j][1] || 0;
|
|
if (y) for(i = 0; i < n; ++i)series[i][j][1] /= y;
|
|
}
|
|
none$1(series, order);
|
|
}
|
|
}, exports1.stackOffsetNone = none$1, exports1.stackOffsetSilhouette = function(series, order) {
|
|
if ((n = series.length) > 0) {
|
|
for(var n, j = 0, s0 = series[order[0]], m = s0.length; j < m; ++j){
|
|
for(var i = 0, y = 0; i < n; ++i)y += series[i][j][1] || 0;
|
|
s0[j][1] += s0[j][0] = -y / 2;
|
|
}
|
|
none$1(series, order);
|
|
}
|
|
}, exports1.stackOffsetWiggle = function(series, order) {
|
|
if ((n = series.length) > 0 && (m = (s0 = series[order[0]]).length) > 0) {
|
|
for(var s0, m, n, y = 0, j = 1; j < m; ++j){
|
|
for(var i = 0, s1 = 0, s2 = 0; i < n; ++i){
|
|
for(var si = series[order[i]], sij0 = si[j][1] || 0, s3 = (sij0 - (si[j - 1][1] || 0)) / 2, k = 0; k < i; ++k){
|
|
var sk = series[order[k]];
|
|
s3 += (sk[j][1] || 0) - (sk[j - 1][1] || 0);
|
|
}
|
|
s1 += sij0, s2 += s3 * sij0;
|
|
}
|
|
s0[j - 1][1] += s0[j - 1][0] = y, s1 && (y -= s2 / s1);
|
|
}
|
|
s0[j - 1][1] += s0[j - 1][0] = y, none$1(series, order);
|
|
}
|
|
}, exports1.stackOrderAppearance = appearance, exports1.stackOrderAscending = ascending$3, exports1.stackOrderDescending = function(series) {
|
|
return ascending$3(series).reverse();
|
|
}, exports1.stackOrderInsideOut = function(series) {
|
|
var i, j, n = series.length, sums = series.map(sum$1), order = appearance(series), top = 0, bottom = 0, tops = [], bottoms = [];
|
|
for(i = 0; i < n; ++i)j = order[i], top < bottom ? (top += sums[j], tops.push(j)) : (bottom += sums[j], bottoms.push(j));
|
|
return bottoms.reverse().concat(tops);
|
|
}, exports1.stackOrderNone = none$2, exports1.stackOrderReverse = function(series) {
|
|
return none$2(series).reverse();
|
|
}, exports1.stratify = function() {
|
|
var id = defaultId, parentId = defaultParentId;
|
|
function stratify(data) {
|
|
var d, i, root, parent, node, nodeId, nodeKey, nodes = Array.from(data), n = nodes.length, nodeByKey = new Map;
|
|
for(i = 0; i < n; ++i)d = nodes[i], node = nodes[i] = new Node(d), null != (nodeId = id(d, i, data)) && (nodeId += "") && (nodeKey = node.id = nodeId, nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node)), null != (nodeId = parentId(d, i, data)) && (nodeId += "") && (node.parent = nodeId);
|
|
for(i = 0; i < n; ++i)if (nodeId = (node = nodes[i]).parent) {
|
|
if (!(parent = nodeByKey.get(nodeId))) throw Error("missing: " + nodeId);
|
|
if (parent === ambiguous) throw Error("ambiguous: " + nodeId);
|
|
parent.children ? parent.children.push(node) : parent.children = [
|
|
node
|
|
], node.parent = parent;
|
|
} else {
|
|
if (root) throw Error("multiple roots");
|
|
root = node;
|
|
}
|
|
if (!root) throw Error("no root");
|
|
if (root.parent = preroot, root.eachBefore(function(node) {
|
|
node.depth = node.parent.depth + 1, --n;
|
|
}).eachBefore(computeHeight), root.parent = null, n > 0) throw Error("cycle");
|
|
return root;
|
|
}
|
|
return stratify.id = function(x) {
|
|
return arguments.length ? (id = required(x), stratify) : id;
|
|
}, stratify.parentId = function(x) {
|
|
return arguments.length ? (parentId = required(x), stratify) : parentId;
|
|
}, stratify;
|
|
}, exports1.style = styleValue, exports1.subset = function(values, other) {
|
|
return superset(other, values);
|
|
}, exports1.sum = function(values, valueof) {
|
|
let sum = 0;
|
|
if (void 0 === valueof) for (let value of values)(value = +value) && (sum += value);
|
|
else {
|
|
let index = -1;
|
|
for (let value of values)(value = +valueof(value, ++index, values)) && (sum += value);
|
|
}
|
|
return sum;
|
|
}, exports1.superset = superset, exports1.svg = svg, exports1.symbol = function(type, size) {
|
|
var context = null;
|
|
function symbol() {
|
|
var buffer;
|
|
if (context || (context = buffer = path()), type.apply(this, arguments).draw(context, +size.apply(this, arguments)), buffer) return context = null, buffer + "" || null;
|
|
}
|
|
return type = "function" == typeof type ? type : constant$a(type || circle$2), size = "function" == typeof size ? size : constant$a(void 0 === size ? 64 : +size), symbol.type = function(_) {
|
|
return arguments.length ? (type = "function" == typeof _ ? _ : constant$a(_), symbol) : type;
|
|
}, symbol.size = function(_) {
|
|
return arguments.length ? (size = "function" == typeof _ ? _ : constant$a(+_), symbol) : size;
|
|
}, symbol.context = function(_) {
|
|
return arguments.length ? (context = null == _ ? null : _, symbol) : context;
|
|
}, symbol;
|
|
}, exports1.symbolCircle = circle$2, exports1.symbolCross = cross$2, exports1.symbolDiamond = diamond, exports1.symbolSquare = square$1, exports1.symbolStar = star, exports1.symbolTriangle = triangle, exports1.symbolWye = wye, exports1.symbols = symbols, exports1.text = text, exports1.thresholdFreedmanDiaconis = function(values, min, max) {
|
|
return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3)));
|
|
}, exports1.thresholdScott = function(values, min, max) {
|
|
return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3)));
|
|
}, exports1.thresholdSturges = thresholdSturges, exports1.tickFormat = tickFormat, exports1.tickIncrement = tickIncrement, exports1.tickStep = tickStep, exports1.ticks = ticks, exports1.timeDay = day, exports1.timeDays = days, exports1.timeFormatDefaultLocale = defaultLocale$1, exports1.timeFormatLocale = formatLocale$1, exports1.timeFriday = friday, exports1.timeFridays = fridays, exports1.timeHour = hour, exports1.timeHours = hours, exports1.timeInterval = newInterval, exports1.timeMillisecond = millisecond, exports1.timeMilliseconds = milliseconds, exports1.timeMinute = minute, exports1.timeMinutes = minutes, exports1.timeMonday = monday, exports1.timeMondays = mondays, exports1.timeMonth = month, exports1.timeMonths = months, exports1.timeSaturday = saturday, exports1.timeSaturdays = saturdays, exports1.timeSecond = second, exports1.timeSeconds = seconds, exports1.timeSunday = sunday, exports1.timeSundays = sundays, exports1.timeThursday = thursday, exports1.timeThursdays = thursdays, exports1.timeTuesday = tuesday, exports1.timeTuesdays = tuesdays, exports1.timeWednesday = wednesday, exports1.timeWednesdays = wednesdays, exports1.timeWeek = sunday, exports1.timeWeeks = sundays, exports1.timeYear = year, exports1.timeYears = years, exports1.timeout = timeout$1, exports1.timer = timer, exports1.timerFlush = timerFlush, exports1.transition = transition, exports1.transpose = transpose, exports1.tree = function() {
|
|
var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = null;
|
|
function tree(root) {
|
|
var t = function(root) {
|
|
for(var node, child, children, i, n, tree = new TreeNode(root, 0), nodes = [
|
|
tree
|
|
]; node = nodes.pop();)if (children = node._.children) for(node.children = Array(n = children.length), i = n - 1; i >= 0; --i)nodes.push(child = node.children[i] = new TreeNode(children[i], i)), child.parent = node;
|
|
return (tree.parent = new TreeNode(null, 0)).children = [
|
|
tree
|
|
], tree;
|
|
}(root);
|
|
if (t.eachAfter(firstWalk), t.parent.m = -t.z, t.eachBefore(secondWalk), nodeSize) root.eachBefore(sizeNode);
|
|
else {
|
|
var left = root, right = root, bottom = root;
|
|
root.eachBefore(function(node) {
|
|
node.x < left.x && (left = node), node.x > right.x && (right = node), node.depth > bottom.depth && (bottom = node);
|
|
});
|
|
var s = left === right ? 1 : separation(left, right) / 2, tx = s - left.x, kx = dx / (right.x + s + tx), ky = dy / (bottom.depth || 1);
|
|
root.eachBefore(function(node) {
|
|
node.x = (node.x + tx) * kx, node.y = node.depth * ky;
|
|
});
|
|
}
|
|
return root;
|
|
}
|
|
function firstWalk(v) {
|
|
var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
|
|
if (children) {
|
|
!function(v) {
|
|
for(var w, shift = 0, change = 0, children = v.children, i = children.length; --i >= 0;)w = children[i], w.z += shift, w.m += shift, shift += w.s + (change += w.c);
|
|
}(v);
|
|
var midpoint = (children[0].z + children[children.length - 1].z) / 2;
|
|
w ? (v.z = w.z + separation(v._, w._), v.m = v.z - midpoint) : v.z = midpoint;
|
|
} else w && (v.z = w.z + separation(v._, w._));
|
|
v.parent.A = function(v, w, ancestor) {
|
|
if (w) {
|
|
for(var vim, ancestor1, shift, vip = v, vop = v, vim1 = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim1.m, som = vom.m; vim1 = nextRight(vim1), vip = nextLeft(vip), vim1 && vip;)vom = nextLeft(vom), (vop = nextRight(vop)).a = v, (shift = vim1.z + sim - vip.z - sip + separation(vim1._, vip._)) > 0 && (function(wm, wp, shift) {
|
|
var change = shift / (wp.i - wm.i);
|
|
wp.c -= change, wp.s += shift, wm.c += change, wp.z += shift, wp.m += shift;
|
|
}((vim = vim1, ancestor1 = ancestor, vim.a.parent === v.parent ? vim.a : ancestor1), v, shift), sip += shift, sop += shift), sim += vim1.m, sip += vip.m, som += vom.m, sop += vop.m;
|
|
vim1 && !nextRight(vop) && (vop.t = vim1, vop.m += sim - sop), vip && !nextLeft(vom) && (vom.t = vip, vom.m += sip - som, ancestor = v);
|
|
}
|
|
return ancestor;
|
|
}(v, w, v.parent.A || siblings[0]);
|
|
}
|
|
function secondWalk(v) {
|
|
v._.x = v.z + v.parent.m, v.m += v.parent.m;
|
|
}
|
|
function sizeNode(node) {
|
|
node.x *= dx, node.y = node.depth * dy;
|
|
}
|
|
return tree.separation = function(x) {
|
|
return arguments.length ? (separation = x, tree) : separation;
|
|
}, tree.size = function(x) {
|
|
return arguments.length ? (nodeSize = !1, dx = +x[0], dy = +x[1], tree) : nodeSize ? null : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, tree.nodeSize = function(x) {
|
|
return arguments.length ? (nodeSize = !0, dx = +x[0], dy = +x[1], tree) : nodeSize ? [
|
|
dx,
|
|
dy
|
|
] : null;
|
|
}, tree;
|
|
}, exports1.treemap = function() {
|
|
var tile = squarify, round = !1, dx = 1, dy = 1, paddingStack = [
|
|
0
|
|
], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;
|
|
function treemap(root) {
|
|
return root.x0 = root.y0 = 0, root.x1 = dx, root.y1 = dy, root.eachBefore(positionNode), paddingStack = [
|
|
0
|
|
], round && root.eachBefore(roundNode), root;
|
|
}
|
|
function positionNode(node) {
|
|
var p = paddingStack[node.depth], x0 = node.x0 + p, y0 = node.y0 + p, x1 = node.x1 - p, y1 = node.y1 - p;
|
|
x1 < x0 && (x0 = x1 = (x0 + x1) / 2), y1 < y0 && (y0 = y1 = (y0 + y1) / 2), node.x0 = x0, node.y0 = y0, node.x1 = x1, node.y1 = y1, node.children && (p = paddingStack[node.depth + 1] = paddingInner(node) / 2, x0 += paddingLeft(node) - p, y0 += paddingTop(node) - p, x1 -= paddingRight(node) - p, y1 -= paddingBottom(node) - p, x1 < x0 && (x0 = x1 = (x0 + x1) / 2), y1 < y0 && (y0 = y1 = (y0 + y1) / 2), tile(node, x0, y0, x1, y1));
|
|
}
|
|
return treemap.round = function(x) {
|
|
return arguments.length ? (round = !!x, treemap) : round;
|
|
}, treemap.size = function(x) {
|
|
return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [
|
|
dx,
|
|
dy
|
|
];
|
|
}, treemap.tile = function(x) {
|
|
return arguments.length ? (tile = required(x), treemap) : tile;
|
|
}, treemap.padding = function(x) {
|
|
return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
|
|
}, treemap.paddingInner = function(x) {
|
|
return arguments.length ? (paddingInner = "function" == typeof x ? x : constant$9(+x), treemap) : paddingInner;
|
|
}, treemap.paddingOuter = function(x) {
|
|
return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
|
|
}, treemap.paddingTop = function(x) {
|
|
return arguments.length ? (paddingTop = "function" == typeof x ? x : constant$9(+x), treemap) : paddingTop;
|
|
}, treemap.paddingRight = function(x) {
|
|
return arguments.length ? (paddingRight = "function" == typeof x ? x : constant$9(+x), treemap) : paddingRight;
|
|
}, treemap.paddingBottom = function(x) {
|
|
return arguments.length ? (paddingBottom = "function" == typeof x ? x : constant$9(+x), treemap) : paddingBottom;
|
|
}, treemap.paddingLeft = function(x) {
|
|
return arguments.length ? (paddingLeft = "function" == typeof x ? x : constant$9(+x), treemap) : paddingLeft;
|
|
}, treemap;
|
|
}, exports1.treemapBinary = function(parent, x0, y0, x1, y1) {
|
|
var i, sum, nodes = parent.children, n = nodes.length, sums = Array(n + 1);
|
|
for(sums[0] = sum = i = 0; i < n; ++i)sums[i + 1] = sum += nodes[i].value;
|
|
(function partition(i, j, value, x0, y0, x1, y1) {
|
|
if (i >= j - 1) {
|
|
var node = nodes[i];
|
|
node.x0 = x0, node.y0 = y0, node.x1 = x1, node.y1 = y1;
|
|
return;
|
|
}
|
|
for(var valueOffset = sums[i], valueTarget = value / 2 + valueOffset, k = i + 1, hi = j - 1; k < hi;){
|
|
var mid = k + hi >>> 1;
|
|
sums[mid] < valueTarget ? k = mid + 1 : hi = mid;
|
|
}
|
|
valueTarget - sums[k - 1] < sums[k] - valueTarget && i + 1 < k && --k;
|
|
var valueLeft = sums[k] - valueOffset, valueRight = value - valueLeft;
|
|
if (x1 - x0 > y1 - y0) {
|
|
var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1;
|
|
partition(i, k, valueLeft, x0, y0, xk, y1), partition(k, j, valueRight, xk, y0, x1, y1);
|
|
} else {
|
|
var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1;
|
|
partition(i, k, valueLeft, x0, y0, x1, yk), partition(k, j, valueRight, x0, yk, x1, y1);
|
|
}
|
|
})(0, n, parent.value, x0, y0, x1, y1);
|
|
}, exports1.treemapDice = treemapDice, exports1.treemapResquarify = resquarify, exports1.treemapSlice = treemapSlice, exports1.treemapSliceDice = function(parent, x0, y0, x1, y1) {
|
|
(1 & parent.depth ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
|
|
}, exports1.treemapSquarify = squarify, exports1.tsv = tsv$1, exports1.tsvFormat = tsvFormat, exports1.tsvFormatBody = tsvFormatBody, exports1.tsvFormatRow = tsvFormatRow, exports1.tsvFormatRows = tsvFormatRows, exports1.tsvFormatValue = tsvFormatValue, exports1.tsvParse = tsvParse, exports1.tsvParseRows = tsvParseRows, exports1.union = function(...others) {
|
|
const set = new Set();
|
|
for (const other of others)for (const o of other)set.add(o);
|
|
return set;
|
|
}, exports1.utcDay = utcDay, exports1.utcDays = utcDays, exports1.utcFriday = utcFriday, exports1.utcFridays = utcFridays, exports1.utcHour = utcHour, exports1.utcHours = utcHours, exports1.utcMillisecond = millisecond, exports1.utcMilliseconds = milliseconds, exports1.utcMinute = utcMinute, exports1.utcMinutes = utcMinutes, exports1.utcMonday = utcMonday, exports1.utcMondays = utcMondays, exports1.utcMonth = utcMonth, exports1.utcMonths = utcMonths, exports1.utcSaturday = utcSaturday, exports1.utcSaturdays = utcSaturdays, exports1.utcSecond = second, exports1.utcSeconds = seconds, exports1.utcSunday = utcSunday, exports1.utcSundays = utcSundays, exports1.utcThursday = utcThursday, exports1.utcThursdays = utcThursdays, exports1.utcTuesday = utcTuesday, exports1.utcTuesdays = utcTuesdays, exports1.utcWednesday = utcWednesday, exports1.utcWednesdays = utcWednesdays, exports1.utcWeek = utcSunday, exports1.utcWeeks = utcSundays, exports1.utcYear = utcYear, exports1.utcYears = utcYears, exports1.variance = variance, exports1.version = "6.3.1", exports1.window = defaultView, exports1.xml = xml, exports1.zip = function() {
|
|
return transpose(arguments);
|
|
}, exports1.zoom = function() {
|
|
var touchstarting, touchfirst, touchending, filter = defaultFilter$2, extent = defaultExtent$1, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable$2, scaleExtent = [
|
|
0,
|
|
1 / 0
|
|
], translateExtent = [
|
|
[
|
|
-1 / 0,
|
|
-1 / 0
|
|
],
|
|
[
|
|
1 / 0,
|
|
1 / 0
|
|
]
|
|
], duration = 250, interpolate = interpolateZoom, listeners = dispatch("start", "zoom", "end"), clickDistance2 = 0, tapDistance = 10;
|
|
function zoom(selection) {
|
|
selection.property("__zoom", defaultTransform).on("wheel.zoom", wheeled).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
|
|
}
|
|
function scale(transform, k) {
|
|
return (k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k))) === transform.k ? transform : new Transform(k, transform.x, transform.y);
|
|
}
|
|
function translate(transform, p0, p1) {
|
|
var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
|
|
return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
|
|
}
|
|
function centroid(extent) {
|
|
return [
|
|
(+extent[0][0] + +extent[1][0]) / 2,
|
|
(+extent[0][1] + +extent[1][1]) / 2
|
|
];
|
|
}
|
|
function schedule(transition, transform, point, event) {
|
|
transition.on("start.zoom", function() {
|
|
gesture(this, arguments).event(event).start();
|
|
}).on("interrupt.zoom end.zoom", function() {
|
|
gesture(this, arguments).event(event).end();
|
|
}).tween("zoom", function() {
|
|
var args = arguments, g = gesture(this, args).event(event), e = extent.apply(this, args), p = null == point ? centroid(e) : "function" == typeof point ? point.apply(this, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = this.__zoom, b = "function" == typeof transform ? transform.apply(this, args) : transform, i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
|
|
return function(t) {
|
|
if (1 === t) t = b;
|
|
else {
|
|
var l = i(t), k = w / l[2];
|
|
t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
|
|
}
|
|
g.zoom(null, t);
|
|
};
|
|
});
|
|
}
|
|
function gesture(that, args, clean) {
|
|
return !clean && that.__zooming || new Gesture(that, args);
|
|
}
|
|
function Gesture(that, args) {
|
|
this.that = that, this.args = args, this.active = 0, this.sourceEvent = null, this.extent = extent.apply(that, args), this.taps = 0;
|
|
}
|
|
function wheeled(event, ...args) {
|
|
if (filter.apply(this, arguments)) {
|
|
var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer(event);
|
|
if (g.wheel) (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) && (g.mouse[1] = t.invert(g.mouse[0] = p)), clearTimeout(g.wheel);
|
|
else {
|
|
if (t.k === k) return;
|
|
g.mouse = [
|
|
p,
|
|
t.invert(p)
|
|
], interrupt(this), g.start();
|
|
}
|
|
noevent$2(event), g.wheel = setTimeout(function() {
|
|
g.wheel = null, g.end();
|
|
}, 150), g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
|
|
}
|
|
}
|
|
function mousedowned(event, ...args) {
|
|
if (!touchending && filter.apply(this, arguments)) {
|
|
var g = gesture(this, args, !0).event(event), v = select(event.view).on("mousemove.zoom", function(event) {
|
|
if (noevent$2(event), !g.moved) {
|
|
var dx = event.clientX - x0, dy = event.clientY - y0;
|
|
g.moved = dx * dx + dy * dy > clickDistance2;
|
|
}
|
|
g.event(event).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));
|
|
}, !0).on("mouseup.zoom", function(event) {
|
|
v.on("mousemove.zoom mouseup.zoom", null), yesdrag(event.view, g.moved), noevent$2(event), g.event(event).end();
|
|
}, !0), p = pointer(event, currentTarget), currentTarget = event.currentTarget, x0 = event.clientX, y0 = event.clientY;
|
|
dragDisable(event.view), nopropagation$2(event), g.mouse = [
|
|
p,
|
|
this.__zoom.invert(p)
|
|
], interrupt(this), g.start();
|
|
}
|
|
}
|
|
function dblclicked(event, ...args) {
|
|
if (filter.apply(this, arguments)) {
|
|
var t0 = this.__zoom, p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
|
|
noevent$2(event), duration > 0 ? select(this).transition().duration(duration).call(schedule, t1, p0, event) : select(this).call(zoom.transform, t1, p0, event);
|
|
}
|
|
}
|
|
function touchstarted(event, ...args) {
|
|
if (filter.apply(this, arguments)) {
|
|
var started, i, t, p, touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event);
|
|
for(nopropagation$2(event), i = 0; i < n; ++i)p = [
|
|
p = pointer(t = touches[i], this),
|
|
this.__zoom.invert(p),
|
|
t.identifier
|
|
], g.touch0 ? g.touch1 || g.touch0[2] === p[2] || (g.touch1 = p, g.taps = 0) : (g.touch0 = p, started = !0, g.taps = 1 + !!touchstarting);
|
|
touchstarting && (touchstarting = clearTimeout(touchstarting)), started && (g.taps < 2 && (touchfirst = p[0], touchstarting = setTimeout(function() {
|
|
touchstarting = null;
|
|
}, 500)), interrupt(this), g.start());
|
|
}
|
|
}
|
|
function touchmoved(event, ...args) {
|
|
if (this.__zooming) {
|
|
var i, t, p, l, g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length;
|
|
for(noevent$2(event), i = 0; i < n; ++i)p = pointer(t = touches[i], this), g.touch0 && g.touch0[2] === t.identifier ? g.touch0[0] = p : g.touch1 && g.touch1[2] === t.identifier && (g.touch1[0] = p);
|
|
if (t = g.that.__zoom, g.touch1) {
|
|
var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
|
|
t = scale(t, Math.sqrt(dp / dl)), p = [
|
|
(p0[0] + p1[0]) / 2,
|
|
(p0[1] + p1[1]) / 2
|
|
], l = [
|
|
(l0[0] + l1[0]) / 2,
|
|
(l0[1] + l1[1]) / 2
|
|
];
|
|
} else {
|
|
if (!g.touch0) return;
|
|
p = g.touch0[0], l = g.touch0[1];
|
|
}
|
|
g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
|
|
}
|
|
}
|
|
function touchended(event, ...args) {
|
|
if (this.__zooming) {
|
|
var i, t, g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length;
|
|
for(nopropagation$2(event), touchending && clearTimeout(touchending), touchending = setTimeout(function() {
|
|
touchending = null;
|
|
}, 500), i = 0; i < n; ++i)t = touches[i], g.touch0 && g.touch0[2] === t.identifier ? delete g.touch0 : g.touch1 && g.touch1[2] === t.identifier && delete g.touch1;
|
|
if (g.touch1 && !g.touch0 && (g.touch0 = g.touch1, delete g.touch1), g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
|
|
else if (g.end(), 2 === g.taps && (t = pointer(t, this), Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance)) {
|
|
var p = select(this).on("dblclick.zoom");
|
|
p && p.apply(this, arguments);
|
|
}
|
|
}
|
|
}
|
|
return zoom.transform = function(collection, transform, point, event) {
|
|
var selection = collection.selection ? collection.selection() : collection;
|
|
selection.property("__zoom", defaultTransform), collection !== selection ? schedule(collection, transform, point, event) : selection.interrupt().each(function() {
|
|
gesture(this, arguments).event(event).start().zoom(null, "function" == typeof transform ? transform.apply(this, arguments) : transform).end();
|
|
});
|
|
}, zoom.scaleBy = function(selection, k, p, event) {
|
|
zoom.scaleTo(selection, function() {
|
|
var k0 = this.__zoom.k, k1 = "function" == typeof k ? k.apply(this, arguments) : k;
|
|
return k0 * k1;
|
|
}, p, event);
|
|
}, zoom.scaleTo = function(selection, k, p, event) {
|
|
zoom.transform(selection, function() {
|
|
var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = null == p ? centroid(e) : "function" == typeof p ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = "function" == typeof k ? k.apply(this, arguments) : k;
|
|
return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
|
|
}, p, event);
|
|
}, zoom.translateBy = function(selection, x, y, event) {
|
|
zoom.transform(selection, function() {
|
|
return constrain(this.__zoom.translate("function" == typeof x ? x.apply(this, arguments) : x, "function" == typeof y ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent);
|
|
}, null, event);
|
|
}, zoom.translateTo = function(selection, x, y, p, event) {
|
|
zoom.transform(selection, function() {
|
|
var e = extent.apply(this, arguments), t = this.__zoom, p0 = null == p ? centroid(e) : "function" == typeof p ? p.apply(this, arguments) : p;
|
|
return constrain(identity$9.translate(p0[0], p0[1]).scale(t.k).translate("function" == typeof x ? -x.apply(this, arguments) : -x, "function" == typeof y ? -y.apply(this, arguments) : -y), e, translateExtent);
|
|
}, p, event);
|
|
}, Gesture.prototype = {
|
|
event: function(event) {
|
|
return event && (this.sourceEvent = event), this;
|
|
},
|
|
start: function() {
|
|
return 1 == ++this.active && (this.that.__zooming = this, this.emit("start")), this;
|
|
},
|
|
zoom: function(key, transform) {
|
|
return this.mouse && "mouse" !== key && (this.mouse[1] = transform.invert(this.mouse[0])), this.touch0 && "touch" !== key && (this.touch0[1] = transform.invert(this.touch0[0])), this.touch1 && "touch" !== key && (this.touch1[1] = transform.invert(this.touch1[0])), this.that.__zoom = transform, this.emit("zoom"), this;
|
|
},
|
|
end: function() {
|
|
return 0 == --this.active && (delete this.that.__zooming, this.emit("end")), this;
|
|
},
|
|
emit: function(type) {
|
|
var d = select(this.that).datum();
|
|
listeners.call(type, this.that, new ZoomEvent(type, {
|
|
sourceEvent: this.sourceEvent,
|
|
target: zoom,
|
|
type,
|
|
transform: this.that.__zoom,
|
|
dispatch: listeners
|
|
}), d);
|
|
}
|
|
}, zoom.wheelDelta = function(_) {
|
|
return arguments.length ? (wheelDelta = "function" == typeof _ ? _ : constant$b(+_), zoom) : wheelDelta;
|
|
}, zoom.filter = function(_) {
|
|
return arguments.length ? (filter = "function" == typeof _ ? _ : constant$b(!!_), zoom) : filter;
|
|
}, zoom.touchable = function(_) {
|
|
return arguments.length ? (touchable = "function" == typeof _ ? _ : constant$b(!!_), zoom) : touchable;
|
|
}, zoom.extent = function(_) {
|
|
return arguments.length ? (extent = "function" == typeof _ ? _ : constant$b([
|
|
[
|
|
+_[0][0],
|
|
+_[0][1]
|
|
],
|
|
[
|
|
+_[1][0],
|
|
+_[1][1]
|
|
]
|
|
]), zoom) : extent;
|
|
}, zoom.scaleExtent = function(_) {
|
|
return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [
|
|
scaleExtent[0],
|
|
scaleExtent[1]
|
|
];
|
|
}, zoom.translateExtent = function(_) {
|
|
return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [
|
|
[
|
|
translateExtent[0][0],
|
|
translateExtent[0][1]
|
|
],
|
|
[
|
|
translateExtent[1][0],
|
|
translateExtent[1][1]
|
|
]
|
|
];
|
|
}, zoom.constrain = function(_) {
|
|
return arguments.length ? (constrain = _, zoom) : constrain;
|
|
}, zoom.duration = function(_) {
|
|
return arguments.length ? (duration = +_, zoom) : duration;
|
|
}, zoom.interpolate = function(_) {
|
|
return arguments.length ? (interpolate = _, zoom) : interpolate;
|
|
}, zoom.on = function() {
|
|
var value = listeners.on.apply(listeners, arguments);
|
|
return value === listeners ? zoom : value;
|
|
}, zoom.clickDistance = function(_) {
|
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
|
|
}, zoom.tapDistance = function(_) {
|
|
return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
|
|
}, zoom;
|
|
}, exports1.zoomIdentity = identity$9, exports1.zoomTransform = transform$1, Object.defineProperty(exports1, '__esModule', {
|
|
value: !0
|
|
});
|
|
});
|