diff --git a/.circleci/config.yml b/.circleci/config.yml index f8691f8ff..78eb37051 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -136,6 +136,9 @@ workflows: - benchmark: requires: - prep-build-test + - stats-module-load-init: + requires: + - prep-build-test-mv3 - job-publish-prerelease: requires: - prep-deps @@ -143,7 +146,9 @@ workflows: - prep-build-beta - prep-build-flask - prep-build-storybook + - prep-build-test-mv3 - benchmark + - stats-module-load-init - all-tests-pass - job-publish-release: filters: @@ -596,6 +601,40 @@ jobs: paths: - test-artifacts + stats-module-load-init: + executor: node-browsers-medium-plus + steps: + - checkout + - run: + name: Re-Install Chrome + command: ./.circleci/scripts/chrome-install.sh + - attach_workspace: + at: . + - run: + name: Move test build to dist + command: mv ./dist-test-mv3 ./dist + - run: + name: Move test zips to builds + command: mv ./builds-test-mv3 ./builds + - run: + name: Run page load benchmark + command: | + mkdir -p test-artifacts/chrome/mv3 + cp -R development/charts/flamegraph test-artifacts/chrome/mv3/initialisation + cp -R development/charts/flamegraph/chart test-artifacts/chrome/mv3/initialisation/background + cp -R development/charts/flamegraph/chart test-artifacts/chrome/mv3/initialisation/ui + cp -R development/charts/table test-artifacts/chrome/mv3/load_time + - run: + name: Run page load benchmark + command: yarn mv3:stats:chrome --out test-artifacts/chrome/mv3 + - store_artifacts: + path: test-artifacts + destination: test-artifacts + - persist_to_workspace: + root: . + paths: + - test-artifacts + job-publish-prerelease: executor: node-browsers steps: diff --git a/.eslintrc.js b/.eslintrc.js index 2001994f4..16c28cf7d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { 'app/vendor/**', 'builds/**/*', 'development/chromereload.js', + 'development/charts/**', 'dist/**/*', 'node_modules/**/*', ], diff --git a/development/charts/flamegraph/chart/index.html b/development/charts/flamegraph/chart/index.html new file mode 100644 index 000000000..7afe9f9d0 --- /dev/null +++ b/development/charts/flamegraph/chart/index.html @@ -0,0 +1,170 @@ + + + + + + + + + + + + + Performance Measurements + + + + + +
+
+ +

d3-flame-graph

+
+
+
+
+
+ + + + + + + + + + + diff --git a/development/charts/flamegraph/lib/d3-flamegraph-tooltip.js b/development/charts/flamegraph/lib/d3-flamegraph-tooltip.js new file mode 100644 index 000000000..cc042a0f2 --- /dev/null +++ b/development/charts/flamegraph/lib/d3-flamegraph-tooltip.js @@ -0,0 +1,3117 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["flamegraph"] = factory(); + else + root["flamegraph"] = root["flamegraph"] || {}, root["flamegraph"]["tooltip"] = factory(); +})(self, function() { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "defaultFlamegraphTooltip": () => (/* binding */ defaultFlamegraphTooltip) +}); + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selector.js +function none() {} + +/* harmony default export */ function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/select.js + + + +/* harmony default export */ function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/array.js +// Given something array like (or null), returns something that is strictly an +// array. This is used to ensure that array-like objects passed to d3.selectAll +// or selection.selectAll are converted into proper arrays when creating a +// selection; we don’t ever want to create a selection backed by a live +// HTMLCollection or NodeList. However, note that selection.selectAll will use a +// static NodeList as a group, since it safely derived from querySelectorAll. +function array(x) { + return x == null ? [] : Array.isArray(x) ? x : Array.from(x); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selectorAll.js +function empty() { + return []; +} + +/* harmony default export */ function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectAll.js + + + + +function arrayAll(select) { + return function() { + return array(select.apply(this, arguments)); + }; +} + +/* harmony default export */ function selectAll(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/matcher.js +/* harmony default export */ function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChild.js + + +var find = Array.prototype.find; + +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +/* harmony default export */ function selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChildren.js + + +var filter = Array.prototype.filter; + +function children() { + return Array.from(this.children); +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +/* harmony default export */ function selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/filter.js + + + +/* harmony default export */ function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sparse.js +/* harmony default export */ function sparse(update) { + return new Array(update.length); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/enter.js + + + +/* harmony default export */ function enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +} + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +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); } +}; + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/constant.js +/* harmony default export */ function src_constant(x) { + return function() { + return x; + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/data.js + + + + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} + +function datum(node) { + return node.__data__; +} + +/* harmony default export */ function data(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = src_constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +// Given some data, this returns an array-like view of it: an object that +// exposes a length property and allows numeric indexing. Note that unlike +// selectAll, this isn’t worried about “live” collections because the resulting +// array will only be used briefly while data is being bound. (It is possible to +// cause the data to change while iterating by using a key function, but please +// don’t; we’d rather avoid a gratuitous copy.) +function arraylike(data) { + return typeof data === "object" && "length" in data + ? data // Array, TypedArray, NodeList, array-like + : Array.from(data); // Map, Set, iterable, string, or anything else +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/exit.js + + + +/* harmony default export */ function exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/join.js +/* harmony default export */ function join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + if (typeof onenter === "function") { + enter = onenter(enter); + if (enter) enter = enter.selection(); + } else { + enter = enter.append(onenter + ""); + } + if (onupdate != null) { + update = onupdate(update); + if (update) update = update.selection(); + } + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/merge.js + + +/* harmony default export */ function merge(context) { + var selection = context.selection ? context.selection() : context; + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/order.js +/* harmony default export */ function order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sort.js + + +/* harmony default export */ function sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +} + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/call.js +/* harmony default export */ function call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/nodes.js +/* harmony default export */ function nodes() { + return Array.from(this); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/node.js +/* harmony default export */ function node() { + + 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; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/size.js +/* harmony default export */ function size() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/empty.js +/* harmony default export */ function selection_empty() { + return !this.node(); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/each.js +/* harmony default export */ function each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/namespaces.js +var xhtml = "http://www.w3.org/1999/xhtml"; + +/* harmony default export */ const 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/" +}); + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/namespace.js + + +/* harmony default export */ function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/attr.js + + +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); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +/* harmony default export */ function attr(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((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/window.js +/* harmony default export */ function src_window(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/style.js + + +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); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +/* harmony default export */ function style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || src_window(node).getComputedStyle(node, null).getPropertyValue(name); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/property.js +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); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +/* harmony default export */ function property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/classed.js +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") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++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); + }; +} + +/* harmony default export */ function classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/text.js +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 = v == null ? "" : v; + }; +} + +/* harmony default export */ function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/html.js +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 = v == null ? "" : v; + }; +} + +/* harmony default export */ function html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/raise.js +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +/* harmony default export */ function selection_raise() { + return this.each(raise); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/lower.js +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +/* harmony default export */ function selection_lower() { + return this.each(lower); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/creator.js + + + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +/* harmony default export */ function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/append.js + + +/* harmony default export */ function append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/insert.js + + + +function constantNull() { + return null; +} + +/* harmony default export */ function insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/remove.js +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +/* harmony default export */ function selection_remove() { + return this.each(remove); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/clone.js +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +/* harmony default export */ function clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/datum.js +/* harmony default export */ function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/on.js +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} + +function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + 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}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +/* harmony default export */ function on(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; 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; + } + + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/dispatch.js + + +function dispatchEvent(node, type, params) { + var window = src_window(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + 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)); + }; +} + +/* harmony default export */ function dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/iterator.js +/* harmony default export */ function* iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/index.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +var root = [null]; + +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +function selection_selection() { + return this; +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selectAll, + selectChild: selectChild, + selectChildren: selectChildren, + filter: selection_filter, + data: data, + enter: enter, + exit: exit, + join: join, + merge: merge, + selection: selection_selection, + order: order, + sort: sort, + call: call, + nodes: nodes, + node: node, + size: size, + empty: selection_empty, + each: each, + attr: attr, + style: style, + property: property, + classed: classed, + text: selection_text, + html: html, + raise: selection_raise, + lower: selection_lower, + append: append, + insert: insert, + remove: selection_remove, + clone: clone, + datum: selection_datum, + on: on, + dispatch: dispatch, + [Symbol.iterator]: iterator +}; + +/* harmony default export */ const src_selection = (selection); + +;// CONCATENATED MODULE: ../node_modules/d3-selection/src/select.js + + +/* harmony default export */ function src_select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +} + +;// CONCATENATED MODULE: ../node_modules/d3-dispatch/src/dispatch.js +var noop = {value: () => {}}; + +function dispatch_dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function dispatch_parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch_dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = dispatch_parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[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 args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new 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 new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(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; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +/* harmony default export */ const src_dispatch = (dispatch_dispatch); + +;// CONCATENATED MODULE: ../node_modules/d3-timer/src/timer.js +var timer_frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && 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; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e); + t = t._next; + } + --timer_frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + timer_frame = timeout = 0; + try { + timerFlush(); + } finally { + timer_frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (timer_frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + timer_frame = 1, setFrame(wake); + } +} + +;// CONCATENATED MODULE: ../node_modules/d3-timer/src/timeout.js + + +/* harmony default export */ function src_timeout(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/schedule.js + + + +var emptyOn = src_dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +/* harmony default export */ function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +function init(node, id) { + var schedule = schedule_get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function schedule_set(node, id) { + var schedule = schedule_get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function schedule_get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return src_timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + src_timeout(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/interrupt.js + + +/* harmony default export */ function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/interrupt.js + + +/* harmony default export */ function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/number.js +/* harmony default export */ function number(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/decompose.js +var degrees = 180 / Math.PI; + +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +/* harmony default export */ function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/parse.js + + +var svgNode; + +/* eslint-disable no-undef */ +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +} + +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/index.js + + + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(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: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(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: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/tween.js + + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = schedule_set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = schedule_set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + 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; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +/* harmony default export */ function tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = schedule_get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = schedule_set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return schedule_get(node, id).value[name]; + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-color/src/define.js +/* harmony default export */ function src_define(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; +} + +;// CONCATENATED MODULE: ../node_modules/d3-color/src/color.js + + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +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 = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var 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 +}; + +src_define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function color_rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +src_define(Rgb, color_rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return 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, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "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)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return 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); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.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; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +src_define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return 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; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +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; +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basis.js +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; +} + +/* harmony default export */ function src_basis(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); + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basisClosed.js + + +/* harmony default export */ 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); + }; +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/constant.js +/* harmony default export */ const d3_interpolate_src_constant = (x => () => x); + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/color.js + + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : d3_interpolate_src_constant(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : d3_interpolate_src_constant(isNaN(a) ? b : a); +} + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/rgb.js + + + + + +/* harmony default export */ const rgb = ((function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; +})(1)); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = color_rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +var rgbBasis = rgbSpline(src_basis); +var rgbBasisClosed = rgbSpline(basisClosed); + +;// CONCATENATED MODULE: ../node_modules/d3-interpolate/src/string.js + + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +/* harmony default export */ function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/interpolate.js + + + +/* harmony default export */ function interpolate(a, b) { + var c; + return (typeof b === "number" ? number + : b instanceof color ? rgb + : (c = color(b)) ? (b = c, rgb) + : string)(a, b); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attr.js + + + + + +function attr_attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attr_attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attr_attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attr_attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attr_attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attr_attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +/* harmony default export */ function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attr_attrFunctionNS : attr_attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attr_attrRemoveNS : attr_attrRemove)(fullname) + : (fullname.local ? attr_attrConstantNS : attr_attrConstant)(fullname, i, value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attrTween.js + + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +/* harmony default export */ function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/delay.js + + +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; + }; +} + +/* harmony default export */ function delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : schedule_get(this.node(), id).delay; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/duration.js + + +function durationFunction(id, value) { + return function() { + schedule_set(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + schedule_set(this, id).duration = value; + }; +} + +/* harmony default export */ function duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : schedule_get(this.node(), id).duration; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/ease.js + + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + schedule_set(this, id).ease = value; + }; +} + +/* harmony default export */ function ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : schedule_get(this.node(), id).ease; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/easeVarying.js + + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + schedule_set(this, id).ease = v; + }; +} + +/* harmony default export */ function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/filter.js + + + +/* harmony default export */ function transition_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/merge.js + + +/* harmony default export */ function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (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); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/on.js + + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : schedule_set; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +/* harmony default export */ function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? schedule_get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/remove.js +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +/* harmony default export */ function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/select.js + + + + +/* harmony default export */ function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, schedule_get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selectAll.js + + + + +/* harmony default export */ function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = schedule_get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selection.js + + +var selection_Selection = src_selection.prototype.constructor; + +/* harmony default export */ function transition_selection() { + return new selection_Selection(this._groups, this._parents); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/style.js + + + + + + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function style_styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function style_styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function style_styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = schedule_set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = style_styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +/* harmony default export */ function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, style_styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, style_styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, style_styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/styleTween.js +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +/* harmony default export */ function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/text.js + + +function text_textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function text_textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +/* harmony default export */ function transition_text(value) { + return this.tween("text", typeof value === "function" + ? text_textFunction(tweenValue(this, "text", value)) + : text_textConstant(value == null ? "" : value + "")); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/textTween.js +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +/* harmony default export */ function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/transition.js + + + +/* harmony default export */ function transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = schedule_get(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); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/end.js + + +/* harmony default export */ function end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = schedule_set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/index.js + + + + + + + + + + + + + + + + + + + + + + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition_transition(name) { + return src_selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = src_selection.prototype; + +Transition.prototype = transition_transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition, + 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: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: tween, + delay: delay, + duration: duration, + ease: ease, + easeVarying: transition_easeVarying, + end: end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +;// CONCATENATED MODULE: ../node_modules/d3-ease/src/cubic.js +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/transition.js + + + + + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + return timing; +} + +/* harmony default export */ function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/index.js + + + + +src_selection.prototype.interrupt = selection_interrupt; +src_selection.prototype.transition = selection_transition; + +;// CONCATENATED MODULE: ../node_modules/d3-transition/src/index.js + + + + + +;// CONCATENATED MODULE: ./tooltip.js +/* global event */ + + + + + + +function defaultLabel (d) { + return d.data.name +} + +function defaultFlamegraphTooltip () { + var rootElement = src_select('body') + var tooltip = null + // Function to get HTML content from data. + var html = defaultLabel + // Function to get text content from data. + var text = defaultLabel + // Whether to use d3's .html() to set content, otherwise use .text(). + var contentIsHTML = false + + function tip () { + tooltip = rootElement + .append('div') + .style('display', 'none') + .style('position', 'absolute') + .style('opacity', 0) + .style('pointer-events', 'none') + .attr('class', 'd3-flame-graph-tip') + } + + tip.show = function (d) { + tooltip + .style('display', 'block') + .style('left', event.pageX + 5 + 'px') + .style('top', event.pageY + 5 + 'px') + .transition() + .duration(200) + .style('opacity', 1) + .style('pointer-events', 'all') + + if (contentIsHTML) { + tooltip.html(html(d)) + } else { + tooltip.text(text(d)) + } + + return tip + } + + tip.hide = function () { + tooltip + .style('display', 'none') + .transition() + .duration(200) + .style('opacity', 0) + .style('pointer-events', 'none') + + return tip + } + + /** + * Gets/sets a function converting the d3 data into the tooltip's textContent. + * + * Cannot be combined with tip.html(). + */ + tip.text = function (_) { + if (!arguments.length) return text + text = _ + contentIsHTML = false + return tip + } + + /** + * Gets/sets a function converting the d3 data into the tooltip's innerHTML. + * + * Cannot be combined with tip.text(). + * + * @deprecated prefer tip.text(). + */ + tip.html = function (_) { + if (!arguments.length) return html + html = _ + contentIsHTML = true + return tip + } + + tip.destroy = function () { + tooltip.remove() + } + + return tip +} + +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/development/charts/flamegraph/lib/d3-flamegraph.css b/development/charts/flamegraph/lib/d3-flamegraph.css new file mode 100644 index 000000000..fa6f345ff --- /dev/null +++ b/development/charts/flamegraph/lib/d3-flamegraph.css @@ -0,0 +1,46 @@ +.d3-flame-graph rect { + stroke: #EEEEEE; + fill-opacity: .8; +} + +.d3-flame-graph rect:hover { + stroke: #474747; + stroke-width: 0.5; + cursor: pointer; +} + +.d3-flame-graph-label { + pointer-events: none; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-size: 12px; + font-family: Verdana; + margin-left: 4px; + margin-right: 4px; + line-height: 1.5; + padding: 0 0 0; + font-weight: 400; + color: black; + text-align: left; +} + +.d3-flame-graph .fade { + opacity: 0.6 !important; +} + +.d3-flame-graph .title { + font-size: 20px; + font-family: Verdana; +} + +.d3-flame-graph-tip { + background-color: black; + border: none; + border-radius: 3px; + padding: 5px 10px 5px 10px; + min-width: 250px; + text-align: left; + color: white; + z-index: 10; +} \ No newline at end of file diff --git a/development/charts/flamegraph/lib/d3-flamegraph.js b/development/charts/flamegraph/lib/d3-flamegraph.js new file mode 100644 index 000000000..eabb2c449 --- /dev/null +++ b/development/charts/flamegraph/lib/d3-flamegraph.js @@ -0,0 +1,5719 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if (typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if (typeof define === 'function' && define.amd) define([], factory); + else if (typeof exports === 'object') exports['flamegraph'] = factory(); + else root['flamegraph'] = factory(); +})(self, function () { + return /******/ (() => { + // webpackBootstrap + /******/ 'use strict'; // The require scope + /******/ /******/ var __webpack_require__ = {}; /* webpack/runtime/define property getters */ + /******/ + /************************************************************************/ + /******/ /******/ (() => { + /******/ // define getter functions for harmony exports + /******/ __webpack_require__.d = (exports, definition) => { + /******/ for (var key in definition) { + /******/ if ( + __webpack_require__.o(definition, key) && + !__webpack_require__.o(exports, key) + ) { + /******/ Object.defineProperty(exports, key, { + enumerable: true, + get: definition[key], + }); + /******/ + } + /******/ + } + /******/ + }; + /******/ + })(); /* webpack/runtime/hasOwnProperty shorthand */ + /******/ + /******/ /******/ (() => { + /******/ __webpack_require__.o = (obj, prop) => + Object.prototype.hasOwnProperty.call(obj, prop); + /******/ + })(); + /******/ + /************************************************************************/ + var __webpack_exports__ = {}; + + // EXPORTS + __webpack_require__.d(__webpack_exports__, { + default: () => /* binding */ flamegraph, + }); // CONCATENATED MODULE: ../node_modules/d3-selection/src/selector.js + + function none() {} + + /* harmony default export */ function selector(selector) { + return selector == null + ? none + : function () { + return this.querySelector(selector); + }; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/select.js + + /* harmony default export */ function selection_select(select) { + if (typeof select !== 'function') select = selector(select); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = new Array(m), + j = 0; + j < m; + ++j + ) { + for ( + var group = groups[j], + n = group.length, + subgroup = (subgroups[j] = new Array(n)), + node, + subnode, + i = 0; + i < n; + ++i + ) { + if ( + (node = group[i]) && + (subnode = select.call(node, node.__data__, i, group)) + ) { + if ('__data__' in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/array.js + + // Given something array like (or null), returns something that is strictly an + // array. This is used to ensure that array-like objects passed to d3.selectAll + // or selection.selectAll are converted into proper arrays when creating a + // selection; we don’t ever want to create a selection backed by a live + // HTMLCollection or NodeList. However, note that selection.selectAll will use a + // static NodeList as a group, since it safely derived from querySelectorAll. + function array(x) { + return x == null ? [] : Array.isArray(x) ? x : Array.from(x); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selectorAll.js + + function empty() { + return []; + } + + /* harmony default export */ function selectorAll(selector) { + return selector == null + ? empty + : function () { + return this.querySelectorAll(selector); + }; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectAll.js + + function arrayAll(select) { + return function () { + return array(select.apply(this, arguments)); + }; + } + + /* harmony default export */ function selectAll(select) { + if (typeof select === 'function') select = arrayAll(select); + else select = selectorAll(select); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = [], + parents = [], + j = 0; + j < m; + ++j + ) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if ((node = group[i])) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/matcher.js + + /* harmony default export */ function matcher(selector) { + return function () { + return this.matches(selector); + }; + } + + function childMatcher(selector) { + return function (node) { + return node.matches(selector); + }; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChild.js + + var find = Array.prototype.find; + + function childFind(match) { + return function () { + return find.call(this.children, match); + }; + } + + function childFirst() { + return this.firstElementChild; + } + + /* harmony default export */ function selectChild(match) { + return this.select( + match == null + ? childFirst + : childFind( + typeof match === 'function' ? match : childMatcher(match), + ), + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/selectChildren.js + + var filter = Array.prototype.filter; + + function children() { + return Array.from(this.children); + } + + function childrenFilter(match) { + return function () { + return filter.call(this.children, match); + }; + } + + /* harmony default export */ function selectChildren(match) { + return this.selectAll( + match == null + ? children + : childrenFilter( + typeof match === 'function' ? match : childMatcher(match), + ), + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/filter.js + + /* harmony default export */ function selection_filter(match) { + if (typeof match !== 'function') match = matcher(match); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = new Array(m), + j = 0; + j < m; + ++j + ) { + for ( + var group = groups[j], + n = group.length, + subgroup = (subgroups[j] = []), + node, + i = 0; + i < n; + ++i + ) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sparse.js + + /* harmony default export */ function sparse(update) { + return new Array(update.length); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/enter.js + + /* harmony default export */ function enter() { + return new Selection( + this._enter || this._groups.map(sparse), + this._parents, + ); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + 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); + }, + }; // CONCATENATED MODULE: ../node_modules/d3-selection/src/constant.js + + /* harmony default export */ function src_constant(x) { + return function () { + return x; + }; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/data.js + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if ((node = group[i])) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if ((node = group[i])) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map(), + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i])) { + keyValues[i] = keyValue = + key.call(node, node.__data__, i, group) + ''; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ''; + if ((node = nodeByKeyValue.get(keyValue))) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } + } + + function datum(node) { + return node.__data__; + } + + /* harmony default export */ function data(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== 'function') value = src_constant(value); + + for ( + var m = groups.length, + update = new Array(m), + enter = new Array(m), + exit = new Array(m), + j = 0; + j < m; + ++j + ) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = arraylike( + value.call(parent, parent && parent.__data__, j, parents), + ), + dataLength = data.length, + enterGroup = (enter[j] = new Array(dataLength)), + updateGroup = (update[j] = new Array(dataLength)), + exitGroup = (exit[j] = new Array(groupLength)); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if ((previous = enterGroup[i0])) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + // Given some data, this returns an array-like view of it: an object that + // exposes a length property and allows numeric indexing. Note that unlike + // selectAll, this isn’t worried about “live” collections because the resulting + // array will only be used briefly while data is being bound. (It is possible to + // cause the data to change while iterating by using a key function, but please + // don’t; we’d rather avoid a gratuitous copy.) + function arraylike(data) { + return typeof data === 'object' && 'length' in data + ? data // Array, TypedArray, NodeList, array-like + : Array.from(data); // Map, Set, iterable, string, or anything else + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/exit.js + + /* harmony default export */ function exit() { + return new Selection( + this._exit || this._groups.map(sparse), + this._parents, + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/join.js + + /* harmony default export */ function join(onenter, onupdate, onexit) { + var enter = this.enter(), + update = this, + exit = this.exit(); + if (typeof onenter === 'function') { + enter = onenter(enter); + if (enter) enter = enter.selection(); + } else { + enter = enter.append(onenter + ''); + } + if (onupdate != null) { + update = onupdate(update); + if (update) update = update.selection(); + } + if (onexit == null) exit.remove(); + else onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/merge.js + + /* harmony default export */ function merge(context) { + var selection = context.selection ? context.selection() : context; + + for ( + var groups0 = this._groups, + groups1 = selection._groups, + m0 = groups0.length, + m1 = groups1.length, + m = Math.min(m0, m1), + merges = new Array(m0), + j = 0; + j < m; + ++j + ) { + for ( + var group0 = groups0[j], + group1 = groups1[j], + n = group0.length, + merge = (merges[j] = new Array(n)), + node, + i = 0; + i < n; + ++i + ) { + if ((node = group0[i] || group1[i])) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/order.js + + /* harmony default export */ function order() { + for (var groups = this._groups, j = -1, m = groups.length; ++j < m; ) { + for ( + var group = groups[j], i = group.length - 1, next = group[i], node; + --i >= 0; + + ) { + if ((node = group[i])) { + if (next && node.compareDocumentPosition(next) ^ 4) + next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/sort.js + + /* harmony default export */ function sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for ( + var groups = this._groups, + m = groups.length, + sortgroups = new Array(m), + j = 0; + j < m; + ++j + ) { + for ( + var group = groups[j], + n = group.length, + sortgroup = (sortgroups[j] = new Array(n)), + node, + i = 0; + i < n; + ++i + ) { + if ((node = group[i])) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/call.js + + /* harmony default export */ function call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/nodes.js + + /* harmony default export */ function nodes() { + return Array.from(this); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/node.js + + /* harmony default export */ function node() { + 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; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/size.js + + /* harmony default export */ function size() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/empty.js + + /* harmony default export */ function selection_empty() { + return !this.node(); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/each.js + + /* harmony default export */ function each(callback) { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if ((node = group[i])) callback.call(node, node.__data__, i, group); + } + } + + return this; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/namespaces.js + + var xhtml = 'http://www.w3.org/1999/xhtml'; + + /* harmony default export */ const 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/', + }; // CONCATENATED MODULE: ../node_modules/d3-selection/src/namespace.js + + /* harmony default export */ function namespace(name) { + var prefix = (name += ''), + i = prefix.indexOf(':'); + if (i >= 0 && (prefix = name.slice(0, i)) !== 'xmlns') + name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) + ? { space: namespaces[prefix], local: name } + : name; // eslint-disable-line no-prototype-builtins + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/attr.js + + 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); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + /* harmony default export */ function attr(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( + (value == null + ? fullname.local + ? attrRemoveNS + : attrRemove + : typeof value === 'function' + ? fullname.local + ? attrFunctionNS + : attrFunction + : fullname.local + ? attrConstantNS + : attrConstant)(fullname, value), + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/window.js + + /* harmony default export */ function src_window(node) { + return ( + (node.ownerDocument && node.ownerDocument.defaultView) || // node is a Node + (node.document && node) || // node is a Window + node.defaultView + ); // node is a Document + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/style.js + + 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); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + /* harmony default export */ function style(name, value, priority) { + return arguments.length > 1 + ? this.each( + (value == null + ? styleRemove + : typeof value === 'function' + ? styleFunction + : styleConstant)(name, value, priority == null ? '' : priority), + ) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return ( + node.style.getPropertyValue(name) || + src_window(node).getComputedStyle(node, null).getPropertyValue(name) + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/property.js + + 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); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + /* harmony default export */ function property(name, value) { + return arguments.length > 1 + ? this.each( + (value == null + ? propertyRemove + : typeof value === 'function' + ? propertyFunction + : propertyConstant)(name, value), + ) + : this.node()[name]; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/classed.js + + 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') || ''); + } + + ClassList.prototype = { + add: function (name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute('class', this._names.join(' ')); + } + }, + remove: function (name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute('class', this._names.join(' ')); + } + }, + contains: function (name) { + return this._names.indexOf(name) >= 0; + }, + }; + + function classedAdd(node, names) { + var list = classList(node), + i = -1, + n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), + i = -1, + n = names.length; + while (++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, + ); + }; + } + + /* harmony default export */ function classed(name, value) { + var names = classArray(name + ''); + + if (arguments.length < 2) { + var list = classList(this.node()), + i = -1, + n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each( + (typeof value === 'function' + ? classedFunction + : value + ? classedTrue + : classedFalse)(names, value), + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/text.js + + 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 = v == null ? '' : v; + }; + } + + /* harmony default export */ function selection_text(value) { + return arguments.length + ? this.each( + value == null + ? textRemove + : (typeof value === 'function' ? textFunction : textConstant)( + value, + ), + ) + : this.node().textContent; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/html.js + + 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 = v == null ? '' : v; + }; + } + + /* harmony default export */ function html(value) { + return arguments.length + ? this.each( + value == null + ? htmlRemove + : (typeof value === 'function' ? htmlFunction : htmlConstant)( + value, + ), + ) + : this.node().innerHTML; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/raise.js + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + /* harmony default export */ function selection_raise() { + return this.each(raise); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/lower.js + + function lower() { + if (this.previousSibling) + this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + /* harmony default export */ function selection_lower() { + return this.each(lower); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/creator.js + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS( + fullname.space, + fullname.local, + ); + }; + } + + /* harmony default export */ function creator(name) { + var fullname = namespace(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/append.js + + /* harmony default export */ function append(name) { + var create = typeof name === 'function' ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/insert.js + + function constantNull() { + return null; + } + + /* harmony default export */ function insert(name, before) { + var create = typeof name === 'function' ? name : creator(name), + select = + before == null + ? constantNull + : typeof before === 'function' + ? before + : selector(before); + return this.select(function () { + return this.insertBefore( + create.apply(this, arguments), + select.apply(this, arguments) || null, + ); + }); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/remove.js + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + /* harmony default export */ function selection_remove() { + return this.each(remove); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/clone.js + + function selection_cloneShallow() { + var clone = this.cloneNode(false), + parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_cloneDeep() { + var clone = this.cloneNode(true), + parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + /* harmony default export */ function clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/datum.js + + /* harmony default export */ function selection_datum(value) { + return arguments.length + ? this.property('__data__', value) + : this.node().__data__; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/on.js + + function contextListener(listener) { + return function (event) { + listener.call(this, event, this.__data__); + }; + } + + function parseTypenames(typenames) { + return typenames + .trim() + .split(/^|\s+/) + .map(function (t) { + var name = '', + i = t.indexOf('.'); + if (i >= 0) (name = t.slice(i + 1)), (t = t.slice(0, i)); + return { type: t, name: name }; + }); + } + + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if ( + ((o = on[j]), + (!typename.type || o.type === typename.type) && + o.name === typename.name) + ) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, options) { + return function () { + var on = this.__on, + o, + listener = contextListener(value); + 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, + }; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + /* harmony default export */ function on(typename, value, options) { + var typenames = parseTypenames(typename + ''), + i, + n = typenames.length, + t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) + for (var j = 0, m = on.length, o; 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; + } + + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/dispatch.js + + function dispatchEvent(node, type, params) { + var window = src_window(node), + event = window.CustomEvent; + + if (typeof event === 'function') { + event = new event(type, params); + } else { + event = window.document.createEvent('Event'); + if (params) + event.initEvent(type, params.bubbles, params.cancelable), + (event.detail = params.detail); + else event.initEvent(type, false, false); + } + + 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)); + }; + } + + /* harmony default export */ function dispatch(type, params) { + return this.each( + (typeof params === 'function' ? dispatchFunction : dispatchConstant)( + type, + params, + ), + ); + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/iterator.js + + /* harmony default export */ function* iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if ((node = group[i])) yield node; + } + } + } // CONCATENATED MODULE: ../node_modules/d3-selection/src/selection/index.js + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + function selection_selection() { + return this; + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selectAll, + selectChild: selectChild, + selectChildren: selectChildren, + filter: selection_filter, + data: data, + enter: enter, + exit: exit, + join: join, + merge: merge, + selection: selection_selection, + order: order, + sort: sort, + call: call, + nodes: nodes, + node: node, + size: size, + empty: selection_empty, + each: each, + attr: attr, + style: style, + property: property, + classed: classed, + text: selection_text, + html: html, + raise: selection_raise, + lower: selection_lower, + append: append, + insert: insert, + remove: selection_remove, + clone: clone, + datum: selection_datum, + on: on, + dispatch: dispatch, + [Symbol.iterator]: iterator, + }; + + /* harmony default export */ const src_selection = selection; // CONCATENATED MODULE: ../node_modules/d3-selection/src/select.js + + /* harmony default export */ function src_select(selector) { + return typeof selector === 'string' + ? new Selection( + [[document.querySelector(selector)]], + [document.documentElement], + ) + : new Selection([[selector]], root); + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatDecimal.js + + /* harmony default export */ function formatDecimal(x) { + return Math.abs((x = Math.round(x))) >= 1e21 + ? x.toLocaleString('en').replace(/,/g, '') + : x.toString(10); + } + + // Computes the decimal coefficient and exponent of the specified number x with + // significant digits p, where x is positive and p is in [1, 21] or undefined. + // For example, formatDecimalParts(1.23) returns ["123", 0]. + function formatDecimalParts(x, p) { + if ( + (i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf( + 'e', + )) < 0 + ) + return null; // NaN, ±Infinity + var i, + coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 + ? coefficient[0] + coefficient.slice(2) + : coefficient, + +x.slice(i + 1), + ]; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/exponent.js + + /* harmony default export */ function exponent(x) { + return (x = formatDecimalParts(Math.abs(x))), x ? x[1] : NaN; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatGroup.js + + /* harmony default export */ function formatGroup(grouping, thousands) { + return function (value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring((i -= g), i + g)); + if ((length += g + 1) > width) break; + g = grouping[(j = (j + 1) % grouping.length)]; + } + + return t.reverse().join(thousands); + }; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatNumerals.js + + /* harmony default export */ function formatNumerals(numerals) { + return function (value) { + return value.replace(/[0-9]/g, function (i) { + return numerals[+i]; + }); + }; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatSpecifier.js + + // [[fill]align][sign][symbol][0][width][,][.precision][~][type] + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) + throw new Error('invalid format: ' + specifier); + var match; + 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], + }); + } + + formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + + function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? ' ' : specifier.fill + ''; + this.align = specifier.align === undefined ? '>' : specifier.align + ''; + this.sign = specifier.sign === undefined ? '-' : specifier.sign + ''; + this.symbol = specifier.symbol === undefined ? '' : specifier.symbol + ''; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = + specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? '' : specifier.type + ''; + } + + FormatSpecifier.prototype.toString = function () { + return ( + this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? '0' : '') + + (this.width === undefined ? '' : Math.max(1, this.width | 0)) + + (this.comma ? ',' : '') + + (this.precision === undefined + ? '' + : '.' + Math.max(0, this.precision | 0)) + + (this.trim ? '~' : '') + + this.type + ); + }; // CONCATENATED MODULE: ../node_modules/d3-format/src/formatTrim.js + + // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. + /* harmony default export */ function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case '.': + i0 = i1 = i; + break; + case '0': + if (i0 === 0) i0 = i; + i1 = i; + break; + default: + if (!+s[i]) break out; + if (i0 > 0) i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatPrefixAuto.js + + var prefixExponent; + + /* harmony default export */ function formatPrefixAuto(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ''; + var coefficient = d[0], + exponent = d[1], + i = + exponent - + (prefixExponent = + Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + + 1, + n = coefficient.length; + return i === n + ? coefficient + : i > n + ? coefficient + new Array(i - n + 1).join('0') + : i > 0 + ? coefficient.slice(0, i) + '.' + coefficient.slice(i) + : '0.' + + new Array(1 - i).join('0') + + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatRounded.js + + /* harmony default export */ function formatRounded(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ''; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 + ? '0.' + new Array(-exponent).join('0') + coefficient + : coefficient.length > exponent + 1 + ? coefficient.slice(0, exponent + 1) + + '.' + + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join('0'); + } // CONCATENATED MODULE: ../node_modules/d3-format/src/formatTypes.js + + /* harmony default export */ const formatTypes = { + '%': (x, p) => (x * 100).toFixed(p), + b: (x) => Math.round(x).toString(2), + c: (x) => x + '', + d: formatDecimal, + 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(x * 100, p), + r: formatRounded, + s: formatPrefixAuto, + X: (x) => Math.round(x).toString(16).toUpperCase(), + x: (x) => Math.round(x).toString(16), + }; // CONCATENATED MODULE: ../node_modules/d3-format/src/identity.js + + /* harmony default export */ function identity(x) { + return x; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/locale.js + + var map = Array.prototype.map, + prefixes = [ + 'y', + 'z', + 'a', + 'f', + 'p', + 'n', + 'µ', + 'm', + '', + 'k', + 'M', + 'G', + 'T', + 'P', + 'E', + 'Z', + 'Y', + ]; + + /* harmony default export */ function locale(locale) { + var group = + locale.grouping === undefined || locale.thousands === undefined + ? identity + : formatGroup( + map.call(locale.grouping, Number), + locale.thousands + '', + ), + currencyPrefix = + locale.currency === undefined ? '' : locale.currency[0] + '', + currencySuffix = + locale.currency === undefined ? '' : locale.currency[1] + '', + decimal = locale.decimal === undefined ? '.' : locale.decimal + '', + numerals = + locale.numerals === undefined + ? identity + : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? '%' : locale.percent + '', + minus = locale.minus === undefined ? '−' : locale.minus + '', + nan = locale.nan === undefined ? 'NaN' : locale.nan + ''; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = 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; + + // The "n" type is an alias for ",g". + if (type === 'n') (comma = true), (type = 'g'); + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) + precision === undefined && (precision = 12), + (trim = true), + (type = 'g'); + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === '0' && align === '=')) + (zero = true), (fill = '0'), (align = '='); + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = + symbol === '$' + ? currencyPrefix + : symbol === '#' && /[boxX]/.test(type) + ? '0' + type.toLowerCase() + : '', + suffix = + symbol === '$' ? currencySuffix : /[%p]/.test(type) ? percent : ''; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = + precision === undefined + ? 6 + : /[gprs]/.test(type) + ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, + n, + c; + + if (type === 'c') { + valueSuffix = formatType(value) + valueSuffix; + value = ''; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== '+') + valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = + (valueNegative + ? sign === '(' + ? sign + : minus + : sign === '-' || sign === '(' + ? '' + : sign) + valuePrefix; + valueSuffix = + (type === 's' ? prefixes[8 + prefixExponent / 3] : '') + + valueSuffix + + (valueNegative && sign === '(' ? ')' : ''); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + (i = -1), (n = value.length); + while (++i < n) { + if (((c = value.charCodeAt(i)), 48 > c || c > 57)) { + valueSuffix = + (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = + length < width ? new Array(width - length + 1).join(fill) : ''; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) + (value = group( + padding + value, + padding.length ? width - valueSuffix.length : Infinity, + )), + (padding = ''); + + // Reconstruct the final output based on the desired alignment. + switch (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; + break; + } + + return numerals(value); + } + + format.toString = function () { + return specifier + ''; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat( + ((specifier = formatSpecifier(specifier)), + (specifier.type = 'f'), + specifier), + ), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function (value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix, + }; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/defaultLocale.js + + var defaultLocale_locale; + var format; + var formatPrefix; + + defaultLocale({ + thousands: ',', + grouping: [3], + currency: ['$', ''], + }); + + function defaultLocale(definition) { + defaultLocale_locale = locale(definition); + format = defaultLocale_locale.format; + formatPrefix = defaultLocale_locale.formatPrefix; + return defaultLocale_locale; + } // CONCATENATED MODULE: ../node_modules/d3-array/src/ascending.js + + function ascending_ascending(a, b) { + return a == null || b == null + ? NaN + : a < b + ? -1 + : a > b + ? 1 + : a >= b + ? 0 + : NaN; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/treemap/round.js + + /* harmony default export */ function treemap_round(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); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/treemap/dice.js + + /* harmony default export */ function dice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + (node = nodes[i]), (node.y0 = y0), (node.y1 = y1); + (node.x0 = x0), (node.x1 = x0 += node.value * k); + } + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/partition.js + + /* harmony default export */ function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(treemap_round); + return root; + } + + function positionNode(dy, n) { + return function (node) { + if (node.children) { + dice( + node, + node.x0, + (dy * (node.depth + 1)) / n, + node.x1, + (dy * (node.depth + 2)) / n, + ); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + 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; + }; + + return partition; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/count.js + + function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; + } + + /* harmony default export */ function hierarchy_count() { + return this.eachAfter(count); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/each.js + + /* harmony default export */ function hierarchy_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } + return this; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/eachBefore.js + + /* harmony default export */ function eachBefore(callback, that) { + var node = this, + nodes = [node], + children, + i, + index = -1; + while ((node = nodes.pop())) { + callback.call(that, node, ++index, this); + if ((children = node.children)) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/eachAfter.js + + /* harmony default export */ function eachAfter(callback, that) { + var node = this, + nodes = [node], + next = [], + children, + i, + n, + index = -1; + while ((node = nodes.pop())) { + next.push(node); + if ((children = node.children)) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while ((node = next.pop())) { + callback.call(that, node, ++index, this); + } + return this; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/find.js + + /* harmony default export */ function hierarchy_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/sum.js + + /* harmony default export */ function sum(value) { + return this.eachAfter(function (node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/sort.js + + /* harmony default export */ function hierarchy_sort(compare) { + return this.eachBefore(function (node) { + if (node.children) { + node.children.sort(compare); + } + }); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/path.js + + /* harmony default export */ function path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + } + + function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/ancestors.js + + /* harmony default export */ function ancestors() { + var node = this, + nodes = [node]; + while ((node = node.parent)) { + nodes.push(node); + } + return nodes; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/descendants.js + + /* harmony default export */ function descendants() { + return Array.from(this); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/leaves.js + + /* harmony default export */ function leaves() { + var leaves = []; + this.eachBefore(function (node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/links.js + + /* harmony default export */ function links() { + var root = this, + links = []; + root.each(function (node) { + if (node !== root) { + // Don’t include the root’s parent, if any. + links.push({ source: node.parent, target: node }); + } + }); + return links; + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/iterator.js + + /* harmony default export */ function* hierarchy_iterator() { + var node = this, + current, + next = [node], + children, + i, + n; + do { + (current = next.reverse()), (next = []); + while ((node = current.pop())) { + yield node; + if ((children = node.children)) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); + } // CONCATENATED MODULE: ../node_modules/d3-hierarchy/src/hierarchy/index.js + + function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node(data), + node, + nodes = [root], + child, + childs, + i, + n; + + while ((node = nodes.pop())) { + if ( + (childs = children(node.data)) && + (n = (childs = Array.from(childs)).length) + ) { + node.children = childs; + for (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 node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function objectChildren(d) { + return d.children; + } + + function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; + } + + function copyData(node) { + if (node.data.value !== undefined) 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; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + count: hierarchy_count, + each: hierarchy_each, + eachAfter: eachAfter, + eachBefore: eachBefore, + find: hierarchy_find, + sum: sum, + sort: hierarchy_sort, + path: path, + ancestors: ancestors, + descendants: descendants, + leaves: leaves, + links: links, + copy: node_copy, + [Symbol.iterator]: hierarchy_iterator, + }; // CONCATENATED MODULE: ../node_modules/d3-array/src/ticks.js + + var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + + function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + (stop = +stop), (start = +start), (count = +count); + if (start === stop && count > 0) return [start]; + if ((reverse = stop < start)) (n = start), (start = stop), (stop = n); + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) + return []; + + if (step > 0) { + let r0 = Math.round(start / step), + r1 = Math.round(stop / step); + if (r0 * step < start) ++r0; + if (r1 * step > stop) --r1; + ticks = new Array((n = r1 - r0 + 1)); + while (++i < n) ticks[i] = (r0 + i) * step; + } else { + step = -step; + let r0 = Math.round(start * step), + r1 = Math.round(stop * step); + if (r0 / step < start) ++r0; + if (r1 / step > stop) --r1; + ticks = new Array((n = r1 - r0 + 1)); + while (++i < n) ticks[i] = (r0 + i) / step; + } + + if (reverse) ticks.reverse(); + + return 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; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } // CONCATENATED MODULE: ../node_modules/d3-array/src/bisector.js + + function bisector(f) { + let delta = f; + let compare1 = f; + let compare2 = f; + + if (f.length !== 2) { + delta = (d, x) => f(d) - x; + compare1 = ascending_ascending; + compare2 = (d, x) => ascending_ascending(f(d), x); + } + + function left(a, x, lo = 0, hi = a.length) { + if (lo < hi) { + if (compare1(x, x) !== 0) return hi; + do { + const mid = (lo + hi) >>> 1; + if (compare2(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } while (lo < hi); + } + return lo; + } + + function right(a, x, lo = 0, hi = a.length) { + if (lo < hi) { + if (compare1(x, x) !== 0) return hi; + do { + const mid = (lo + hi) >>> 1; + if (compare2(a[mid], x) <= 0) lo = mid + 1; + else hi = mid; + } while (lo < hi); + } + return lo; + } + + function center(a, x, lo = 0, 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; + } + + return { left, center, right }; + } // CONCATENATED MODULE: ../node_modules/d3-array/src/number.js + + function number(x) { + return x === null ? NaN : +x; + } + + function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } + } else { + let index = -1; + for (let value of values) { + if ( + (value = valueof(value, ++index, values)) != null && + (value = +value) >= value + ) { + yield value; + } + } + } + } // CONCATENATED MODULE: ../node_modules/d3-array/src/bisect.js + + const ascendingBisect = bisector(ascending_ascending); + const bisectRight = ascendingBisect.right; + const bisectLeft = ascendingBisect.left; + const bisectCenter = bisector(number).center; + /* harmony default export */ const bisect = bisectRight; // CONCATENATED MODULE: ../node_modules/d3-color/src/define.js + + /* harmony default export */ function src_define( + 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; + } // CONCATENATED MODULE: ../node_modules/d3-color/src/color.js + + function Color() {} + + var darker = 0.7; + var brighter = 1 / darker; + + 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 = new RegExp('^rgb\\(' + [reI, reI, reI] + '\\)$'), + reRgbPercent = new RegExp('^rgb\\(' + [reP, reP, reP] + '\\)$'), + reRgbaInteger = new RegExp('^rgba\\(' + [reI, reI, reI, reN] + '\\)$'), + reRgbaPercent = new RegExp('^rgba\\(' + [reP, reP, reP, reN] + '\\)$'), + reHslPercent = new RegExp('^hsl\\(' + [reN, reP, reP] + '\\)$'), + reHslaPercent = new RegExp('^hsla\\(' + [reN, reP, reP, reN] + '\\)$'); + + var 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, + }; + + src_define(Color, color, { + copy: function (channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable: function () { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb, + }); + + function color_formatHex() { + return this.rgb().formatHex(); + } + + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } + + function color_formatRgb() { + return this.rgb().formatRgb(); + } + + function color(format) { + var m, l; + format = (format + '').trim().toLowerCase(); + return (m = reHex.exec(format)) + ? ((l = m[1].length), + (m = parseInt(m[1], 16)), + l === 6 + ? rgbn(m) // #ff0000 + : l === 3 + ? new Rgb( + ((m >> 8) & 0xf) | ((m >> 4) & 0xf0), + ((m >> 4) & 0xf) | (m & 0xf0), + ((m & 0xf) << 4) | (m & 0xf), + 1, + ) // #f00 + : l === 8 + ? rgba( + (m >> 24) & 0xff, + (m >> 16) & 0xff, + (m >> 8) & 0xff, + (m & 0xff) / 0xff, + ) // #ff000000 + : l === 4 + ? rgba( + ((m >> 12) & 0xf) | ((m >> 8) & 0xf0), + ((m >> 8) & 0xf) | ((m >> 4) & 0xf0), + ((m >> 4) & 0xf) | (m & 0xf0), + (((m & 0xf) << 4) | (m & 0xf)) / 0xff, + ) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) + ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) + ? new Rgb((m[1] * 255) / 100, (m[2] * 255) / 100, (m[3] * 255) / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) + ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) + ? rgba((m[1] * 255) / 100, (m[2] * 255) / 100, (m[3] * 255) / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) + ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) + ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) + ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === 'transparent' + ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + + function rgbn(n) { + return new Rgb((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff, 1); + } + + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } + + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + + function color_rgb(r, g, b, opacity) { + return arguments.length === 1 + ? rgbConvert(r) + : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + + src_define( + Rgb, + color_rgb, + extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return 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, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb, + }), + ); + + function rgb_formatHex() { + return '#' + hex(this.r) + hex(this.g) + hex(this.b); + } + + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return ( + (a === 1 ? '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)) + + (a === 1 ? ')' : ', ' + a + ')') + ); + } + + function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? '0' : '') + value.toString(16); + } + + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return 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); + if (!o) return new Hsl(); + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.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; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + + function hsl(h, s, l, opacity) { + return arguments.length === 1 + ? hslConvert(h) + : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + src_define( + Hsl, + hsl, + extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return 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; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return ( + (a === 1 ? 'hsl(' : 'hsla(') + + (this.h || 0) + + ', ' + + (this.s || 0) * 100 + + '%, ' + + (this.l || 0) * 100 + + '%' + + (a === 1 ? ')' : ', ' + a + ')') + ); + }, + }), + ); + + /* From FvD 13.37, CSS Color Module Level 3 */ + 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 + ); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basis.js + + 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 + ); + } + + /* harmony default export */ function src_basis(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); + }; + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/basisClosed.js + + /* harmony default export */ 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); + }; + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/constant.js + + /* harmony default export */ const d3_interpolate_src_constant = ( + x, + ) => () => x; // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/color.js + + function linear(a, d) { + return function (t) { + return a + t * d; + }; + } + + function exponential(a, b, y) { + return ( + (a = Math.pow(a, y)), + (b = Math.pow(b, y) - a), + (y = 1 / y), + function (t) { + return Math.pow(a + t * b, y); + } + ); + } + + function hue(a, b) { + var d = b - a; + return d + ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) + : constant(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 + ? nogamma + : function (a, b) { + return b - a + ? exponential(a, b, y) + : d3_interpolate_src_constant(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : d3_interpolate_src_constant(isNaN(a) ? b : a); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/rgb.js + + /* harmony default export */ const rgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ''; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; + })(1); + + function rgbSpline(spline) { + return function (colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, + color; + for (i = 0; i < n; ++i) { + color = color_rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function (t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ''; + }; + }; + } + + var rgbBasis = rgbSpline(src_basis); + var rgbBasisClosed = rgbSpline(basisClosed); // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/array.js + + /* harmony default export */ function src_array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); + } + + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(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; + }; + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/date.js + + /* harmony default export */ function date(a, b) { + var d = new Date(); + return ( + (a = +a), + (b = +b), + function (t) { + return d.setTime(a * (1 - t) + b * t), d; + } + ); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/number.js + + /* harmony default export */ function src_number(a, b) { + return ( + (a = +a), + (b = +b), + function (t) { + return a * (1 - t) + b * t; + } + ); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/object.js + + /* harmony default export */ function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== 'object') a = {}; + if (b === null || typeof b !== 'object') b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function (t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/string.js + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, 'g'); + + function zero(b) { + return function () { + return b; + }; + } + + function one(b) { + return function (t) { + return b(t) + ''; + }; + } + + /* harmony default export */ function string(a, b) { + var bi = (reA.lastIndex = reB.lastIndex = 0), // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + (a = a + ''), (b = b + ''); + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; + // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + // numbers in a & b match + if (s[i]) s[i] += bm; + // coalesce with previous string + else s[++i] = bm; + } else { + // interpolate non-matching numbers + s[++i] = null; + q.push({ i: i, x: src_number(am, bm) }); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; + // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 + ? q[0] + ? one(q[0].x) + : zero(b) + : ((b = q.length), + function (t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(''); + }); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/numberArray.js + + /* harmony default export */ function src_numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; + } + + function numberArray_isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/value.js + + /* harmony default export */ function value(a, b) { + var t = typeof b, + c; + return b == null || t === 'boolean' + ? d3_interpolate_src_constant(b) + : (t === 'number' + ? src_number + : t === 'string' + ? (c = color(b)) + ? ((b = c), rgb) + : string + : b instanceof color + ? rgb + : b instanceof Date + ? date + : numberArray_isNumberArray(b) + ? src_numberArray + : Array.isArray(b) + ? genericArray + : (typeof b.valueOf !== 'function' && + typeof b.toString !== 'function') || + isNaN(b) + ? object + : src_number)(a, b); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/round.js + + /* harmony default export */ function round(a, b) { + return ( + (a = +a), + (b = +b), + function (t) { + return Math.round(a * (1 - t) + b * t); + } + ); + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/constant.js + + function constants(x) { + return function () { + return x; + }; + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/number.js + + function number_number(x) { + return +x; + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/continuous.js + + var unit = [0, 1]; + + function continuous_identity(x) { + return x; + } + + function normalize(a, b) { + return (b -= a = +a) + ? function (x) { + return (x - a) / b; + } + : constants(isNaN(b) ? NaN : 0.5); + } + + function clamper(a, b) { + var t; + if (a > b) (t = a), (a = b), (b = t); + return function (x) { + return Math.max(a, Math.min(b, x)); + }; + } + + // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. + // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. + function bimap(domain, range, interpolate) { + var d0 = domain[0], + d1 = domain[1], + r0 = range[0], + r1 = range[1]; + if (d1 < d0) (d0 = normalize(d1, d0)), (r0 = interpolate(r1, r0)); + else (d0 = normalize(d0, d1)), (r0 = interpolate(r0, r1)); + return function (x) { + return r0(d0(x)); + }; + } + + function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function (x) { + var i = bisect(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() { + var domain = unit, + range = unit, + interpolate = value, + transform, + untransform, + unknown, + clamp = continuous_identity, + piecewise, + output, + input; + + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== continuous_identity) + clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return x == null || isNaN((x = +x)) + ? unknown + : ( + output || + (output = piecewise(domain.map(transform), range, interpolate)) + )(transform(clamp(x))); + } + + scale.invert = function (y) { + return clamp( + untransform( + ( + input || + (input = piecewise(range, domain.map(transform), src_number)) + )(y), + ), + ); + }; + + scale.domain = function (_) { + return arguments.length + ? ((domain = Array.from(_, number_number)), rescale()) + : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length + ? ((range = Array.from(_)), rescale()) + : range.slice(); + }; + + scale.rangeRound = function (_) { + return (range = Array.from(_)), (interpolate = round), rescale(); + }; + + scale.clamp = function (_) { + return arguments.length + ? ((clamp = _ ? true : continuous_identity), rescale()) + : clamp !== continuous_identity; + }; + + scale.interpolate = function (_) { + return arguments.length ? ((interpolate = _), rescale()) : interpolate; + }; + + scale.unknown = function (_) { + return arguments.length ? ((unknown = _), scale) : unknown; + }; + + return function (t, u) { + (transform = t), (untransform = u); + return rescale(); + }; + } + + function continuous() { + return transformer()(continuous_identity, continuous_identity); + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/init.js + + function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; + } + + function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: + break; + case 1: { + if (typeof domain === 'function') this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === 'function') + this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/precisionPrefix.js + + /* harmony default export */ function precisionPrefix(step, value) { + return Math.max( + 0, + Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - + exponent(Math.abs(step)), + ); + } // CONCATENATED MODULE: ../node_modules/d3-format/src/precisionRound.js + + /* harmony default export */ function precisionRound(step, max) { + (step = Math.abs(step)), (max = Math.abs(max) - step); + return Math.max(0, exponent(max) - exponent(step)) + 1; + } // CONCATENATED MODULE: ../node_modules/d3-format/src/precisionFixed.js + + /* harmony default export */ function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/tickFormat.js + + function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ',f' : specifier); + switch (specifier.type) { + case 's': { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if ( + specifier.precision == null && + !isNaN((precision = precisionPrefix(step, value))) + ) + specifier.precision = precision; + return formatPrefix(specifier, value); + } + case '': + case 'e': + case 'g': + case 'p': + case 'r': { + if ( + specifier.precision == null && + !isNaN( + (precision = precisionRound( + step, + Math.max(Math.abs(start), Math.abs(stop)), + )), + ) + ) + specifier.precision = precision - (specifier.type === 'e'); + break; + } + case 'f': + case '%': { + if ( + specifier.precision == null && + !isNaN((precision = precisionFixed(step))) + ) + specifier.precision = precision - (specifier.type === '%') * 2; + break; + } + } + return format(specifier); + } // CONCATENATED MODULE: ../node_modules/d3-scale/src/linear.js + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function (count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function (count, specifier) { + var d = domain(); + return tickFormat( + d[0], + d[d.length - 1], + count == null ? 10 : count, + specifier, + ); + }; + + scale.nice = function (count) { + if (count == null) count = 10; + + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + + if (stop < start) { + (step = start), (start = stop), (stop = step); + (step = i0), (i0 = i1), (i1 = step); + } + + while (maxIter-- > 0) { + step = tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else 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; + }; + + return scale; + } + + function linear_linear() { + var scale = continuous(); + + scale.copy = function () { + return copy(scale, linear_linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); + } // CONCATENATED MODULE: ../node_modules/d3-ease/src/cubic.js + + function cubicIn(t) { + return t * t * t; + } + + function cubicOut(t) { + return --t * t * t + 1; + } + + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } // CONCATENATED MODULE: ../node_modules/d3-dispatch/src/dispatch.js + + var noop = { value: () => {} }; + + function dispatch_dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + '') || t in _ || /[\s.]/.test(t)) + throw new Error('illegal type: ' + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function dispatch_parseTypenames(typenames, types) { + return typenames + .trim() + .split(/^|\s+/) + .map(function (t) { + var name = '', + i = t.indexOf('.'); + if (i >= 0) (name = t.slice(i + 1)), (t = t.slice(0, i)); + if (t && !types.hasOwnProperty(t)) + throw new Error('unknown type: ' + t); + return { type: t, name: name }; + }); + } + + Dispatch.prototype = dispatch_dispatch.prototype = { + constructor: Dispatch, + on: function (typename, callback) { + var _ = this._, + T = dispatch_parseTypenames(typename + '', _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) + if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) + return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== 'function') + throw new Error('invalid callback: ' + callback); + while (++i < n) { + if ((t = (typename = T[i]).type)) + _[t] = set(_[t], typename.name, callback); + else if (callback == null) + for (t in _) _[t] = set(_[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 args = new Array(n), i = 0, n, t; i < n; ++i) + args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) + throw new 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 new Error('unknown type: ' + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + }, + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set(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; + } + } + if (callback != null) type.push({ name: name, value: callback }); + return type; + } + + /* harmony default export */ const src_dispatch = dispatch_dispatch; // CONCATENATED MODULE: ../node_modules/d3-timer/src/timer.js + + var timer_frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = + typeof performance === 'object' && performance.now ? performance : Date, + setFrame = + typeof window === 'object' && 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; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function (callback, delay, time) { + if (typeof callback !== 'function') + throw new TypeError('callback is not a function'); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function () { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + }, + }; + + function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, + e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e); + t = t._next; + } + --timer_frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + timer_frame = timeout = 0; + try { + timerFlush(); + } finally { + timer_frame = 0; + nap(); + clockNow = 0; + } + } + + function poke() { + var now = clock.now(), + delay = now - clockLast; + if (delay > pokeDelay) (clockSkew -= delay), (clockLast = now); + } + + function nap() { + var t0, + t1 = taskHead, + t2, + time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + (t0 = t1), (t1 = t1._next); + } else { + (t2 = t1._next), (t1._next = null); + t1 = t0 ? (t0._next = t2) : (taskHead = t2); + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (timer_frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) + timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) + (clockLast = clock.now()), (interval = setInterval(poke, pokeDelay)); + (timer_frame = 1), setFrame(wake); + } + } // CONCATENATED MODULE: ../node_modules/d3-timer/src/timeout.js + + /* harmony default export */ function src_timeout(callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart( + (elapsed) => { + t.stop(); + callback(elapsed + delay); + }, + delay, + time, + ); + return t; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/schedule.js + + var emptyOn = src_dispatch('start', 'end', 'cancel', 'interrupt'); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + /* harmony default export */ function schedule( + node, + name, + id, + index, + group, + timing, + ) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED, + }); + } + + function init(node, id) { + var schedule = schedule_get(node, id); + if (schedule.state > CREATED) + throw new Error('too late; already scheduled'); + return schedule; + } + + function schedule_set(node, id) { + var schedule = schedule_get(node, id); + if (schedule.state > STARTED) + throw new Error('too late; already running'); + return schedule; + } + + function schedule_get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) + throw new Error('transition not found'); + return schedule; + } + + function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return src_timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call('interrupt', node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call('cancel', node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + src_timeout(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call('start', node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array((n = self.tween.length)); + for (i = 0, j = -1; i < n; ++i) { + if ( + (o = self.tween[i].value.call( + node, + node.__data__, + self.index, + self.group, + )) + ) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = + elapsed < self.duration + ? self.ease.call(null, elapsed / self.duration) + : (self.timer.restart(stop), (self.state = ENDING), 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call('end', node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/interrupt.js + + /* harmony default export */ function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ''; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call( + active ? 'interrupt' : 'cancel', + node, + node.__data__, + schedule.index, + schedule.group, + ); + delete schedules[i]; + } + + if (empty) delete node.__transition; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/interrupt.js + + /* harmony default export */ function selection_interrupt(name) { + return this.each(function () { + interrupt(this, name); + }); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/decompose.js + + var degrees = 180 / Math.PI; + + var decompose_identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1, + }; + + /* harmony default export */ function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if ((scaleX = Math.sqrt(a * a + b * b))) (a /= scaleX), (b /= scaleX); + if ((skewX = a * c + b * d)) (c -= a * skewX), (d -= b * skewX); + if ((scaleY = Math.sqrt(c * c + d * d))) + (c /= scaleY), (d /= scaleY), (skewX /= scaleY); + if (a * d < b * c) + (a = -a), (b = -b), (skewX = -skewX), (scaleX = -scaleX); + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY, + }; + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/parse.js + + var svgNode; + + /* eslint-disable no-undef */ + function parseCss(value) { + const m = new (typeof DOMMatrix === 'function' + ? DOMMatrix + : WebKitCSSMatrix)(value + ''); + return m.isIdentity + ? decompose_identity + : decompose(m.a, m.b, m.c, m.d, m.e, m.f); + } + + function parseSvg(value) { + if (value == null) return decompose_identity; + if (!svgNode) + svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'g'); + svgNode.setAttribute('transform', value); + if (!(value = svgNode.transform.baseVal.consolidate())) + return decompose_identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } // CONCATENATED MODULE: ../node_modules/d3-interpolate/src/transform/index.js + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + ' ' : ''; + } + + function translate(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: src_number(xa, xb) }, + { i: i - 2, x: src_number(ya, yb) }, + ); + } else if (xb || yb) { + s.push('translate(' + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; + else if (b - a > 180) a += 360; // shortest path + q.push({ + i: s.push(pop(s) + 'rotate(', null, degParen) - 2, + x: src_number(a, b), + }); + } else if (b) { + s.push(pop(s) + 'rotate(' + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({ + i: s.push(pop(s) + 'skewX(', null, degParen) - 2, + x: src_number(a, b), + }); + } else if (b) { + s.push(pop(s) + 'skewX(' + b + degParen); + } + } + + function scale(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: src_number(xa, xb) }, + { i: i - 2, x: src_number(ya, yb) }, + ); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + 'scale(' + xb + ',' + yb + ')'); + } + } + + return function (a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + (a = parse(a)), (b = parse(b)); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function (t) { + var i = -1, + n = q.length, + o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(''); + }; + }; + } + + var interpolateTransformCss = interpolateTransform( + parseCss, + 'px, ', + 'px)', + 'deg)', + ); + var interpolateTransformSvg = interpolateTransform( + parseSvg, + ', ', + ')', + ')', + ); // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/tween.js + + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = schedule_set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== 'function') throw new Error(); + return function () { + var schedule = schedule_set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + 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; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + /* harmony default export */ function tween(name, value) { + var id = this._id; + + name += ''; + + if (arguments.length < 2) { + var tween = schedule_get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each( + (value == null ? tweenRemove : tweenFunction)(id, name, value), + ); + } + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function () { + var schedule = schedule_set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply( + this, + arguments, + ); + }); + + return function (node) { + return schedule_get(node, id).value[name]; + }; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/interpolate.js + + /* harmony default export */ function interpolate(a, b) { + var c; + return (typeof b === 'number' + ? src_number + : b instanceof color + ? rgb + : (c = color(b)) + ? ((b = c), rgb) + : string)(a, b); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attr.js + + function attr_attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attr_attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attr_attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + '', + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 + ? null + : string0 === string00 + ? interpolate0 + : (interpolate0 = interpolate((string00 = string0), value1)); + }; + } + + function attr_attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + '', + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 + ? null + : string0 === string00 + ? interpolate0 + : (interpolate0 = interpolate((string00 = string0), value1)); + }; + } + + function attr_attrFunction(name, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0, + value1 = value(this), + string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ''; + return string0 === string1 + ? null + : string0 === string00 && string1 === string10 + ? interpolate0 + : ((string10 = string1), + (interpolate0 = interpolate((string00 = string0), value1))); + }; + } + + function attr_attrFunctionNS(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0, + value1 = value(this), + string1; + if (value1 == null) + return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ''; + return string0 === string1 + ? null + : string0 === string00 && string1 === string10 + ? interpolate0 + : ((string10 = string1), + (interpolate0 = interpolate((string00 = string0), value1))); + }; + } + + /* harmony default export */ function transition_attr(name, value) { + var fullname = namespace(name), + i = fullname === 'transform' ? interpolateTransformSvg : interpolate; + return this.attrTween( + name, + typeof value === 'function' + ? (fullname.local ? attr_attrFunctionNS : attr_attrFunction)( + fullname, + i, + tweenValue(this, 'attr.' + name, value), + ) + : value == null + ? (fullname.local ? attr_attrRemoveNS : attr_attrRemove)(fullname) + : (fullname.local ? attr_attrConstantNS : attr_attrConstant)( + fullname, + i, + value, + ), + ); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/attrTween.js + + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); + }; + } + + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } + + function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; + } + + function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; + } + + /* harmony default export */ function transition_attrTween(name, value) { + var key = 'attr.' + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== 'function') throw new Error(); + var fullname = namespace(name); + return this.tween( + key, + (fullname.local ? attrTweenNS : attrTween)(fullname, value), + ); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/delay.js + + 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; + } + ); + } + + /* harmony default export */ function delay(value) { + var id = this._id; + + return arguments.length + ? this.each( + (typeof value === 'function' ? delayFunction : delayConstant)( + id, + value, + ), + ) + : schedule_get(this.node(), id).delay; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/duration.js + + function durationFunction(id, value) { + return function () { + schedule_set(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return ( + (value = +value), + function () { + schedule_set(this, id).duration = value; + } + ); + } + + /* harmony default export */ function duration(value) { + var id = this._id; + + return arguments.length + ? this.each( + (typeof value === 'function' ? durationFunction : durationConstant)( + id, + value, + ), + ) + : schedule_get(this.node(), id).duration; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/ease.js + + function easeConstant(id, value) { + if (typeof value !== 'function') throw new Error(); + return function () { + schedule_set(this, id).ease = value; + }; + } + + /* harmony default export */ function ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : schedule_get(this.node(), id).ease; + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/easeVarying.js + + function easeVarying(id, value) { + return function () { + var v = value.apply(this, arguments); + if (typeof v !== 'function') throw new Error(); + schedule_set(this, id).ease = v; + }; + } + + /* harmony default export */ function transition_easeVarying(value) { + if (typeof value !== 'function') throw new Error(); + return this.each(easeVarying(this._id, value)); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/filter.js + + /* harmony default export */ function transition_filter(match) { + if (typeof match !== 'function') match = matcher(match); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = new Array(m), + j = 0; + j < m; + ++j + ) { + for ( + var group = groups[j], + n = group.length, + subgroup = (subgroups[j] = []), + node, + i = 0; + i < n; + ++i + ) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/merge.js + + /* harmony default export */ function transition_merge(transition) { + if (transition._id !== this._id) throw new Error(); + + for ( + var groups0 = this._groups, + groups1 = transition._groups, + m0 = groups0.length, + m1 = groups1.length, + m = Math.min(m0, m1), + merges = new Array(m0), + j = 0; + j < m; + ++j + ) { + for ( + var group0 = groups0[j], + group1 = groups1[j], + n = group0.length, + merge = (merges[j] = new Array(n)), + node, + i = 0; + i < n; + ++i + ) { + if ((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); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/on.js + + function start(name) { + return (name + '') + .trim() + .split(/^|\s+/) + .every(function (t) { + var i = t.indexOf('.'); + if (i >= 0) t = t.slice(0, i); + return !t || t === 'start'; + }); + } + + function onFunction(id, name, listener) { + var on0, + on1, + sit = start(name) ? init : schedule_set; + return function () { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + /* harmony default export */ function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? schedule_get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/remove.js + + function removeFunction(id) { + return function () { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; + } + + /* harmony default export */ function transition_remove() { + return this.on('end.remove', removeFunction(this._id)); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/select.js + + /* harmony default export */ function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== 'function') select = selector(select); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = new Array(m), + j = 0; + j < m; + ++j + ) { + for ( + var group = groups[j], + n = group.length, + subgroup = (subgroups[j] = new Array(n)), + node, + subnode, + i = 0; + i < n; + ++i + ) { + if ( + (node = group[i]) && + (subnode = select.call(node, node.__data__, i, group)) + ) { + if ('__data__' in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule( + subgroup[i], + name, + id, + i, + subgroup, + schedule_get(node, id), + ); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selectAll.js + + /* harmony default export */ function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== 'function') select = selectorAll(select); + + for ( + var groups = this._groups, + m = groups.length, + subgroups = [], + parents = [], + j = 0; + j < m; + ++j + ) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if ((node = group[i])) { + for ( + var children = select.call(node, node.__data__, i, group), + child, + inherit = schedule_get(node, id), + k = 0, + l = children.length; + k < l; + ++k + ) { + if ((child = children[k])) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/selection.js + + var selection_Selection = src_selection.prototype.constructor; + + /* harmony default export */ function transition_selection() { + return new selection_Selection(this._groups, this._parents); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/style.js + + function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function () { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 + ? null + : string0 === string00 && string1 === string10 + ? interpolate0 + : (interpolate0 = interpolate( + (string00 = string0), + (string10 = string1), + )); + }; + } + + function style_styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function style_styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + '', + interpolate0; + return function () { + var string0 = styleValue(this, name); + return string0 === string1 + ? null + : string0 === string00 + ? interpolate0 + : (interpolate0 = interpolate((string00 = string0), value1)); + }; + } + + function style_styleFunction(name, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ''; + if (value1 == null) + string1 = value1 = + (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 + ? null + : string0 === string00 && string1 === string10 + ? interpolate0 + : ((string10 = string1), + (interpolate0 = interpolate((string00 = string0), value1))); + }; + } + + function styleMaybeRemove(id, name) { + var on0, + on1, + listener0, + key = 'style.' + name, + event = 'end.' + key, + remove; + return function () { + var schedule = schedule_set(this, id), + on = schedule.on, + listener = + schedule.value[key] == null + ? remove || (remove = style_styleRemove(name)) + : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) + (on1 = (on0 = on).copy()).on(event, (listener0 = listener)); + + schedule.on = on1; + }; + } + + /* harmony default export */ function transition_style( + name, + value, + priority, + ) { + var i = + (name += '') === 'transform' ? interpolateTransformCss : interpolate; + return value == null + ? this.styleTween(name, styleNull(name, i)).on( + 'end.style.' + name, + style_styleRemove(name), + ) + : typeof value === 'function' + ? this.styleTween( + name, + style_styleFunction( + name, + i, + tweenValue(this, 'style.' + name, value), + ), + ).each(styleMaybeRemove(this._id, name)) + : this.styleTween( + name, + style_styleConstant(name, i, value), + priority, + ).on('end.style.' + name, null); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/styleTween.js + + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } + + function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; + } + + /* harmony default export */ function transition_styleTween( + name, + value, + priority, + ) { + var key = 'style.' + (name += ''); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== 'function') throw new Error(); + return this.tween( + key, + styleTween(name, value, priority == null ? '' : priority), + ); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/text.js + + function text_textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function text_textFunction(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? '' : value1; + }; + } + + /* harmony default export */ function transition_text(value) { + return this.tween( + 'text', + typeof value === 'function' + ? text_textFunction(tweenValue(this, 'text', value)) + : text_textConstant(value == null ? '' : value + ''), + ); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/textTween.js + + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } + + function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; + } + + /* harmony default export */ function transition_textTween(value) { + var key = 'text'; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== 'function') throw new Error(); + return this.tween(key, textTween(value)); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/transition.js + + /* harmony default export */ function transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if ((node = group[i])) { + var inherit = schedule_get(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); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/end.js + + /* harmony default export */ function end() { + var on0, + on1, + that = this, + id = that._id, + size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = { value: reject }, + end = { + value: function () { + if (--size === 0) resolve(); + }, + }; + + that.each(function () { + var schedule = schedule_set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/transition/index.js + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition_transition(name) { + return src_selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = src_selection.prototype; + + Transition.prototype = transition_transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition, + 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: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: tween, + delay: delay, + duration: duration, + ease: ease, + easeVarying: transition_easeVarying, + end: end, + [Symbol.iterator]: selection_prototype[Symbol.iterator], + }; // CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/transition.js + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut, + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + return timing; + } + + /* harmony default export */ function selection_transition(name) { + var id, timing; + + if (name instanceof Transition) { + (id = name._id), (name = name._name); + } else { + (id = newId()), + ((timing = defaultTiming).time = now()), + (name = name == null ? null : name + ''); + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if ((node = group[i])) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + } // CONCATENATED MODULE: ../node_modules/d3-transition/src/selection/index.js + + src_selection.prototype.interrupt = selection_interrupt; + src_selection.prototype.transition = selection_transition; // CONCATENATED MODULE: ../node_modules/d3-transition/src/index.js // CONCATENATED MODULE: ./colorUtils.js + + function generateHash(name) { + // Return a vector (0.0->1.0) that is a hash of the input string. + // The hash is computed to favor early characters over later ones, so + // that strings with similar starts have similar vectors. Only the first + // 6 characters are considered. + const MAX_CHAR = 6; + + let hash = 0; + let maxHash = 0; + let weight = 1; + const mod = 10; + + if (name) { + for (let i = 0; i < name.length; i++) { + if (i > MAX_CHAR) { + break; + } + hash += weight * (name.charCodeAt(i) % mod); + maxHash += weight * (mod - 1); + weight *= 0.7; + } + if (maxHash > 0) { + hash = hash / maxHash; + } + } + return hash; + } + + function generateColorVector(name) { + let vector = 0; + if (name) { + const nameArr = name.split('`'); + if (nameArr.length > 1) { + name = nameArr[nameArr.length - 1]; // drop module name if present + } + name = name.split('(')[0]; // drop extra info + vector = generateHash(name); + } + return vector; + } // CONCATENATED MODULE: ./colorScheme.js + + function calculateColor(hue, vector) { + let r; + let g; + let b; + + if (hue === 'red') { + r = 200 + Math.round(55 * vector); + g = 50 + Math.round(80 * vector); + b = g; + } else if (hue === 'orange') { + r = 190 + Math.round(65 * vector); + g = 90 + Math.round(65 * vector); + b = 0; + } else if (hue === 'yellow') { + r = 175 + Math.round(55 * vector); + g = r; + b = 50 + Math.round(20 * vector); + } else if (hue === 'green') { + r = 50 + Math.round(60 * vector); + g = 200 + Math.round(55 * vector); + b = r; + } else if (hue === 'pastelgreen') { + // rgb(163,195,72) - rgb(238,244,221) + r = 163 + Math.round(75 * vector); + g = 195 + Math.round(49 * vector); + b = 72 + Math.round(149 * vector); + } else if (hue === 'blue') { + // rgb(91,156,221) - rgb(217,232,247) + r = 91 + Math.round(126 * vector); + g = 156 + Math.round(76 * vector); + b = 221 + Math.round(26 * vector); + } else if (hue === 'aqua') { + r = 50 + Math.round(60 * vector); + g = 165 + Math.round(55 * vector); + b = g; + } else if (hue === 'cold') { + r = 0 + Math.round(55 * (1 - vector)); + g = 0 + Math.round(230 * (1 - vector)); + b = 200 + Math.round(55 * vector); + } else { + // original warm palette + r = 200 + Math.round(55 * vector); + g = 0 + Math.round(230 * (1 - vector)); + b = 0 + Math.round(55 * (1 - vector)); + } + + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } // CONCATENATED MODULE: ./flamegraph.js + + /* harmony default export */ function flamegraph() { + let w = 960; // graph width + let h = null; // graph height + let c = 18; // cell height + let selection = null; // selection + let tooltip = null; // tooltip + let title = ''; // graph title + let transitionDuration = 750; + let transitionEase = cubicInOut; // tooltip offset + let sort = false; + let inverted = false; // invert the graph direction + let clickHandler = null; + let hoverHandler = null; + let minFrameSize = 0; + let detailsElement = null; + let searchDetails = null; + let selfValue = false; + let resetHeightOnZoom = false; + let scrollOnZoom = false; + let minHeight = null; + let computeDelta = false; + let colorHue = null; + + let getName = function (d) { + return d.data.n || d.data.name; + }; + + let getValue = function (d) { + if ('v' in d) { + return d.v; + } else { + return d.value; + } + }; + + let getChildren = function (d) { + return d.c || d.children; + }; + + let getLibtype = function (d) { + return d.data.l || d.data.libtype; + }; + + let getDelta = function (d) { + if ('d' in d.data) { + return d.data.d; + } else { + return d.data.delta; + } + }; + + let searchHandler = function (searchResults, searchSum, totalValue) { + searchDetails = () => { + if (detailsElement) { + detailsElement.textContent = + 'search: ' + + searchSum + + ' of ' + + totalValue + + ' total time ( ' + + format('.3f')(100 * (searchSum / totalValue), 3) + + '%)'; + } + }; + searchDetails(); + }; + const originalSearchHandler = searchHandler; + + let searchMatch = (d, term, ignoreCase = false) => { + if (!term) { + return false; + } + let label = getName(d); + if (ignoreCase) { + term = term.toLowerCase(); + label = label.toLowerCase(); + } + const re = new RegExp(term); + return typeof label !== 'undefined' && label && label.match(re); + }; + const originalSearchMatch = searchMatch; + + let detailsHandler = function (d) { + if (detailsElement) { + if (d) { + detailsElement.textContent = d; + } else { + if (typeof searchDetails === 'function') { + searchDetails(); + } else { + detailsElement.textContent = ''; + } + } + } + }; + const originalDetailsHandler = detailsHandler; + + let labelHandler = function (d) { + return ( + getName(d) + + ' (' + + format('.3f')(100 * (d.x1 - d.x0), 3) + + '%, ' + + getValue(d) + + ' ms)' + ); + }; + + let colorMapper = function (d) { + return d.highlight ? '#E600E6' : colorHash(getName(d), getLibtype(d)); + }; + const originalColorMapper = colorMapper; + + function colorHash(name, libtype) { + // Return a color for the given name and library type. The library type + // selects the hue, and the name is hashed to a color in that hue. + + // default when libtype is not in use + let hue = colorHue || 'warm'; + + if (!colorHue && !(typeof libtype === 'undefined' || libtype === '')) { + // Select hue. Order is important. + hue = 'red'; + if (typeof name !== 'undefined' && name && name.match(/::/)) { + hue = 'yellow'; + } + if (libtype === 'kernel') { + hue = 'orange'; + } else if (libtype === 'jit') { + hue = 'green'; + } else if (libtype === 'inlined') { + hue = 'aqua'; + } + } + + const vector = generateColorVector(name); + return calculateColor(hue, vector); + } + + function show(d) { + d.data.fade = false; + d.data.hide = false; + if (d.children) { + d.children.forEach(show); + } + } + + function hideSiblings(node) { + let child = node; + let parent = child.parent; + let children, i, sibling; + while (parent) { + children = parent.children; + i = children.length; + while (i--) { + sibling = children[i]; + if (sibling !== child) { + sibling.data.hide = true; + } + } + child = parent; + parent = child.parent; + } + } + + function fadeAncestors(d) { + if (d.parent) { + d.parent.data.fade = true; + fadeAncestors(d.parent); + } + } + + function zoom(d) { + if (tooltip) tooltip.hide(); + hideSiblings(d); + show(d); + fadeAncestors(d); + update(); + if (scrollOnZoom) { + const chartOffset = src_select(this).select('svg')._groups[0][0] + .parentNode.offsetTop; + const maxFrames = (window.innerHeight - chartOffset) / c; + const frameOffset = (d.height - maxFrames + 10) * c; + window.scrollTo({ + top: chartOffset + frameOffset, + left: 0, + behavior: 'smooth', + }); + } + if (typeof clickHandler === 'function') { + clickHandler(d); + } + } + + function searchTree(d, term) { + const results = []; + let sum = 0; + + function searchInner(d, foundParent) { + let found = false; + + if (searchMatch(d, term)) { + d.highlight = true; + found = true; + if (!foundParent) { + sum += getValue(d); + } + results.push(d); + } else { + d.highlight = false; + } + + if (getChildren(d)) { + getChildren(d).forEach(function (child) { + searchInner(child, foundParent || found); + }); + } + } + searchInner(d, false); + + return [results, sum]; + } + + function findTree(d, id) { + if (d.id === id) { + return d; + } else { + const children = getChildren(d); + if (children) { + for (let i = 0; i < children.length; i++) { + const found = findTree(children[i], id); + if (found) { + return found; + } + } + } + } + } + + function clear(d) { + d.highlight = false; + if (getChildren(d)) { + getChildren(d).forEach(function (child) { + clear(child); + }); + } + } + + function doSort(a, b) { + if (typeof sort === 'function') { + return sort(a, b); + } else if (sort) { + return ascending_ascending(getName(a), getName(b)); + } + } + + const p = partition(); + + function filterNodes(root) { + let nodeList = root.descendants(); + if (minFrameSize > 0) { + const kx = w / (root.x1 - root.x0); + nodeList = nodeList.filter(function (el) { + return (el.x1 - el.x0) * kx > minFrameSize; + }); + } + return nodeList; + } + + function update() { + selection.each(function (root) { + const x = linear_linear().range([0, w]); + const y = linear_linear().range([0, c]); + + reappraiseNode(root); + + if (sort) root.sort(doSort); + + p(root); + + const kx = w / (root.x1 - root.x0); + function width(d) { + return (d.x1 - d.x0) * kx; + } + + const descendants = filterNodes(root); + const svg = src_select(this).select('svg'); + svg.attr('width', w); + + let g = svg.selectAll('g').data(descendants, function (d) { + return d.id; + }); + + // if height is not set: set height on first update, after nodes were filtered by minFrameSize + if (!h || resetHeightOnZoom) { + const maxDepth = Math.max.apply( + null, + descendants.map(function (n) { + return n.depth; + }), + ); + + h = (maxDepth + 3) * c; + if (h < minHeight) h = minHeight; + + svg.attr('height', h); + } + + g.transition() + .duration(transitionDuration) + .ease(transitionEase) + .attr('transform', function (d) { + return ( + 'translate(' + + x(d.x0) + + ',' + + (inverted ? y(d.depth) : h - y(d.depth) - c) + + ')' + ); + }); + + g.select('rect') + .transition() + .duration(transitionDuration) + .ease(transitionEase) + .attr('width', width); + + const node = g + .enter() + .append('svg:g') + .attr('transform', function (d) { + return ( + 'translate(' + + x(d.x0) + + ',' + + (inverted ? y(d.depth) : h - y(d.depth) - c) + + ')' + ); + }); + + node + .append('svg:rect') + .transition() + .delay(transitionDuration / 2) + .attr('width', width); + + if (!tooltip) { + node.append('svg:title'); + } + + node.append('foreignObject').append('xhtml:div'); + + // Now we have to re-select to see the new elements (why?). + g = svg.selectAll('g').data(descendants, function (d) { + return d.id; + }); + + g.attr('width', width) + .attr('height', function (d) { + return c; + }) + .attr('name', function (d) { + return getName(d); + }) + .attr('class', function (d) { + return d.data.fade ? 'frame fade' : 'frame'; + }); + + g.select('rect') + .attr('height', function (d) { + return c; + }) + .attr('fill', function (d) { + return colorMapper(d); + }); + + if (!tooltip) { + g.select('title').text(labelHandler); + } + + g.select('foreignObject') + .attr('width', width) + .attr('height', function (d) { + return c; + }) + .select('div') + .attr('class', 'd3-flame-graph-label') + .style('display', function (d) { + return width(d) < 35 ? 'none' : 'block'; + }) + .transition() + .delay(transitionDuration) + .text(getName); + + g.on('click', (_, d) => { + zoom(d); + }); + + g.exit().remove(); + + g.on('mouseover', function (_, d) { + if (tooltip) tooltip.show(d, this); + detailsHandler(labelHandler(d)); + if (typeof hoverHandler === 'function') { + hoverHandler(d); + } + }).on('mouseout', function () { + if (tooltip) tooltip.hide(); + detailsHandler(null); + }); + }); + } + + function merge(data, samples) { + samples.forEach(function (sample) { + const node = data.find(function (element) { + return element.name === sample.name; + }); + + if (node) { + node.value += sample.value; + if (sample.children) { + if (!node.children) { + node.children = []; + } + merge(node.children, sample.children); + } + } else { + data.push(sample); + } + }); + } + + function forEachNode(node, f) { + f(node); + let children = node.children; + if (children) { + const stack = [children]; + let count, child, grandChildren; + while (stack.length) { + children = stack.pop(); + count = children.length; + while (count--) { + child = children[count]; + f(child); + grandChildren = child.children; + if (grandChildren) { + stack.push(grandChildren); + } + } + } + } + } + + function adoptNode(node) { + let id = 0; + forEachNode(node, function (n) { + n.id = id++; + }); + } + + function reappraiseNode(root) { + let node, + children, + grandChildren, + childrenValue, + i, + j, + child, + childValue; + const stack = []; + const included = []; + const excluded = []; + const compoundValue = !selfValue; + let item = root.data; + if (item.hide) { + root.value = 0; + children = root.children; + if (children) { + excluded.push(children); + } + } else { + root.value = item.fade ? 0 : getValue(item); + stack.push(root); + } + // First DFS pass: + // 1. Update node.value with node's self value + // 2. Populate excluded list with children under hidden nodes + // 3. Populate included list with children under visible nodes + while ((node = stack.pop())) { + children = node.children; + if (children && (i = children.length)) { + childrenValue = 0; + while (i--) { + child = children[i]; + item = child.data; + if (item.hide) { + child.value = 0; + grandChildren = child.children; + if (grandChildren) { + excluded.push(grandChildren); + } + continue; + } + if (item.fade) { + child.value = 0; + } else { + childValue = getValue(item); + child.value = childValue; + childrenValue += childValue; + } + stack.push(child); + } + // Here second part of `&&` is actually checking for `node.data.fade`. However, + // checking for node.value is faster and presents more oportunities for JS optimizer. + if (compoundValue && node.value) { + node.value -= childrenValue; + } + included.push(children); + } + } + // Postorder traversal to compute compound value of each visible node. + i = included.length; + while (i--) { + children = included[i]; + childrenValue = 0; + j = children.length; + while (j--) { + childrenValue += children[j].value; + } + children[0].parent.value += childrenValue; + } + // Continue DFS to set value of all hidden nodes to 0. + while (excluded.length) { + children = excluded.pop(); + j = children.length; + while (j--) { + child = children[j]; + child.value = 0; + grandChildren = child.children; + if (grandChildren) { + excluded.push(grandChildren); + } + } + } + } + + function processData() { + selection.datum((data) => { + if (data.constructor.name !== 'Node') { + // creating a root hierarchical structure + const root = hierarchy(data, getChildren); + + // augumenting nodes with ids + adoptNode(root); + + // calculate actual value + reappraiseNode(root); + + // store value for later use + root.originalValue = root.value; + + // computing deltas for differentials + if (computeDelta) { + root.eachAfter((node) => { + let sum = getDelta(node); + const children = node.children; + let i = children && children.length; + while (--i >= 0) sum += children[i].delta; + node.delta = sum; + }); + } + + // setting the bound data for the selection + return root; + } + }); + } + + function chart(s) { + if (!arguments.length) { + return chart; + } + + // saving the selection on `.call` + selection = s; + + // processing raw data to be used in the chart + processData(); + + // create chart svg + selection.each(function (data) { + if (src_select(this).select('svg').size() === 0) { + const svg = src_select(this) + .append('svg:svg') + .attr('width', w) + .attr('class', 'partition d3-flame-graph'); + + if (h) { + if (h < minHeight) h = minHeight; + svg.attr('height', h); + } + + svg + .append('svg:text') + .attr('class', 'title') + .attr('text-anchor', 'middle') + .attr('y', '25') + .attr('x', w / 2) + .attr('fill', '#808080') + .text(title); + + if (tooltip) svg.call(tooltip); + } + }); + + // first draw + update(); + } + + chart.height = function (_) { + if (!arguments.length) { + return h; + } + h = _; + return chart; + }; + + chart.minHeight = function (_) { + if (!arguments.length) { + return minHeight; + } + minHeight = _; + return chart; + }; + + chart.width = function (_) { + if (!arguments.length) { + return w; + } + w = _; + return chart; + }; + + chart.cellHeight = function (_) { + if (!arguments.length) { + return c; + } + c = _; + return chart; + }; + + chart.tooltip = function (_) { + if (!arguments.length) { + return tooltip; + } + if (typeof _ === 'function') { + tooltip = _; + } + return chart; + }; + + chart.title = function (_) { + if (!arguments.length) { + return title; + } + title = _; + return chart; + }; + + chart.transitionDuration = function (_) { + if (!arguments.length) { + return transitionDuration; + } + transitionDuration = _; + return chart; + }; + + chart.transitionEase = function (_) { + if (!arguments.length) { + return transitionEase; + } + transitionEase = _; + return chart; + }; + + chart.sort = function (_) { + if (!arguments.length) { + return sort; + } + sort = _; + return chart; + }; + + chart.inverted = function (_) { + if (!arguments.length) { + return inverted; + } + inverted = _; + return chart; + }; + + chart.computeDelta = function (_) { + if (!arguments.length) { + return computeDelta; + } + computeDelta = _; + return chart; + }; + + chart.setLabelHandler = function (_) { + if (!arguments.length) { + return labelHandler; + } + labelHandler = _; + return chart; + }; + // Kept for backwards compatibility. + chart.label = chart.setLabelHandler; + + chart.search = function (term) { + const searchResults = []; + let searchSum = 0; + let totalValue = 0; + selection.each(function (data) { + const res = searchTree(data, term); + searchResults.push(...res[0]); + searchSum += res[1]; + totalValue += data.originalValue; + }); + searchHandler(searchResults, searchSum, totalValue); + update(); + }; + + chart.findById = function (id) { + if (typeof id === 'undefined' || id === null) { + return null; + } + let found = null; + selection.each(function (data) { + if (found === null) { + found = findTree(data, id); + } + }); + return found; + }; + + chart.clear = function () { + detailsHandler(null); + selection.each(function (root) { + clear(root); + update(); + }); + }; + + chart.zoomTo = function (d) { + zoom(d); + }; + + chart.resetZoom = function () { + selection.each(function (root) { + zoom(root); // zoom to root + }); + }; + + chart.onClick = function (_) { + if (!arguments.length) { + return clickHandler; + } + clickHandler = _; + return chart; + }; + + chart.onHover = function (_) { + if (!arguments.length) { + return hoverHandler; + } + hoverHandler = _; + return chart; + }; + + chart.merge = function (data) { + if (!selection) { + return chart; + } + + // TODO: Fix merge with zoom + // Merging a zoomed chart doesn't work properly, so + // clearing zoom before merge. + // To apply zoom on merge, we would need to set hide + // and fade on new data according to current data. + // New ids are generated for the whole data structure, + // so previous ids might not be the same. For merge to + // work with zoom, previous ids should be maintained. + this.resetZoom(); + + // Clear search details + // Merge requires a new search, updating data and + // the details handler with search results. + // Since we don't store the search term, can't + // perform search again. + searchDetails = null; + detailsHandler(null); + + selection.datum((root) => { + merge([root.data], [data]); + return root.data; + }); + processData(); + update(); + return chart; + }; + + chart.update = function (data) { + if (!selection) { + return chart; + } + if (data) { + selection.datum(data); + processData(); + } + update(); + return chart; + }; + + chart.destroy = function () { + if (!selection) { + return chart; + } + if (tooltip) { + tooltip.hide(); + if (typeof tooltip.destroy === 'function') { + tooltip.destroy(); + } + } + selection.selectAll('svg').remove(); + return chart; + }; + + chart.setColorMapper = function (_) { + if (!arguments.length) { + colorMapper = originalColorMapper; + return chart; + } + colorMapper = (d) => { + const originalColor = originalColorMapper(d); + return _(d, originalColor); + }; + return chart; + }; + // Kept for backwards compatibility. + chart.color = chart.setColorMapper; + + chart.setColorHue = function (_) { + if (!arguments.length) { + colorHue = null; + return chart; + } + colorHue = _; + return chart; + }; + + chart.minFrameSize = function (_) { + if (!arguments.length) { + return minFrameSize; + } + minFrameSize = _; + return chart; + }; + + chart.setDetailsElement = function (_) { + if (!arguments.length) { + return detailsElement; + } + detailsElement = _; + return chart; + }; + // Kept for backwards compatibility. + chart.details = chart.setDetailsElement; + + chart.selfValue = function (_) { + if (!arguments.length) { + return selfValue; + } + selfValue = _; + return chart; + }; + + chart.resetHeightOnZoom = function (_) { + if (!arguments.length) { + return resetHeightOnZoom; + } + resetHeightOnZoom = _; + return chart; + }; + + chart.scrollOnZoom = function (_) { + if (!arguments.length) { + return scrollOnZoom; + } + scrollOnZoom = _; + return chart; + }; + + chart.getName = function (_) { + if (!arguments.length) { + return getName; + } + getName = _; + return chart; + }; + + chart.getValue = function (_) { + if (!arguments.length) { + return getValue; + } + getValue = _; + return chart; + }; + + chart.getChildren = function (_) { + if (!arguments.length) { + return getChildren; + } + getChildren = _; + return chart; + }; + + chart.getLibtype = function (_) { + if (!arguments.length) { + return getLibtype; + } + getLibtype = _; + return chart; + }; + + chart.getDelta = function (_) { + if (!arguments.length) { + return getDelta; + } + getDelta = _; + return chart; + }; + + chart.setSearchHandler = function (_) { + if (!arguments.length) { + searchHandler = originalSearchHandler; + return chart; + } + searchHandler = _; + return chart; + }; + + chart.setDetailsHandler = function (_) { + if (!arguments.length) { + detailsHandler = originalDetailsHandler; + return chart; + } + detailsHandler = _; + return chart; + }; + + chart.setSearchMatch = function (_) { + if (!arguments.length) { + searchMatch = originalSearchMatch; + return chart; + } + searchMatch = _; + return chart; + }; + + return chart; + } + + __webpack_exports__ = __webpack_exports__['default']; + /******/ return __webpack_exports__; + /******/ + })(); +}); diff --git a/development/charts/table/index.html b/development/charts/table/index.html new file mode 100644 index 000000000..ec11ecfde --- /dev/null +++ b/development/charts/table/index.html @@ -0,0 +1,67 @@ + + + + + + + + +
+
+ + + + + + + +
S.NoNameTotalTime
+
+
+ + diff --git a/development/charts/table/jquery.min.js b/development/charts/table/jquery.min.js new file mode 100644 index 000000000..8cdc80eb8 --- /dev/null +++ b/development/charts/table/jquery.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/development/metamaskbot-build-announce.js b/development/metamaskbot-build-announce.js index 9310a92d8..bbe931e5f 100755 --- a/development/metamaskbot-build-announce.js +++ b/development/metamaskbot-build-announce.js @@ -94,6 +94,12 @@ async function start() { // links to bundle browser builds const depVizUrl = `${BUILD_LINK_BASE}/build-artifacts/build-viz/index.html`; const depVizLink = `Build System`; + const moduleInitStatsBackgroundUrl = `${BUILD_LINK_BASE}/test-artifacts/chrome/mv3/initialisation/background/index.html`; + const moduleInitStatsBackgroundLink = `MV3 Background Module Init Stats`; + const moduleInitStatsUIUrl = `${BUILD_LINK_BASE}/test-artifacts/chrome/mv3/initialisation/ui/index.html`; + const moduleInitStatsUILink = `MV3 UI Init Stats`; + const moduleLoadStatsUrl = `${BUILD_LINK_BASE}/test-artifacts/chrome/mv3/load_time/index.html`; + const moduleLoadStatsLink = `Module Load Stats`; // link to artifacts const allArtifactsUrl = `https://circleci.com/gh/MetaMask/metamask-extension/${CIRCLE_BUILD_NUM}#artifacts/containers/0`; @@ -103,6 +109,9 @@ async function start() { `builds (beta): ${betaBuildLinks}`, `builds (flask): ${flaskBuildLinks}`, `build viz: ${depVizLink}`, + `mv3: ${moduleInitStatsBackgroundLink}`, + `mv3: ${moduleInitStatsUILink}`, + `mv3: ${moduleLoadStatsLink}`, `code coverage: ${coverageLink}`, `storybook: ${storybookLink}`, `all artifacts`, diff --git a/test/e2e/benchmark.js b/test/e2e/benchmark.js index fe2dc7926..df4c95756 100644 --- a/test/e2e/benchmark.js +++ b/test/e2e/benchmark.js @@ -1,12 +1,16 @@ #!/usr/bin/env node const path = require('path'); -const { promises: fs, constants: fsConstants } = require('fs'); +const { promises: fs } = require('fs'); const yargs = require('yargs/yargs'); const { hideBin } = require('yargs/helpers'); const ttest = require('ttest'); const { retry } = require('../../development/lib/retry'); const { exitWithError } = require('../../development/lib/exit-with-error'); +const { + isWritable, + getFirstParentDirectoryThatExists, +} = require('../helpers/file'); const { withFixtures, tinyDelayMs } = require('./helpers'); const { PAGES } = require('./webdriver/driver'); @@ -108,35 +112,6 @@ async function profilePageLoad(pages, numSamples, retries) { return results; } -async function isWritable(directory) { - try { - await fs.access(directory, fsConstants.W_OK); - return true; - } catch (error) { - if (error.code !== 'EACCES') { - throw error; - } - return false; - } -} - -async function getFirstParentDirectoryThatExists(directory) { - let nextDirectory = directory; - for (;;) { - try { - await fs.access(nextDirectory, fsConstants.F_OK); - return nextDirectory; - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } else if (nextDirectory === path.dirname(nextDirectory)) { - throw new Error('Failed to find parent directory that exists'); - } - nextDirectory = path.dirname(nextDirectory); - } - } -} - async function main() { const { argv } = yargs(hideBin(process.argv)).usage( '$0 [options]', diff --git a/test/e2e/mv3-stats.js b/test/e2e/mv3-stats.js new file mode 100644 index 000000000..8e8180e02 --- /dev/null +++ b/test/e2e/mv3-stats.js @@ -0,0 +1,111 @@ +#!/usr/bin/env node + +/* eslint-disable node/shebang */ +const path = require('path'); +const { promises: fs } = require('fs'); +const yargs = require('yargs/yargs'); +const { hideBin } = require('yargs/helpers'); + +const { exitWithError } = require('../../development/lib/exit-with-error'); +const { + isWritable, + getFirstParentDirectoryThatExists, +} = require('../helpers/file'); +const { withFixtures, tinyDelayMs } = require('./helpers'); + +/** + * The e2e test case is used to capture load and initialisation time statistics for extension in MV3 environment. + */ + +async function profilePageLoad() { + const parsedLogs = {}; + try { + await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { + await driver.delay(tinyDelayMs); + await driver.navigate(); + await driver.delay(1000); + const logs = await driver.checkBrowserForLavamoatLogs(); + + let logString = ''; + let logType = ''; + + logs.forEach((log) => { + if (log.indexOf('"version": 1') >= 0) { + // log end here + logString += log; + parsedLogs[logType] = JSON.parse(`{${logString}}`); + logString = ''; + logType = ''; + } else if (logType) { + // log string continues + logString += log; + } else if ( + log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 + ) { + // background log starts + logString += log; + logType = 'background'; + } else if (log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0) { + // ui log starts + logString += log; + logType = 'ui'; + } else if (log.search(/"name": "Total"/u) >= 0) { + // load time log starts + logString += log; + logType = 'loadTime'; + } + }); + }); + } catch (error) { + console.log('Error in trying to parse logs.'); + } + return parsedLogs; +} + +async function main() { + const { argv } = yargs(hideBin(process.argv)).usage( + '$0 [options]', + 'Run a page load benchmark', + (_yargs) => + _yargs.option('out', { + description: + 'Output filename. Output printed to STDOUT of this is omitted.', + type: 'string', + normalize: true, + }), + ); + + const results = await profilePageLoad(); + const { out } = argv; + + const logCategories = [ + { key: 'background', dirPath: 'initialisation/background/stacks.json' }, + { key: 'ui', dirPath: 'initialisation/ui/stacks.json' }, + { key: 'loadTime', dirPath: 'load_time/stats.json' }, + ]; + + if (out) { + logCategories.forEach(async ({ key, dirPath }) => { + if (results[key]) { + const outPath = `${out}/${dirPath}`; + const outputDirectory = path.dirname(outPath); + const existingParentDirectory = await getFirstParentDirectoryThatExists( + outputDirectory, + ); + if (!(await isWritable(existingParentDirectory))) { + throw new Error('Specified output file directory is not writable'); + } + if (outputDirectory !== existingParentDirectory) { + await fs.mkdir(outputDirectory, { recursive: true }); + } + await fs.writeFile(outPath, JSON.stringify(results[key], null, 2)); + } + }); + } else { + console.log(JSON.stringify(results, null, 2)); + } +} + +main().catch((error) => { + exitWithError(error); +}); diff --git a/test/helpers/file.js b/test/helpers/file.js new file mode 100644 index 000000000..f2f13fa83 --- /dev/null +++ b/test/helpers/file.js @@ -0,0 +1,37 @@ +/* eslint-disable node/shebang */ +const path = require('path'); +const { promises: fs, constants: fsConstants } = require('fs'); + +async function isWritable(directory) { + try { + await fs.access(directory, fsConstants.W_OK); + return true; + } catch (error) { + if (error.code !== 'EACCES') { + throw error; + } + return false; + } +} + +async function getFirstParentDirectoryThatExists(directory) { + let nextDirectory = directory; + for (;;) { + try { + await fs.access(nextDirectory, fsConstants.F_OK); + return nextDirectory; + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; + } else if (nextDirectory === path.dirname(nextDirectory)) { + throw new Error('Failed to find parent directory that exists'); + } + nextDirectory = path.dirname(nextDirectory); + } + } +} + +module.exports = { + isWritable, + getFirstParentDirectoryThatExists, +};