From ec7b89c67020e1189825089392f961d85c54178d Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Fri, 14 Sep 2012 01:48:23 +0200 Subject: [PATCH] split backend from ffmap-d3 --- html/d3.v2.js | 9414 ----------------- html/force-big.css | 65 - html/force-light.css | 77 - html/force.css | 180 - html/force.js | 709 -- html/geomap.html | 65 - html/geomap.js | 163 - html/gplaypattern.png | Bin 14288 -> 0 bytes html/img/blank.gif | Bin 42 -> 0 bytes html/img/cloud-popup-relative.png | Bin 2564 -> 0 bytes html/img/drag-rectangle-off.png | Bin 1202 -> 0 bytes html/img/drag-rectangle-on.png | Bin 1218 -> 0 bytes html/img/east-mini.png | Bin 451 -> 0 bytes html/img/layer-switcher-maximize.png | Bin 451 -> 0 bytes html/img/layer-switcher-minimize.png | Bin 249 -> 0 bytes html/img/marker-blue.png | Bin 992 -> 0 bytes html/img/marker-gold.png | Bin 831 -> 0 bytes html/img/marker-green.png | Bin 967 -> 0 bytes html/img/marker.png | Bin 606 -> 0 bytes html/img/measuring-stick-off.png | Bin 3343 -> 0 bytes html/img/measuring-stick-on.png | Bin 3816 -> 0 bytes html/img/north-mini.png | Bin 484 -> 0 bytes html/img/panning-hand-off.png | Bin 3875 -> 0 bytes html/img/panning-hand-on.png | Bin 3977 -> 0 bytes html/img/slider.png | Bin 285 -> 0 bytes html/img/south-mini.png | Bin 481 -> 0 bytes html/img/west-mini.png | Bin 453 -> 0 bytes html/img/zoom-minus-mini.png | Bin 359 -> 0 bytes html/img/zoom-plus-mini.png | Bin 489 -> 0 bytes html/img/zoom-world-mini.png | Bin 1072 -> 0 bytes html/img/zoombar.png | Bin 463 -> 0 bytes html/jquery.min.js | 4 - html/links.js | 11 - html/nodes.html | 93 - html/pacman.js | 72 - html/pacman_chomp.wav | Bin 15892 -> 0 bytes html/pacman_eatfruit.wav | Bin 5120 -> 0 bytes html/pacman_eatghost.wav | Bin 6656 -> 0 bytes html/router-down.png | Bin 3471 -> 0 bytes html/router-unknown.png | Bin 1896 -> 0 bytes html/router-up.png | Bin 3361 -> 0 bytes html/style.css | 38 - html/theme/default/framedCloud.css | 0 html/theme/default/google.css | 9 - html/theme/default/ie6-style.css | 7 - html/theme/default/img/add_point_off.png | Bin 1616 -> 0 bytes html/theme/default/img/add_point_on.png | Bin 1464 -> 0 bytes html/theme/default/img/blank.gif | Bin 42 -> 0 bytes html/theme/default/img/close.gif | Bin 1078 -> 0 bytes html/theme/default/img/drag-rectangle-off.png | Bin 1202 -> 0 bytes html/theme/default/img/drag-rectangle-on.png | Bin 1218 -> 0 bytes html/theme/default/img/draw_line_off.png | Bin 1567 -> 0 bytes html/theme/default/img/draw_line_on.png | Bin 1399 -> 0 bytes html/theme/default/img/draw_point_off.png | Bin 1612 -> 0 bytes html/theme/default/img/draw_point_on.png | Bin 1460 -> 0 bytes html/theme/default/img/draw_polygon_off.png | Bin 1546 -> 0 bytes html/theme/default/img/draw_polygon_on.png | Bin 1407 -> 0 bytes html/theme/default/img/editing_tool_bar.png | Bin 3901 -> 0 bytes html/theme/default/img/move_feature_off.png | Bin 1543 -> 0 bytes html/theme/default/img/move_feature_on.png | Bin 1379 -> 0 bytes html/theme/default/img/navigation_history.png | Bin 7021 -> 0 bytes .../default/img/overview_replacement.gif | Bin 79 -> 0 bytes html/theme/default/img/pan-panel-NOALPHA.png | Bin 566 -> 0 bytes html/theme/default/img/pan-panel.png | Bin 1287 -> 0 bytes html/theme/default/img/pan_off.png | Bin 1696 -> 0 bytes html/theme/default/img/pan_on.png | Bin 1568 -> 0 bytes html/theme/default/img/panning-hand-off.png | Bin 3875 -> 0 bytes html/theme/default/img/panning-hand-on.png | Bin 3977 -> 0 bytes html/theme/default/img/remove_point_off.png | Bin 1612 -> 0 bytes html/theme/default/img/remove_point_on.png | Bin 1464 -> 0 bytes html/theme/default/img/ruler.png | Bin 1211 -> 0 bytes html/theme/default/img/save_features_off.png | Bin 357 -> 0 bytes html/theme/default/img/save_features_on.png | Bin 364 -> 0 bytes html/theme/default/img/view_next_off.png | Bin 1644 -> 0 bytes html/theme/default/img/view_next_on.png | Bin 1686 -> 0 bytes html/theme/default/img/view_previous_off.png | Bin 1553 -> 0 bytes html/theme/default/img/view_previous_on.png | Bin 1592 -> 0 bytes html/theme/default/img/zoom-panel-NOALPHA.png | Bin 1173 -> 0 bytes html/theme/default/img/zoom-panel.png | Bin 1624 -> 0 bytes html/theme/default/style.css | 343 - 80 files changed, 11250 deletions(-) delete mode 100644 html/d3.v2.js delete mode 100644 html/force-big.css delete mode 100644 html/force-light.css delete mode 100644 html/force.css delete mode 100644 html/force.js delete mode 100644 html/geomap.html delete mode 100644 html/geomap.js delete mode 100644 html/gplaypattern.png delete mode 100644 html/img/blank.gif delete mode 100755 html/img/cloud-popup-relative.png delete mode 100644 html/img/drag-rectangle-off.png delete mode 100644 html/img/drag-rectangle-on.png delete mode 100644 html/img/east-mini.png delete mode 100644 html/img/layer-switcher-maximize.png delete mode 100644 html/img/layer-switcher-minimize.png delete mode 100644 html/img/marker-blue.png delete mode 100644 html/img/marker-gold.png delete mode 100644 html/img/marker-green.png delete mode 100644 html/img/marker.png delete mode 100644 html/img/measuring-stick-off.png delete mode 100644 html/img/measuring-stick-on.png delete mode 100644 html/img/north-mini.png delete mode 100644 html/img/panning-hand-off.png delete mode 100644 html/img/panning-hand-on.png delete mode 100644 html/img/slider.png delete mode 100644 html/img/south-mini.png delete mode 100644 html/img/west-mini.png delete mode 100644 html/img/zoom-minus-mini.png delete mode 100644 html/img/zoom-plus-mini.png delete mode 100644 html/img/zoom-world-mini.png delete mode 100644 html/img/zoombar.png delete mode 100644 html/jquery.min.js delete mode 100644 html/links.js delete mode 100644 html/nodes.html delete mode 100644 html/pacman.js delete mode 100644 html/pacman_chomp.wav delete mode 100644 html/pacman_eatfruit.wav delete mode 100644 html/pacman_eatghost.wav delete mode 100644 html/router-down.png delete mode 100644 html/router-unknown.png delete mode 100644 html/router-up.png delete mode 100644 html/style.css delete mode 100644 html/theme/default/framedCloud.css delete mode 100644 html/theme/default/google.css delete mode 100755 html/theme/default/ie6-style.css delete mode 100644 html/theme/default/img/add_point_off.png delete mode 100644 html/theme/default/img/add_point_on.png delete mode 100644 html/theme/default/img/blank.gif delete mode 100644 html/theme/default/img/close.gif delete mode 100644 html/theme/default/img/drag-rectangle-off.png delete mode 100644 html/theme/default/img/drag-rectangle-on.png delete mode 100644 html/theme/default/img/draw_line_off.png delete mode 100644 html/theme/default/img/draw_line_on.png delete mode 100644 html/theme/default/img/draw_point_off.png delete mode 100644 html/theme/default/img/draw_point_on.png delete mode 100644 html/theme/default/img/draw_polygon_off.png delete mode 100644 html/theme/default/img/draw_polygon_on.png delete mode 100644 html/theme/default/img/editing_tool_bar.png delete mode 100644 html/theme/default/img/move_feature_off.png delete mode 100644 html/theme/default/img/move_feature_on.png delete mode 100644 html/theme/default/img/navigation_history.png delete mode 100644 html/theme/default/img/overview_replacement.gif delete mode 100755 html/theme/default/img/pan-panel-NOALPHA.png delete mode 100755 html/theme/default/img/pan-panel.png delete mode 100644 html/theme/default/img/pan_off.png delete mode 100644 html/theme/default/img/pan_on.png delete mode 100644 html/theme/default/img/panning-hand-off.png delete mode 100644 html/theme/default/img/panning-hand-on.png delete mode 100644 html/theme/default/img/remove_point_off.png delete mode 100644 html/theme/default/img/remove_point_on.png delete mode 100644 html/theme/default/img/ruler.png delete mode 100644 html/theme/default/img/save_features_off.png delete mode 100644 html/theme/default/img/save_features_on.png delete mode 100644 html/theme/default/img/view_next_off.png delete mode 100644 html/theme/default/img/view_next_on.png delete mode 100644 html/theme/default/img/view_previous_off.png delete mode 100644 html/theme/default/img/view_previous_on.png delete mode 100755 html/theme/default/img/zoom-panel-NOALPHA.png delete mode 100755 html/theme/default/img/zoom-panel.png delete mode 100644 html/theme/default/style.css diff --git a/html/d3.v2.js b/html/d3.v2.js deleted file mode 100644 index 837a698..0000000 --- a/html/d3.v2.js +++ /dev/null @@ -1,9414 +0,0 @@ -/* - -Copyright (c) 2012, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.9.2"}; // semver -function d3_class(ctor, properties) { - try { - for (var key in properties) { - Object.defineProperty(ctor.prototype, key, { - value: properties[key], - enumerable: false - }); - } - } catch (e) { - ctor.prototype = properties; - } -} -var d3_array = d3_arraySlice; // conversion for NodeLists - -function d3_arrayCopy(pseudoarray) { - var i = -1, n = pseudoarray.length, array = []; - while (++i < n) array.push(pseudoarray[i]); - return array; -} - -function d3_arraySlice(pseudoarray) { - return Array.prototype.slice.call(pseudoarray); -} - -try { - d3_array(document.documentElement.childNodes)[0].nodeType; -} catch(e) { - d3_array = d3_arrayCopy; -} - -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -d3.map = function(object) { - var map = new d3_Map; - for (var key in object) map.set(key, object[key]); - return map; -}; - -function d3_Map() {} - -d3_class(d3_Map, { - has: function(key) { - return d3_map_prefix + key in this; - }, - get: function(key) { - return this[d3_map_prefix + key]; - }, - set: function(key, value) { - return this[d3_map_prefix + key] = value; - }, - remove: function(key) { - key = d3_map_prefix + key; - return key in this && delete this[key]; - }, - keys: function() { - var keys = []; - this.forEach(function(key) { keys.push(key); }); - return keys; - }, - values: function() { - var values = []; - this.forEach(function(key, value) { values.push(value); }); - return values; - }, - entries: function() { - var entries = []; - this.forEach(function(key, value) { entries.push({key: key, value: value}); }); - return entries; - }, - forEach: function(f) { - for (var key in this) { - if (key.charCodeAt(0) === d3_map_prefixCode) { - f.call(this, key.substring(1), this[key]); - } - } - } -}); - -var d3_map_prefix = "\0", // prevent collision with built-ins - d3_map_prefixCode = d3_map_prefix.charCodeAt(0); -function d3_identity(d) { - return d; -} -function d3_this() { - return this; -} -function d3_true() { - return true; -} -function d3_functor(v) { - return typeof v === "function" ? v : function() { return v; }; -} - -d3.functor = d3_functor; -// Copies a variable number of methods from source to target. -d3.rebind = function(target, source) { - var i = 1, n = arguments.length, method; - while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); - return target; -}; - -// Method is assumed to be a standard D3 getter-setter: -// If passed with no arguments, gets the value. -// If passed with arguments, sets the value and returns the target. -function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return arguments.length ? target : value; - }; -} -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.mean = function(array, f) { - var n = array.length, - a, - m = 0, - i = -1, - j = 0; - if (arguments.length === 1) { - while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; - } else { - while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; - } - return j ? m : undefined; -}; -d3.median = function(array, f) { - if (arguments.length > 1) array = array.map(f); - array = array.filter(d3_number); - return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.extent = function(array, f) { - var i = -1, - n = array.length, - a, - b, - c; - if (arguments.length === 1) { - while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined; - while (++i < n) if ((b = array[i]) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } else { - while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } - return [a, c]; -}; -d3.random = { - normal: function(mean, deviation) { - if (arguments.length < 2) deviation = 1; - if (arguments.length < 1) mean = 0; - return function() { - var x, y, r; - do { - x = Math.random() * 2 - 1; - y = Math.random() * 2 - 1; - r = x * x + y * y; - } while (!r || r > 1); - return mean + deviation * x * Math.sqrt(-2 * Math.log(r) / r); - }; - } -}; -function d3_number(x) { - return x != null && !isNaN(x); -} -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.transpose = function(matrix) { - return d3.zip.apply(d3, matrix); -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -d3.bisector = function(f) { - return { - left: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >> 1; - if (f.call(a, a[mid], mid) < x) lo = mid + 1; - else hi = mid; - } - return lo; - }, - right: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >> 1; - if (x < f.call(a, a[mid], mid)) hi = mid; - else lo = mid + 1; - } - return lo; - } - }; -}; - -var d3_bisector = d3.bisector(function(d) { return d; }); -d3.bisectLeft = d3_bisector.left; -d3.bisect = d3.bisectRight = d3_bisector.right; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - valuesByKey = new d3_Map, - values, - o = {}; - - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(object = array[i]))) { - values.push(object); - } else { - valuesByKey.set(keyValue, [object]); - } - } - - valuesByKey.forEach(function(keyValue) { - o[keyValue] = map(valuesByKey.get(keyValue), depth); - }); - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step === Infinity) throw new Error("infinite range"); - var range = [], - k = d3_range_integerScale(Math.abs(step)), - i = -1, - j; - start *= k, stop *= k, step *= k; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); - else while ((j = start + step * ++i) < stop) range.push(j / k); - return range; -}; - -function d3_range_integerScale(x) { - var k = 1; - while (x * k % 1) k *= 10; - return k; -} -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * (n = Math.pow(10, n))) / n - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime, mime = null; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - if (mime) req.setRequestHeader("Accept", mime); - req.onreadystatechange = function() { - if (req.readyState === 4) { - var s = req.status; - callback(s >= 200 && s < 300 || s === 304 ? req : null); - } - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -var d3_nsPrefix = { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" -}; - -d3.ns = { - prefix: d3_nsPrefix, - qualify: function(name) { - var i = name.indexOf(":"), - prefix = name; - if (i >= 0) { - prefix = name.substring(0, i); - name = name.substring(i + 1); - } - return d3_nsPrefix.hasOwnProperty(prefix) - ? {space: d3_nsPrefix[prefix], local: name} - : name; - } -}; -d3.dispatch = function() { - var dispatch = new d3_dispatch, - i = -1, - n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - return dispatch; -}; - -function d3_dispatch() {} - -d3_dispatch.prototype.on = function(type, listener) { - var i = type.indexOf("."), - name = ""; - - // Extract optional namespace, e.g., "click.foo" - if (i > 0) { - name = type.substring(i + 1); - type = type.substring(0, i); - } - - return arguments.length < 2 - ? this[type].on(name) - : this[type].on(name, listener); -}; - -function d3_dispatch_event(dispatch) { - var listeners = [], - listenerByName = new d3_Map; - - function event() { - var z = listeners, // defensive reference - i = -1, - n = z.length, - l; - while (++i < n) if (l = z[i].on) l.apply(this, arguments); - return dispatch; - } - - event.on = function(name, listener) { - var l = listenerByName.get(name), - i; - - // return the current listener, if any - if (arguments.length < 2) return l && l.on; - - // remove the old listener, if any (with copy-on-write) - if (l) { - l.on = null; - listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); - listenerByName.remove(name); - } - - // add the new listener, if any - if (listener) listeners.push(listenerByName.set(name, {on: listener})); - - return dispatch; - }; - - return event; -} -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - scale = 1, - suffix = "", - integer = false; - - if (precision) precision = +precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": scale = 100; suffix = "%"; type = "f"; break; - case "p": scale = 100; suffix = "%"; type = "r"; break; - case "d": integer = true; precision = 0; break; - case "s": scale = -1; type = "r"; break; - } - - // If no precision is specified for r, fallback to general notation. - if (type == "r" && !precision) type = "g"; - - type = d3_format_types.get(type) || d3_format_typeDefault; - - return function(value) { - - // Return the empty string for floats formatted as ints. - if (integer && (value % 1)) return ""; - - // Convert negative to positive, and record the sign prefix. - var negative = (value < 0) && (value = -value) ? "\u2212" : sign; - - // Apply the scale, computing it from the value's exponent for si format. - if (scale < 0) { - var prefix = d3.formatPrefix(value, precision); - value = prefix.scale(value); - suffix = prefix.symbol; - } else { - value *= scale; - } - - // Convert to the desired precision. - value = type(value, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - - return value + suffix; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = d3.map({ - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); } -}); - -function d3_format_precision(x, p) { - return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1); -} - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -var d3_formatPrefixes = ["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix); - -d3.formatPrefix = function(value, precision) { - var i = 0; - if (value) { - if (value < 0) value *= -1; - if (precision) value = d3.round(value, d3_format_precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); - } - return d3_formatPrefixes[8 + i / 3]; -}; - -function d3_formatPrefix(d, i) { - var k = Math.pow(10, Math.abs(8 - i) * 3); - return { - scale: i > 8 ? function(d) { return d / k; } : function(d) { return d * k; }, - symbol: d - }; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3), - d3_ease_default = function() { return d3_ease_identity; }; - -var d3_ease = d3.map({ - linear: d3_ease_default, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}); - -var d3_ease_mode = d3.map({ - "in": d3_ease_identity, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}); - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - t = d3_ease.get(t) || d3_ease_default; - m = d3_ease_mode.get(m) || d3_ease_identity; - return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_identity(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - }; -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; - -function d3_eventCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} - -function d3_eventSource() { - var e = d3.event, s; - while (s = e.sourceEvent) e = s; - return e; -} - -// Like d3.dispatch, but for custom events abstracting native UI events. These -// events have a target component (such as a brush), a target element (such as -// the svg:g element containing the brush) and the standard arguments `d` (the -// target element's data) and `i` (the selection index of the target element). -function d3_eventDispatch(target) { - var dispatch = new d3_dispatch, - i = 0, - n = arguments.length; - - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - - // Creates a dispatch context for the specified `thiz` (typically, the target - // DOM element that received the source event) and `argumentz` (typically, the - // data `d` and index `i` of the target element). The returned function can be - // used to dispatch an event to any registered listeners; the function takes a - // single argument as input, being the event to dispatch. The event must have - // a "type" attribute which corresponds to a type registered in the - // constructor. This context will automatically populate the "sourceEvent" and - // "target" attributes of the event, as well as setting the `d3.event` global - // for the duration of the notification. - dispatch.of = function(thiz, argumentz) { - return function(e1) { - try { - var e0 = - e1.sourceEvent = d3.event; - e1.target = target; - d3.event = e1; - dispatch[e1.type].apply(thiz, argumentz); - } finally { - d3.event = e0; - } - }; - }; - - return dispatch; -} -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateTransform = function(a, b) { - var s = [], // string constants and placeholders - q = [], // number interpolators - n, - A = d3.transform(a), - B = d3.transform(b), - ta = A.translate, - tb = B.translate, - ra = A.rotate, - rb = B.rotate, - wa = A.skew, - wb = B.skew, - ka = A.scale, - kb = B.scale; - - if (ta[0] != tb[0] || ta[1] != tb[1]) { - s.push("translate(", null, ",", null, ")"); - q.push({i: 1, x: d3.interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3.interpolateNumber(ta[1], tb[1])}); - } else if (tb[0] || tb[1]) { - s.push("translate(" + tb + ")"); - } else { - s.push(""); - } - - if (ra != rb) { - q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3.interpolateNumber(ra, rb)}); - } else if (rb) { - s.push(s.pop() + "rotate(" + rb + ")"); - } - - if (wa != wb) { - q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3.interpolateNumber(wa, wb)}); - } else if (wb) { - s.push(s.pop() + "skewX(" + wb + ")"); - } - - if (ka[0] != kb[0] || ka[1] != kb[1]) { - n = s.push(s.pop() + "scale(", null, ",", null, ")"); - q.push({i: n - 4, x: d3.interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3.interpolateNumber(ka[1], kb[1])}); - } else if (kb[0] != 1 || kb[1] != 1) { - s.push(s.pop() + "scale(" + kb + ")"); - } - - n = q.length; - return function(t) { - var i = -1, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "#" - + d3_rgb_hex(Math.round(ar + br * t)) - + d3_rgb_hex(Math.round(ag + bg * t)) - + d3_rgb_hex(Math.round(ab + bb * t)); - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; - -function d3_interpolateByName(n) { - return n == "transform" - ? d3.interpolateTransform - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + ""); }, - function(a, b) { return (typeof b === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(a, b); }, - function(a, b) { return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) - : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb)) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.floor(k * this.r), - Math.floor(k * this.g), - Math.floor(k * this.b)); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 - ? "0" + Math.max(0, v).toString(16) - : Math.min(255, v).toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = d3.map({ - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}); - -d3_rgb_names.forEach(function(key, value) { - d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb)); -}); -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) - : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl)) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return this.rgb().toString(); -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }, - d3_selectRoot = document.documentElement, - d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, - d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; - d3_selectMatches = Sizzle.matchesSelector; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i))); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var names = name.split(d3_selection_classedWhitespace), - n = names.length, - i = -1; - if (arguments.length > 1) { - while (++i < n) d3_selection_classed.call(this, names[i], value); - return this; - } else { - while (++i < n) if (!d3_selection_classed.call(this, names[i])) return false; - return true; - } -}; - -var d3_selection_classedWhitespace = /\s+/g; - -function d3_selection_classed(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -} -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 - ? this.node().textContent : this.each(typeof value === "function" - ? function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; } : value == null - ? function() { this.textContent = ""; } - : function() { this.textContent = value; }); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 - ? this.node().innerHTML : this.each(typeof value === "function" - ? function() { var v = value.apply(this, arguments); this.innerHTML = v == null ? "" : v; } : value == null - ? function() { this.innerHTML = ""; } - : function() { this.innerHTML = value; }); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElementNS(this.namespaceURI, name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElementNS(this.namespaceURI, name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -d3_selectionPrototype.data = function(value, key) { - var i = -1, - n = this.length, - group, - node; - - // If no value is specified, return the first value. - if (!arguments.length) { - value = new Array(n = (group = this[0]).length); - while (++i < n) { - if (node = group[i]) { - value[i] = node.__data__; - } - } - return value; - } - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (key) { - var nodeByKeyValue = new d3_Map, - keyValues = [], - keyValue, - j = groupData.length; - - for (i = -1; ++i < n;) { - keyValue = key.call(node = group[i], node.__data__, i); - if (nodeByKeyValue.has(keyValue)) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKeyValue.set(keyValue, node); - } - keyValues.push(keyValue); - } - - for (i = -1; ++i < m;) { - keyValue = key.call(groupData, nodeData = groupData[i], i) - if (nodeByKeyValue.has(keyValue)) { - updateNodes[i] = node = nodeByKeyValue.get(keyValue); - node.__data__ = nodeData; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - nodeByKeyValue.remove(keyValue); - } - - for (i = -1; ++i < n;) { - if (nodeByKeyValue.has(keyValues[i])) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var enter = d3_selection_enter([]), - update = d3_selection([]), - exit = d3_selection([]); - - if (typeof value === "function") { - while (++i < n) { - bind(group = this[i], value.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], value); - } - } - - update.enter = function() { return enter; }; - update.exit = function() { return exit; }; - return update; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -d3_selectionPrototype.datum = -d3_selectionPrototype.map = function(value) { - return arguments.length < 1 - ? this.property("__data__") - : this.property("__data__", value); -}; -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - if (typeof filter !== "function") filter = d3_selection_filter(filter); - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_filter(selector) { - return function() { - return d3_selectMatches(this, selector); - }; -} -d3_selectionPrototype.order = function() { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) { - if (node = group[i]) { - if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); - next = node; - } - } - } - return this; -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator); - return this.order(); -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this, - o = node[name]; - - // remove the old listener, if any (using the previously-set capture) - if (o) { - node.removeEventListener(type, o, o.$); - delete node[name]; - } - - // add the new listener, if any (remembering the capture flag) - if (listener) { - node.addEventListener(type, node[name] = l, l.$ = capture); - l._ = listener; // stash the unwrapped listener for get - } - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: d3_transitionDelay, duration: d3_transitionDuration} : null); - } - } - - return d3_transition(subgroups, d3_transitionId || ++d3_transitionNextId, Date.now()); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = d3_selectRoot; - -// TODO fast singleton implementation! -// TODO select(function) -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -// TODO selectAll(function) -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([d3_array(selector)]); // assume node[] -}; -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3.selection.enter = d3_selection_enter; -d3.selection.enter.prototype = d3_selection_enterPrototype; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.node = d3_selectionPrototype.node; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -function d3_transition(groups, id, time) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = new d3_Map, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase; - - groups.id = id; - - groups.time = time; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens.get(name); - if (tween == null) tweens.remove(name); - else tweens.set(name, tween); - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event.on(type, listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - tweens.forEach(function(key, value) { - if (value = value.call(node, d, i)) { - tweened.push(value); - } - }); - - event.start.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, time); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionId = id; - event.end.call(node, d, i); - d3_transitionId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, time); - - return groups; -} - -var d3_transitionRemove = {}; - -function d3_transitionNull(d, i, a) { - return a != "" && d3_transitionRemove; -} - -function d3_transitionTween(name, b) { - var interpolate = d3_interpolateByName(name); - - function transitionFunction(d, i, a) { - var v = b.call(this, d, i); - return v == null - ? a != "" && d3_transitionRemove - : a != v && interpolate(a, v); - } - - function transitionString(d, i, a) { - return a != b && interpolate(a, b); - } - - return typeof b === "function" ? transitionFunction - : b == null ? d3_transitionNull - : (b += "", transitionString); -} - -var d3_transitionPrototype = [], - d3_transitionNextId = 0, - d3_transitionId = 0, - d3_transitionDefaultDelay = 0, - d3_transitionDefaultDuration = 250, - d3_transitionDefaultEase = d3.ease("cubic-in-out"), - d3_transitionDelay = d3_transitionDefaultDelay, - d3_transitionDuration = d3_transitionDefaultDuration, - d3_transitionEase = d3_transitionDefaultEase; - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function(selection) { - return arguments.length - ? (d3_transitionId ? selection.transition() : selection) - : d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - subnodes, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subnodes = selector.call(node.node, node.node.__data__, i); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o;) { - subgroup.push({node: subnodes[k], delay: node.delay, duration: node.duration}); - } - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(name, value)); -}; - -d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f === d3_transitionRemove - ? (this.removeAttribute(name), null) - : f && function(t) { this.setAttribute(name, f(t)); }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f === d3_transitionRemove - ? (this.removeAttributeNS(name.space, name.local), null) - : f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); }; - } - - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(name, value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f === d3_transitionRemove - ? (this.style.removeProperty(name), null) - : f && function(t) { this.style.setProperty(name, f(t), priority); }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end.transition", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = value.apply(this, arguments) | 0; } - : (value = value | 0, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = Math.max(1, value.apply(this, arguments) | 0); } - : (value = Math.max(1, value | 0), function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - var id = d3_transitionId, - ease = d3_transitionEase, - delay = d3_transitionDelay, - duration = d3_transitionDuration; - - d3_transitionId = this.id; - d3_transitionEase = this.ease(); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) { - d3_transitionDelay = this[j][i].delay; - d3_transitionDuration = this[j][i].duration; - callback.call(node = node.node, node.__data__, i, j); - } - } - } - - d3_transitionId = id; - d3_transitionEase = ease; - d3_transitionDelay = delay; - d3_transitionDuration = duration; - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -d3.transform = function(string) { - var g = document.createElementNS(d3.ns.prefix.svg, "g"), - identity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0}; - return (d3.transform = function(string) { - g.setAttribute("transform", string); - var t = g.transform.baseVal.consolidate(); - return new d3_transform(t ? t.matrix : identity); - })(string); -}; - -// Compute x-scale and normalize the first row. -// Compute shear and make second row orthogonal to first. -// Compute y-scale and normalize the second row. -// Finally, compute the rotation. -function d3_transform(m) { - var r0 = [m.a, m.b], - r1 = [m.c, m.d], - kx = d3_transformNormalize(r0), - kz = d3_transformDot(r0, r1), - ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; - if (r0[0] * r1[1] < r1[0] * r0[1]) { - r0[0] *= -1; - r0[1] *= -1; - kx *= -1; - kz *= -1; - } - this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_transformDegrees; - this.translate = [m.e, m.f]; - this.scale = [kx, ky]; - this.skew = ky ? Math.atan2(kz, ky) * d3_transformDegrees : 0; -}; - -d3_transform.prototype.toString = function() { - return "translate(" + this.translate - + ")rotate(" + this.rotate - + ")skewX(" + this.skew - + ")scale(" + this.scale - + ")"; -}; - -function d3_transformDot(a, b) { - return a[0] * b[0] + a[1] * b[1]; -} - -function d3_transformNormalize(a) { - var k = Math.sqrt(d3_transformDot(a, a)); - if (k) { - a[0] /= k; - a[1] /= k; - } - return k; -} - -function d3_transformCombine(a, b, k) { - a[0] += k * b[0]; - a[1] += k * b[1]; - return a; -} - -var d3_transformDegrees = 180 / Math.PI; -d3.mouse = function(container) { - return d3_mousePoint(container, d3_eventSource()); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_mousePoint(container, e) { - var svg = container.ownerSVGElement || container; - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - svg = d3.select(document.body) - .append("svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; - } - var rect = container.getBoundingClientRect(); - return [e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop]; -}; -d3.touches = function(container, touches) { - if (arguments.length < 2) touches = d3_eventSource().touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_scaleRange(scale) { - return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - if (dx = x1 - x0) { - nice = nice(dx); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - } - - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -} - -function d3_scale_linearRebind(scale, linear) { - return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - k = Math.min(domain.length, range.length) - 1; - - // Handle descending domains. - if (domain[k] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } - - while (++j <= k) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, k) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function(n, format) { - if (arguments.length < 2) format = d3_scale_logFormat; - if (arguments.length < 1) return format; - var k = n / scale.ticks().length, - f = log === d3_scale_logn ? (e = -1e-12, Math.floor) : (e = 1e-12, Math.ceil), - e; - return function(d) { - return d / pow(f(log(d) + e)) < k ? format(d) : ""; - }; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -} - -var d3_scale_logFormat = d3.format(".0e"); - -function d3_scale_logp(x) { - return Math.log(x < 0 ? 0 : x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(x > 0 ? 0 : -x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -} - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length]; - } - - function steps(start, step) { - return d3.range(domain.length).map(function(i) { return start + step * i; }); - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = new d3_Map; - var i = -1, n = x.length, xi; - while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var reverse = x[1] < x[0], - start = x[reverse - 0], - stop = x[1 - reverse], - step = (stop - start) / (domain.length + padding); - range = steps(start + step * padding, step); - if (reverse) range.reverse(); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var reverse = x[1] < x[0], - start = x[reverse - 0], - stop = x[1 - reverse], - step = Math.floor((stop - start) / (domain.length + padding)), - error = stop - start - (domain.length - padding) * step; - range = steps(start + Math.round(error / 2), step); - if (reverse) range.reverse(); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.rangeExtent = function() { - return d3_scaleExtent(ranger.x); - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -} -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -} -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -} -d3.scale.identity = function() { - return d3_scale_identity([0, 1]); -}; - -function d3_scale_identity(domain) { - - function identity(x) { return +x; } - - identity.invert = identity; - - identity.domain = identity.range = function(x) { - if (!arguments.length) return domain; - domain = x.map(identity); - return identity; - }; - - identity.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - identity.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - identity.copy = function() { - return d3_scale_identity(domain); - }; - - return identity; -} -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3_functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3_functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - defined = d3_true, - interpolate = d3_svg_lineInterpolatorDefault, - interpolator = d3_svg_lineLinear, - tension = .7; - - function line(data) { - var segments = [], - points = [], - i = -1, - n = data.length, - d, - fx = d3_functor(x), - fy = d3_functor(y); - - function segment() { - segments.push("M", interpolator(projection(points), tension)); - } - - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points.push([+fx.call(this, d, i), +fy.call(this, d, i)]); - } else if (points.length) { - segment(); - points = []; - } - } - - if (points.length) segment(); - - return segments.length ? segments.join("") : null; - } - - line.x = function(_) { - if (!arguments.length) return x; - x = _; - return line; - }; - - line.y = function(_) { - if (!arguments.length) return y; - y = _; - return line; - }; - - line.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return line; - }; - - line.interpolate = function(_) { - if (!arguments.length) return interpolate; - if (!d3_svg_lineInterpolators.has(_ += "")) _ = d3_svg_lineInterpolatorDefault; - interpolator = d3_svg_lineInterpolators.get(interpolate = _); - return line; - }; - - line.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(d3_identity); -}; - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -var d3_svg_lineInterpolatorDefault = "linear"; - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = d3.map({ - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}); - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]], - path = [x0, ",", y0]; - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - defined = d3_true, - interpolate = d3_svg_lineInterpolatorDefault, - i0 = d3_svg_lineLinear, - i1 = d3_svg_lineLinear, - L = "L", - tension = .7; - - function area(data) { - var segments = [], - points0 = [], - points1 = [], - i = -1, - n = data.length, - d, - fx0 = d3_functor(x0), - fy0 = d3_functor(y0), - fx1 = x0 === x1 ? function() { return x; } : d3_functor(x1), - fy1 = y0 === y1 ? function() { return y; } : d3_functor(y1), - x, - y; - - function segment() { - segments.push("M", i0(projection(points1), tension), - L, i1(projection(points0.reverse()), tension), - "Z"); - } - - while (++i < n) { - if (defined.call(this, d = data[i], i)) { - points0.push([x = +fx0.call(this, d, i), y = +fy0.call(this, d, i)]); - points1.push([+fx1.call(this, d, i), +fy1.call(this, d, i)]); - } else if (points0.length) { - segment(); - points0 = []; - points1 = []; - } - } - - if (points0.length) segment(); - - return segments.length ? segments.join("") : null; - } - - area.x = function(_) { - if (!arguments.length) return x1; - x0 = x1 = _; - return area; - }; - - area.x0 = function(_) { - if (!arguments.length) return x0; - x0 = _; - return area; - }; - - area.x1 = function(_) { - if (!arguments.length) return x1; - x1 = _; - return area; - }; - - area.y = function(_) { - if (!arguments.length) return y1; - y0 = y1 = _; - return area; - }; - - area.y0 = function(_) { - if (!arguments.length) return y0; - y0 = _; - return area; - }; - - area.y1 = function(_) { - if (!arguments.length) return y1; - y1 = _; - return area; - }; - - area.defined = function(_) { - if (!arguments.length) return defined; - defined = _; - return area; - }; - - area.interpolate = function(_) { - if (!arguments.length) return interpolate; - if (!d3_svg_lineInterpolators.has(_ += "")) _ = d3_svg_lineInterpolatorDefault; - i0 = d3_svg_lineInterpolators.get(interpolate = _); - i1 = i0.reverse || i0; - L = /-closed$/.test(_) ? "M" : "L"; - return area; - }; - - area.tension = function(_) { - if (!arguments.length) return tension; - tension = _; - return area; - }; - - return area; -} - -d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; -d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; - -d3.svg.area = function() { - return d3_svg_area(Object); -}; -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1, t.a1 - t.a0) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p, a) { - return "A" + r + "," + r + " 0 " + +(a > Math.PI) + ",1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3_functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3_functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3_functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3_functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3_functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3_functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3_functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = d3.mouse; -d3.svg.touches = d3.touches; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols.get(type.call(this, d, i)) - || d3_svg_symbolCircle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3_functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3_functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -function d3_svg_symbolCircle(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = d3.map({ - "circle": d3_svg_symbolCircle, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}); - -d3.svg.symbolTypes = d3_svg_symbols.keys(); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickValues = null, - tickFormat_, - tickSubdivide = 0; - - function axis(g) { - g.each(function() { - var g = d3.select(this); - - // Ticks, or domain values for ordinal scales. - var ticks = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain()) : tickValues, - tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = d3.transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6), - tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = d3.transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleRange(scale), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("path").attr("class", "domain"), - pathUpdate = d3.transition(path); - - // Stash a snapshot of the new scale, and retrieve the old snapshot. - var scale1 = scale.copy(), - scale0 = this.__chart__ || scale1; - this.__chart__ = scale1; - - tickEnter.append("line").attr("class", "tick"); - tickEnter.append("text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickEnter.attr("y2", tickMinorSize); - subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize); - tickEnter.select("line").attr("y2", tickMajorSize); - tickEnter.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickEnter.attr("y2", -tickMinorSize); - subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize); - tickEnter.select("line").attr("y2", -tickMajorSize); - tickEnter.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickEnter.attr("x2", -tickMinorSize); - subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0); - tickEnter.select("line").attr("x2", -tickMajorSize); - tickEnter.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end"); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickEnter.attr("x2", tickMinorSize); - subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0); - tickEnter.select("line").attr("x2", tickMajorSize); - tickEnter.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start"); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - // For quantitative scales: - // - enter new ticks from the old scale - // - exit old ticks to the new scale - if (scale.ticks) { - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale1); - tickExit.call(tickTransform, scale1); - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale1); - subtickExit.call(tickTransform, scale1); - } - - // For ordinal scales: - // - any entering ticks are undefined in the old scale - // - any exiting ticks are undefined in the new scale - // Therefore, we only need to transition updating ticks. - else { - var dx = scale1.rangeBand() / 2, x = function(d) { return scale1(d) + dx; }; - tickEnter.call(tickTransform, x); - tickUpdate.call(tickTransform, x); - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickValues = function(x) { - if (!arguments.length) return tickValues; - tickValues = x; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.svg.brush = function() { - var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), - x = null, // x-scale, optional - y = null, // y-scale, optional - resizes = d3_svg_brushResizes[0], - extent = [[0, 0], [0, 0]], // [x0, y0], [x1, y1], in pixels (integers) - extentDomain; // the extent in data space, lazily created - - function brush(g) { - g.each(function() { - var g = d3.select(this), - bg = g.selectAll(".background").data([0]), - fg = g.selectAll(".extent").data([0]), - tz = g.selectAll(".resize").data(resizes, String), - e; - - // Prepare the brush container for events. - g - .style("pointer-events", "all") - .on("mousedown.brush", brushstart) - .on("touchstart.brush", brushstart); - - // An invisible, mouseable area for starting a new brush. - bg.enter().append("rect") - .attr("class", "background") - .style("visibility", "hidden") - .style("cursor", "crosshair"); - - // The visible brush extent; style this as you like! - fg.enter().append("rect") - .attr("class", "extent") - .style("cursor", "move"); - - // More invisible rects for resizing the extent. - tz.enter().append("g") - .attr("class", function(d) { return "resize " + d; }) - .style("cursor", function(d) { return d3_svg_brushCursor[d]; }) - .append("rect") - .attr("x", function(d) { return /[ew]$/.test(d) ? -3 : null; }) - .attr("y", function(d) { return /^[ns]/.test(d) ? -3 : null; }) - .attr("width", 6) - .attr("height", 6) - .style("visibility", "hidden"); - - // Show or hide the resizers. - tz.style("display", brush.empty() ? "none" : null); - - // Remove any superfluous resizers. - tz.exit().remove(); - - // Initialize the background to fill the defined range. - // If the range isn't defined, you can post-process. - if (x) { - e = d3_scaleRange(x); - bg.attr("x", e[0]).attr("width", e[1] - e[0]); - redrawX(g); - } - if (y) { - e = d3_scaleRange(y); - bg.attr("y", e[0]).attr("height", e[1] - e[0]); - redrawY(g); - } - redraw(g); - }); - } - - function redraw(g) { - g.selectAll(".resize").attr("transform", function(d) { - return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")"; - }); - } - - function redrawX(g) { - g.select(".extent").attr("x", extent[0][0]); - g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]); - } - - function redrawY(g) { - g.select(".extent").attr("y", extent[0][1]); - g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]); - } - - function brushstart() { - var target = this, - eventTarget = d3.select(d3.event.target), - event_ = event.of(target, arguments), - g = d3.select(target), - resizing = eventTarget.datum(), - resizingX = !/^(n|s)$/.test(resizing) && x, - resizingY = !/^(e|w)$/.test(resizing) && y, - dragging = eventTarget.classed("extent"), - center, - origin = mouse(), - offset; - - var w = d3.select(window) - .on("mousemove.brush", brushmove) - .on("mouseup.brush", brushend) - .on("touchmove.brush", brushmove) - .on("touchend.brush", brushend) - .on("keydown.brush", keydown) - .on("keyup.brush", keyup); - - // If the extent was clicked on, drag rather than brush; - // store the point between the mouse and extent origin instead. - if (dragging) { - origin[0] = extent[0][0] - origin[0]; - origin[1] = extent[0][1] - origin[1]; - } - - // If a resizer was clicked on, record which side is to be resized. - // Also, set the origin to the opposite side. - else if (resizing) { - var ex = +/w$/.test(resizing), - ey = +/^n/.test(resizing); - offset = [extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1]]; - origin[0] = extent[ex][0]; - origin[1] = extent[ey][1]; - } - - // If the ALT key is down when starting a brush, the center is at the mouse. - else if (d3.event.altKey) center = origin.slice(); - - // Propagate the active cursor to the body for the drag duration. - g.style("pointer-events", "none").selectAll(".resize").style("display", null); - d3.select("body").style("cursor", eventTarget.style("cursor")); - - // Notify listeners. - event_({type: "brushstart"}); - brushmove(); - d3_eventCancel(); - - function mouse() { - var touches = d3.event.changedTouches; - return touches ? d3.touches(target, touches)[0] : d3.mouse(target); - } - - function keydown() { - if (d3.event.keyCode == 32) { - if (!dragging) { - center = null; - origin[0] -= extent[1][0]; - origin[1] -= extent[1][1]; - dragging = 2; - } - d3_eventCancel(); - } - } - - function keyup() { - if (d3.event.keyCode == 32 && dragging == 2) { - origin[0] += extent[1][0]; - origin[1] += extent[1][1]; - dragging = 0; - d3_eventCancel(); - } - } - - function brushmove() { - var point = mouse(), - moved = false; - - // Preserve the offset for thick resizers. - if (offset) { - point[0] += offset[0]; - point[1] += offset[1]; - } - - if (!dragging) { - - // If needed, determine the center from the current extent. - if (d3.event.altKey) { - if (!center) center = [(extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2]; - - // Update the origin, for when the ALT key is released. - origin[0] = extent[+(point[0] < center[0])][0]; - origin[1] = extent[+(point[1] < center[1])][1]; - } - - // When the ALT key is released, we clear the center. - else center = null; - } - - // Update the brush extent for each dimension. - if (resizingX && move1(point, x, 0)) { - redrawX(g); - moved = true; - } - if (resizingY && move1(point, y, 1)) { - redrawY(g); - moved = true; - } - - // Final redraw and notify listeners. - if (moved) { - redraw(g); - event_({type: "brush", mode: dragging ? "move" : "resize"}); - } - } - - function move1(point, scale, i) { - var range = d3_scaleRange(scale), - r0 = range[0], - r1 = range[1], - position = origin[i], - size = extent[1][i] - extent[0][i], - min, - max; - - // When dragging, reduce the range by the extent size and position. - if (dragging) { - r0 -= position; - r1 -= size + position; - } - - // Clamp the point so that the extent fits within the range extent. - min = Math.max(r0, Math.min(r1, point[i])); - - // Compute the new extent bounds. - if (dragging) { - max = (min += position) + size; - } else { - - // If the ALT key is pressed, then preserve the center of the extent. - if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); - - // Compute the min and max of the position and point. - if (position < min) { - max = min; - min = position; - } else { - max = position; - } - } - - // Update the stored bounds. - if (extent[0][i] !== min || extent[1][i] !== max) { - extentDomain = null; - extent[0][i] = min; - extent[1][i] = max; - return true; - } - } - - function brushend() { - brushmove(); - - // reset the cursor styles - g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); - d3.select("body").style("cursor", null); - - w .on("mousemove.brush", null) - .on("mouseup.brush", null) - .on("touchmove.brush", null) - .on("touchend.brush", null) - .on("keydown.brush", null) - .on("keyup.brush", null); - - event_({type: "brushend"}); - d3_eventCancel(); - } - } - - brush.x = function(z) { - if (!arguments.length) return x; - x = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; // fore! - return brush; - }; - - brush.y = function(z) { - if (!arguments.length) return y; - y = z; - resizes = d3_svg_brushResizes[!x << 1 | !y]; // fore! - return brush; - }; - - brush.extent = function(z) { - var x0, x1, y0, y1, t; - - // Invert the pixel extent to data-space. - if (!arguments.length) { - z = extentDomain || extent; - if (x) { - x0 = z[0][0], x1 = z[1][0]; - if (!extentDomain) { - x0 = extent[0][0], x1 = extent[1][0]; - if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - } - } - if (y) { - y0 = z[0][1], y1 = z[1][1]; - if (!extentDomain) { - y0 = extent[0][1], y1 = extent[1][1]; - if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - } - } - return x && y ? [[x0, y0], [x1, y1]] : x ? [x0, x1] : y && [y0, y1]; - } - - // Scale the data-space extent to pixels. - extentDomain = [[0, 0], [0, 0]]; - if (x) { - x0 = z[0], x1 = z[1]; - if (y) x0 = x0[0], x1 = x1[0]; - extentDomain[0][0] = x0, extentDomain[1][0] = x1; - if (x.invert) x0 = x(x0), x1 = x(x1); - if (x1 < x0) t = x0, x0 = x1, x1 = t; - extent[0][0] = x0 | 0, extent[1][0] = x1 | 0; - } - if (y) { - y0 = z[0], y1 = z[1]; - if (x) y0 = y0[1], y1 = y1[1]; - extentDomain[0][1] = y0, extentDomain[1][1] = y1; - if (y.invert) y0 = y(y0), y1 = y(y1); - if (y1 < y0) t = y0, y0 = y1, y1 = t; - extent[0][1] = y0 | 0, extent[1][1] = y1 | 0; - } - - return brush; - }; - - brush.clear = function() { - extentDomain = null; - extent[0][0] = - extent[0][1] = - extent[1][0] = - extent[1][1] = 0; - return brush; - }; - - brush.empty = function() { - return (x && extent[0][0] === extent[1][0]) - || (y && extent[0][1] === extent[1][1]); - }; - - return d3.rebind(brush, event, "on"); -}; - -var d3_svg_brushCursor = { - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" -}; - -var d3_svg_brushResizes = [ - ["n", "e", "s", "w", "nw", "ne", "se", "sw"], - ["e", "w"], - ["n", "s"], - [] -]; -d3.behavior = {}; -// TODO Track touch points by identifier. - -d3.behavior.drag = function() { - var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), - origin = null; - - function drag() { - this.on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - } - - function mousedown() { - var target = this, - event_ = event.of(target, arguments), - eventTarget = d3.event.target, - offset, - origin_ = point(), - moved = 0; - - var w = d3.select(window) - .on("mousemove.drag", dragmove) - .on("touchmove.drag", dragmove) - .on("mouseup.drag", dragend, true) - .on("touchend.drag", dragend, true); - - if (origin) { - offset = origin.apply(target, arguments); - offset = [offset.x - origin_[0], offset.y - origin_[1]]; - } else { - offset = [0, 0]; - } - - d3_eventCancel(); - event_({type: "dragstart"}); - - function point() { - var p = target.parentNode, - t = d3.event.changedTouches; - return t ? d3.touches(p, t)[0] : d3.mouse(p); - } - - function dragmove() { - if (!target.parentNode) return dragend(); // target removed from DOM - - var p = point(), - dx = p[0] - origin_[0], - dy = p[1] - origin_[1]; - - moved |= dx | dy; - origin_ = p; - d3_eventCancel(); - - event_({type: "drag", x: p[0] + offset[0], y: p[1] + offset[1], dx: dx, dy: dy}); - } - - function dragend() { - event_({type: "dragend"}); - - // if moved, prevent the mouseup (and possibly click) from propagating - if (moved) { - d3_eventCancel(); - if (d3.event.target === eventTarget) w.on("click.drag", click, true); - } - - w .on("mousemove.drag", null) - .on("touchmove.drag", null) - .on("mouseup.drag", null) - .on("touchend.drag", null); - } - - // prevent the subsequent click from propagating (e.g., for anchors) - function click() { - d3_eventCancel(); - w.on("click.drag", null); - } - } - - drag.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return drag; - }; - - return d3.rebind(drag, event, "on"); -}; -d3.behavior.zoom = function() { - var translate = [0, 0], - translate0, // translate when we started zooming (to avoid drift) - scale = 1, - scale0, // scale when we started touching - scaleExtent = d3_behavior_zoomInfinity, - event = d3_eventDispatch(zoom, "zoom"), - x0, - x1, - y0, - y1, - touchtime; // time of last touchstart (to detect double-tap) - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("mousemove.zoom", mousemove) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart) - .on("touchmove.zoom", touchmove) - .on("touchend.zoom", touchstart); - } - - zoom.translate = function(x) { - if (!arguments.length) return translate; - translate = x.map(Number); - return zoom; - }; - - zoom.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return zoom; - }; - - zoom.scaleExtent = function(x) { - if (!arguments.length) return scaleExtent; - scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number); - return zoom; - }; - - zoom.x = function(z) { - if (!arguments.length) return x1; - x1 = z; - x0 = z.copy(); - return zoom; - }; - - zoom.y = function(z) { - if (!arguments.length) return y1; - y1 = z; - y0 = z.copy(); - return zoom; - }; - - function location(p) { - return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale]; - } - - function point(l) { - return [l[0] * scale + translate[0], l[1] * scale + translate[1]]; - } - - function scaleTo(s) { - scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); - } - - function translateTo(p, l) { - l = point(l); - translate[0] += p[0] - l[0]; - translate[1] += p[1] - l[1]; - } - - function dispatch(event) { - if (x1) x1.domain(x0.range().map(function(x) { return (x - translate[0]) / scale; }).map(x0.invert)); - if (y1) y1.domain(y0.range().map(function(y) { return (y - translate[1]) / scale; }).map(y0.invert)); - d3.event.preventDefault(); - event({type: "zoom", scale: scale, translate: translate}); - } - - function mousedown() { - var target = this, - event_ = event.of(target, arguments), - eventTarget = d3.event.target, - moved = 0, - w = d3.select(window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), - l = location(d3.mouse(target)); - - window.focus(); - d3_eventCancel(); - - function mousemove() { - moved = 1; - translateTo(d3.mouse(target), l); - dispatch(event_); - } - - function mouseup() { - if (moved) d3_eventCancel(); - w.on("mousemove.zoom", null).on("mouseup.zoom", null); - if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true); - } - - function click() { - d3_eventCancel(); - w.on("click.zoom", null); - } - } - - function mousewheel() { - if (!translate0) translate0 = location(d3.mouse(this)); - scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale); - translateTo(d3.mouse(this), translate0); - dispatch(event.of(this, arguments)); - } - - function mousemove() { - translate0 = null; - } - - function dblclick() { - var p = d3.mouse(this), l = location(p); - scaleTo(d3.event.shiftKey ? scale / 2 : scale * 2); - translateTo(p, l); - dispatch(event.of(this, arguments)); - } - - function touchstart() { - var touches = d3.touches(this), - now = Date.now(); - - scale0 = scale; - translate0 = {}; - touches.forEach(function(t) { translate0[t.identifier] = location(t); }); - d3_eventCancel(); - - if ((touches.length === 1) && (now - touchtime < 500)) { // dbltap - var p = touches[0], l = location(touches[0]); - scaleTo(scale * 2); - translateTo(p, l); - dispatch(event.of(this, arguments)); - } - touchtime = now; - } - - function touchmove() { - var touches = d3.touches(this), - p0 = touches[0], - l0 = translate0[p0.identifier]; - if (p1 = touches[1]) { - var p1, l1 = translate0[p1.identifier]; - p0 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; - l0 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - scaleTo(d3.event.scale * scale0); - } - translateTo(p0, l0); - dispatch(event.of(this, arguments)); - } - - return d3.rebind(zoom, event, "on"); -}; - -var d3_behavior_zoomDiv, // for interpreting mousewheel events - d3_behavior_zoomInfinity = [0, Infinity]; // default scale extent - -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta; -} -d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - // Note: Opera has a bug reordering object literal properties! - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[di][j], - v = matrix[di][dj], - a0 = x, - a1 = x += v * k; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }; - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords( - (a.source.value + a.target.value) / 2, - (b.source.value + b.target.value) / 2); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("start", "tick", "end"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths, - charges; - - function repulse(node) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = quad.charge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = quad.pointCharge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - - force.tick = function() { - // simulated annealing, basically - if ((alpha *= .99) < .005) { - event.end({type: "end", alpha: alpha = 0}); - return true; - } - - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick({type: "tick", alpha: alpha}); - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3_functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3_functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.alpha = function(x) { - if (!arguments.length) return alpha; - - if (alpha) { // if we're already running - if (x > 0) alpha = x; // we might keep it hot - else alpha = 0; // or, next tick will dispatch "end" - } else if (x > 0) { // otherwise, fire it up! - event.start({type: "start", alpha: alpha = x}); - d3.timer(force.tick); - } - - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - charges = []; - if (typeof charge === "function") { - for (i = 0; i < n; ++i) { - charges[i] = +charge.call(this, nodes[i], i); - } - } else { - for (i = 0; i < n; ++i) { - charges[i] = charge; - } - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - return force.alpha(.1); - }; - - force.stop = function() { - return force.alpha(0); - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .origin(d3_identity) - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return d3.rebind(force, event, "on"); -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px = d3.event.x; - d3_layout_forceDragNode.py = d3.event.y; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, - cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, - n, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children && (n = children.length)) { - var i = -1, - n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = d3_layout_pieSortByValue, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the numeric values for each data element. - var values = data.map(function(d, i) { return +value.call(pie, d, i); }); - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular scale factor: from value to radians. - var k = ((typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle) - / d3.sum(values); - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(sort === d3_layout_pieSortByValue - ? function(i, j) { return values[j] - values[i]; } - : function(i, j) { return sort(data[i], data[j]); }); - - // Compute the arcs! - // They are stored in the original data's order. - var arcs = []; - index.forEach(function(i) { - var d; - arcs[i] = { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - return arcs; - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; - -var d3_layout_pieSortByValue = {}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = d3_identity, - order = d3_layout_stackOrderDefault, - offset = d3_layout_stackOffsetZero, - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = d3.map({ - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": d3_layout_stackOrderDefault - -}); - -var d3_layout_stackOffsets = d3.map({ - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": d3_layout_stackOffsetZero - -}); - -function d3_layout_stackOrderDefault(data) { - return d3.range(data.length); -} - -function d3_layout_stackOffsetZero(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; -} - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - if (m > 0) { - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3_functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3_functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs && (n = childs.length)) { - var i = -1, - n, - c = node.children = [], - v = 0, - j = depth + 1, - d; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children && (n = children.length)) { - var i = -1, - n, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - d3.rebind(object, hierarchy, "sort", "children", "value"); - - // Add an alias for links, for convenience. - object.links = d3_layout_hierarchyLinks; - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return dr * dr - dx * dx - dy * dy > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - break; - } - } - } - - // Update node chain. - if (isect) { - if (s1 < s2 || (s1 == s2 && b.r < a.r)) d3_layout_packSplice(a, b = j); - else d3_layout_packSplice(a = k, b); - i--; - } else { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children && children.length) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, - dc = Math.sqrt(dx * dx + dy * dy), - cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))), - theta = Math.acos(cos), - x = cos * (db /= dc), - y = Math.sin(theta) * db; - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } -} -// Implements a hierarchical layout using the cluster (or dendrogram) -// algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children && (n = children.length)) { - var i = -1, - n; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - var children = node.children; - return children && children.length ? children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - var children = node.children, - n; - return children && (n = children.length) ? children[n - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children && (n = children.length)) { - var child, - n, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children && (n = children.length)) { - var child, - previousChild = null, - i = -1, - n; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - row = [], - remaining = children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - remaining.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - remaining = children.slice(), // copy-on-write - child, - row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = rect.dy; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = rect.dx; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -d3.csv = function(url, callback) { - d3.text(url, "text/csv", function(text) { - callback(text && d3.csv.parse(text)); - }); -}; -d3.csv.parse = function(text) { - var header; - return d3.csv.parseRows(text, function(row, i) { - if (i) { - var o = {}, j = -1, m = header.length; - while (++j < m) o[header[j]] = row[j]; - return o; - } else { - header = row; - return null; - } - }); -}; - -d3.csv.parseRows = function(text, f) { - var EOL = {}, // sentinel value for end-of-line - EOF = {}, // sentinel value for end-of-file - rows = [], // output rows - re = /\r\n|[,\r\n]/g, // field separator regex - n = 0, // the current line number - t, // the current token - eol; // is the current token followed by EOL? - - re.lastIndex = 0; // work-around bug in FF 3.6 - - /** @private Returns the next token. */ - function token() { - if (re.lastIndex >= text.length) return EOF; // special case: end of file - if (eol) { eol = false; return EOL; } // special case: end of line - - // special case: quotes - var j = re.lastIndex; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < text.length) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - i++; - } - } - re.lastIndex = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) re.lastIndex++; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, "\""); - } - - // common case - var m = re.exec(text); - if (m) { - eol = m[0].charCodeAt(0) !== 44; - return text.substring(j, m.index); - } - re.lastIndex = text.length; - return text.substring(j); - } - - while ((t = token()) !== EOF) { - var a = []; - while ((t !== EOL) && (t !== EOF)) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - - return rows; -}; -d3.csv.format = function(rows) { - return rows.map(d3_csv_formatRow).join("\n"); -}; - -function d3_csv_formatRow(row) { - return row.map(d3_csv_formatValue).join(","); -} - -function d3_csv_formatValue(text) { - return /[",\n]/.test(text) - ? "\"" + text.replace(/\"/g, "\"\"") + "\"" - : text; -} -d3.geo = {}; - -var d3_geo_radians = Math.PI / 180; -// TODO clip input coordinates on opposite hemisphere -d3.geo.azimuthal = function() { - var mode = "orthographic", // or stereographic, gnomonic, equidistant or equalarea - origin, - scale = 200, - translate = [480, 250], - x0, - y0, - cy0, - sy0; - - function azimuthal(coordinates) { - var x1 = coordinates[0] * d3_geo_radians - x0, - y1 = coordinates[1] * d3_geo_radians, - cx1 = Math.cos(x1), - sx1 = Math.sin(x1), - cy1 = Math.cos(y1), - sy1 = Math.sin(y1), - cc = mode !== "orthographic" ? sy0 * sy1 + cy0 * cy1 * cx1 : null, - c, - k = mode === "stereographic" ? 1 / (1 + cc) - : mode === "gnomonic" ? 1 / cc - : mode === "equidistant" ? (c = Math.acos(cc), c ? c / Math.sin(c) : 0) - : mode === "equalarea" ? Math.sqrt(2 / (1 + cc)) - : 1, - x = k * cy1 * sx1, - y = k * (sy0 * cy1 * cx1 - cy0 * sy1); - return [ - scale * x + translate[0], - scale * y + translate[1] - ]; - } - - azimuthal.invert = function(coordinates) { - var x = (coordinates[0] - translate[0]) / scale, - y = (coordinates[1] - translate[1]) / scale, - p = Math.sqrt(x * x + y * y), - c = mode === "stereographic" ? 2 * Math.atan(p) - : mode === "gnomonic" ? Math.atan(p) - : mode === "equidistant" ? p - : mode === "equalarea" ? 2 * Math.asin(.5 * p) - : Math.asin(p), - sc = Math.sin(c), - cc = Math.cos(c); - return [ - (x0 + Math.atan2(x * sc, p * cy0 * cc + y * sy0 * sc)) / d3_geo_radians, - Math.asin(cc * sy0 - (p ? (y * sc * cy0) / p : 0)) / d3_geo_radians - ]; - }; - - azimuthal.mode = function(x) { - if (!arguments.length) return mode; - mode = x + ""; - return azimuthal; - }; - - azimuthal.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - x0 = origin[0] * d3_geo_radians; - y0 = origin[1] * d3_geo_radians; - cy0 = Math.cos(y0); - sy0 = Math.sin(y0); - return azimuthal; - }; - - azimuthal.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return azimuthal; - }; - - azimuthal.translate = function(x) { - if (!arguments.length) return translate; - translate = [+x[0], +x[1]]; - return azimuthal; - }; - - return azimuthal.origin([0, 0]); -}; -// Derived from Tom Carden's Albers implementation for Protovis. -// http://gist.github.com/476238 -// http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html - -d3.geo.albers = function() { - var origin = [-98, 38], - parallels = [29.5, 45.5], - scale = 1000, - translate = [480, 250], - lng0, // d3_geo_radians * origin[0] - n, - C, - p0; - - function albers(coordinates) { - var t = n * (d3_geo_radians * coordinates[0] - lng0), - p = Math.sqrt(C - 2 * n * Math.sin(d3_geo_radians * coordinates[1])) / n; - return [ - scale * p * Math.sin(t) + translate[0], - scale * (p * Math.cos(t) - p0) + translate[1] - ]; - } - - albers.invert = function(coordinates) { - var x = (coordinates[0] - translate[0]) / scale, - y = (coordinates[1] - translate[1]) / scale, - p0y = p0 + y, - t = Math.atan2(x, p0y), - p = Math.sqrt(x * x + p0y * p0y); - return [ - (lng0 + t / n) / d3_geo_radians, - Math.asin((C - p * p * n * n) / (2 * n)) / d3_geo_radians - ]; - }; - - function reload() { - var phi1 = d3_geo_radians * parallels[0], - phi2 = d3_geo_radians * parallels[1], - lat0 = d3_geo_radians * origin[1], - s = Math.sin(phi1), - c = Math.cos(phi1); - lng0 = d3_geo_radians * origin[0]; - n = .5 * (s + Math.sin(phi2)); - C = c * c + 2 * n * s; - p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n; - return albers; - } - - albers.origin = function(x) { - if (!arguments.length) return origin; - origin = [+x[0], +x[1]]; - return reload(); - }; - - albers.parallels = function(x) { - if (!arguments.length) return parallels; - parallels = [+x[0], +x[1]]; - return reload(); - }; - - albers.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return albers; - }; - - albers.translate = function(x) { - if (!arguments.length) return translate; - translate = [+x[0], +x[1]]; - return albers; - }; - - return reload(); -}; - -// A composite projection for the United States, 960x500. The set of standard -// parallels for each region comes from USGS, which is published here: -// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers -// TODO allow the composite projection to be rescaled? -d3.geo.albersUsa = function() { - var lower48 = d3.geo.albers(); - - var alaska = d3.geo.albers() - .origin([-160, 60]) - .parallels([55, 65]); - - var hawaii = d3.geo.albers() - .origin([-160, 20]) - .parallels([8, 18]); - - var puertoRico = d3.geo.albers() - .origin([-60, 10]) - .parallels([8, 18]); - - function albersUsa(coordinates) { - var lon = coordinates[0], - lat = coordinates[1]; - return (lat > 50 ? alaska - : lon < -140 ? hawaii - : lat < 21 ? puertoRico - : lower48)(coordinates); - } - - albersUsa.scale = function(x) { - if (!arguments.length) return lower48.scale(); - lower48.scale(x); - alaska.scale(x * .6); - hawaii.scale(x); - puertoRico.scale(x * 1.5); - return albersUsa.translate(lower48.translate()); - }; - - albersUsa.translate = function(x) { - if (!arguments.length) return lower48.translate(); - var dz = lower48.scale() / 1000, - dx = x[0], - dy = x[1]; - lower48.translate(x); - alaska.translate([dx - 400 * dz, dy + 170 * dz]); - hawaii.translate([dx - 190 * dz, dy + 200 * dz]); - puertoRico.translate([dx + 580 * dz, dy + 430 * dz]); - return albersUsa; - }; - - return albersUsa.scale(lower48.scale()); -}; -d3.geo.bonne = function() { - var scale = 200, - translate = [480, 250], - x0, // origin longitude in radians - y0, // origin latitude in radians - y1, // parallel latitude in radians - c1; // cot(y1) - - function bonne(coordinates) { - var x = coordinates[0] * d3_geo_radians - x0, - y = coordinates[1] * d3_geo_radians - y0; - if (y1) { - var p = c1 + y1 - y, E = x * Math.cos(y) / p; - x = p * Math.sin(E); - y = p * Math.cos(E) - c1; - } else { - x *= Math.cos(y); - y *= -1; - } - return [ - scale * x + translate[0], - scale * y + translate[1] - ]; - } - - bonne.invert = function(coordinates) { - var x = (coordinates[0] - translate[0]) / scale, - y = (coordinates[1] - translate[1]) / scale; - if (y1) { - var c = c1 + y, p = Math.sqrt(x * x + c * c); - y = c1 + y1 - p; - x = x0 + p * Math.atan2(x, c) / Math.cos(y); - } else { - y *= -1; - x /= Math.cos(y); - } - return [ - x / d3_geo_radians, - y / d3_geo_radians - ]; - }; - - // 90° for Werner, 0° for Sinusoidal - bonne.parallel = function(x) { - if (!arguments.length) return y1 / d3_geo_radians; - c1 = 1 / Math.tan(y1 = x * d3_geo_radians); - return bonne; - }; - - bonne.origin = function(x) { - if (!arguments.length) return [x0 / d3_geo_radians, y0 / d3_geo_radians]; - x0 = x[0] * d3_geo_radians; - y0 = x[1] * d3_geo_radians; - return bonne; - }; - - bonne.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return bonne; - }; - - bonne.translate = function(x) { - if (!arguments.length) return translate; - translate = [+x[0], +x[1]]; - return bonne; - }; - - return bonne.origin([0, 0]).parallel(45); -}; -d3.geo.equirectangular = function() { - var scale = 500, - translate = [480, 250]; - - function equirectangular(coordinates) { - var x = coordinates[0] / 360, - y = -coordinates[1] / 360; - return [ - scale * x + translate[0], - scale * y + translate[1] - ]; - } - - equirectangular.invert = function(coordinates) { - var x = (coordinates[0] - translate[0]) / scale, - y = (coordinates[1] - translate[1]) / scale; - return [ - 360 * x, - -360 * y - ]; - }; - - equirectangular.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return equirectangular; - }; - - equirectangular.translate = function(x) { - if (!arguments.length) return translate; - translate = [+x[0], +x[1]]; - return equirectangular; - }; - - return equirectangular; -}; -d3.geo.mercator = function() { - var scale = 500, - translate = [480, 250]; - - function mercator(coordinates) { - var x = coordinates[0] / 360, - y = -(Math.log(Math.tan(Math.PI / 4 + coordinates[1] * d3_geo_radians / 2)) / d3_geo_radians) / 360; - return [ - scale * x + translate[0], - scale * Math.max(-.5, Math.min(.5, y)) + translate[1] - ]; - } - - mercator.invert = function(coordinates) { - var x = (coordinates[0] - translate[0]) / scale, - y = (coordinates[1] - translate[1]) / scale; - return [ - 360 * x, - 2 * Math.atan(Math.exp(-360 * y * d3_geo_radians)) / d3_geo_radians - 90 - ]; - }; - - mercator.scale = function(x) { - if (!arguments.length) return scale; - scale = +x; - return mercator; - }; - - mercator.translate = function(x) { - if (!arguments.length) return translate; - translate = [+x[0], +x[1]]; - return mercator; - }; - - return mercator; -}; -function d3_geo_type(types, defaultValue) { - return function(object) { - return object && types.hasOwnProperty(object.type) ? types[object.type](object) : defaultValue; - }; -} -/** - * Returns a function that, given a GeoJSON object (e.g., a feature), returns - * the corresponding SVG path. The function can be customized by overriding the - * projection. Point features are mapped to circles with a default radius of - * 4.5px; the radius can be specified either as a constant or a function that - * is evaluated per object. - */ -d3.geo.path = function() { - var pointRadius = 4.5, - pointCircle = d3_path_circle(pointRadius), - projection = d3.geo.albersUsa(); - - function path(d, i) { - if (typeof pointRadius === "function") { - pointCircle = d3_path_circle(pointRadius.apply(this, arguments)); - } - return pathType(d) || null; - } - - function project(coordinates) { - return projection(coordinates).join(","); - } - - var pathType = d3_geo_type({ - - FeatureCollection: function(o) { - var path = [], - features = o.features, - i = -1, // features.index - n = features.length; - while (++i < n) path.push(pathType(features[i].geometry)); - return path.join(""); - }, - - Feature: function(o) { - return pathType(o.geometry); - }, - - Point: function(o) { - return "M" + project(o.coordinates) + pointCircle; - }, - - MultiPoint: function(o) { - var path = [], - coordinates = o.coordinates, - i = -1, // coordinates.index - n = coordinates.length; - while (++i < n) path.push("M", project(coordinates[i]), pointCircle); - return path.join(""); - }, - - LineString: function(o) { - var path = ["M"], - coordinates = o.coordinates, - i = -1, // coordinates.index - n = coordinates.length; - while (++i < n) path.push(project(coordinates[i]), "L"); - path.pop(); - return path.join(""); - }, - - MultiLineString: function(o) { - var path = [], - coordinates = o.coordinates, - i = -1, // coordinates.index - n = coordinates.length, - subcoordinates, // coordinates[i] - j, // subcoordinates.index - m; // subcoordinates.length - while (++i < n) { - subcoordinates = coordinates[i]; - j = -1; - m = subcoordinates.length; - path.push("M"); - while (++j < m) path.push(project(subcoordinates[j]), "L"); - path.pop(); - } - return path.join(""); - }, - - Polygon: function(o) { - var path = [], - coordinates = o.coordinates, - i = -1, // coordinates.index - n = coordinates.length, - subcoordinates, // coordinates[i] - j, // subcoordinates.index - m; // subcoordinates.length - while (++i < n) { - subcoordinates = coordinates[i]; - j = -1; - if ((m = subcoordinates.length - 1) > 0) { - path.push("M"); - while (++j < m) path.push(project(subcoordinates[j]), "L"); - path[path.length - 1] = "Z"; - } - } - return path.join(""); - }, - - MultiPolygon: function(o) { - var path = [], - coordinates = o.coordinates, - i = -1, // coordinates index - n = coordinates.length, - subcoordinates, // coordinates[i] - j, // subcoordinates index - m, // subcoordinates.length - subsubcoordinates, // subcoordinates[j] - k, // subsubcoordinates index - p; // subsubcoordinates.length - while (++i < n) { - subcoordinates = coordinates[i]; - j = -1; - m = subcoordinates.length; - while (++j < m) { - subsubcoordinates = subcoordinates[j]; - k = -1; - if ((p = subsubcoordinates.length - 1) > 0) { - path.push("M"); - while (++k < p) path.push(project(subsubcoordinates[k]), "L"); - path[path.length - 1] = "Z"; - } - } - } - return path.join(""); - }, - - GeometryCollection: function(o) { - var path = [], - geometries = o.geometries, - i = -1, // geometries index - n = geometries.length; - while (++i < n) path.push(pathType(geometries[i])); - return path.join(""); - } - - }); - - var areaType = path.area = d3_geo_type({ - - FeatureCollection: function(o) { - var area = 0, - features = o.features, - i = -1, // features.index - n = features.length; - while (++i < n) area += areaType(features[i]); - return area; - }, - - Feature: function(o) { - return areaType(o.geometry); - }, - - Polygon: function(o) { - return polygonArea(o.coordinates); - }, - - MultiPolygon: function(o) { - var sum = 0, - coordinates = o.coordinates, - i = -1, // coordinates index - n = coordinates.length; - while (++i < n) sum += polygonArea(coordinates[i]); - return sum; - }, - - GeometryCollection: function(o) { - var sum = 0, - geometries = o.geometries, - i = -1, // geometries index - n = geometries.length; - while (++i < n) sum += areaType(geometries[i]); - return sum; - } - - }, 0); - - function polygonArea(coordinates) { - var sum = area(coordinates[0]), // exterior ring - i = 0, // coordinates.index - n = coordinates.length; - while (++i < n) sum -= area(coordinates[i]); // holes - return sum; - } - - function polygonCentroid(coordinates) { - var polygon = d3.geom.polygon(coordinates[0].map(projection)), // exterior ring - area = polygon.area(), - centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1), - x = centroid[0], - y = centroid[1], - z = area, - i = 0, // coordinates index - n = coordinates.length; - while (++i < n) { - polygon = d3.geom.polygon(coordinates[i].map(projection)); // holes - area = polygon.area(); - centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1); - x -= centroid[0]; - y -= centroid[1]; - z -= area; - } - return [x, y, 6 * z]; // weighted centroid - } - - var centroidType = path.centroid = d3_geo_type({ - - // TODO FeatureCollection - // TODO Point - // TODO MultiPoint - // TODO LineString - // TODO MultiLineString - // TODO GeometryCollection - - Feature: function(o) { - return centroidType(o.geometry); - }, - - Polygon: function(o) { - var centroid = polygonCentroid(o.coordinates); - return [centroid[0] / centroid[2], centroid[1] / centroid[2]]; - }, - - MultiPolygon: function(o) { - var area = 0, - coordinates = o.coordinates, - centroid, - x = 0, - y = 0, - z = 0, - i = -1, // coordinates index - n = coordinates.length; - while (++i < n) { - centroid = polygonCentroid(coordinates[i]); - x += centroid[0]; - y += centroid[1]; - z += centroid[2]; - } - return [x / z, y / z]; - } - - }); - - function area(coordinates) { - return Math.abs(d3.geom.polygon(coordinates.map(projection)).area()); - } - - path.projection = function(x) { - projection = x; - return path; - }; - - path.pointRadius = function(x) { - if (typeof x === "function") pointRadius = x; - else { - pointRadius = +x; - pointCircle = d3_path_circle(pointRadius); - } - return path; - }; - - return path; -}; - -function d3_path_circle(radius) { - return "m0," + radius - + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius) - + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius) - + "z"; -} -/** - * Given a GeoJSON object, returns the corresponding bounding box. The bounding - * box is represented by a two-dimensional array: [[left, bottom], [right, - * top]], where left is the minimum longitude, bottom is the minimum latitude, - * right is maximum longitude, and top is the maximum latitude. - */ -d3.geo.bounds = function(feature) { - var left = Infinity, - bottom = Infinity, - right = -Infinity, - top = -Infinity; - d3_geo_bounds(feature, function(x, y) { - if (x < left) left = x; - if (x > right) right = x; - if (y < bottom) bottom = y; - if (y > top) top = y; - }); - return [[left, bottom], [right, top]]; -}; - -function d3_geo_bounds(o, f) { - if (d3_geo_boundsTypes.hasOwnProperty(o.type)) d3_geo_boundsTypes[o.type](o, f); -} - -var d3_geo_boundsTypes = { - Feature: d3_geo_boundsFeature, - FeatureCollection: d3_geo_boundsFeatureCollection, - GeometryCollection: d3_geo_boundsGeometryCollection, - LineString: d3_geo_boundsLineString, - MultiLineString: d3_geo_boundsMultiLineString, - MultiPoint: d3_geo_boundsLineString, - MultiPolygon: d3_geo_boundsMultiPolygon, - Point: d3_geo_boundsPoint, - Polygon: d3_geo_boundsPolygon -}; - -function d3_geo_boundsFeature(o, f) { - d3_geo_bounds(o.geometry, f); -} - -function d3_geo_boundsFeatureCollection(o, f) { - for (var a = o.features, i = 0, n = a.length; i < n; i++) { - d3_geo_bounds(a[i].geometry, f); - } -} - -function d3_geo_boundsGeometryCollection(o, f) { - for (var a = o.geometries, i = 0, n = a.length; i < n; i++) { - d3_geo_bounds(a[i], f); - } -} - -function d3_geo_boundsLineString(o, f) { - for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) { - f.apply(null, a[i]); - } -} - -function d3_geo_boundsMultiLineString(o, f) { - for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) { - for (var b = a[i], j = 0, m = b.length; j < m; j++) { - f.apply(null, b[j]); - } - } -} - -function d3_geo_boundsMultiPolygon(o, f) { - for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) { - for (var b = a[i][0], j = 0, m = b.length; j < m; j++) { - f.apply(null, b[j]); - } - } -} - -function d3_geo_boundsPoint(o, f) { - f.apply(null, o.coordinates); -} - -function d3_geo_boundsPolygon(o, f) { - for (var a = o.coordinates[0], i = 0, n = a.length; i < n; i++) { - f.apply(null, a[i]); - } -} -// TODO breakAtDateLine? - -d3.geo.circle = function() { - var origin = [0, 0], - degrees = 90 - 1e-2, - radians = degrees * d3_geo_radians, - arc = d3.geo.greatArc().target(d3_identity); - - function circle() { - // TODO render a circle as a Polygon - } - - function visible(point) { - return arc.distance(point) < radians; - } - - circle.clip = function(d) { - arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin); - return clipType(d); - }; - - var clipType = d3_geo_type({ - - FeatureCollection: function(o) { - var features = o.features.map(clipType).filter(d3_identity); - return features && (o = Object.create(o), o.features = features, o); - }, - - Feature: function(o) { - var geometry = clipType(o.geometry); - return geometry && (o = Object.create(o), o.geometry = geometry, o); - }, - - Point: function(o) { - return visible(o.coordinates) && o; - }, - - MultiPoint: function(o) { - var coordinates = o.coordinates.filter(visible); - return coordinates.length && { - type: o.type, - coordinates: coordinates - }; - }, - - LineString: function(o) { - var coordinates = clip(o.coordinates); - return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o); - }, - - MultiLineString: function(o) { - var coordinates = o.coordinates.map(clip).filter(function(d) { return d.length; }); - return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o); - }, - - Polygon: function(o) { - var coordinates = o.coordinates.map(clip); - return coordinates[0].length && (o = Object.create(o), o.coordinates = coordinates, o); - }, - - MultiPolygon: function(o) { - var coordinates = o.coordinates.map(function(d) { return d.map(clip); }).filter(function(d) { return d[0].length; }); - return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o); - }, - - GeometryCollection: function(o) { - var geometries = o.geometries.map(clipType).filter(d3_identity); - return geometries.length && (o = Object.create(o), o.geometries = geometries, o); - } - - }); - - function clip(coordinates) { - var i = -1, - n = coordinates.length, - clipped = [], - p0, - p1, - p2, - d0, - d1; - - while (++i < n) { - d1 = arc.distance(p2 = coordinates[i]); - if (d1 < radians) { - if (p1) clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1))); - clipped.push(p2); - p0 = p1 = null; - } else { - p1 = p2; - if (!p0 && clipped.length) { - clipped.push(d3_geo_greatArcInterpolate(clipped[clipped.length - 1], p1)((radians - d0) / (d1 - d0))); - p0 = p1; - } - } - d0 = d1; - } - - if (p1 && clipped.length) { - d1 = arc.distance(p2 = clipped[0]); - clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1))); - } - - return resample(clipped); - } - - // Resample coordinates, creating great arcs between each. - function resample(coordinates) { - var i = 0, - n = coordinates.length, - j, - m, - resampled = n ? [coordinates[0]] : coordinates, - resamples, - origin = arc.source(); - - while (++i < n) { - resamples = arc.source(coordinates[i - 1])(coordinates[i]).coordinates; - for (j = 0, m = resamples.length; ++j < m;) resampled.push(resamples[j]); - } - - arc.source(origin); - return resampled; - } - - circle.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return circle; - }; - - circle.angle = function(x) { - if (!arguments.length) return degrees; - radians = (degrees = +x) * d3_geo_radians; - return circle; - }; - - // Precision is specified in degrees. - circle.precision = function(x) { - if (!arguments.length) return arc.precision(); - arc.precision(x); - return circle; - }; - - return circle; -} -d3.geo.greatArc = function() { - var source = d3_geo_greatArcSource, - target = d3_geo_greatArcTarget, - precision = 6 * d3_geo_radians; - - function greatArc() { - var a = typeof source === "function" ? source.apply(this, arguments) : source, - b = typeof target === "function" ? target.apply(this, arguments) : target, - i = d3_geo_greatArcInterpolate(a, b), - dt = precision / i.d, - t = 0, - coordinates = [a]; - while ((t += dt) < 1) coordinates.push(i(t)); - coordinates.push(b); - return { - type: "LineString", - coordinates: coordinates - }; - } - - // Length returned in radians; multiply by radius for distance. - greatArc.distance = function() { - var a = typeof source === "function" ? source.apply(this, arguments) : source, - b = typeof target === "function" ? target.apply(this, arguments) : target; - return d3_geo_greatArcInterpolate(a, b).d; - }; - - greatArc.source = function(x) { - if (!arguments.length) return source; - source = x; - return greatArc; - }; - - greatArc.target = function(x) { - if (!arguments.length) return target; - target = x; - return greatArc; - }; - - // Precision is specified in degrees. - greatArc.precision = function(x) { - if (!arguments.length) return precision / d3_geo_radians; - precision = x * d3_geo_radians; - return greatArc; - }; - - return greatArc; -}; - -function d3_geo_greatArcSource(d) { - return d.source; -} - -function d3_geo_greatArcTarget(d) { - return d.target; -} - -function d3_geo_greatArcInterpolate(a, b) { - var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0), - y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0), - x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1), - y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1), - d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))), - sd = Math.sin(d); - - // From http://williams.best.vwh.net/avform.htm#Intermediate - function interpolate(t) { - var A = Math.sin(d - (t *= d)) / sd, - B = Math.sin(t) / sd, - x = A * cy0 * cx0 + B * cy1 * cx1, - y = A * cy0 * sx0 + B * cy1 * sx1, - z = A * sy0 + B * sy1; - return [ - Math.atan2(y, x) / d3_geo_radians, - Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians - ]; - } - - return interpolate; -} -d3.geo.greatCircle = d3.geo.circle; -d3.geom = {}; -/** - * Computes a contour for a given input grid function using the marching - * squares algorithm. Returns the contour polygon as an array of points. - * - * @param grid a two-input function(x, y) that returns true for values - * inside the contour and false for values outside the contour. - * @param start an optional starting point [x, y] on the grid. - * @returns polygon [[x1, y1], [x2, y2], …] - */ -d3.geom.contour = function(grid, start) { - var s = start || d3_geom_contourStart(grid), // starting point - c = [], // contour polygon - x = s[0], // current x position - y = s[1], // current y position - dx = 0, // next x direction - dy = 0, // next y direction - pdx = NaN, // previous x direction - pdy = NaN, // previous y direction - i = 0; - - do { - // determine marching squares index - i = 0; - if (grid(x-1, y-1)) i += 1; - if (grid(x, y-1)) i += 2; - if (grid(x-1, y )) i += 4; - if (grid(x, y )) i += 8; - - // determine next direction - if (i === 6) { - dx = pdy === -1 ? -1 : 1; - dy = 0; - } else if (i === 9) { - dx = 0; - dy = pdx === 1 ? -1 : 1; - } else { - dx = d3_geom_contourDx[i]; - dy = d3_geom_contourDy[i]; - } - - // update contour polygon - if (dx != pdx && dy != pdy) { - c.push([x, y]); - pdx = dx; - pdy = dy; - } - - x += dx; - y += dy; - } while (s[0] != x || s[1] != y); - - return c; -}; - -// lookup tables for marching directions -var d3_geom_contourDx = [1, 0, 1, 1,-1, 0,-1, 1,0, 0,0,0,-1, 0,-1,NaN], - d3_geom_contourDy = [0,-1, 0, 0, 0,-1, 0, 0,1,-1,1,1, 0,-1, 0,NaN]; - -function d3_geom_contourStart(grid) { - var x = 0, - y = 0; - - // search for a starting point; begin at origin - // and proceed along outward-expanding diagonals - while (true) { - if (grid(x,y)) { - return [x,y]; - } - if (x === 0) { - x = y + 1; - y = 0; - } else { - x = x - 1; - y = y + 1; - } - } -} -/** - * Computes the 2D convex hull of a set of points using Graham's scanning - * algorithm. The algorithm has been implemented as described in Cormen, - * Leiserson, and Rivest's Introduction to Algorithms. The running time of - * this algorithm is O(n log n), where n is the number of input points. - * - * @param vertices [[x1, y1], [x2, y2], …] - * @returns polygon [[x1, y1], [x2, y2], …] - */ -d3.geom.hull = function(vertices) { - if (vertices.length < 3) return []; - - var len = vertices.length, - plen = len - 1, - points = [], - stack = [], - i, j, h = 0, x1, y1, x2, y2, u, v, a, sp; - - // find the starting ref point: leftmost point with the minimum y coord - for (i=1; i= (x2*x2 + y2*y2)) { - points[i].index = -1; - } else { - points[u].index = -1; - a = points[i].angle; - u = i; - v = j; - } - } else { - a = points[i].angle; - u = i; - v = j; - } - } - - // initialize the stack - stack.push(h); - for (i=0, j=0; i<2; ++j) { - if (points[j].index !== -1) { - stack.push(points[j].index); - i++; - } - } - sp = stack.length; - - // do graham's scan - for (; j 0; -} -// Note: requires coordinates to be counterclockwise and convex! -d3.geom.polygon = function(coordinates) { - - coordinates.area = function() { - var i = 0, - n = coordinates.length, - a = coordinates[n - 1][0] * coordinates[0][1], - b = coordinates[n - 1][1] * coordinates[0][0]; - while (++i < n) { - a += coordinates[i - 1][0] * coordinates[i][1]; - b += coordinates[i - 1][1] * coordinates[i][0]; - } - return (b - a) * .5; - }; - - coordinates.centroid = function(k) { - var i = -1, - n = coordinates.length, - x = 0, - y = 0, - a, - b = coordinates[n - 1], - c; - if (!arguments.length) k = -1 / (6 * coordinates.area()); - while (++i < n) { - a = b; - b = coordinates[i]; - c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } - return [x * k, y * k]; - }; - - // The Sutherland-Hodgman clipping algorithm. - coordinates.clip = function(subject) { - var input, - i = -1, - n = coordinates.length, - j, - m, - a = coordinates[n - 1], - b, - c, - d; - while (++i < n) { - input = subject.slice(); - subject.length = 0; - b = coordinates[i]; - c = input[(m = input.length) - 1]; - j = -1; - while (++j < m) { - d = input[j]; - if (d3_geom_polygonInside(d, a, b)) { - if (!d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - subject.push(d); - } else if (d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - c = d; - } - a = b; - } - return subject; - }; - - return coordinates; -}; - -function d3_geom_polygonInside(p, a, b) { - return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); -} - -// Intersect two infinite lines cd and ab. -function d3_geom_polygonIntersect(c, d, a, b) { - var x1 = c[0], x2 = d[0], x3 = a[0], x4 = b[0], - y1 = c[1], y2 = d[1], y3 = a[1], y4 = b[1], - x13 = x1 - x3, - x21 = x2 - x1, - x43 = x4 - x3, - y13 = y1 - y3, - y21 = y2 - y1, - y43 = y4 - y3, - ua = (x43 * y13 - y43 * x13) / (y43 * x21 - x43 * y21); - return [x1 + ua * x21, y1 + ua * y21]; -} -// Adapted from Nicolas Garcia Belmonte's JIT implementation: -// http://blog.thejit.org/2010/02/12/voronoi-tessellation/ -// http://blog.thejit.org/assets/voronoijs/voronoi.js -// See lib/jit/LICENSE for details. - -// Notes: -// -// This implementation does not clip the returned polygons, so if you want to -// clip them to a particular shape you will need to do that either in SVG or by -// post-processing with d3.geom.polygon's clip method. -// -// If any vertices are coincident or have NaN positions, the behavior of this -// method is undefined. Most likely invalid polygons will be returned. You -// should filter invalid points, and consolidate coincident points, before -// computing the tessellation. - -/** - * @param vertices [[x1, y1], [x2, y2], …] - * @returns polygons [[[x1, y1], [x2, y2], …], …] - */ -d3.geom.voronoi = function(vertices) { - var polygons = vertices.map(function() { return []; }); - - d3_voronoi_tessellate(vertices, function(e) { - var s1, - s2, - x1, - x2, - y1, - y2; - if (e.a === 1 && e.b >= 0) { - s1 = e.ep.r; - s2 = e.ep.l; - } else { - s1 = e.ep.l; - s2 = e.ep.r; - } - if (e.a === 1) { - y1 = s1 ? s1.y : -1e6; - x1 = e.c - e.b * y1; - y2 = s2 ? s2.y : 1e6; - x2 = e.c - e.b * y2; - } else { - x1 = s1 ? s1.x : -1e6; - y1 = e.c - e.a * x1; - x2 = s2 ? s2.x : 1e6; - y2 = e.c - e.a * x2; - } - var v1 = [x1, y1], - v2 = [x2, y2]; - polygons[e.region.l.index].push(v1, v2); - polygons[e.region.r.index].push(v1, v2); - }); - - // Reconnect the polygon segments into counterclockwise loops. - return polygons.map(function(polygon, i) { - var cx = vertices[i][0], - cy = vertices[i][1]; - polygon.forEach(function(v) { - v.angle = Math.atan2(v[0] - cx, v[1] - cy); - }); - return polygon.sort(function(a, b) { - return a.angle - b.angle; - }).filter(function(d, i) { - return !i || (d.angle - polygon[i - 1].angle > 1e-10); - }); - }); -}; - -var d3_voronoi_opposite = {"l": "r", "r": "l"}; - -function d3_voronoi_tessellate(vertices, callback) { - - var Sites = { - list: vertices - .map(function(v, i) { - return { - index: i, - x: v[0], - y: v[1] - }; - }) - .sort(function(a, b) { - return a.y < b.y ? -1 - : a.y > b.y ? 1 - : a.x < b.x ? -1 - : a.x > b.x ? 1 - : 0; - }), - bottomSite: null - }; - - var EdgeList = { - list: [], - leftEnd: null, - rightEnd: null, - - init: function() { - EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l"); - EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l"); - EdgeList.leftEnd.r = EdgeList.rightEnd; - EdgeList.rightEnd.l = EdgeList.leftEnd; - EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd); - }, - - createHalfEdge: function(edge, side) { - return { - edge: edge, - side: side, - vertex: null, - "l": null, - "r": null - }; - }, - - insert: function(lb, he) { - he.l = lb; - he.r = lb.r; - lb.r.l = he; - lb.r = he; - }, - - leftBound: function(p) { - var he = EdgeList.leftEnd; - do { - he = he.r; - } while (he != EdgeList.rightEnd && Geom.rightOf(he, p)); - he = he.l; - return he; - }, - - del: function(he) { - he.l.r = he.r; - he.r.l = he.l; - he.edge = null; - }, - - right: function(he) { - return he.r; - }, - - left: function(he) { - return he.l; - }, - - leftRegion: function(he) { - return he.edge == null - ? Sites.bottomSite - : he.edge.region[he.side]; - }, - - rightRegion: function(he) { - return he.edge == null - ? Sites.bottomSite - : he.edge.region[d3_voronoi_opposite[he.side]]; - } - }; - - var Geom = { - - bisect: function(s1, s2) { - var newEdge = { - region: {"l": s1, "r": s2}, - ep: {"l": null, "r": null} - }; - - var dx = s2.x - s1.x, - dy = s2.y - s1.y, - adx = dx > 0 ? dx : -dx, - ady = dy > 0 ? dy : -dy; - - newEdge.c = s1.x * dx + s1.y * dy - + (dx * dx + dy * dy) * .5; - - if (adx > ady) { - newEdge.a = 1; - newEdge.b = dy / dx; - newEdge.c /= dx; - } else { - newEdge.b = 1; - newEdge.a = dx / dy; - newEdge.c /= dy; - } - - return newEdge; - }, - - intersect: function(el1, el2) { - var e1 = el1.edge, - e2 = el2.edge; - if (!e1 || !e2 || (e1.region.r == e2.region.r)) { - return null; - } - var d = (e1.a * e2.b) - (e1.b * e2.a); - if (Math.abs(d) < 1e-10) { - return null; - } - var xint = (e1.c * e2.b - e2.c * e1.b) / d, - yint = (e2.c * e1.a - e1.c * e2.a) / d, - e1r = e1.region.r, - e2r = e2.region.r, - el, - e; - if ((e1r.y < e2r.y) || - (e1r.y == e2r.y && e1r.x < e2r.x)) { - el = el1; - e = e1; - } else { - el = el2; - e = e2; - } - var rightOfSite = (xint >= e.region.r.x); - if ((rightOfSite && (el.side === "l")) || - (!rightOfSite && (el.side === "r"))) { - return null; - } - return { - x: xint, - y: yint - }; - }, - - rightOf: function(he, p) { - var e = he.edge, - topsite = e.region.r, - rightOfSite = (p.x > topsite.x); - - if (rightOfSite && (he.side === "l")) { - return 1; - } - if (!rightOfSite && (he.side === "r")) { - return 0; - } - if (e.a === 1) { - var dyp = p.y - topsite.y, - dxp = p.x - topsite.x, - fast = 0, - above = 0; - - if ((!rightOfSite && (e.b < 0)) || - (rightOfSite && (e.b >= 0))) { - above = fast = (dyp >= e.b * dxp); - } else { - above = ((p.x + p.y * e.b) > e.c); - if (e.b < 0) { - above = !above; - } - if (!above) { - fast = 1; - } - } - if (!fast) { - var dxs = topsite.x - e.region.l.x; - above = (e.b * (dxp * dxp - dyp * dyp)) < - (dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b)); - - if (e.b < 0) { - above = !above; - } - } - } else /* e.b == 1 */ { - var yl = e.c - e.a * p.x, - t1 = p.y - yl, - t2 = p.x - topsite.x, - t3 = yl - topsite.y; - - above = (t1 * t1) > (t2 * t2 + t3 * t3); - } - return he.side === "l" ? above : !above; - }, - - endPoint: function(edge, side, site) { - edge.ep[side] = site; - if (!edge.ep[d3_voronoi_opposite[side]]) return; - callback(edge); - }, - - distance: function(s, t) { - var dx = s.x - t.x, - dy = s.y - t.y; - return Math.sqrt(dx * dx + dy * dy); - } - }; - - var EventQueue = { - list: [], - - insert: function(he, site, offset) { - he.vertex = site; - he.ystar = site.y + offset; - for (var i=0, list=EventQueue.list, l=list.length; i next.ystar || - (he.ystar == next.ystar && - site.x > next.vertex.x)) { - continue; - } else { - break; - } - } - list.splice(i, 0, he); - }, - - del: function(he) { - for (var i=0, ls=EventQueue.list, l=ls.length; i top.y) { - temp = bot; - bot = top; - top = temp; - pm = "r"; - } - e = Geom.bisect(bot, top); - bisector = EdgeList.createHalfEdge(e, pm); - EdgeList.insert(llbnd, bisector); - Geom.endPoint(e, d3_voronoi_opposite[pm], v); - p = Geom.intersect(llbnd, bisector); - if (p) { - EventQueue.del(llbnd); - EventQueue.insert(llbnd, p, Geom.distance(p, bot)); - } - p = Geom.intersect(bisector, rrbnd); - if (p) { - EventQueue.insert(bisector, p, Geom.distance(p, bot)); - } - } else { - break; - } - }//end while - - for (lbnd = EdgeList.right(EdgeList.leftEnd); - lbnd != EdgeList.rightEnd; - lbnd = EdgeList.right(lbnd)) { - callback(lbnd.edge); - } -} -/** -* @param vertices [[x1, y1], [x2, y2], …] -* @returns triangles [[[x1, y1], [x2, y2], [x3, y3]], …] - */ -d3.geom.delaunay = function(vertices) { - var edges = vertices.map(function() { return []; }), - triangles = []; - - // Use the Voronoi tessellation to determine Delaunay edges. - d3_voronoi_tessellate(vertices, function(e) { - edges[e.region.l.index].push(vertices[e.region.r.index]); - }); - - // Reconnect the edges into counterclockwise triangles. - edges.forEach(function(edge, i) { - var v = vertices[i], - cx = v[0], - cy = v[1]; - edge.forEach(function(v) { - v.angle = Math.atan2(v[0] - cx, v[1] - cy); - }); - edge.sort(function(a, b) { - return a.angle - b.angle; - }); - for (var j = 0, m = edge.length - 1; j < m; j++) { - triangles.push([v, edge[j], edge[j + 1]]); - } - }); - - return triangles; -}; -// Constructs a new quadtree for the specified array of points. A quadtree is a -// two-dimensional recursive spatial subdivision. This implementation uses -// square partitions, dividing each square into four equally-sized squares. Each -// point exists in a unique node; if multiple points are in the same position, -// some points may be stored on internal nodes rather than leaf nodes. Quadtrees -// can be used to accelerate various spatial operations, such as the Barnes-Hut -// approximation for computing n-body forces, or collision detection. -d3.geom.quadtree = function(points, x1, y1, x2, y2) { - var p, - i = -1, - n = points.length; - - // Type conversion for deprecated API. - if (n && isNaN(points[0].x)) points = points.map(d3_geom_quadtreePoint); - - // Allow bounds to be specified explicitly. - if (arguments.length < 5) { - if (arguments.length === 3) { - y2 = x2 = y1; - y1 = x1; - } else { - x1 = y1 = Infinity; - x2 = y2 = -Infinity; - - // Compute bounds. - while (++i < n) { - p = points[i]; - if (p.x < x1) x1 = p.x; - if (p.y < y1) y1 = p.y; - if (p.x > x2) x2 = p.x; - if (p.y > y2) y2 = p.y; - } - - // Squarify the bounds. - var dx = x2 - x1, - dy = y2 - y1; - if (dx > dy) y2 = y1 + dx; - else x2 = x1 + dy; - } - } - - // Recursively inserts the specified point p at the node n or one of its - // descendants. The bounds are defined by [x1, x2] and [y1, y2]. - function insert(n, p, x1, y1, x2, y2) { - if (isNaN(p.x) || isNaN(p.y)) return; // ignore invalid points - if (n.leaf) { - var v = n.point; - if (v) { - // If the point at this leaf node is at the same position as the new - // point we are adding, we leave the point associated with the - // internal node while adding the new point to a child node. This - // avoids infinite recursion. - if ((Math.abs(v.x - p.x) + Math.abs(v.y - p.y)) < .01) { - insertChild(n, p, x1, y1, x2, y2); - } else { - n.point = null; - insertChild(n, v, x1, y1, x2, y2); - insertChild(n, p, x1, y1, x2, y2); - } - } else { - n.point = p; - } - } else { - insertChild(n, p, x1, y1, x2, y2); - } - } - - // Recursively inserts the specified point p into a descendant of node n. The - // bounds are defined by [x1, x2] and [y1, y2]. - function insertChild(n, p, x1, y1, x2, y2) { - // Compute the split point, and the quadrant in which to insert p. - var sx = (x1 + x2) * .5, - sy = (y1 + y2) * .5, - right = p.x >= sx, - bottom = p.y >= sy, - i = (bottom << 1) + right; - - // Recursively insert into the child node. - n.leaf = false; - n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); - - // Update the bounds as we recurse. - if (right) x1 = sx; else x2 = sx; - if (bottom) y1 = sy; else y2 = sy; - insert(n, p, x1, y1, x2, y2); - } - - // Create the root node. - var root = d3_geom_quadtreeNode(); - - root.add = function(p) { - insert(root, p, x1, y1, x2, y2); - }; - - root.visit = function(f) { - d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2); - }; - - // Insert all points. - points.forEach(root.add); - return root; -}; - -function d3_geom_quadtreeNode() { - return { - leaf: true, - nodes: [], - point: null - }; -} - -function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { - if (!f(node, x1, y1, x2, y2)) { - var sx = (x1 + x2) * .5, - sy = (y1 + y2) * .5, - children = node.nodes; - if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); - if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); - if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); - if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); - } -} - -function d3_geom_quadtreePoint(p) { - return { - x: p[0], - y: p[1] - }; -} -d3.time = {}; - -var d3_time = Date; - -function d3_time_utc() { - this._ = new Date(arguments.length > 1 - ? Date.UTC.apply(this, arguments) - : arguments[0]); -} - -d3_time_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTime: function() { return this._.getTime(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.valueOf(); }, - setDate: function() { d3_time_prototype.setUTCDate.apply(this._, arguments); }, - setDay: function() { d3_time_prototype.setUTCDay.apply(this._, arguments); }, - setFullYear: function() { d3_time_prototype.setUTCFullYear.apply(this._, arguments); }, - setHours: function() { d3_time_prototype.setUTCHours.apply(this._, arguments); }, - setMilliseconds: function() { d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); }, - setMinutes: function() { d3_time_prototype.setUTCMinutes.apply(this._, arguments); }, - setMonth: function() { d3_time_prototype.setUTCMonth.apply(this._, arguments); }, - setSeconds: function() { d3_time_prototype.setUTCSeconds.apply(this._, arguments); }, - setTime: function() { d3_time_prototype.setTime.apply(this._, arguments); } -}; - -var d3_time_prototype = Date.prototype; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var d = {y: 1900, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}, - i = d3_time_parse(d, template, string, 0); - if (i != string.length) return null; - - // The am-pm flag is 0 for AM, and 1 for PM. - if ("p" in d) d.H = d.H % 12 + d.p * 12; - - var date = new d3_time(); - date.setFullYear(d.y, d.m, d.d); - date.setHours(d.H, d.M, d.S, d.L); - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: function(d) { return d3_time_zfill3(1 + d3.time.dayOfYear(d)); }, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: function(d) { return d3_time_zfill2(d3.time.sundayOfYear(d)); }, - w: function(d) { return d.getDay(); }, - W: function(d) { return d3_time_zfill2(d3.time.mondayOfYear(d)); }, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour24, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return d3_time_weekdayAbbrevRe.test(string.substring(i, i += 3)) ? i : -1; -} - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayAbbrevRe = /^(?:sun|mon|tue|wed|thu|fri|sat)/i, - d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/i, - d3_time_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup.get(string.substring(i, i += 3).toLowerCase()); - return n == null ? -1 : (date.m = n, i); -} - -var d3_time_monthAbbrevLookup = d3.map({ - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}); - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = d3.map({ - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}); - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.y = +n[0], i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.y = d3_time_century() + +n[0], i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.m = n[0] - 1, i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.d = +n[0], i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23] or [1,12]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.H = +n[0], i += n[0].length) : -1; -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.M = +n[0], i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.S = +n[0], i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.L = +n[0], i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase()); - return n == null ? -1 : (date.p = n, i); -} - -var d3_time_amPmLookup = d3.map({ - am: 0, - pm: 1 -}); - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_interval(local, step, number) { - - function round(date) { - var d0 = local(date), d1 = offset(d0, 1); - return date - d0 < d1 - date ? d0 : d1; - } - - function ceil(date) { - step(date = local(new d3_time(date - 1)), 1); - return date; - } - - function offset(date, k) { - step(date = new d3_time(+date), k); - return date; - } - - function range(t0, t1, dt) { - var time = ceil(t0), times = []; - if (dt > 1) { - while (time < t1) { - if (!(number(time) % dt)) times.push(new Date(+time)); - step(time, 1); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time, 1); - } - return times; - } - - function range_utc(t0, t1, dt) { - try { - d3_time = d3_time_utc; - var utc = new d3_time_utc(); - utc._ = t0; - return range(utc, t1, dt); - } finally { - d3_time = Date; - } - } - - local.floor = local; - local.round = round; - local.ceil = ceil; - local.offset = offset; - local.range = range; - - var utc = local.utc = d3_time_interval_utc(local); - utc.floor = utc; - utc.round = d3_time_interval_utc(round); - utc.ceil = d3_time_interval_utc(ceil); - utc.offset = d3_time_interval_utc(offset); - utc.range = range_utc; - - return local; -} - -function d3_time_interval_utc(method) { - return function(date, k) { - try { - d3_time = d3_time_utc; - var utc = new d3_time_utc(); - utc._ = date; - return method(utc, k)._; - } finally { - d3_time = Date; - } - }; -} -d3.time.second = d3_time_interval(function(date) { - return new d3_time(Math.floor(date / 1e3) * 1e3); -}, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 1e3); // DST breaks setSeconds -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds = d3.time.second.range; -d3.time.seconds.utc = d3.time.second.utc.range; -d3.time.minute = d3_time_interval(function(date) { - return new d3_time(Math.floor(date / 6e4) * 6e4); -}, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 6e4); // DST breaks setMinutes -}, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes = d3.time.minute.range; -d3.time.minutes.utc = d3.time.minute.utc.range; -d3.time.hour = d3_time_interval(function(date) { - var timezone = date.getTimezoneOffset() / 60; - return new d3_time((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); -}, function(date, offset) { - date.setTime(date.getTime() + Math.floor(offset) * 36e5); // DST breaks setHours -}, function(date) { - return date.getHours(); -}); - -d3.time.hours = d3.time.hour.range; -d3.time.hours.utc = d3.time.hour.utc.range; -d3.time.day = d3_time_interval(function(date) { - return new d3_time(date.getFullYear(), date.getMonth(), date.getDate()); -}, function(date, offset) { - date.setDate(date.getDate() + offset); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days = d3.time.day.range; -d3.time.days.utc = d3.time.day.utc.range; - -d3.time.dayOfYear = function(date) { - var year = d3.time.year(date); - return Math.floor((date - year) / 864e5 - (date.getTimezoneOffset() - year.getTimezoneOffset()) / 1440); -}; -d3_time_weekdays.forEach(function(day, i) { - day = day.toLowerCase(); - i = 7 - i; - - var interval = d3.time[day] = d3_time_interval(function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); - return date; - }, function(date, offset) { - date.setDate(date.getDate() + Math.floor(offset) * 7); - }, function(date) { - var day = d3.time.year(date).getDay(); - return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); - }); - - d3.time[day + "s"] = interval.range; - d3.time[day + "s"].utc = interval.utc.range; - - d3.time[day + "OfYear"] = function(date) { - var day = d3.time.year(date).getDay(); - return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7); - }; -}); - -d3.time.week = d3.time.sunday; -d3.time.weeks = d3.time.sunday.range; -d3.time.weeks.utc = d3.time.sunday.utc.range; -d3.time.weekOfYear = d3.time.sundayOfYear; -d3.time.month = d3_time_interval(function(date) { - return new d3_time(date.getFullYear(), date.getMonth(), 1); -}, function(date, offset) { - date.setMonth(date.getMonth() + offset); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months = d3.time.month.range; -d3.time.months.utc = d3.time.month.utc.range; -d3.time.year = d3_time_interval(function(date) { - return new d3_time(date.getFullYear(), 0, 1); -}, function(date, offset) { - date.setFullYear(date.getFullYear() + offset); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years = d3.time.year.range; -d3.time.years.utc = d3.time.year.utc.range; -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.nice = function(m) { - var extent = d3_time_scaleExtent(scale.domain()); - return scale.domain([m.floor(extent[0]), m.ceil(extent[1])]); - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target); - if (i == d3_time_scaleSteps.length) return methods.year(extent, m); - if (!i) return linear.ticks(m).map(d3_time_scaleDate); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0].range; - } - return m(extent[0], new Date(+extent[1] + 1), k); // inclusive upper bound - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -function d3_time_scaleSetYear(y) { - var d = new Date(y, 0, 1); - d.setFullYear(y); // Y2K fail - return d; -} - -function d3_time_scaleGetYear(d) { - var y = d.getFullYear(), - d0 = d3_time_scaleSetYear(y), - d1 = d3_time_scaleSetYear(y + 1); - return y + (d - d0) / (d1 - d0); -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 2592e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.second, 1], - [d3.time.second, 5], - [d3.time.second, 15], - [d3.time.second, 30], - [d3.time.minute, 1], - [d3.time.minute, 5], - [d3.time.minute, 15], - [d3.time.minute, 30], - [d3.time.hour, 1], - [d3.time.hour, 3], - [d3.time.hour, 6], - [d3.time.hour, 12], - [d3.time.day, 1], - [d3.time.day, 2], - [d3.time.week, 1], - [d3.time.month, 1], - [d3.time.month, 3], - [d3.time.year, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds(); }], - [d3.time.format(".%L"), function(d) { return d.getMilliseconds(); }] -]; - -var d3_time_scaleLinear = d3.scale.linear(), - d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3_time_scaleLocalMethods.year = function(extent, m) { - return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear); -}; - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) { - return [m[0].utc, m[1]]; -}); - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds(); }], - [d3.time.format.utc(".%L"), function(d) { return d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -function d3_time_scaleUTCSetYear(y) { - var d = new Date(Date.UTC(y, 0, 1)); - d.setUTCFullYear(y); // Y2K fail - return d; -} - -function d3_time_scaleUTCGetYear(d) { - var y = d.getUTCFullYear(), - d0 = d3_time_scaleUTCSetYear(y), - d1 = d3_time_scaleUTCSetYear(y + 1); - return y + (d - d0) / (d1 - d0); -} - -d3_time_scaleUTCMethods.year = function(extent, m) { - return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear); -}; - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/html/force-big.css b/html/force-big.css deleted file mode 100644 index ffb518e..0000000 --- a/html/force-big.css +++ /dev/null @@ -1,65 +0,0 @@ -#chart { - background: #000; -} - -.node ellipse { - stroke-width: 2.5px; -} - -.node text, .label text { - font-size: 10px; - fill: #000; -} - -.link line { - stroke: #ddd; - stroke-width: 5px; -} - -.link.vpn line { - stroke-dasharray: 1px 6px; - stroke-linecap: round; - stroke-width: 2px; -} - -.link line.unidirectional { - stroke-width: 2px; -} - -.node ellipse { - fill: #fff; - stroke: #48f; -} - -.node ellipse.gateway { - stroke: #ff7f0e; - fill: #ff7f03; -} - -.node ellipse.client { - stroke: #ff0; - fill: #ff0; - stroke-width: 5px; -} - -.uplinks path, .uplinks text { - fill: #0ff; -} - -.strength { - font-size: 10px; - fill: #C83771; -} - -#sidebar { - color: #ddd; -} - -#sidebar text { - fill: #ddd; - font-size: 0.8em; -} - -.label rect { - fill: rgba(255, 255, 255, 1.0); -} diff --git a/html/force-light.css b/html/force-light.css deleted file mode 100644 index c12fcae..0000000 --- a/html/force-light.css +++ /dev/null @@ -1,77 +0,0 @@ -#chart { - background-image: url(gplaypattern.png); -} - -.node ellipse { - fill: #fff; - stroke-width: 2.5px; -} - -.node text, .label text { - font-size: 10px; - fill: #333; -} - -.link line { - stroke: #777; - stroke-width: 2.5px; -} - -.link line.unidirectional { - stroke-width: 0.8px; -} - -.link.vpn line { - stroke-dasharray: 0.75px 4px; - stroke-linecap: round; - stroke-width: 1.5px; -} - -.link:hover line { - stroke-width: 5px; -} - -.uplinks path { - fill: #333; -} - -.node ellipse { - stroke: #AEC7E8; -} - -.node ellipse.gateway { - stroke: #FF7F0E; -} - -.node ellipse.client { - stroke: #1F77B4; - fill: #1F77B4; -} - -.link .label { - fill: transparent; - stroke: #C83771; - stroke-width: 1px; -} - -.strength { - font-size: 10px; - fill: #C83771; -} - -#sidebar { - color: #777; -} - -#sidebar text { - fill: #777; - font-size: 0.8em; -} - -.label rect { - fill: rgba(255, 255, 255, 0.8); -} - -.label.highlight rect { - fill: rgba(255, 255, 100, 0.9); -} diff --git a/html/force.css b/html/force.css deleted file mode 100644 index caf3c5e..0000000 --- a/html/force.css +++ /dev/null @@ -1,180 +0,0 @@ -#chart, #chart svg { - display: block; - vertical-align: middle; -} - -#chart { - position: relative; -} - -.node.marked ellipse { - stroke: #C83771 !important; - stroke-width: 5px; -} - -.link { - stroke-opacity: 0.8; -} - -.faded { - stroke-opacity: 0.02; - fill-opacity: 0.1; -} - -.node.highlight ellipse { - fill: #FFF0B3; -} - -#nodeinfo { - position: absolute; - background: #fff; - border: 1px solid #ddd; - padding: 0.5em; - font-family: arial, helvatica; -} - -#nodeinfo { - top: 10px; - left: 10px; -} - -#nodeinfo button.close { - float: right; -} - -#controlpanel { - font-size: 10pt; - display: inline-block; - color: #fff; -} - -#controlpanel * { - display: inline; -} - -#controlpanel p { - margin: 0 1em; -} - -#nodeinfo h1, #nodeinfo p { - color: #555; -} - -#nodeinfo h1 { - font-size: 10pt; - margin: 0 0 0.5em; -} - -#nodeinfo h2 { - font-size: 9pt; -} - -#nodeinfo p { - font-size: 10pt; - margin: 0; -} - -.btn { - color: #6e6e6e; - font: bold 12px Helvetica, Arial, sans-serif; - text-decoration: none; - padding: 2px 8px; - position: relative; - display: inline-block; - text-shadow: 0 1px 0 #fff; - -webkit-transition: border-color .218s; - -moz-transition: border .218s; - -o-transition: border-color .218s; - transition: border-color .218s; - background: #f3f3f3; - background: -webkit-gradient(linear,0% 40%,0% 70%,from(#F5F5F5),to(#F1F1F1)); - background: -moz-linear-gradient(linear,0% 40%,0% 70%,from(#F5F5F5),to(#F1F1F1)); - border: solid 1px #dcdcdc; - border-radius: 2px; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - margin-right: 10px; -} - -.btn:hover { - color: #333; - border-color: #999; - -moz-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2) -webkit-box-shadow:0 2px 5px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); -} - -.btn:active { - color: #000; - border-color: #444; -} - -.btn.left { - -webkit-border-top-right-radius: 0; - -moz-border-radius-topright: 0; - border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; - margin: 0; -} - -.btn.middle { - border-left: solid 1px #f3f3f3; - margin: 0; - border-left: solid 1px rgba(255, 255, 255, 0); -} - -.btn.right { - -webkit-border-top-left-radius: 0; - -moz-border-radius-topleft: 0; - border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; - margin-left: -1px; -} - -.btn.active { - background: #C83771; - color: #fff; - text-shadow: none; -} - -#sidebar { - position: absolute; - top: 1em; - right: 1.5em; - z-index: 0; - font-size: 9pt; -} - -#legend ul { - list-style: none; -} - -#legend li { - margin-bottom: 0.5em; -} - -#legend li svg { - margin-right: 0.5em; - display: inline; - vertical-align: center; -} - -#sidebar h2 { - margin-top: 0; - font-size: 9pt; -} - -footer { - position: absolute; - bottom: 0.2em; - right: 0.2em; - font-size: 8pt; - color: #777; -} - -footer a { - color: #444; -} diff --git a/html/force.js b/html/force.js deleted file mode 100644 index 1d9b0ec..0000000 --- a/html/force.js +++ /dev/null @@ -1,709 +0,0 @@ -var style; - -function switch_style(s) { - var el = document.getElementsByTagName("link") - for (var i = 0; i < el.length; i++ ) { - if (el[i].getAttribute("rel").indexOf("style") != -1 - && el[i].getAttribute("title")) { - /* always set to true first to workaround Chrome bug */ - el[i].disabled = true - - if (el[i].getAttribute("title") == s) - el[i].disabled = false - } - } - - style_btn.text(s) -} - -function getOffset( el ) { - var _x = 0, _y = 0 - - while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) { - _x += el.offsetLeft - el.scrollLeft - _y += el.offsetTop - el.scrollTop - el = el.offsetParent - } - return { top: _y, left: _x } -} - -var w, h - -resize() - -window.onresize = resize - -function resize() { - var offset = getOffset(document.getElementById('chart')) - - w = window.innerWidth - offset.left - h = window.innerHeight - offset.top - 1 - - d3.select("#chart") - .attr("width", w).attr("height", h) - - if (vis) - vis.attr("width", w).attr("height", h) - - if (force) - force.size([w, h]).start() -} - -function next_style() { - var s; - if (style !== undefined) - s = d3.select("head link[title=" + style + "] + link") - - if (s == null || s[0][0] == null) - s = d3.select("head link[title]") - - style = s[0][0].getAttribute("title") - switch_style(style) -} - -var cp = d3.select("header").append("div") - .attr("id", "controlpanel") - -var updated_at = cp.append("p") - -cp.append("button") - .attr("class", "btn") - .attr("value", "reload") - .text("Aktualisieren") - .on("click", reload) - -var style_btn = cp.append("button") - .attr("class", "btn") - .attr("value", "reload") - .text("Farbwechsler") - .on("click", next_style) - -cp.append("button") - .attr("class", "btn") - .attr("value", "reload") - .on("click", pacman) - .append("svg") - .attr("width", 12) - .attr("height", 12) - .append("path") - .attr("d", d3.svg.arc().innerRadius(0) - .outerRadius(5) - .endAngle(-Math.PI/4 + Math.PI/2 + 2*Math.PI) - .startAngle(Math.PI/4 + Math.PI/2)) - .attr("fill", "#888") - .attr("transform", "translate(6,7)") - - -var btns = cp.append("div") - .attr("class", "btn-group") - -btns.append("button") - .attr("class", "btn active left") - .attr("value", "clients") - .text("Clients") - .on("click", update_graph) - -btns.append("button") - .attr("class", "btn active middle") - .attr("value", "vpn") - .text("VPN") - .on("click", update_graph) - -btns.append("button") - .attr("class", "btn active right") - .attr("value", "labels") - .text("Labels") - .on("click", update_graph) - -var meshinfo = d3.select("#sidebar") - .insert("div", ":first-child") - -meshinfo.append("h2").text("Mesh") - -meshinfo.append("p") - .attr("id", "nodecount") - -meshinfo.append("p") - .attr("id", "gatewaycount") - -meshinfo.append("p") - .attr("id", "clientcount") - -//cp.append("input") -// .on("keyup", function(){show_node(this.value)}) -// .on("change", function(){show_node(this.value)}) - -function show_node(mac) { - d3.selectAll("#chart .node") - .classed("marked", false) - - if (mac.length == 0) - return - - d3.selectAll("#chart .node") - .each( function(d) { - if (d.id == mac) - d3.select(this) - .classed("marked", true) - }) -} - -var hashstr = window.location.hash.substring(1) - -function isConnected(a, b) { - return linkedByIndex[a.index + "," + b.index] || - linkedByIndex[b.index + "," + a.index] || - a.index == b.index -} - -function highlight(b) { - return function(d) { - if (dragging) return - - vis.selectAll("g.node") - .classed("faded", function(o) { - return !(isConnected(d, o)) && b - }) - .classed("highlight", function(o) { - return isConnected(d, o) && b - }) - - vis.selectAll("g.label") - .classed("faded", function(o) { - return !isConnected(d, o) && b - }) - .classed("highlight", function(o) { - return o == d && b - }) - - vis.selectAll(".link") -   .classed("faded", function(o) { -  return !(o.source === d || o.target === d) && b -  }) -  } -} - -function goto_node(d) { - show_node_info(d) -} - -function show_node_info(d) { - d3.selectAll("#nodeinfo").remove() - - nodeinfo = d3.select("#chart") - .append("div") - .attr("id", "nodeinfo") - - nodeinfo.append("button") - .attr("class", "close") - .text("x") - .on("click", function() { - nodeinfo.remove() - }) - - nodeinfo.append("button") - .attr("class", "refresh") - .text("refresh") - .on("click", function() { - goto_node(d) - }) - - nodeinfo.append("h1") - .text(d.name + " / " + d.id) - - nodeinfo.append("p") - .append("label") - .text("macs: " + d.macs) - - nodeinfo.append("h2").text("VPN-Links") - - nodeinfo.append("ul") - .selectAll("li") - .data(d.vpns) - .enter().append("li") - .append("a") - .on("click", goto_node) - .attr("href", "#") - .text(function(d) { - return d.name || d.macs - }) - - if (d.geo) { - nodeinfo.append("h2").text("Geodaten") - - nodeinfo.append("p") - .text(d.geo) - - url = GMaps.staticMapURL({ - size: [300, 100], - lat: d.geo[0], - lng: d.geo[1], - markers: [ - {lat: d.geo[0], lng: d.geo[1]} - ] - }) - - nodeinfo.append("img") - .attr("src", url) - } -} - -function update_graph() { - jQuery(this).toggleClass("active") - var value = jQuery(this).val() - visible[value] = jQuery(this).hasClass("active") - update() -} - -var vis = d3.select("#chart").append("svg") - .attr("width", w) - .attr("height", h) - -vis.append("g").attr("class", "links") - -vis.append("g").attr("class", "nodes") - -vis.append("g").attr("class", "labels") - -var linkedByIndex - -var force = d3.layout.force() - .charge( function (d) { - if (d.flags.client) - return -30 - - return -100 - }) - .gravity(0.035) - .friction(0.73) - .theta(0.8) - .size([w, h]) - .linkDistance(function (d) { - switch (d.type) { - case "client": return 20 - default: return 70 - } - }) - .linkStrength(function (d) { - switch (d.type) { - case "vpn": return 0.01 - case "client": return 1 - default: return 0.2 - } - }) - -function tick_event(e) { - var size = force.size() - var nodes = force.nodes() - var nl = nodes.length - for (i = 0; i < nl; i++) { - var n = nodes[i] - if (!n.fixed) { - if (n.x < n.rx + 20) n.x = n.rx + 20 - if (n.x > size[0] - n.rx - 20) n.x = size[0] - n.rx - 20 - if (n.y < n.ry + 20) n.y = n.ry + 20 - if (n.y > size[1] - n.ry - 20 ) n.y = size[1] - n.ry - 20 - } - } - - var link = vis.selectAll(".link") - - link.selectAll("line") - .attr("x1", function(d) { return d.source.x }) - .attr("y1", function(d) { return d.source.y }) - .attr("x2", function(d) { return d.target.x }) - .attr("y2", function(d) { return d.target.y }) - - vis.selectAll(".node").attr("transform", function(d) { - return "translate(" + d.x + "," + d.y + ")"; - }) - - vis.selectAll(".label").attr("transform", function(d) { - return "translate(" + d.x + "," + d.y + ")"; - }) -} - -var data - -var visible = {clients: true, vpn: true, labels: true} - -function reload() { - d3.json(nodes_json, function(json) { - // update existing nodes with new info - // XXX inefficient data structure - json.nodes.forEach(function(d, i) { - var n - force.nodes().forEach(function(x) {if (x.id == d.id) n = x}) - if (n) { - for (var key in d) - if (d.hasOwnProperty(key)) - n[key] = d[key] - - json.nodes[i] = n - } - }) - - json.links.forEach(function(d, i) { - var n - force.links().forEach(function(x) {if (x.id == d.id) n = x}) - if (n) { - for (var key in d) - if (d.hasOwnProperty(key)) - n[key] = d[key] - - json.links[i] = n - } - }) - - // replace indices with real objects - json.links.forEach( function(d) { - if (typeof d.source == "number") d.source = json.nodes[d.source]; - if (typeof d.target == "number") d.target = json.nodes[d.target]; - }) - - // count vpn links - json.nodes.forEach(function(d) { - d.vpns = [] - }) - - json.links.forEach(function(d) { - var node, other - - if (d.type == "vpn") { - d.source.vpns.push(d.target) - d.target.vpns.push(d.source) - } - }) - - data = json - - updated_at.text(d3.time.format("%X")(new Date())) - - var nNodes = data.nodes.filter(function(d) { - return !d.flags.client && d.flags.online - }).length, - nGateways = data.nodes.filter(function(d) { - return d.flags.gateway && d.flags.online - }).length, - nClients = data.nodes.filter(function(d) { - return d.flags.client && d.flags.online - }).length - - d3.select("#nodecount") - .text(nNodes + " Knoten") - - d3.select("#gatewaycount") - .text(nGateways + " Gateways") - - d3.select("#clientcount") - .text("ungefähr " + (nClients - nNodes) + " Clients") - - data = wilder_scheiß(data) - - update() - }) -} - -function fix_geonodes(nodes, x) { - nodes.filter(function(d) { - return d.geo !== null - }).forEach(function(d) { - d.fixed = x - }) -} - -function wilder_scheiß(data) { - var nodes = data.nodes.filter(function(d) { - return d.geo !== null - }) - - var lat = nodes.map(function(d) { return d.geo[0] }) - var lon = nodes.map(function(d) { return d.geo[1] }) - - var max_lat = Math.min.apply(null, lat) - var min_lat = Math.max.apply(null, lat) - - var min_lon = Math.min.apply(null, lon) - var max_lon = Math.max.apply(null, lon) - - var width = force.size()[0] - var height = force.size()[1] - - var scale_x = width / (max_lon - min_lon) - var scale_y = height / (max_lat - min_lat) - - nodes.forEach(function(d) { - if (d.x || d.y) - return - - d.x = (d.geo[1] - min_lon) * scale_x - d.y = (d.geo[0] - min_lat) * scale_y - }) - - return data -} - -var dragging = false - -var node_drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", dragmove) - .on("dragend", dragend) - -var d3_layout_forceDragNode - -function dragstart(d) { - dragging = true - d3_layout_forceDragNode = d - d.fixed |= 2 -} - -function dragmove() { - d3_layout_forceDragNode.px = d3.event.x - d3_layout_forceDragNode.py = d3.event.y - force.resume() // restart annealing -} - -function dragend() { - d3_layout_forceDragNode.fixed &= 1 - d3_layout_forceDragNode = null - dragging = false -} - -function update() { - var links = data.links - .filter(function (d) { - if (!visible.vpn && d.type == "vpn") - return false - - if (!visible.clients && (d.source.flags.client || d.target.flags.client)) - return false - - // hides links to clients - if (!visible.vpn && (d.source.flags.vpn || d.target.flags.vpn)) - return false - - return true - }) - - var link = vis.select("g.links") - .selectAll("g.link") - .data(links, function(d) { - return d.id - }) - - var linkEnter = link.enter().append("g") - .attr("class", function(d) { - return "link " + d.type - }) - .on("mouseover", function(d) { - if (dragging) return - - d.source.fixed |= 2 - d.target.fixed |= 2 - }) - .on("mouseout", function(d) { - if (dragging) return - - d.source.fixed &= 1 - d.target.fixed &= 1 - }) - - linkEnter.append("line") - .append("title") - - link.selectAll("line") - .filter( function (d) { - return d.type != 'client' - }) - .style("stroke", function(d) { - switch (d.type) { - case "vpn": - return linkcolor['default'](Math.max.apply(null, d.quality.split(","))) - default: - return linkcolor['wifi'](Math.max.apply(null, d.quality.split(","))) - } - }) - .attr("class", function(d) { - return d.quality.split(",").length==1?"unidirectional":"bidirectional" - }) - - link.selectAll("title") - .text( function (d) { - var s = d.quality - if (d.type) - s += " (" + d.type + ")" - - return s - }) - - link.exit().remove() - - var nodes = data.nodes.filter(function (d) { - if (!visible.vpn && d.flags.vpn) - return false - - if (!visible.clients && d.flags.client) - return false - - if (!d.flags.online) - return false - - return true - }) - .sort(function(a, b) { - return (a.flags.client?1:0) < (b.flags.client?1:0) - }) - - var node = vis.select("g.nodes") - .selectAll("g.node") - .data(nodes, - function(d) { - return d.id - } - ) - - var nodeEnter = node.enter().append("g") - .attr("id", function (d) { - return d.id - }) - .attr("class", "node") - .on("mouseover", highlight(true)) - .on("mouseout", highlight(false)) - .on("click", goto_node) - .call(node_drag) - - nodeEnter.append("ellipse") - - node.selectAll("ellipse") - .attr("class", function(d) { - var s = [] - for (var key in d.flags) - if (d.flags.hasOwnProperty(key) && d.flags[key]) - s.push(key) - - return s.join(" ") - }) - - node.selectAll("ellipse") - .attr("rx", function(d) { - var r - if (d.flags.client) r = 4 - else r = 8 - - d.rx = r - - return r - }) - .attr("ry", function(d) { - var r - if (d.flags.client) r = 4 - else r = 8 - - d.ry = r - - return r - }) - - var label = vis.select("g.labels") - .selectAll("g.label") - .data(nodes.filter(function(d) { - return !d.flags.client && visible.labels - }), function(d) { - return d.id - } - ) - - var labelEnter = label.enter() - .append("g") - .attr("id", function (d) { - return d.id - }) - .attr("class", "label") - - labelEnter.append("rect") - .attr("y", "10px") - .attr("x", function(d) { return - d.name.length * 7/2 }) - .attr("width", function(d) { return d.name.length * 7 }) - .attr("height", "15px") - - labelEnter.append("text") - .attr("class", "name") - .attr("text-anchor", "middle") - .attr("y", "21px") - .attr("x", "0px") - - label.selectAll("text.name") - .text(function(d) { - return d.name - }) - - label.exit().remove() - - nodeEnter.append("title") - - node.selectAll("title") - .text(function(d) { return d.name?d.name:" " }) - - node.selectAll(".uplinks").remove() - - if (!visible.vpn) { - var uplink_info = node.filter(function (d) { - return d.vpns.length > 0 - }) - .append("g") - .attr("class", "uplinks") - - uplink_info.append("path") - .attr("d","m -2.8850049,-13.182327" - + "c 7.5369165,0.200772 12.1529864,-1.294922 12.3338513,-10.639456" - + "l 2.2140476,1.018191 -3.3137621,-5.293097 -3.2945999,5.20893 2.4339957,-0.995747" - + "c -0.4041883,5.76426 -1.1549641,10.561363 -10.3735326,10.701179 z") - - uplink_info.append("text") - .attr("text-anchor", "middle") - .attr("y", 3 - 20) - .text(function (d) {return d.vpns.length}) - } - - node.exit().remove() - - force.nodes(nodes) - .links(links) - .alpha(0.1) - .start() - - if (initial == 1) { - fix_geonodes(data.nodes, true) - - force.alpha(0.1) - while(force.alpha() > 0.05) - force.tick() - - fix_geonodes(data.nodes, false) - - force.alpha(0.1) - while(force.alpha() > 0.05) - force.tick() - - force.on("tick", tick_event) - force.start() - } - - initial = 0 - - linkedByIndex = {} - - links.forEach(function(d) { - linkedByIndex[d.source.index + "," + d.target.index] = 1 - }) - - if (hashstr.length != 0) - show_node(hashstr) -} - -var initial = 1 - -reload() - -var timer = window.setInterval(reload, 30000) diff --git a/html/geomap.html b/html/geomap.html deleted file mode 100644 index 42fcc75..0000000 --- a/html/geomap.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - Freifunk Lübeck - Knotenkarte - - - - - - - - - - - -
-

luebeck.freifunk.net

- - -
-
- - diff --git a/html/geomap.js b/html/geomap.js deleted file mode 100644 index d931b7b..0000000 --- a/html/geomap.js +++ /dev/null @@ -1,163 +0,0 @@ -var map; -var vectorLayer; -var nodes_json = "nodes.json" - -OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control); - -function init() -{ - map = new OpenLayers.Map ("map", { - controls:[ - new OpenLayers.Control.Navigation(), - new OpenLayers.Control.PanZoomBar(), - new OpenLayers.Control.Attribution(), - new OpenLayers.Control.ScaleLine(), - new OpenLayers.Control.MousePosition()], - maxResolution: 156543.0399, - numZoomLevels: 19, - units: 'm', - projection: new OpenLayers.Projection("EPSG:900913"), - displayProjection: new OpenLayers.Projection("EPSG:4326") - } ); - -arrayOSM = ["http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.jpg", - "http://otile2.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.jpg", - "http://otile3.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.jpg", - "http://otile4.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.jpg"]; - - var baseOSM = new OpenLayers.Layer.OSM("MapQuest-OSM Tiles", arrayOSM, {opacity: 0.6}); - map.addLayer(baseOSM); - - var center = new OpenLayers.LonLat(10.688, 53.866).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); - - var zoom = 13 - - map.setCenter(center, zoom); - - vectorLayer = new OpenLayers.Layer.Vector("Nodes"); - - map.addLayer(vectorLayer); - - selectControl = new OpenLayers.Control.SelectFeature(map.layers[1], - {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect}); - map.addControl(selectControl); - selectControl.activate(); - - var click = new OpenLayers.Control.Click(); - map.addControl(click); - click.activate(); - - load_json(vectorLayer, map) - - d3.selectAll("#gpsbutton").on("click", function() { - function clickhandler(e) { - var lonlat = map.getLonLatFromViewPortPx(e.xy).transform(map.getProjectionObject(), new OpenLayers.Projection("EPSG:4326")) - alert(lonlat.lat + " " + lonlat.lon) - map.events.unregister("click", map, clickhandler) - } - var clickevent = map.events.register("click", map, clickhandler) - }) -} - -function resizeMap() -{ - if (map !== undefined) { - map.updateSize() - - // Did someone say Chrome bug? - map.removeLayer(vectorLayer) - map.addLayer(vectorLayer) - } -} - -function onPopupClose(evt) -{ - selectControl.unselect(selectedFeature); -} - -function onFeatureSelect(feature) -{ - selectedFeature = feature; - popup = new OpenLayers.Popup.FramedCloud("chicken", - feature.geometry.getBounds().getCenterLonLat(), - new OpenLayers.Size(100,150), - "
Name: "+feature.attributes.name+"
Description: "+feature.attributes.description+"
", - null, true, onPopupClose); - feature.popup = popup; - map.addPopup(popup); -} - -function onFeatureUnselect(feature) -{ - map.removePopup(feature.popup); - feature.popup.destroy(); - feature.popup = null; -} - -function kmlLoaded() -{ - map.zoomToExtent(vectorLayer.getDataExtent()); -} - -function load_json(layer, map) { - d3.json(nodes_json, function(json) { - // replace indices with real objects - json.links.forEach( function(d) { - if (typeof d.source == "number") d.source = json.nodes[d.source] - if (typeof d.target == "number") d.target = json.nodes[d.target] - }) - - json.nodes.filter( function(d) { - return d.geo !== null - }).forEach( function(d) { - var lonlat = new OpenLayers.LonLat(d.geo[1], d.geo[0]) - .transform( new OpenLayers.Projection("EPSG:4326"), - map.getProjectionObject() - ); - - var img = d.flags.online?"router-up.png":"router-down.png" - - var feature = new OpenLayers.Feature.Vector( - new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat), - {name: d.name, description: d.id}, - {externalGraphic: img, graphicHeight: 32, graphicWidth: 32} - ) - layer.addFeatures([feature]) - }) - - json.links.filter( function(d) { - return d.source.geo !== null && d.target.geo !== null && - d.type != "vpn" - }).forEach( function(d) { - var a = new OpenLayers.LonLat(d.source.geo[1], d.source.geo[0]) - .transform( new OpenLayers.Projection("EPSG:4326"), - map.getProjectionObject() - ); - - var b = new OpenLayers.LonLat(d.target.geo[1], d.target.geo[0]) - .transform( new OpenLayers.Projection("EPSG:4326"), - map.getProjectionObject() - ); - var color; - switch (d.type) { - case "vpn": - color = linkcolor['default'](Math.max.apply(null, d.quality.split(","))) - break; - default: - color = linkcolor['wifi'](Math.max.apply(null, d.quality.split(","))) - } - - var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString( - [new OpenLayers.Geometry.Point(a.lon, a.lat), - new OpenLayers.Geometry.Point(b.lon, b.lat), - ]), - {name: d.name, description: d.id}, - { - strokeColor: d3.rgb(color).brighter(1), - strokeOpacity: 0.8, - strokeWidth: 3 - }) - layer.addFeatures([feature]) - }) - }) -} diff --git a/html/gplaypattern.png b/html/gplaypattern.png deleted file mode 100644 index fa9bf5eeaf585412aa901c9470eebf46975ab2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14288 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 diff --git a/html/img/blank.gif b/html/img/blank.gif deleted file mode 100644 index 4bcc753a12e9854923af4b9b5b9a4b76f1bc53a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 ocmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NXCJQ(S^Yp0J?7nHvj+t diff --git a/html/img/cloud-popup-relative.png b/html/img/cloud-popup-relative.png deleted file mode 100755 index 9db138abe9ec880a39711ae006dbf864720bdea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2564 zcmc~bm46pc8FqF4bzL<|yCc2S5R!3Kc@Ls%psXpOQ|DiRPu2#Y9j0hQ09{sOWY zl=4FfDjAeTsz?Qm3rmNPVnhMADlrQLC`&L&6RcS6Oj~Dk`e*LEx%d2c?>Yb9`ySxy zvq@9KKm!JYX?ox=L>NpBQreR_GnJ7zLhe)LG9#9_$rV=FZpc?Uj=o+b?5R3fYip}O zAP@?LB9TZe77q*z3=R%TB$A<_q2b}-(b3Vdv9XDX38_>%IXNkl$>egmLZL9#-g-%u zkxKOOgKd1t3spLEqjB3}VK9wBmCbOyh|E_8)u|rdSase^LtTSaiMm~Paf!-Sl($D=)9jf!S?48>DBG<=>%Z&QS9k7?)fL%Q}nPIw&lsQVVjURrdr z;f)E2dbYf`Px?r(pwSlP&EI$Uj87-Zn-bL;7UhKQ9NBX<|4#E=e0IrBwu6ii_518} zN7Bm%te{3 ze6x)STaR8iYBLa+=1mm0lZF8A71A&E>6EPZySs;SA&|JA3#c7$REyASZTp;D5 zF@;Y7Dm-nG5}yK8_@{2vVov3Lp91?q6^w<7h>Fjj^**EormKp-Cr488o2G$2TgNuH84opnmmG=;b2-tm3QZTegN_l@be|54~irN5|b1o2D$vX7MfOSc$& z=H~s!uK&Ef`DsEw8jCL~`%|avuS$IHiSf|(W>+D=C8gs^HbUypT@4>afQ5Jf4W{Sd zPChX4H}5dz#6m3g@w>aBG9oG;=Z{y(e4PSo_mq0-D03@i&lr!YVB&rT03nEDCW&>19BB)2lSz76wZo-6X zruu?#zn5zt&u{*T3f(aSD^GlD!d(NFoyGJ$5cK6aA2)CJlHR!5mEvWBLCG?a$wK3} zi~HW(FV5{9y>QS=z_O(~bNH6y$?_fakUX`3_5L&_;u5!i;CU@8{xK1{Fj<|)e*=~Q zKykPOxtil&h2LyTx8?v@=tFW|*=sG&BM8|w&5kShR{(Wq>ABAS3Gxr(mZ@mxpa&xs zgQ9S4Ml&mD)x`5S8`_eni8d3uy&V+S!XhZVy0s8Jfx^)94P_wOCt`#ll9}<>wkM47 zW47x{YBH$Zt2P{39TO4sFsL}-dMZ#ok+GP795(JiAA1)*vgp77SKUn>wz=R|Q7s6x%3x#x*o%$PS~E#Kvah7uL@tc9DrG$p%eE zrT3dVZqBjVz=<+a2e>~^Dkq` zikHW(0V50o)F%g%O+h``UNez5=Ht=Vf>|Q?N^(R-SjH{|PUR%Actv z;gRI*%RLFKT}zX~wU}Rx3|G?07xz7IfppQggrO^*87%{ACv)7Og3_&{v={7zEqy~p zz0rO#sYMk7Xin1RcqGl8!BueQo=U*%->_?2?r{M5iqdEco{U1ar_kn=S9i^G1mpjv%bjRhf9f#lv>ZWb}R;=a405aV_Ik430$v(00Af zgN;E+g$VA^u$Ft(O%<7LM!BI@ZTjJqdn^6PwB$!68F)Lrdd(W#KvVCKCuk3nmNm?r31M7pSbPYcG2Yb^G4*&oF diff --git a/html/img/drag-rectangle-off.png b/html/img/drag-rectangle-off.png deleted file mode 100644 index fc6daf4dc90298bc0114488ab35e30d01c767594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP)3_}4!g7G zLwCD9ZK3T_Ds8QT3j(FFCV!S{Tyz-(KM2U&^qo_Tqtx0T2xf z510r*#p}0MU9L}Z-I5}*imKAuOe&$h1i3c-hW66dNWGgDQS!$lGm&*$Zs^Z=3x zA=nPn)W?J(iFoF2+#PP1+YhXUDlAtmb++2)o?hW~P&fSo%*!cXYv=A=!-7CbqH<5E z0hD@Z)-qD}${R~JEYeVle^3!5nPX{K$m33K)%NxEjkRmN2RI!w<`WknQgdINUe;8W zS8sHiokZp6sR`-mp6PEs2%P;r8O;!iu#0mIJKn4k(_~?fw}@+2?^2k|h8MOta%nq- zMMgNC>eY)WUk86JO2&2QOko5lZ>R|cGo__Wc4CYlv3ba*^`#mWS4O2ve+iK*X}yIp zyO_vj;pbmcUv~&6uB&W`V`s}cy-mpejyg8a^Wex6s$^5XXMXQ zvnHoT^O{@#6b*n+X#gdQM?wey17H9`ms6QpDV87r7?n;ZNi3|0ys9d^w*-~qYrus8O{egy> zf~|E%0Ov;1AALF_gfeT^ahn^Bok3YtsIk8A(RX?lJBxtnEUA0Cchd^jaq`y%cq(?m z-*@Ju+djH&rJ8T=J!IW>b#nRmXk=a@fRSOPW<~DV-@?BhZ{D(_lxB5OOb+mg{`Qm_ zPxyzLy~5y2OR>40aXEP^eCT_L^>}LW)BHpL{pSq;RYkFo@-}>dgOVUCf=hW530T2H(ddhG1v#03MBLu?a#LnhmzMM9% z(Qa>y7j_)3kekr^?_HYHHwt{_J+!@#hJ{DK^fh}~wXuJOPiFGUMglgYtn*NX1*vLr z+^5Z7R<(R=GW?z>jpBKA z4prWr$7l1DF%hj3)kHMba!p&K!Gq1;hMa(zxqDG$S2wD?@e^1{U(pzk4Z2C1se|Mo zIq@5S`Bv)tU3kHOv&170BzaM>EcRXBGq7lXTS8~ChJ(fbkq96ZFc((4x~C_)W`d`u z(tSP)5{X|)P2RS|tpVX%ogOsbb2z9amKQ%g zSm5Ig0E|_;FQB^4!RPBpYFWCc>2GSJRXsBP6blMVC_I#$DntPQU_StEv`r{gx`nxs zR&{c5${wJ-*IQKgN7CQ_JSsPYiBeNq%I^xG-q>}oR(Dt0B{;3*AUAxam=Ii7Y%0IunquRlK!lkzf`nOx9q;&Xe8IL%zWQi8B1?Q_W5A|Kv+?ee#IlG zG(<#MiN78$9+yc%LFA}S(c5mEdy4Ti}YS&gpK~WCAUqqlkEA9;8HJ1l+cHL6%UAee1VBOtALSF%C zw^|8PMz%aAMb_8KkU8O~(aC%4pi|h@1txE0V_koh;%3Dh6+FZpm2*ZE+W1e z0lRMYqb7scP43HJRpwg*`&&M|iM|8pHo54YHhlTHs)&TdTMX%sM6#}#b`FpT8_7Cs z`t~(NcVm5D>&%OhdU#QYtKIEPLFb^FHpib)P9}kaFGuA^j8nvK!w*1(oX##v#J9aA zJ17nS185;EZMpzz#sSLN1jND3Vpo@%4RwmP9{+!#ds6hVgfcd_vHn^+q+#<+?yuS) zgv7JKDMb8@Rsg`#axX}u`FrIGg82vhqzk&qQIo?#@j@q_)sBUHe|r^S3+3en`2Rl3 zVOilNw$gS^UsHeYu#xe|uq=(sFF9MjQ%iYNhunCV%Z1UT!I~UF8c)AfDJx2PSttO+ g=OxDHCB9(%2l8UY($ek@rvLx|07*qoM6N<$f|>;}-v9sr diff --git a/html/img/east-mini.png b/html/img/east-mini.png deleted file mode 100644 index 0707567a7d50203cedc0bd73637db130aeb4b789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)D z)UiuKQ547V@0BoUP#nS`XpnRXbg>~@grLPG3u+4_aTVc#|AOFy{s0FzArL3Q$+RGp z6hScpCk?Ej9E2nZ>^40pd+O6O-t*(bLXn7@U~tC>wgp@Zp;~nzhr>!PcTA~thR3sM1iR9OwDSA6X*4cK zrH-)MH|Aj>A=Lf3GcuV3;jo)d=MqKnVm8l=9~v6A#j;K^>8ITe5ePW+B6~}1&FQp} z&!12zoZ@oXez&|!uYWT6rrRAd7<~RYUt0z#m!FA7Z)mmNr(1PHP_H*cQEtg*JF_CS zxzK3zMI!Nls@52fC-b63T}VnvCi6r*en-FmvFO5SDV54UsM&nO=gUy7zAgd)`ald; tfBhPAE~Ro0tH1sPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10USw0 zK~y+TWBmXBKLa{oWbCm7ia7(ZDG-|gu@r_PbODe-FwDTv%@4%$fEZ{xi5STcYoO*Q zBpU#;5aKnkOK=*($2al6nAlYOu7nzd(>t7;{r|sw`T76%@4x?pf;QkWjG-GCu(-oR zKw#4UA3uKo|Muv1SJiO1dA<80RX2fQRqgESEK*{002ovPDHLkV1i4nw6y>L diff --git a/html/img/layer-switcher-minimize.png b/html/img/layer-switcher-minimize.png deleted file mode 100644 index e80bf213f8127f0cae11f6b29d870f04effcac1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@+C`LBT9nv z(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647D(d!haSXBOeLKmK>yUwnOZ<_thlh+y zpHJM=yxeEujIhx2s`GJMsI7=b{!q*QiBG{2IkI9M;Wh2U6{x z%)QC_*1W4v`=8_v#^opE8?-;nP*rK2cvISQ@3U8`vD1t+w>)o;6MD-RazOi2_JU}x tKmRXod$TcG?U~Hh#Er-Qc^$prcIkauSI*=veW0@#JYD@<);T3K0RU+eU$+1N diff --git a/html/img/marker-blue.png b/html/img/marker-blue.png deleted file mode 100644 index 83a90b4c85f708b08220ff501e281b6df6e1171c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmV<610Vc}P)X1^@s6-qmI800004b3#c}2nYxW zd>{!xLrWaJ zX<&2cGVi$Fn;O%iVYe{MyHLDr%-V2_xvjO8>z;f5pY!~B(I&gQXWOOv!Sm+#{eC~^ zJUq`iKM)b-TL3BqpV$ImaY6q141yr;lH{Pea?K`7_J_s*Z1~qu0LA{m!uFEVGNt}R znvO>`+EI6&0->-b`9mK7@XeNGlYpFJj6Eg$Ll>UdxOLG>)yD#&C_m6L_eXI0#8z!& zu1$!F8;$qHqacvFaI5b6@xO_~hUwT#g>XhkGhuXc*9~3CGgmyh8KM+`BnLs9qpZ9#&tn=Y;?3`BhMuV=B3A$aB1&=YwtpKxV$BS! zEZ>Nl!{6bBEe$x(m_{HJ&VzmvJ8ZeGeTj&!1G!h~VMz}5)_wGIXvwliJ-6spzuoIW zW8_)IHnkN*G!6j5lt@Iw#QD)gORZKg5kOnhPL(@${S+_<3IL8{9=qG~W45;|SrG8% zwJ7~QbZ5|Y?WXDd94HYPmZ`oIJGo2c+?^9>Xc;70_UeYNR1*=O6*>uyXEWnH*E^c| zOl^8yjvg{Och3`1=S(dR3IL|AyxIQ6K~q;JJb}XlX{3^8EK^r%y>w3~5#0tTcBQSs z^w4nb)3;Q|vGx+tp9Mn!z%;V^QpwZK=+G}Y{mx`7{V{sCpSasRTXt3`5sh)zZHRwX zqfYg-?0sB3vtKv=IULW=dQK<+xUSte*ne}P=hoK%fUnNJXK-@Q5z(!=a)nINs^TTf zv%BBFN|GF$08sp&rzsI35G=a3AY5XAvF-oMh@O1g$9EK2H diff --git a/html/img/marker-gold.png b/html/img/marker-gold.png deleted file mode 100644 index 2ff9ec52813915962a1f15d9b481cb769b102d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmV-F1Hk-=P)X1^@s6-qmI800004b3#c}2nYxW zdR7i=X zm0L(uQ51&1J>KS=IZl?TU6ANPJtT>sX4w@Xirx%_Uc%}vgDw!1LJ*};FA<>_71o1g zqy>seJ(OK2%Y>whsZl`}1fy)6GdeRms|Ot!ouf{=;D6cs-{1Kci?cT(!gK=GL`PEv z%#FxDogq4kBHfOemxE8&=mj>+7z!lBJ7`?Bl>V+JL^_a$3S^FfN4HZ7MEw^O$Z=@& z9N5i(w|xW{)X&FAZU&~)pbbc!77D1iSc;tnW_`tYSg3~IBc+G&>vsBq{7IoeveUuS z%ryGHH%|@>RZ9)BAPFNMK{8wfWIY zSic*J&%??c;Bs60_U5BjuRwq#8*sU&moHU!5i4`u0~qvzXAo=(9=2FRYwtt%SAO`1 zC<_iLJHd(RdL2HDhu09@J|aU${Cokgj`>7X^7XWHBDN3nDS{&W)8qk-eTDNFbA3i}=0sWooOO6^*n z%Jt4B98pn|16^)dl82|y#TF514c)U%G>b@G?;koY-6Akm$`j}D28OAf2n<53ZmINm z2cADKt^fHqcM;u=3z%nhJ}l|zhuTHBU2*|$_#PA%V|slY6_MYTZA@`VCuwoGI~vEQ zyjn`YY4DcOdHnZt5*x#@%~`mEz~3#1)4&8WX8cA0F^10f#>x@s{#^_hI#*`>@Buqh z7vO$=1JUgC0SU8)iU>}FXUT~SDn(%={)nJJdTb2UQw=9n{{ZUlb)-Lb_=Nxf002ov JPDHLkV1l45bA|u_ diff --git a/html/img/marker-green.png b/html/img/marker-green.png deleted file mode 100644 index 17168f1b91a857283440eb923328ff7743c276d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 967 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 Z3;<*L46wTc`o91G002ovPDHLkV1nF_YdHV_ diff --git a/html/img/measuring-stick-on.png b/html/img/measuring-stick-on.png deleted file mode 100644 index cdb8f345b942219122bc24cd7bcdad1f35b09ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3816 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 diff --git a/html/img/north-mini.png b/html/img/north-mini.png deleted file mode 100644 index a8a0b4033e40426b3dfed17b330fe602607c33c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 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 diff --git a/html/img/slider.png b/html/img/slider.png deleted file mode 100644 index 23afd573bbf1832dafe81119693cce89ea945dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W^!3HFa4)S;aDVAa<&kznEsNqQI0P-bETq8EaloF>&ogTfQa-0k``KYHdRL z3--2libuR!>$`)2eZkg6kJ!ExFiQ*dJLWT*8;D(6$7;{WEo8nYE3M1?ehSMZ;{s-r z2Z`?7QygA>+q8OV#sO&=zxg@3TTVamxqn~KRounFMd0N#@6x~!le5)6ul&A7F5^6W zIeuc(gNC4^H_o>d{#mdtzJueKL=Q;SyztGeOefiYzyEj1s^ooKcMzopr08#yEu>b%7 diff --git a/html/img/south-mini.png b/html/img/south-mini.png deleted file mode 100644 index 6c4ac8a0f196dcf06d1627ed86f91ccaf9c3f2d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmV<70UrK|P)z zlD|uWQ51%sD?!juGzqmigdjB4P>n(VKtpo{L6Zp|_y@QMIk~y$W(0zxOQr=W2UV*LLZQ8h5D{T}J369`JS`r7Bb}~H1Vy7S+~0p#g8l&btlBjjNxZ z4Sc>k!>yWjV+H}p*?_FsBp7_8So|9F>2!rytYBsZ$l8FU*`(F#;PIpYXtz7K-PcwS zfTR);lnR7_Lo-Jru}`T~=k)Z-3K9{~j{2Y_;2BsQcde~0Q>*<_t2NCaI^Yt~>Pn=W z8KnX{z@-_?qIBRuM9aWXj(UO%h)e;A^ft-#g~3L{rBq-G*abF$jh>vN`@=~Q&5(^h XLCTLS$T zl)paibF^>Dft7U1W{0Gu@=E42itQHT%26p-YAIwfI%Qqh(mLsLs3wZ zP(+h9=ineoV7I|6dC&KJhTrY{xSxB@xtuErAy7+_ic#PY2m>KtLzASEMFp?}CE#S< zL0ym}759L1U~^FjfIL-+DM&K8MJBU58^pLBLr5U7MzeWLqj7}WZP&ytKZDhsiPO1? zqU@7S?;y*P?nM^HucMLGDwE3vDHNjEY%4~^{({14XCmRIREpv8IOYPTL7|D^^*Sh* z4~WNIrU4Vl(?+lNL8sGaH2V4%=#5a zI(-w*NuC&V>Gm(yx`qw)3->;~_Os(HkJvl&8*k0>5?Mr9zb`E~lJO{^#5=$8ppF>tyzo!t1#uE5{2^Q@d+w8{^rUH@BD9j>SO`@5+8V3~Et zERDk?myN;y$@l%wDi51Kkj-FRf343l$70joc`v0O%=1ZUWRF<^3T zk~>cVK@>*M;IIp1RV*w-?1+t)nD}T+`~liYV?k$Yvi|}SS}QHAtTeHs~8=CeJ45 fP4rX#?H_#tm&$|IMWgd%00000NkvXXu0mjfXz|d8 diff --git a/html/img/zoom-world-mini.png b/html/img/zoom-world-mini.png deleted file mode 100644 index 2159dde7ba0c32010d5d76910fd4d49bae925912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmV-01kd}4P)K;tg z_(&AUz=Rk^zzAfh$QTk7qoAn37>t|1C}ms<{M$W{;TW8^lbn3#@;m2<;72!Gm{<%6 z2|6+}L(ypD)YkU#`0+4;uw^)+|ARCdIn~vB(P+FG8gigecv4aE7OORkxVQiu4kw2W z)zQ;4y)p5Boztfic>VeZ?Dl11V(wzKKA^C$g@uI`va)K}v7?mE&IzikzsF|Vy)~$) zD3R>!?PO$BGc~oq{rh_{8dbb{HA!%=F9w5x)m0Zyo(wZEFw4Gu;oQ0N-A0gJui*Ic zII61N@#f7GM~^l#JnSGfHHdU^J>Qn{|lABF>%LMO4(?wTk3& zDLFayw6~8@UT!5bGlY*H?SzN>t(X4n*`K7Q1_2 zF>vo*4=-Mf6B43iY;2zV{Aer|14^YQCX<%HKm|vRM6+$15{X2_+}tv^Z+Brf>j01* zI1q{34av!RT3bi(@{-WdFi1ngAVo!qR8+hJKoDH``g(Hd(r*AyLsZ@kqE+s!dnk!e52@dw<#ED-p8r3v54kGR9 z`b12OKU%Ffp`l93%6h1;A0Re10JB*~QPEcjf(w6tZ#+E2G&TJ}X=yh$+iu)$Fqw3m zJlTxY<$@0%{^I7%Z;(htOv1Hm7W8@_ ztkzI+a_ZJv2bi2(q_VP?jEoSHl73?U{s;~pjKt5+3#U^cHa38Xi3KiROhToS@$%&- z;^Vc{*7niSG5#3@aQ=KNV`G2w{(U}mb^RPW)gcyqV(DCY@~oDBzn3yhE&XXd)qOO$&jb@;r+~Y zp$B&+Op96lcFXfce&P<>rxl1f*5#jHu5oIzdd9H^{|B>U_+%4qn^nE{=e+)U>glIW z-s_&&H+eZ9TQb=;*L79Lf~5+fDt!wsP0$i@56JWo?NnZ2vZU*XV2D(Z>mv>=UdazP zqi!2_?3TAqc$asRwKTzJ#fgag&8&NsOiH^_UNhcVcA}?CXUEN^IKf#~uE*ABCe2c6 z3Ts>zwq)n;=px6p%=>a@t7|`cox5#8c#8?d$PKe^&T~8_aeU?fjGsSiX%Dn1C(U*(jVTmsry}V!7KF0-TU&#D^nESl?#TtTrirz zD8F{=e4a<|+Ut&Q5_J?6+#-^4;M|h)HhZ>yn;m%PZm6K6x8p3OLYAp*U;4si9G5EM e^{Vgc6Y?kJ*;+Ny_dEo~2!p4qpUXO@geCy#6~E2^ diff --git a/html/jquery.min.js b/html/jquery.min.js deleted file mode 100644 index 16ad06c..0000000 --- a/html/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(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){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,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=m.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.7.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.add(a);return this},eq:function(a){a=+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.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");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!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(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;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(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(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},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,"ms-").replace(v,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?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.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:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([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&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.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.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),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,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=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},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.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(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.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]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),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]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.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!!m(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=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([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&&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=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null: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=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=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(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.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:[]}},o.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&&(o.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")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[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}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.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 m(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;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;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)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));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(S(c[0])||S(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);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).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 V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},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){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):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 -.clean(arguments);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.clean(arguments));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){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&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,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.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,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),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&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.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(bM,"")).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||bN.test(this.nodeName)||bH.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(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(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?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},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},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),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>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),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.Callbacks("once memory"),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=bG.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.add,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(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.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]!=="*"?", "+bW+"; 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=bZ(bT,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){if(s<2)w(-1,z);else throw 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)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.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(cd,l),b.url===j&&(e&&(k=k.replace(cd,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 ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,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,ce&&delete cg[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);try{m.text=h.responseText}catch(a){}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=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-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=cx.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&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/html/links.js b/html/links.js deleted file mode 100644 index e590b3d..0000000 --- a/html/links.js +++ /dev/null @@ -1,11 +0,0 @@ -var linkcolor = {'default': - d3.scale.linear() - .domain([1, 1.25, 1.5]) - .range(["#0a3", "orange", "red"]), - 'wifi': - d3.scale.linear() - .domain([1, 3, 10]) - .range(["#0a3", "orange", "red"]), - } - - diff --git a/html/nodes.html b/html/nodes.html deleted file mode 100644 index d76804a..0000000 --- a/html/nodes.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Freifunk Lübeck - Knotengraph - - - - - - - - - - - - -
-

luebeck.freifunk.net

- -
-
- -
- - - - - diff --git a/html/pacman.js b/html/pacman.js deleted file mode 100644 index fec688d..0000000 --- a/html/pacman.js +++ /dev/null @@ -1,72 +0,0 @@ -function pacman() { - var angle = d3.scale.linear() - .domain([0, 1, 2, 3]) - .range([0.01, Math.PI/4, 0.01, Math.PI/4]) - - d3.timer(pacman_animate) - var a = 0 - - var p = {x: 0, y: 0} - var pm = vis.append("path") - .style("fill", "#ff0") - .style("stroke", "#000") - .style("stroke-width", 2.5) - .style("stroke-linejoin", "round") - - function pacman_animate() { - var size = force.size() - var nodes = force.nodes() - var n = nodes.length - if (n == 0) - return - - a = (a + 0.10)%2 - - pm.attr("d", d3.svg.arc().innerRadius(0) - .outerRadius(24).endAngle(-angle(a) + Math.PI/2 + 2*Math.PI).startAngle(angle(a) + Math.PI/2)) - - var closest = null - var dd = Infinity; - for (i = 0; i < n; i++) { - var o = nodes[i] - - var d = Math.pow((o.x - p.x),2) + Math.pow( o.y - p.y, 2) - if (d < dd) { - dd = d - closest = o - } - } - - var dx = closest.x - p.x - var dy = closest.y - p.y - - var d = Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2)) - - dx = dx/d - dy = dy/d - - if (d>8) { - p.x += dx * 2 - p.y += dy * 6 - } else { - var snd; - if (closest.flags.client) { - snd = new Audio("pacman_eatfruit.wav") - } else { - snd = new Audio("pacman_eatghost.wav") - } - snd.play() - - data.nodes = data.nodes.filter(function (d) { - return d.id != closest.id - }) - - data.links = data.links.filter(function (d) { - return d.target.id != closest.id && d.source.id != closest.id - }) - update() - } - - pm.attr("transform", "matrix(" + [dx, dy, -dy, dx, p.x, p.y].join(",") + ")") - } -} diff --git a/html/pacman_chomp.wav b/html/pacman_chomp.wav deleted file mode 100644 index 993b08ead95aa8b78dc270aefdca7edb26cf26b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15892 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 SN`!`PgIY_3Ty~1brT#zE2F<D8y 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 N;5$?ewEF*ve+S!7gIWLp diff --git a/html/pacman_eatghost.wav b/html/pacman_eatghost.wav deleted file mode 100644 index 7ba6b2d0ee0dfff688b7294874df66a5ac1070d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 diff --git a/html/router-unknown.png b/html/router-unknown.png deleted file mode 100644 index 6f9a256af976e08468f7a5d70da0902ad3beee56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 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 diff --git a/html/style.css b/html/style.css deleted file mode 100644 index 4e5b8a1..0000000 --- a/html/style.css +++ /dev/null @@ -1,38 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans serif; -} - -header h1, ul { - margin: 0; - padding: 0; -} - -header h1, header ul, header ul li { - display: inline-block; - font-size: 10pt; -} - -header h1, header ul li a { - padding: 0.5em; -} - -header ul { - list-style: none; - padding: 0; -} - -header { - background: #333; - color: #fefefe; -} - -header a { - text-decoration: none; - color: #FFCC01; -} - -header a:hover { - background: #C83771; -} diff --git a/html/theme/default/framedCloud.css b/html/theme/default/framedCloud.css deleted file mode 100644 index e69de29..0000000 diff --git a/html/theme/default/google.css b/html/theme/default/google.css deleted file mode 100644 index 7f3c369..0000000 --- a/html/theme/default/google.css +++ /dev/null @@ -1,9 +0,0 @@ -.olLayerGoogleCopyright { - right: 3px; - bottom: 2px; -} -.olLayerGooglePoweredBy { - left: 2px; - bottom: 2px; -} - diff --git a/html/theme/default/ie6-style.css b/html/theme/default/ie6-style.css deleted file mode 100755 index 65f6b19..0000000 --- a/html/theme/default/ie6-style.css +++ /dev/null @@ -1,7 +0,0 @@ -.olControlZoomPanel div { - background-image: url(img/zoom-panel-NOALPHA.png); -} -.olControlPanPanel div { - background-image: url(img/pan-panel-NOALPHA.png); -} - diff --git a/html/theme/default/img/add_point_off.png b/html/theme/default/img/add_point_off.png deleted file mode 100644 index aefd09cf33c21ad75939f5f8ab93a99e65114708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1616 zcmV-W2Cw;vP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BUP(kjR49>UlCf&TFcd`{3?2%x7Gsd{RwM%6w8fhYp?{Dukbs9~=oCtpK$EXf zr)-*Jlwhz&lMc<+I$MWA=T2Qa_Q_7#&>RUpbk9YTtd-}W3$~k;wQ>65Kgx49*4E1| z1hBPGkri5$WhM&KC<}z9wGhZcnNlKCS}0u#Q0TP^x;g`)pOw~yR#NILQyo@S!IiH; zD5(^rQkoNuN8=!1`xu0jROXaYNtHrNgvN}8hYCcVQ^<1(8!gwtZpeagVFdjJJ+24W zQ^;q&d1^vAop6&c+q|Ad@dN~?&HDW7M=_@$T;6cr=iCKha~GJWH_`ssw_TST(U14Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5A#z{m$R49>SXcA%L#{e5QG%##n+o6sDcCc+=*oZ|O2sSeCqYCizXI%i(XcGMA z_e=3&kzh31zh8<=3`2rHF)mR`$_PUTeoj~4F*eWQLFymk^wm}FdoV~cps7&rT_qVjAX)3 S7Cw~#0000bmP+{ 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 diff --git a/html/theme/default/img/draw_line_off.png b/html/theme/default/img/draw_line_off.png deleted file mode 100644 index 7f15612548a17545c7dceaee437c78078b9b8373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1567 zcmV+)2H^RLP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BElET{R49>Uk}Yn;Fc3yvSqgMWNI*e=M;mIk(7u9EsX<{6uxQm&_yk6_ysJoF z+=8Osp+_h!>^I4(TeZ)>^Sv>%I1XL^kMrp$PTfBKB@f+6oQLvHfV1dZX*FIhB{uH3 z#I3IveaShNT#b3C@v2HK5cMtB+TJI#cwbVBu~is|oN~^|+cabM9%TX$DN$O;Q=-g~ z_e7gm7DB!x;z_`p>7F2HE$GH<46z7g>0l998#d!31qjQ6Y_LoSf!i#D>ST002ovPDHLkV1jy{zg7SM diff --git a/html/theme/default/img/draw_line_on.png b/html/theme/default/img/draw_line_on.png deleted file mode 100644 index ba09186c7e212a9af610cfaa91b63f0dea314820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1399 zcmV--1&I2IP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5Ag-Jv~R49>SXb@rJ#{e5QG%##n+o6sDcCc+=*oZ|O2sSeCV-;8Dhf5e4ZNe_0 zXr#Vr6BY@G*e19fngm!5MFQFUO-72?C4laLOQ48@dH5wjTCquZfGk53NAe&A5)d0P zC7?E9GfEvIp@CgOgTWG8)T+O?WI#>~jEC|L-iIWHCIBNhV8yc%ja>i$002ovPDHLk FV1oMCUvvNf diff --git a/html/theme/default/img/draw_point_off.png b/html/theme/default/img/draw_point_off.png deleted file mode 100644 index fde94bde24ad8eb7c5f2109bf6fe837f1bddf9fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1612 zcmV-S2DABzP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BT1iAfR49>Uk}+$-Kp2K2feZz6O9))ZR_+k8-Db86NdJMOppeC(lN1+0`zx-K z+f8?z5=h2ihq|@t)}he3Q`e6DF4`*fxsZ?Vecog`XBl|tg6(GMY`nhsj|#kvvkmlx z0JaV)b!kLZX;IonRU$NPgg_3`N(rruP^J=~&`TY4jRs+!lrg1IQW~vQht+j-6&esq zDg~*O_Kn7)aTKwA3PMUM3reY^N}&}(W5(jw8bnc0$O{P%TCJnqkVWyr3i=0nSP!nJ zkk3NQ9E^?hzdOFrmM zk9{9j|5wcOLC%i-77*CZ5zE4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5A!bwCyR49>SXb@rJ#{e5QG%##n+o6sDcCc+=*oZ|O2sSeCqYCizXI%i(XcGMA z_e=3&kzh31zh8<=3`2rHF)mR`$_PUTe4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5B7)eAyR49>U(kpJnFc1b{SC#@35@N7Y0&FcP8WtE|!KgF`=m7%v1cg3K%H7(!$QfX`Al;@+L%i|Q`(bYWA`+1vQKnAlv0JHX7WN+CtNuE8d{ zvD$pEVpZ_o1|I>QqTMOPfDqq&jOo3F#+cxewJD+?c;~%$rlA;P@Y7)soKtR588%ZY z!?LJDoe0{KLQs?=GysZVP`w(D_2y+&144fXW8YIp*#k7UP$F>N!oOdPye#_-Bv&Km z4>->qbinyz1ROzZl2>X3NIPInczAuje(aCo8-+`bFbc^JssI2007*qoM6N<$g2t_|e*gdg diff --git a/html/theme/default/img/draw_polygon_on.png b/html/theme/default/img/draw_polygon_on.png deleted file mode 100644 index 2a3337614fa182ca28fc8e884b72f615ff6c94e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1407 zcmV-_1%UdAP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5AjY&j7R49>!(ySgSe56!r#3i@|3roh5IFB#9 z9R}uk8LrMZ$!U<}#@J+ZNiyk|Wbw3*z5-wz0@RFvX^B-k!P^c{`$7mD6sU0M)#5(@ zltX}>`|ssTC~U}KJ6Imuz&f-a@R?P|p_86{ZG85!Uxv$kn;z>j++XxZocWJqGll>F N002ovPDHLkV1l|7aCra# diff --git a/html/theme/default/img/editing_tool_bar.png b/html/theme/default/img/editing_tool_bar.png deleted file mode 100644 index 464340efb61df48b4cab2225ca724d53314ee67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3901 zcmV-D55n+?P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7! z6DR_BosE_CX>@2HM@dakSAh-}000h{NklY0HVg`;PjWfyT0 zLVU3t&gjfp2iJ9686TM06JZH3s38v&A-v=bP9z8kB#|IVNYdTuuDbh2byZhC)7|OL zc%t{5oOD;;y1)Cq?)`4n2j92vbdvy7RS{o&ae&&BCu#b+DJ}yK95|2(6DBZq>W`5m zNlGMR%9KoG*&+!c#EBF86Dmid^`*P#|ltWQ^VxR*OHz#Do*Q)M0)xt($hy#S@{utiP6_MR)Ds) zHqz5af&dT*Ktj^K0+P@-3jsp%eD*k%=_m7by|uNq(U%zU;RrTvECC>G=m17!j9}b^ zX|ZvDqerSK+g63mmc&gr&S2UPZi-kQ**i1IGhq#a07(cu7eHte5EA6)7opEWGT*KP zg=f0Le+dfB7%_4TBSwtj(@%CGbjiN0j41Wx&)K-KgvTCxg4=R$AuTPPkGEAu#W{Ak znl-P!!u#v~%)tXYIC-j$qUTn#c+syoaPTl&H<$3oS5|TG^BvwHL&zh0IRfEPgFt8s zlDvC|#|bIOF9IOHpa`K0Y$#9|ij{=qRdP2BAp{xeX#iwTSEwkjq`bVsgN{GrrkgW+ z#E3>;m=!Jr>(>{vaN*O`pE+!dwP{l&ovlp~agYRM+p73o!AmS$_#_SI8aZ_E7$7rf z@D=Q?KFCA!7xCcSdwKo!caWs;@>nq~Cqh?(Z*Um@3ksg|nOs4^a}*WjBN@vR-iexT z?1oWUQN_{E{%G{OeTEHyk18sRYd^`!?lI%@1ACBU8H;Q+#w(A35vjh6UBGjtw6uhV za}B)p=a>1Px7LxDdn*8Y_U@z0?Zjqpj)*gM+&Clzw&Ve%4*5JKzZza&W#MJs-XBuV6Z43Ak+=I)Xd zJPGZN;n#FW(43(XfSl~Cm>Hf^9E##Xk|ZP`Cnwvuw>&~dr1}y<7@UozB|I{J0c-#A z-*hQj$6K@S0ib&478FHAQPplZnhevXOk)4ua(?)uJo0Xv$;&Uli6qIW?habpE+Na> zyj$BYF@4$;h7V6;$&wd%``xtx zb~`mS+EHwKW-F_nifud-ARKFur-Y3a7JJn(i!3=bN!wERi$(=Pp7o z?|Hd-;TchIN=r+aKmXULDqL!BV$!6mxqS3+*1i9KY_Hrva&i*M$tk2Hr(lugu$=vS zx3hTBBA$NwDVo2z#LgXC0J#6YnFv)y#m(&5cc3VO)|M9X@_tO0OTpdMWjK$&ys|lJ zy$O-_-7u#Sb&DjU}S4S&7g6AuzgwMSPI!D+-?tx`&21l1AO!ZWZBK@1zJAlD;1Y308#g z=`ZyDs)`zd5sV{D92td;n>TtQKe+Mr$WQH;LP|<9)}*09a}HrTnE)uNLTc&|%0B)p zt5&bU?Q)_h3KA|9Rb^QE9@9g5`xTvZ8RAj|zPI>f@*Z;s^nwMvn!cx#qn%Jlzb>_`2yVZnx9(_yr$1 z^#8)oW&9&KkP)aa^Z$*TH+uH`?jzqYezzQnWy_vrMd81(^qG9pGbZvMD__Fx>O#eh zP!zh{ow!|goDK&Lhl9=z2hGjr`DDjl7Crv3;h<)Y_c?&-zv&2*F@<*zF)2&??p4-` z!e>p_0%K9A+CBPt{G&ats15#MwUg|utgwvaq$B_`($fs%n>W+&atJCaD#J2D=?etM zkL_jj$TYTY`CsZzALhdOhJeUVz3ei>_!jGss5sY7zM5BFUPYIy6GvAkUG8?A_7*zr z7r1os8(LdhXlZGot?d$xO${7Aasr35gWGQZxySIn9IG!ZFrzLkScXtRlC?i`AIa-J zo)tm(Oj?qI@3H&#?Lv}dWQ)v)%UdI2=wI&V7ZdsHlpH`noScl_Tb4Xa9@~->l=cHGg2~`ww>HxTR)?A;l&7Vz4pz1RjW63sM zFD!b|_)Y&@Sg+bp7JM%7{dTK$?$oJ>f*L@jue*PSxYEDy7u$(1Je#^rT-OGRh0|Btx?Vcpr zMSF*xO`FS@dC#3;<+X-{3Dxr=OE!L6Ua*uEMJv5dP_PVv>f_1!7@-v29YY^Wppun! zi}6_?k&&K8)A?rHE?3+b=Fdq<{k*wDHw=G{5Gs%U;y28F;OD&aZV8`#QVM{@Y9S># zg?@VETL*Ef_Bb}HjmyW3r~b^B(FKl4p8ID13-7#J!lREofZMI*Q%_&9*CQuK#8s_{lkLN=UWdBIZM9X)S7)c_?2Thk(82vk#&t}!Gbyt#uc z8T)HI8C_00=g!t@D~3=Jk{Whx_UD}ZVmEfD9jBuUx8fox$wrbbnUrMhoNuuVLI5_a z%{SkZh>D}jbA4tG*JtLiySl;?`EKoWb>RYs4xV7jlxvY>P(6>BgW1IjkeZrm7}31h z2%-ACQ`VKXJb$VG47~uqWHvQ5l~@=-v|un4C2RT5ss7GZzw7KJVQ%C-VFJD z4i^29aQx-DJ~Jm^?EB|DqUA!mJR$5N1B@R(o_+hPx!BT-5EjqlVh!T|e%$9(K;S9J zJ23(K5AI|9`0?~5M%*}lZw%wf(UV|RQM;8#0=RhbqG)Wajkx$wQ54*61w~PiC9qhn z*lfO!bp4AdU0qJ`<;f!nVdw>p(H2q0B8TUJPgKRHvB;uDZ|}(Sefti#m^?a?_I+9S zx0`d-#A&4TyG$z!*UPEL4mi%u{fpxQIxEfLR9!#(%fb`G&{}WEk$72pi(@(k)YQ~) zP5M`i7R7N}T1JavM)!x0YyO?S#OP}rqbz)MTKpj9W-i(83yhv}N@^bmyyf6mIiHRT zr-@wNF0*2@CGkL3CmC#uNFF&BA(j?r#a+R}@@g2CSHreF?FmbGdV|rO@%_ueV{J|3 z@`tLsdHc|VG?7bH%|9EZ;iY?rQhNFcR+rsD6S-l>kz+M}yq!RQMf}q{XR&QhdqRw) zGjeD2PZ%Rq`)kd@pyl8#SG*h3cyE_k$uC&R!i7(=`}9>DJ@N&?O2hMCt&99!K(vv+ zv^a~EbECO;O zMoI1CA?K)l2#s^4kFO8`*Jn9@E(!D+riD9@^q3L{c!Wg=<^n_7T`*_H5 z@SYgIiCh-GI+4Y1ToY4icvKD$tx==xA8GUlBvdbrj97`0Mt@Hjp&~z6Ik-NiDqR-S z*ne8@W?gYf%%$NGCxK>T1~Y6ZWA|2m@NI40$PYArQ`vQZwk*4o#**Yb5)(sJ)tF1e zp(-*5SUIQ4FtWcvgBdwg-%#gqfVP8+5_;y3$6g!To*&%!R=f{+Vm1DXnN=~DhQC%g zCAuvj+DMMHzkVJ!AM+w@Tep1B?UJr9uR14|#5CG%1L8$MtH?E%gD27n=S_W&XNqs=wlut{QG1R2!%;`$`y?=$ zJwH~5@LwJ7f2JYfij5_A2v!dM`l7#g%jjvY^3t4LEPkUcY-#xV4O>D+e@ssT%}$W$ zY~O!%(96OT)nd&Z^m6bw-z?_*w&}>??_vAv#*TFhFt>kwcnGWC311o>D*9vE0(2+% zM;!IcxkDmaths}B&oS+b=v|#$nX-fb{3TSiw0k1ow>12@Cq^0DQ%DCemmKMj$#!30^fgYx%bX`q zo`KbBOKi#ZlpBy_S?Uwz+E-6RN=lOeoQ_UWd+K4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5B6-h)vR49>Uk}*!jFc3tIBBgYiG(Lc>-|PW?xjsq`z!?yya6{|LmJ>yCYAC3< z14p2xWY!4~_>*KkGtX8UtH-e)ZnVq~YVNP$ztY&xY8mqlfEG2>Tua!t9IEWt!oF`% zLry8=R6;5n9VnL!P+n6hwWJt{DAo{a0Rc!cCA6&vL6iUxql>F^F1kc$nr&cR9l{#% zlC+{X2e4Z@jR_NAa_lBT$Giiv695CyUop!G%@BfSO?tP?8lYpXHIvpIMhC|ovVcP% zpdtz1K(|TVj{reqWw?8}e||qM!xtc@kW1mOiHZOK002ovPDHLkV1ftOr6&LY diff --git a/html/theme/default/img/move_feature_on.png b/html/theme/default/img/move_feature_on.png deleted file mode 100644 index 072f066c30836dd2a0185fb3208be2214d67f329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379 zcmV-p1)TbcP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5AaY;l$R49>SXb@rJ#{e5QG%##n+o6sDcCc+=*oZ|O2sSeCV-;8DN0HFQA)%|Q zi&a8b7fFUVqp(Woq7rZkT_g!zBne$qK!gt5c97v*ygtVjR%k|PsAB~h43^lUR{gyt l19DB1ORibRs~T(?alxI002ovPDHLkV1oQjSo#0} diff --git a/html/theme/default/img/navigation_history.png b/html/theme/default/img/navigation_history.png deleted file mode 100644 index 053d1e0d26a5b41e84c441b4d4e08d6ae7abf1ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7021 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 diff --git a/html/theme/default/img/overview_replacement.gif b/html/theme/default/img/overview_replacement.gif deleted file mode 100644 index a82cf5fc54cc0064099720322d62e9bf4dde05c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmZ?wbhEHbPx#U{Fj{MT-{*004^y28{>^juR7;7Z;Tq8~oGvb(FE5}tIHXHUtx-|0R8+B9 zS+izlxpZ{De0;-*h{%_h&zqakq@>lix8A?M;o92n;NbA_@%Z%g`TYF-{r&#_{{H{} z|2@NR(EtDd0d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_ z00007bV*G`2iOM!5()vh+K+nx000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dak zSAh-}0003UNkl<|CWUkFi>ctT8d=8o+6B&=kY?clvXbz zc0Wl&K-kfnDnCWuPL^?NiPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOM! z1|1C8$9((%000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000DHNklJ{-dUD?Gg|jv6C&%QE-+qH``JRg}NH(OIyLvKIoG^ zv`rvwUrMo4D6OTdRT!0)F_&!ADpiEKy4hGd6?BLdiAxlH7aEt-Hd`OStEr z-?`u4{hj+epIKfCg~*)fOZ~ zCHxo|Qy_*&%vfZMswPCenLB_nJ|HbkkI9rOHP*N`#%WMfP*UXAEhPq^wY7}gTmzMr z_vA#mfx2j?-EJm7UzyIQPv^OPdpuf@vs7-G%;ufc*PGF51*)p@>Fs?fvwY6BXvh5g z3fHdfPbelF4zq7xr)bG46{25y9+N!$U<>+*RTxd*=o}L$Yz0(N=b$0&2;NV{( zK_ybbH8mz|w(Pgp1qG>`I#nc>Ta@F>84sb5{D-%^9OUfTUnPsWINqt(YjL?g6$Ljp zmy(gOT`GUERBg1k|0XNw{P`!$%=|4WC@bFC*jPeNj<_gOQnu0BS|*i03z&^}HZ?tB zY3Yq9cxuXz%QYmGXI4}cM&l07o%=|3W_5KRVzH!4-5QQ}%+0OP(jwl}8ykNi5LlJW zArf@q!Y3pr>*O~sLBpj>FZ?C=HX}Y?6a_NU+1X-<_)YiVA@awSI zvZ=1#74PnoiVX%sG&FbsSX~Wq`t;8mrS40LzRJrpaPi_3MH^ardVFy^2Ef@NwWsy= zzU1MwzokK!RUm+ZfTUXsE@S&0QHn%L}C5u;ir zB2P^mG2W5mqAj%bqV88jjPX`oy$ieDobV|}juc|GW-1XBL!Lq+Vq7^f*^=lJA{|#26#{`(T3ZL%y}O-Tw|*xa zem6MqdZ#HWx$sfi!)#Hi>my)2ak%qAkne*gkeZe4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5Bu1Q2eR49>U(lKk>KokdX6@iBXpB581VNxn{N2ZPe8!vaX6mml;Bwhp-4hVyg zI*4LCHimAQGN^JEFGZ6M*$8AZ8E1$E9o#Jm6!HN&bPBXvpPdp)^S|L9@AuyJv{9{M zJjrZ2(x#PW{D0C~Wvb0;>Ipz*no+1Ci|2EthIUWJ^Y~%T&vFOB?x8N@7(nM3Usr=L zY?M2zo4Q*)(=p~7*ktLHi%r{9oICabg$2P zj{qWw?scT=dcUhLU4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BE=fc|R49>SXcA%L#{e5Q$TMtU+o6sDcCc+=*oZ|O2sSeCBRF-@iFGhGKTM)7 zF|>~HymEY8bRDWh^t7*WIn%t#rrj(n@!TXTJ&;$S?%ZH1) SIzfs60000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C1VBkdK~#9!)K+awTU8i-&TXNkV7V=K>!#pnOKZTH%;L-p z`*I&mln=9kKlnk^Et>d)7?+ud8O}&3hAuD}%S>P~#w?rJrdi~NfD*co051NnWKlxcaL8yNIMgMY{7MBj>WWL;Zq#Cq_M*_a_ zb&s!;G9<|;4PX7RO%#w z%u|4rS3my;5bRi zn#EeG-{ZXabq@f5J-yxOa@DOenSzSnWHPy2b>-#dJk5908w!OIy9g2P0cwBb_zJ0( z`+eU{$+FD-s;W0Vo^SP{C`l{x^YaUf3c02>o894Xyi&0xu62ygXXXanHhXS+NBiL5 zKxb#C)xH*Rx3_mNMp@kGJfAVjD2+}|PPDgoM8aVndqAh=P<)uU0k`wnU6e-o4p;5F znVAo%lGH!-_s0Ply%q2=${33=MmZ>(XJ<~IE-c-X0964_04kxwX19q3gHD&aY15W) zII?=x>g?=ntJTT{(`ZxV(Gf*a3oZQ>6V@0}VI`sRUbTM6$ zq`bVmU$0+R5oom91Oo=9)#`3cjH?LKq@?g@o$Kx1-re^eDBW##zptkPShFTe%8&q< z%@$c6@dXsKIU67hgb)TWbGC&M0Ek8+Ny*8#L(#?V{ttbd0epV$Q(h`S&1Q3kL6qgu zpb`K8CV&w};#wvpC(H6k|FE*eJnibe3gA$^3lIPSAbQbgHe2+fk${0P5Jtej;%Wkz znDj0HxvMF+Yd^2N@Xh;1F>PdcaKlptgpj!v29A_CVFE=7c&>PkHA_oR{yU+4{qhum zhC}Zy1Y-iI00KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C1g1$uK~#9!td@UJR8&fU7q>hs`S+@3frxi&k-5{=rf=DpnPBev zp-taHJr!pT9zSukruNs5i%#@)w6^J6_Pv%>xI0^W@WWYET31rtey!$0)!8Rf(_bw( z9*qZv+iX_zjivER<$-cJD+j7R(`?_Bw-vyRTYnkq+9Os*&QR%viZ63t*pQgGR1}7o z!K=OcvaYUfnLOBLwE?(kHUUV_c7nA{y$;8q;B?w;78>Jp+Y(=Yx~kP@ zPX_p+-T3#Gci)+Qp|bOLUG0(l{G&dAW%Kg#R;*lMHd_Qikjhwy0svuLkjhx8jP;o3 zNmC@AqenEFkRVS(UHkM<0L}Fkjg6P7otggR(9n?6>7+FRa5xg{Iay`9hP&I=S(KkV{29W_a9iGP}pr2g+dV*!K&428gIU7qK2PT zIx;joji&V_=UXm)TVw9;HFiF{DkUZ<8)i0JL(L%ruK%l$)=)@(_eW=rKA ze*1L!B>-lVYp-xzxY=ssdEQMVgaAb37Ki)ESO8~C8CsIFA&Rb#-DYgSPKv z0EYIjE7kTnf>!6G%nSwa*5}1#=YDhRFi|OSZ+uso02VHaxrf_y&nG9dVuG`t-q2xa z4+>p>7ZnZxa^)kpKFd jcLtL}P34^bq5Lxduy61^+hi{!00000NkvXXu0mjfM$DTp diff --git a/html/theme/default/img/remove_point_off.png b/html/theme/default/img/remove_point_off.png deleted file mode 100644 index 76c8606f550c1d95cb9df2e8b8656447e8a9e58d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1612 zcmV-S2DABzP)4Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BT1iAfR49>Uk}+$-Kp2Kk0vQVCmJmotr*emo?KZPrK>80H1%)gQous%p=&!g= zZrA0)DS>1RcBoq$w+@BQow|1HcQLI}pF8sLz0XUgLyxYFFW7EYXk+)qf0S!)(ALc^ z1h7T8$O#$(39Lj@wwDdf3?i&oAY_Ex6!`sTaLqxXh;X$ zY1?;Tb$-P>9i*)7H-PZX9I=$$H+^RC8v%x};jpg5mngm_hNG~2Kk*Ll;oHKC6Q7vf zPcZ5cm=;N3Kr?{_oS*bi-*&$Vf#!*Xkgq;kojr!m)7|c)eGES;bEA)yi@5Uu0000< KMNUMnLSTZbgw{R) diff --git a/html/theme/default/img/remove_point_on.png b/html/theme/default/img/remove_point_on.png deleted file mode 100644 index 0ff28fc7168a54e550cf98006e02d05958b5a6ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 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 diff --git a/html/theme/default/img/save_features_on.png b/html/theme/default/img/save_features_on.png deleted file mode 100644 index 93c8f080bff6c78ed95d7d5c6ccadb90a9a66401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 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 diff --git a/html/theme/default/img/view_previous_off.png b/html/theme/default/img/view_previous_off.png deleted file mode 100644 index b9c230f749e1887d70d1928398b5d03e0105a3d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 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�a{vGU0d!JMQvg8b*k%9#00Cl4M??UK1szBL000Sa zNLh0L01FcU01FcV0GgZ_00007bV*G`2iOM!5(+95W_CLO000?uMObu0Z*6U5Zgc=c za%Ew3Wn>_CX>@2HM@dakSAh-}0005ZNkliz`RUC*NR1}GbSRZP=+y%aT+HBjXxSYASj%|Z${aiZ00000NkvXXu0mjf$)YM? diff --git a/html/theme/default/img/zoom-panel.png b/html/theme/default/img/zoom-panel.png deleted file mode 100755 index f2c7c518d592b2142c2e94bef00e985c6884de69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1624 zcmV-e2B-OnP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOM! z1|kHG!rt-#000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000HENklF7{`CTz4QeuZ3#$)%1}|98iPPp)GE#eO%s(w;!AW+iA$zN6OG*>CWXz)o{z;SDr}zAN zpXZ$OocmYMt8!C;nScdI2?Q&EUw|`U|M}GsidO)7AP-nU-`WqX2YX8|pxi0IVIYS7 zsSa2O_RHNsxq6`L4ItfNW5C`b1Oj<)0U*~INLO5^Q(-Wu z0q}Tyw6%3~AC{tk+^)Y23sd26e2ORvU3YYJNXRmTg!GI>M}LFMPNrRDPxN@cb z-9Y`-zh5IkfRq#yvu6(_B0@_^$wSVatHtM&`Rs1ZrlNEw(r@r=^}3TOENN!@c#SxR8%xj zTs)VYoXNd|va=_WnK_bKvx;##-5fqVhlB(pzy8`pY-|{2vyP4qiSy@csi|pU-n@AB z?fbANC?-b7nlTr* z($a=7dUW{THM(+T2{kp%h@!yKrN{Aje2f@jz-l#Z57w9JtZzqPksFhva-fvwVKiERU{`zF?g_!<;%x1e7GK^ zQbB90m%V#$V6m9|>uAA(QOGh(of<=FX&q{{l9MMNaq{FNva=_0@ZcQ)d_IY=FcsUj z`48DGTT)Rd;N?pnX=$+tt*ss^DxP9C59G@)t%Qeby3%QF^&&|!PG=j>pL=>tcX+sl zJ$q(SUEPdcuR=I+;y03$qbMr6%g&uwiHRA=_U%(hPk)cd$WUA^KR^@}Xtg3)S!3C; zV=A$+VXR$yhJ=K0PMvy$c;iMRXk?W?(R=X>a%Wr#~a(M=TZ-F4s$T?V85KiGx|TYzzej zw*mhNVloZD;dp^YqvWfvti;3&#AX}H;>Ab*-u+EYZ5%pumszvoNKO5Y`SVAxaN#Hn z1~nd!kHo}5G&H!`x-}J}QN#7?jU**SQBv}dt5=`)Y$KaDmr`HFIG~W{#w##mm{Vk0~pwdu=`acYF5#ptm^JqN4{87N+iV zkjv%4;dl`oWHhR&srdx2SLzd_QVEz$U(?*|=^dn03MiEVlGOK`hf*o@cs=X{Ie=&Y zr?ZV2GY%6Gq3sjY)a1tLZ0jC!hym9#w=+^&TK6`!t`Gv&>0R}U;P+qetTRHu#O;3v z$bPW@+*$hd0n7BJstb(mT-o*(zlnPzSf}x8d1Z^(FZ)egztY?vFnpJTc-pr&$A1Cq W+8RZ(A4&570000