2 var version = "4.11.0";
4 var d3_ascending = function(a, b) {
5 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
8 var d3_bisector = function(compare) {
9 if (compare.length === 1) compare = ascendingComparator(compare);
11 left: function(a, x, lo, hi) {
12 if (lo == null) lo = 0;
13 if (hi == null) hi = a.length;
15 var mid = lo + hi >>> 1;
16 if (compare(a[mid], x) < 0) lo = mid + 1;
21 right: function(a, x, lo, hi) {
22 if (lo == null) lo = 0;
23 if (hi == null) hi = a.length;
25 var mid = lo + hi >>> 1;
26 if (compare(a[mid], x) > 0) hi = mid;
34 function ascendingComparator(f) {
35 return function(d, x) {
36 return d3_ascending(f(d), x);
40 var ascendingBisect = d3_bisector(d3_ascending);
41 var bisectRight = ascendingBisect.right;
42 var bisectLeft = ascendingBisect.left;
44 var pairs = function(array, f) {
45 if (f == null) f = pair;
46 var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
47 while (i < n) pairs[i] = f(p, p = array[++i]);
55 var cross = function(values0, values1, reduce) {
56 var n0 = values0.length,
58 values = new Array(n0 * n1),
64 if (reduce == null) reduce = pair;
66 for (i0 = i = 0; i0 < n0; ++i0) {
67 for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
68 values[i] = reduce(value0, values1[i1]);
75 var d3_descending = function(a, b) {
76 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
79 var number = function(x) {
80 return x === null ? NaN : +x;
83 var variance = function(values, valueof) {
84 var n = values.length,
92 if (valueof == null) {
94 if (!isNaN(value = number(values[i]))) {
97 sum += delta * (value - mean);
104 if (!isNaN(value = number(valueof(values[i], i, values)))) {
105 delta = value - mean;
107 sum += delta * (value - mean);
112 if (m > 1) return sum / (m - 1);
115 var deviation = function(array, f) {
116 var v = variance(array, f);
117 return v ? Math.sqrt(v) : v;
120 var extent = function(values, valueof) {
121 var n = values.length,
127 if (valueof == null) {
128 while (++i < n) { // Find the first comparable value.
129 if ((value = values[i]) != null && value >= value) {
131 while (++i < n) { // Compare the remaining values.
132 if ((value = values[i]) != null) {
133 if (min > value) min = value;
134 if (max < value) max = value;
142 while (++i < n) { // Find the first comparable value.
143 if ((value = valueof(values[i], i, values)) != null && value >= value) {
145 while (++i < n) { // Compare the remaining values.
146 if ((value = valueof(values[i], i, values)) != null) {
147 if (min > value) min = value;
148 if (max < value) max = value;
158 var array = Array.prototype;
160 var slice = array.slice;
163 var constant = function(x) {
169 var identity = function(x) {
173 var d3_range = function(start, stop, step) {
174 start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
177 n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178 range = new Array(n);
181 range[i] = start + i * step;
187 var e10 = Math.sqrt(50);
188 var e5 = Math.sqrt(10);
189 var e2 = Math.sqrt(2);
191 var ticks = function(start, stop, count) {
198 stop = +stop, start = +start, count = +count;
199 if (start === stop && count > 0) return [start];
200 if (reverse = stop < start) n = start, start = stop, stop = n;
201 if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
204 start = Math.ceil(start / step);
205 stop = Math.floor(stop / step);
206 ticks = new Array(n = Math.ceil(stop - start + 1));
207 while (++i < n) ticks[i] = (start + i) * step;
209 start = Math.floor(start * step);
210 stop = Math.ceil(stop * step);
211 ticks = new Array(n = Math.ceil(start - stop + 1));
212 while (++i < n) ticks[i] = (start - i) / step;
215 if (reverse) ticks.reverse();
220 function tickIncrement(start, stop, count) {
221 var step = (stop - start) / Math.max(0, count),
222 power = Math.floor(Math.log(step) / Math.LN10),
223 error = step / Math.pow(10, power);
225 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
226 : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
229 function tickStep(start, stop, count) {
230 var step0 = Math.abs(stop - start) / Math.max(0, count),
231 step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
232 error = step0 / step1;
233 if (error >= e10) step1 *= 10;
234 else if (error >= e5) step1 *= 5;
235 else if (error >= e2) step1 *= 2;
236 return stop < start ? -step1 : step1;
239 var sturges = function(values) {
240 return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
243 var histogram = function() {
244 var value = identity,
248 function histogram(data) {
252 values = new Array(n);
254 for (i = 0; i < n; ++i) {
255 values[i] = value(data[i], i, data);
258 var xz = domain(values),
261 tz = threshold(values, x0, x1);
263 // Convert number of thresholds into uniform thresholds.
264 if (!Array.isArray(tz)) {
265 tz = tickStep(x0, x1, tz);
266 tz = d3_range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
269 // Remove any thresholds outside the domain.
271 while (tz[0] <= x0) tz.shift(), --m;
272 while (tz[m - 1] > x1) tz.pop(), --m;
274 var bins = new Array(m + 1),
278 for (i = 0; i <= m; ++i) {
280 bin.x0 = i > 0 ? tz[i - 1] : x0;
281 bin.x1 = i < m ? tz[i] : x1;
284 // Assign data to bins by value, ignoring any outside the domain.
285 for (i = 0; i < n; ++i) {
287 if (x0 <= x && x <= x1) {
288 bins[bisectRight(tz, x, 0, m)].push(data[i]);
295 histogram.value = function(_) {
296 return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
299 histogram.domain = function(_) {
300 return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
303 histogram.thresholds = function(_) {
304 return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
310 var threshold = function(values, p, valueof) {
311 if (valueof == null) valueof = number;
312 if (!(n = values.length)) return;
313 if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
314 if (p >= 1) return +valueof(values[n - 1], n - 1, values);
318 value0 = +valueof(values[i0], i0, values),
319 value1 = +valueof(values[i0 + 1], i0 + 1, values);
320 return value0 + (value1 - value0) * (i - i0);
323 var freedmanDiaconis = function(values, min, max) {
324 values = map.call(values, number).sort(d3_ascending);
325 return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
328 var scott = function(values, min, max) {
329 return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
332 var max = function(values, valueof) {
333 var n = values.length,
338 if (valueof == null) {
339 while (++i < n) { // Find the first comparable value.
340 if ((value = values[i]) != null && value >= value) {
342 while (++i < n) { // Compare the remaining values.
343 if ((value = values[i]) != null && value > max) {
352 while (++i < n) { // Find the first comparable value.
353 if ((value = valueof(values[i], i, values)) != null && value >= value) {
355 while (++i < n) { // Compare the remaining values.
356 if ((value = valueof(values[i], i, values)) != null && value > max) {
367 var mean = function(values, valueof) {
368 var n = values.length,
374 if (valueof == null) {
376 if (!isNaN(value = number(values[i]))) sum += value;
383 if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
388 if (m) return sum / m;
391 var d3_median = function(values, valueof) {
392 var n = values.length,
397 if (valueof == null) {
399 if (!isNaN(value = number(values[i]))) {
407 if (!isNaN(value = number(valueof(values[i], i, values)))) {
413 return threshold(numbers.sort(d3_ascending), 0.5);
416 var merge = function(arrays) {
417 var n = arrays.length,
424 while (++i < n) j += arrays[i].length;
425 merged = new Array(j);
431 merged[--j] = array[m];
438 var min = function(values, valueof) {
439 var n = values.length,
444 if (valueof == null) {
445 while (++i < n) { // Find the first comparable value.
446 if ((value = values[i]) != null && value >= value) {
448 while (++i < n) { // Compare the remaining values.
449 if ((value = values[i]) != null && min > value) {
458 while (++i < n) { // Find the first comparable value.
459 if ((value = valueof(values[i], i, values)) != null && value >= value) {
461 while (++i < n) { // Compare the remaining values.
462 if ((value = valueof(values[i], i, values)) != null && min > value) {
473 var permute = function(array, indexes) {
474 var i = indexes.length, permutes = new Array(i);
475 while (i--) permutes[i] = array[indexes[i]];
479 var scan = function(values, compare) {
480 if (!(n = values.length)) return;
487 if (compare == null) compare = d3_ascending;
490 if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
495 if (compare(xj, xj) === 0) return j;
498 var shuffle = function(array, i0, i1) {
499 var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
504 i = Math.random() * m-- | 0;
506 array[m + i0] = array[i + i0];
513 var sum = function(values, valueof) {
514 var n = values.length,
519 if (valueof == null) {
521 if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
527 if (value = +valueof(values[i], i, values)) sum += value;
534 var transpose = function(matrix) {
535 if (!(n = matrix.length)) return [];
536 for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
537 for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
538 row[j] = matrix[j][i];
548 var zip = function() {
549 return transpose(arguments);
552 var slice$1 = Array.prototype.slice;
554 var identity$1 = function(x) {
564 function translateX(x) {
565 return "translate(" + (x + 0.5) + ",0)";
568 function translateY(y) {
569 return "translate(0," + (y + 0.5) + ")";
572 function number$1(scale) {
578 function center(scale) {
579 var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
580 if (scale.round()) offset = Math.round(offset);
582 return +scale(d) + offset;
586 function entering() {
590 function axis(orient, scale) {
591 var tickArguments = [],
597 k = orient === top || orient === left ? -1 : 1,
598 x = orient === left || orient === right ? "x" : "y",
599 transform = orient === top || orient === bottom ? translateX : translateY;
601 function axis(context) {
602 var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
603 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
604 spacing = Math.max(tickSizeInner, 0) + tickPadding,
605 range = scale.range(),
606 range0 = +range[0] + 0.5,
607 range1 = +range[range.length - 1] + 0.5,
608 position = (scale.bandwidth ? center : number$1)(scale.copy()),
609 selection = context.selection ? context.selection() : context,
610 path = selection.selectAll(".domain").data([null]),
611 tick = selection.selectAll(".tick").data(values, scale).order(),
612 tickExit = tick.exit(),
613 tickEnter = tick.enter().append("g").attr("class", "tick"),
614 line = tick.select("line"),
615 text = tick.select("text");
617 path = path.merge(path.enter().insert("path", ".tick")
618 .attr("class", "domain")
619 .attr("stroke", "#000"));
621 tick = tick.merge(tickEnter);
623 line = line.merge(tickEnter.append("line")
624 .attr("stroke", "#000")
625 .attr(x + "2", k * tickSizeInner));
627 text = text.merge(tickEnter.append("text")
628 .attr("fill", "#000")
629 .attr(x, k * spacing)
630 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
632 if (context !== selection) {
633 path = path.transition(context);
634 tick = tick.transition(context);
635 line = line.transition(context);
636 text = text.transition(context);
638 tickExit = tickExit.transition(context)
639 .attr("opacity", epsilon)
640 .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
643 .attr("opacity", epsilon)
644 .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
650 .attr("d", orient === left || orient == right
651 ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
652 : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
656 .attr("transform", function(d) { return transform(position(d)); });
659 .attr(x + "2", k * tickSizeInner);
662 .attr(x, k * spacing)
665 selection.filter(entering)
666 .attr("fill", "none")
667 .attr("font-size", 10)
668 .attr("font-family", "sans-serif")
669 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
672 .each(function() { this.__axis = position; });
675 axis.scale = function(_) {
676 return arguments.length ? (scale = _, axis) : scale;
679 axis.ticks = function() {
680 return tickArguments = slice$1.call(arguments), axis;
683 axis.tickArguments = function(_) {
684 return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
687 axis.tickValues = function(_) {
688 return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
691 axis.tickFormat = function(_) {
692 return arguments.length ? (tickFormat = _, axis) : tickFormat;
695 axis.tickSize = function(_) {
696 return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
699 axis.tickSizeInner = function(_) {
700 return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
703 axis.tickSizeOuter = function(_) {
704 return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
707 axis.tickPadding = function(_) {
708 return arguments.length ? (tickPadding = +_, axis) : tickPadding;
714 function axisTop(scale) {
715 return axis(top, scale);
718 function axisRight(scale) {
719 return axis(right, scale);
722 function axisBottom(scale) {
723 return axis(bottom, scale);
726 function axisLeft(scale) {
727 return axis(left, scale);
730 var noop = {value: function() {}};
732 function dispatch() {
733 for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
734 if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
737 return new Dispatch(_);
740 function Dispatch(_) {
744 function parseTypenames(typenames, types) {
745 return typenames.trim().split(/^|\s+/).map(function(t) {
746 var name = "", i = t.indexOf(".");
747 if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
748 if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
749 return {type: t, name: name};
753 Dispatch.prototype = dispatch.prototype = {
754 constructor: Dispatch,
755 on: function(typename, callback) {
757 T = parseTypenames(typename + "", _),
762 // If no callback was specified, return the callback of the given type and name.
763 if (arguments.length < 2) {
764 while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
768 // If a type was specified, set the callback for the given type and name.
769 // Otherwise, if a null callback was specified, remove callbacks of the given name.
770 if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
772 if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
773 else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
779 var copy = {}, _ = this._;
780 for (var t in _) copy[t] = _[t].slice();
781 return new Dispatch(copy);
783 call: function(type, that) {
784 if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
785 if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
786 for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
788 apply: function(type, that, args) {
789 if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
790 for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
794 function get(type, name) {
795 for (var i = 0, n = type.length, c; i < n; ++i) {
796 if ((c = type[i]).name === name) {
802 function set(type, name, callback) {
803 for (var i = 0, n = type.length; i < n; ++i) {
804 if (type[i].name === name) {
805 type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
809 if (callback != null) type.push({name: name, value: callback});
813 var xhtml = "http://www.w3.org/1999/xhtml";
816 svg: "http://www.w3.org/2000/svg",
818 xlink: "http://www.w3.org/1999/xlink",
819 xml: "http://www.w3.org/XML/1998/namespace",
820 xmlns: "http://www.w3.org/2000/xmlns/"
823 var namespace = function(name) {
824 var prefix = name += "", i = prefix.indexOf(":");
825 if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
826 return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
829 function creatorInherit(name) {
831 var document = this.ownerDocument,
832 uri = this.namespaceURI;
833 return uri === xhtml && document.documentElement.namespaceURI === xhtml
834 ? document.createElement(name)
835 : document.createElementNS(uri, name);
839 function creatorFixed(fullname) {
841 return this.ownerDocument.createElementNS(fullname.space, fullname.local);
845 var creator = function(name) {
846 var fullname = namespace(name);
847 return (fullname.local
849 : creatorInherit)(fullname);
859 this._ = "@" + (++nextId).toString(36);
862 Local.prototype = local$1.prototype = {
864 get: function(node) {
866 while (!(id in node)) if (!(node = node.parentNode)) return;
869 set: function(node, value) {
870 return node[this._] = value;
872 remove: function(node) {
873 return this._ in node && delete node[this._];
875 toString: function() {
880 var matcher = function(selector) {
882 return this.matches(selector);
886 if (typeof document !== "undefined") {
887 var element = document.documentElement;
888 if (!element.matches) {
889 var vendorMatches = element.webkitMatchesSelector
890 || element.msMatchesSelector
891 || element.mozMatchesSelector
892 || element.oMatchesSelector;
893 matcher = function(selector) {
895 return vendorMatches.call(this, selector);
901 var matcher$1 = matcher;
903 var filterEvents = {};
907 if (typeof document !== "undefined") {
908 var element$1 = document.documentElement;
909 if (!("onmouseenter" in element$1)) {
910 filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
914 function filterContextListener(listener, index, group) {
915 listener = contextListener(listener, index, group);
916 return function(event) {
917 var related = event.relatedTarget;
918 if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
919 listener.call(this, event);
924 function contextListener(listener, index, group) {
925 return function(event1) {
926 var event0 = event; // Events can be reentrant (e.g., focus).
929 listener.call(this, this.__data__, index, group);
936 function parseTypenames$1(typenames) {
937 return typenames.trim().split(/^|\s+/).map(function(t) {
938 var name = "", i = t.indexOf(".");
939 if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
940 return {type: t, name: name};
944 function onRemove(typename) {
948 for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
949 if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
950 this.removeEventListener(o.type, o.listener, o.capture);
955 if (++i) on.length = i;
956 else delete this.__on;
960 function onAdd(typename, value, capture) {
961 var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
962 return function(d, i, group) {
963 var on = this.__on, o, listener = wrap(value, i, group);
964 if (on) for (var j = 0, m = on.length; j < m; ++j) {
965 if ((o = on[j]).type === typename.type && o.name === typename.name) {
966 this.removeEventListener(o.type, o.listener, o.capture);
967 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
972 this.addEventListener(typename.type, listener, capture);
973 o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
974 if (!on) this.__on = [o];
979 var selection_on = function(typename, value, capture) {
980 var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
982 if (arguments.length < 2) {
983 var on = this.node().__on;
984 if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
985 for (i = 0, o = on[j]; i < n; ++i) {
986 if ((t = typenames[i]).type === o.type && t.name === o.name) {
994 on = value ? onAdd : onRemove;
995 if (capture == null) capture = false;
996 for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1000 function customEvent(event1, listener, that, args) {
1002 event1.sourceEvent = event;
1005 return listener.apply(that, args);
1011 var sourceEvent = function() {
1012 var current = event, source;
1013 while (source = current.sourceEvent) current = source;
1017 var point = function(node, event) {
1018 var svg = node.ownerSVGElement || node;
1020 if (svg.createSVGPoint) {
1021 var point = svg.createSVGPoint();
1022 point.x = event.clientX, point.y = event.clientY;
1023 point = point.matrixTransform(node.getScreenCTM().inverse());
1024 return [point.x, point.y];
1027 var rect = node.getBoundingClientRect();
1028 return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1031 var d3_mouse = function(node) {
1032 var event = sourceEvent();
1033 if (event.changedTouches) event = event.changedTouches[0];
1034 return point(node, event);
1039 var selector = function(selector) {
1040 return selector == null ? none : function() {
1041 return this.querySelector(selector);
1045 var selection_select = function(select) {
1046 if (typeof select !== "function") select = selector(select);
1048 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1049 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
1050 if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
1051 if ("__data__" in node) subnode.__data__ = node.__data__;
1052 subgroup[i] = subnode;
1057 return new Selection(subgroups, this._parents);
1060 function empty$1() {
1064 var selectorAll = function(selector) {
1065 return selector == null ? empty$1 : function() {
1066 return this.querySelectorAll(selector);
1070 var selection_selectAll = function(select) {
1071 if (typeof select !== "function") select = selectorAll(select);
1073 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
1074 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
1075 if (node = group[i]) {
1076 subgroups.push(select.call(node, node.__data__, i, group));
1082 return new Selection(subgroups, parents);
1085 var selection_filter = function(match) {
1086 if (typeof match !== "function") match = matcher$1(match);
1088 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1089 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
1090 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
1091 subgroup.push(node);
1096 return new Selection(subgroups, this._parents);
1099 var sparse = function(update) {
1100 return new Array(update.length);
1103 var selection_enter = function() {
1104 return new Selection(this._enter || this._groups.map(sparse), this._parents);
1107 function EnterNode(parent, datum) {
1108 this.ownerDocument = parent.ownerDocument;
1109 this.namespaceURI = parent.namespaceURI;
1111 this._parent = parent;
1112 this.__data__ = datum;
1115 EnterNode.prototype = {
1116 constructor: EnterNode,
1117 appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
1118 insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
1119 querySelector: function(selector) { return this._parent.querySelector(selector); },
1120 querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
1123 var constant$1 = function(x) {
1129 var keyPrefix = "$"; // Protect against keys like “__proto__”.
1131 function bindIndex(parent, group, enter, update, exit, data) {
1134 groupLength = group.length,
1135 dataLength = data.length;
1137 // Put any non-null nodes that fit into update.
1138 // Put any null nodes into enter.
1139 // Put any remaining data into enter.
1140 for (; i < dataLength; ++i) {
1141 if (node = group[i]) {
1142 node.__data__ = data[i];
1145 enter[i] = new EnterNode(parent, data[i]);
1149 // Put any non-null nodes that don’t fit into exit.
1150 for (; i < groupLength; ++i) {
1151 if (node = group[i]) {
1157 function bindKey(parent, group, enter, update, exit, data, key) {
1160 nodeByKeyValue = {},
1161 groupLength = group.length,
1162 dataLength = data.length,
1163 keyValues = new Array(groupLength),
1166 // Compute the key for each node.
1167 // If multiple nodes have the same key, the duplicates are added to exit.
1168 for (i = 0; i < groupLength; ++i) {
1169 if (node = group[i]) {
1170 keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1171 if (keyValue in nodeByKeyValue) {
1174 nodeByKeyValue[keyValue] = node;
1179 // Compute the key for each datum.
1180 // If there a node associated with this key, join and add it to update.
1181 // If there is not (or the key is a duplicate), add it to enter.
1182 for (i = 0; i < dataLength; ++i) {
1183 keyValue = keyPrefix + key.call(parent, data[i], i, data);
1184 if (node = nodeByKeyValue[keyValue]) {
1186 node.__data__ = data[i];
1187 nodeByKeyValue[keyValue] = null;
1189 enter[i] = new EnterNode(parent, data[i]);
1193 // Add any remaining nodes that were not bound to data to exit.
1194 for (i = 0; i < groupLength; ++i) {
1195 if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1201 var selection_data = function(value, key) {
1203 data = new Array(this.size()), j = -1;
1204 this.each(function(d) { data[++j] = d; });
1208 var bind = key ? bindKey : bindIndex,
1209 parents = this._parents,
1210 groups = this._groups;
1212 if (typeof value !== "function") value = constant$1(value);
1214 for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1215 var parent = parents[j],
1217 groupLength = group.length,
1218 data = value.call(parent, parent && parent.__data__, j, parents),
1219 dataLength = data.length,
1220 enterGroup = enter[j] = new Array(dataLength),
1221 updateGroup = update[j] = new Array(dataLength),
1222 exitGroup = exit[j] = new Array(groupLength);
1224 bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1226 // Now connect the enter nodes to their following update node, such that
1227 // appendChild can insert the materialized enter node before this node,
1228 // rather than at the end of the parent node.
1229 for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1230 if (previous = enterGroup[i0]) {
1231 if (i0 >= i1) i1 = i0 + 1;
1232 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1233 previous._next = next || null;
1238 update = new Selection(update, parents);
1239 update._enter = enter;
1240 update._exit = exit;
1244 var selection_exit = function() {
1245 return new Selection(this._exit || this._groups.map(sparse), this._parents);
1248 var selection_merge = function(selection$$1) {
1250 for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1251 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1252 if (node = group0[i] || group1[i]) {
1258 for (; j < m0; ++j) {
1259 merges[j] = groups0[j];
1262 return new Selection(merges, this._parents);
1265 var selection_order = function() {
1267 for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1268 for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1269 if (node = group[i]) {
1270 if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1279 var selection_sort = function(compare) {
1280 if (!compare) compare = ascending;
1282 function compareNode(a, b) {
1283 return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1286 for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1287 for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1288 if (node = group[i]) {
1289 sortgroup[i] = node;
1292 sortgroup.sort(compareNode);
1295 return new Selection(sortgroups, this._parents).order();
1298 function ascending(a, b) {
1299 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1302 var selection_call = function() {
1303 var callback = arguments[0];
1304 arguments[0] = this;
1305 callback.apply(null, arguments);
1309 var selection_nodes = function() {
1310 var nodes = new Array(this.size()), i = -1;
1311 this.each(function() { nodes[++i] = this; });
1315 var selection_node = function() {
1317 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1318 for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1319 var node = group[i];
1320 if (node) return node;
1327 var selection_size = function() {
1329 this.each(function() { ++size; });
1333 var selection_empty = function() {
1334 return !this.node();
1337 var selection_each = function(callback) {
1339 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1340 for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1341 if (node = group[i]) callback.call(node, node.__data__, i, group);
1348 function attrRemove(name) {
1350 this.removeAttribute(name);
1354 function attrRemoveNS(fullname) {
1356 this.removeAttributeNS(fullname.space, fullname.local);
1360 function attrConstant(name, value) {
1362 this.setAttribute(name, value);
1366 function attrConstantNS(fullname, value) {
1368 this.setAttributeNS(fullname.space, fullname.local, value);
1372 function attrFunction(name, value) {
1374 var v = value.apply(this, arguments);
1375 if (v == null) this.removeAttribute(name);
1376 else this.setAttribute(name, v);
1380 function attrFunctionNS(fullname, value) {
1382 var v = value.apply(this, arguments);
1383 if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1384 else this.setAttributeNS(fullname.space, fullname.local, v);
1388 var selection_attr = function(name, value) {
1389 var fullname = namespace(name);
1391 if (arguments.length < 2) {
1392 var node = this.node();
1393 return fullname.local
1394 ? node.getAttributeNS(fullname.space, fullname.local)
1395 : node.getAttribute(fullname);
1398 return this.each((value == null
1399 ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1400 ? (fullname.local ? attrFunctionNS : attrFunction)
1401 : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1404 var defaultView = function(node) {
1405 return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1406 || (node.document && node) // node is a Window
1407 || node.defaultView; // node is a Document
1410 function styleRemove(name) {
1412 this.style.removeProperty(name);
1416 function styleConstant(name, value, priority) {
1418 this.style.setProperty(name, value, priority);
1422 function styleFunction(name, value, priority) {
1424 var v = value.apply(this, arguments);
1425 if (v == null) this.style.removeProperty(name);
1426 else this.style.setProperty(name, v, priority);
1430 var selection_style = function(name, value, priority) {
1431 return arguments.length > 1
1432 ? this.each((value == null
1433 ? styleRemove : typeof value === "function"
1435 : styleConstant)(name, value, priority == null ? "" : priority))
1436 : styleValue(this.node(), name);
1439 function styleValue(node, name) {
1440 return node.style.getPropertyValue(name)
1441 || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1444 function propertyRemove(name) {
1450 function propertyConstant(name, value) {
1456 function propertyFunction(name, value) {
1458 var v = value.apply(this, arguments);
1459 if (v == null) delete this[name];
1460 else this[name] = v;
1464 var selection_property = function(name, value) {
1465 return arguments.length > 1
1466 ? this.each((value == null
1467 ? propertyRemove : typeof value === "function"
1469 : propertyConstant)(name, value))
1470 : this.node()[name];
1473 function classArray(string) {
1474 return string.trim().split(/^|\s+/);
1477 function classList(node) {
1478 return node.classList || new ClassList(node);
1481 function ClassList(node) {
1483 this._names = classArray(node.getAttribute("class") || "");
1486 ClassList.prototype = {
1487 add: function(name) {
1488 var i = this._names.indexOf(name);
1490 this._names.push(name);
1491 this._node.setAttribute("class", this._names.join(" "));
1494 remove: function(name) {
1495 var i = this._names.indexOf(name);
1497 this._names.splice(i, 1);
1498 this._node.setAttribute("class", this._names.join(" "));
1501 contains: function(name) {
1502 return this._names.indexOf(name) >= 0;
1506 function classedAdd(node, names) {
1507 var list = classList(node), i = -1, n = names.length;
1508 while (++i < n) list.add(names[i]);
1511 function classedRemove(node, names) {
1512 var list = classList(node), i = -1, n = names.length;
1513 while (++i < n) list.remove(names[i]);
1516 function classedTrue(names) {
1518 classedAdd(this, names);
1522 function classedFalse(names) {
1524 classedRemove(this, names);
1528 function classedFunction(names, value) {
1530 (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1534 var selection_classed = function(name, value) {
1535 var names = classArray(name + "");
1537 if (arguments.length < 2) {
1538 var list = classList(this.node()), i = -1, n = names.length;
1539 while (++i < n) if (!list.contains(names[i])) return false;
1543 return this.each((typeof value === "function"
1544 ? classedFunction : value
1546 : classedFalse)(names, value));
1549 function textRemove() {
1550 this.textContent = "";
1553 function textConstant(value) {
1555 this.textContent = value;
1559 function textFunction(value) {
1561 var v = value.apply(this, arguments);
1562 this.textContent = v == null ? "" : v;
1566 var selection_text = function(value) {
1567 return arguments.length
1568 ? this.each(value == null
1569 ? textRemove : (typeof value === "function"
1571 : textConstant)(value))
1572 : this.node().textContent;
1575 function htmlRemove() {
1576 this.innerHTML = "";
1579 function htmlConstant(value) {
1581 this.innerHTML = value;
1585 function htmlFunction(value) {
1587 var v = value.apply(this, arguments);
1588 this.innerHTML = v == null ? "" : v;
1592 var selection_html = function(value) {
1593 return arguments.length
1594 ? this.each(value == null
1595 ? htmlRemove : (typeof value === "function"
1597 : htmlConstant)(value))
1598 : this.node().innerHTML;
1602 if (this.nextSibling) this.parentNode.appendChild(this);
1605 var selection_raise = function() {
1606 return this.each(raise);
1610 if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1613 var selection_lower = function() {
1614 return this.each(lower);
1617 var selection_append = function(name) {
1618 var create = typeof name === "function" ? name : creator(name);
1619 return this.select(function() {
1620 return this.appendChild(create.apply(this, arguments));
1624 function constantNull() {
1628 var selection_insert = function(name, before) {
1629 var create = typeof name === "function" ? name : creator(name),
1630 select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1631 return this.select(function() {
1632 return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1637 var parent = this.parentNode;
1638 if (parent) parent.removeChild(this);
1641 var selection_remove = function() {
1642 return this.each(remove);
1645 var selection_datum = function(value) {
1646 return arguments.length
1647 ? this.property("__data__", value)
1648 : this.node().__data__;
1651 function dispatchEvent(node, type, params) {
1652 var window = defaultView(node),
1653 event = window.CustomEvent;
1655 if (typeof event === "function") {
1656 event = new event(type, params);
1658 event = window.document.createEvent("Event");
1659 if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1660 else event.initEvent(type, false, false);
1663 node.dispatchEvent(event);
1666 function dispatchConstant(type, params) {
1668 return dispatchEvent(this, type, params);
1672 function dispatchFunction(type, params) {
1674 return dispatchEvent(this, type, params.apply(this, arguments));
1678 var selection_dispatch = function(type, params) {
1679 return this.each((typeof params === "function"
1681 : dispatchConstant)(type, params));
1686 function Selection(groups, parents) {
1687 this._groups = groups;
1688 this._parents = parents;
1691 function selection() {
1692 return new Selection([[document.documentElement]], root);
1695 Selection.prototype = selection.prototype = {
1696 constructor: Selection,
1697 select: selection_select,
1698 selectAll: selection_selectAll,
1699 filter: selection_filter,
1700 data: selection_data,
1701 enter: selection_enter,
1702 exit: selection_exit,
1703 merge: selection_merge,
1704 order: selection_order,
1705 sort: selection_sort,
1706 call: selection_call,
1707 nodes: selection_nodes,
1708 node: selection_node,
1709 size: selection_size,
1710 empty: selection_empty,
1711 each: selection_each,
1712 attr: selection_attr,
1713 style: selection_style,
1714 property: selection_property,
1715 classed: selection_classed,
1716 text: selection_text,
1717 html: selection_html,
1718 raise: selection_raise,
1719 lower: selection_lower,
1720 append: selection_append,
1721 insert: selection_insert,
1722 remove: selection_remove,
1723 datum: selection_datum,
1725 dispatch: selection_dispatch
1728 var d3_select = function(selector) {
1729 return typeof selector === "string"
1730 ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1731 : new Selection([[selector]], root);
1734 var d3_selectAll = function(selector) {
1735 return typeof selector === "string"
1736 ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1737 : new Selection([selector == null ? [] : selector], root);
1740 var touch = function(node, touches, identifier) {
1741 if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1743 for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1744 if ((touch = touches[i]).identifier === identifier) {
1745 return point(node, touch);
1752 var d3_touches = function(node, touches) {
1753 if (touches == null) touches = sourceEvent().touches;
1755 for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1756 points[i] = point(node, touches[i]);
1762 function nopropagation() {
1763 event.stopImmediatePropagation();
1766 var noevent = function() {
1767 event.preventDefault();
1768 event.stopImmediatePropagation();
1771 var dragDisable = function(view) {
1772 var root = view.document.documentElement,
1773 selection$$1 = d3_select(view).on("dragstart.drag", noevent, true);
1774 if ("onselectstart" in root) {
1775 selection$$1.on("selectstart.drag", noevent, true);
1777 root.__noselect = root.style.MozUserSelect;
1778 root.style.MozUserSelect = "none";
1782 function yesdrag(view, noclick) {
1783 var root = view.document.documentElement,
1784 selection$$1 = d3_select(view).on("dragstart.drag", null);
1786 selection$$1.on("click.drag", noevent, true);
1787 setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1789 if ("onselectstart" in root) {
1790 selection$$1.on("selectstart.drag", null);
1792 root.style.MozUserSelect = root.__noselect;
1793 delete root.__noselect;
1797 var constant$2 = function(x) {
1803 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1804 this.target = target;
1806 this.subject = subject;
1807 this.identifier = id;
1808 this.active = active;
1816 DragEvent.prototype.on = function() {
1817 var value = this._.on.apply(this._, arguments);
1818 return value === this._ ? this : value;
1821 // Ignore right-click, since that should open the context menu.
1822 function defaultFilter$1() {
1823 return !event.button;
1826 function defaultContainer() {
1827 return this.parentNode;
1830 function defaultSubject(d) {
1831 return d == null ? {x: event.x, y: event.y} : d;
1834 function defaultTouchable() {
1835 return "ontouchstart" in this;
1838 var drag = function() {
1839 var filter = defaultFilter$1,
1840 container = defaultContainer,
1841 subject = defaultSubject,
1842 touchable = defaultTouchable,
1844 listeners = dispatch("start", "drag", "end"),
1852 function drag(selection) {
1854 .on("mousedown.drag", mousedowned)
1856 .on("touchstart.drag", touchstarted)
1857 .on("touchmove.drag", touchmoved)
1858 .on("touchend.drag touchcancel.drag", touchended)
1859 .style("touch-action", "none")
1860 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1863 function mousedowned() {
1864 if (touchending || !filter.apply(this, arguments)) return;
1865 var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
1866 if (!gesture) return;
1867 d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1868 dragDisable(event.view);
1870 mousemoving = false;
1871 mousedownx = event.clientX;
1872 mousedowny = event.clientY;
1876 function mousemoved() {
1879 var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1880 mousemoving = dx * dx + dy * dy > clickDistance2;
1882 gestures.mouse("drag");
1885 function mouseupped() {
1886 d3_select(event.view).on("mousemove.drag mouseup.drag", null);
1887 yesdrag(event.view, mousemoving);
1889 gestures.mouse("end");
1892 function touchstarted() {
1893 if (!filter.apply(this, arguments)) return;
1894 var touches = event.changedTouches,
1895 c = container.apply(this, arguments),
1896 n = touches.length, i, gesture;
1898 for (i = 0; i < n; ++i) {
1899 if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1906 function touchmoved() {
1907 var touches = event.changedTouches,
1908 n = touches.length, i, gesture;
1910 for (i = 0; i < n; ++i) {
1911 if (gesture = gestures[touches[i].identifier]) {
1918 function touchended() {
1919 var touches = event.changedTouches,
1920 n = touches.length, i, gesture;
1922 if (touchending) clearTimeout(touchending);
1923 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1924 for (i = 0; i < n; ++i) {
1925 if (gesture = gestures[touches[i].identifier]) {
1932 function beforestart(id, container, point, that, args) {
1933 var p = point(container, id), s, dx, dy,
1934 sublisteners = listeners.copy();
1936 if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1937 if ((event.subject = s = subject.apply(that, args)) == null) return false;
1938 dx = s.x - p[0] || 0;
1939 dy = s.y - p[1] || 0;
1943 return function gesture(type) {
1946 case "start": gestures[id] = gesture, n = active++; break;
1947 case "end": delete gestures[id], --active; // nobreak
1948 case "drag": p = point(container, id), n = active; break;
1950 customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
1954 drag.filter = function(_) {
1955 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1958 drag.container = function(_) {
1959 return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1962 drag.subject = function(_) {
1963 return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1966 drag.touchable = function(_) {
1967 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1970 drag.on = function() {
1971 var value = listeners.on.apply(listeners, arguments);
1972 return value === listeners ? drag : value;
1975 drag.clickDistance = function(_) {
1976 return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1982 var define = function(constructor, factory, prototype) {
1983 constructor.prototype = factory.prototype = prototype;
1984 prototype.constructor = constructor;
1987 function extend(parent, definition) {
1988 var prototype = Object.create(parent.prototype);
1989 for (var key in definition) prototype[key] = definition[key];
1996 var brighter = 1 / darker;
1998 var reI = "\\s*([+-]?\\d+)\\s*";
1999 var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*";
2000 var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
2001 var reHex3 = /^#([0-9a-f]{3})$/;
2002 var reHex6 = /^#([0-9a-f]{6})$/;
2003 var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$");
2004 var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$");
2005 var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$");
2006 var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$");
2007 var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$");
2008 var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2011 aliceblue: 0xf0f8ff,
2012 antiquewhite: 0xfaebd7,
2014 aquamarine: 0x7fffd4,
2019 blanchedalmond: 0xffebcd,
2021 blueviolet: 0x8a2be2,
2023 burlywood: 0xdeb887,
2024 cadetblue: 0x5f9ea0,
2025 chartreuse: 0x7fff00,
2026 chocolate: 0xd2691e,
2028 cornflowerblue: 0x6495ed,
2034 darkgoldenrod: 0xb8860b,
2036 darkgreen: 0x006400,
2038 darkkhaki: 0xbdb76b,
2039 darkmagenta: 0x8b008b,
2040 darkolivegreen: 0x556b2f,
2041 darkorange: 0xff8c00,
2042 darkorchid: 0x9932cc,
2044 darksalmon: 0xe9967a,
2045 darkseagreen: 0x8fbc8f,
2046 darkslateblue: 0x483d8b,
2047 darkslategray: 0x2f4f4f,
2048 darkslategrey: 0x2f4f4f,
2049 darkturquoise: 0x00ced1,
2050 darkviolet: 0x9400d3,
2052 deepskyblue: 0x00bfff,
2055 dodgerblue: 0x1e90ff,
2056 firebrick: 0xb22222,
2057 floralwhite: 0xfffaf0,
2058 forestgreen: 0x228b22,
2060 gainsboro: 0xdcdcdc,
2061 ghostwhite: 0xf8f8ff,
2063 goldenrod: 0xdaa520,
2066 greenyellow: 0xadff2f,
2070 indianred: 0xcd5c5c,
2075 lavenderblush: 0xfff0f5,
2076 lawngreen: 0x7cfc00,
2077 lemonchiffon: 0xfffacd,
2078 lightblue: 0xadd8e6,
2079 lightcoral: 0xf08080,
2080 lightcyan: 0xe0ffff,
2081 lightgoldenrodyellow: 0xfafad2,
2082 lightgray: 0xd3d3d3,
2083 lightgreen: 0x90ee90,
2084 lightgrey: 0xd3d3d3,
2085 lightpink: 0xffb6c1,
2086 lightsalmon: 0xffa07a,
2087 lightseagreen: 0x20b2aa,
2088 lightskyblue: 0x87cefa,
2089 lightslategray: 0x778899,
2090 lightslategrey: 0x778899,
2091 lightsteelblue: 0xb0c4de,
2092 lightyellow: 0xffffe0,
2094 limegreen: 0x32cd32,
2098 mediumaquamarine: 0x66cdaa,
2099 mediumblue: 0x0000cd,
2100 mediumorchid: 0xba55d3,
2101 mediumpurple: 0x9370db,
2102 mediumseagreen: 0x3cb371,
2103 mediumslateblue: 0x7b68ee,
2104 mediumspringgreen: 0x00fa9a,
2105 mediumturquoise: 0x48d1cc,
2106 mediumvioletred: 0xc71585,
2107 midnightblue: 0x191970,
2108 mintcream: 0xf5fffa,
2109 mistyrose: 0xffe4e1,
2111 navajowhite: 0xffdead,
2115 olivedrab: 0x6b8e23,
2117 orangered: 0xff4500,
2119 palegoldenrod: 0xeee8aa,
2120 palegreen: 0x98fb98,
2121 paleturquoise: 0xafeeee,
2122 palevioletred: 0xdb7093,
2123 papayawhip: 0xffefd5,
2124 peachpuff: 0xffdab9,
2128 powderblue: 0xb0e0e6,
2130 rebeccapurple: 0x663399,
2132 rosybrown: 0xbc8f8f,
2133 royalblue: 0x4169e1,
2134 saddlebrown: 0x8b4513,
2136 sandybrown: 0xf4a460,
2142 slateblue: 0x6a5acd,
2143 slategray: 0x708090,
2144 slategrey: 0x708090,
2146 springgreen: 0x00ff7f,
2147 steelblue: 0x4682b4,
2152 turquoise: 0x40e0d0,
2156 whitesmoke: 0xf5f5f5,
2158 yellowgreen: 0x9acd32
2161 define(Color, color, {
2162 displayable: function() {
2163 return this.rgb().displayable();
2165 toString: function() {
2166 return this.rgb() + "";
2170 function color(format) {
2172 format = (format + "").trim().toLowerCase();
2173 return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
2174 : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2175 : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2176 : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2177 : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2178 : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2179 : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2180 : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2181 : named.hasOwnProperty(format) ? rgbn(named[format])
2182 : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2187 return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2190 function rgba(r, g, b, a) {
2191 if (a <= 0) r = g = b = NaN;
2192 return new Rgb(r, g, b, a);
2195 function rgbConvert(o) {
2196 if (!(o instanceof Color)) o = color(o);
2197 if (!o) return new Rgb;
2199 return new Rgb(o.r, o.g, o.b, o.opacity);
2202 function rgb(r, g, b, opacity) {
2203 return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2206 function Rgb(r, g, b, opacity) {
2210 this.opacity = +opacity;
2213 define(Rgb, rgb, extend(Color, {
2214 brighter: function(k) {
2215 k = k == null ? brighter : Math.pow(brighter, k);
2216 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2218 darker: function(k) {
2219 k = k == null ? darker : Math.pow(darker, k);
2220 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2225 displayable: function() {
2226 return (0 <= this.r && this.r <= 255)
2227 && (0 <= this.g && this.g <= 255)
2228 && (0 <= this.b && this.b <= 255)
2229 && (0 <= this.opacity && this.opacity <= 1);
2231 toString: function() {
2232 var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2233 return (a === 1 ? "rgb(" : "rgba(")
2234 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2235 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2236 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2237 + (a === 1 ? ")" : ", " + a + ")");
2241 function hsla(h, s, l, a) {
2242 if (a <= 0) h = s = l = NaN;
2243 else if (l <= 0 || l >= 1) h = s = NaN;
2244 else if (s <= 0) h = NaN;
2245 return new Hsl(h, s, l, a);
2248 function hslConvert(o) {
2249 if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2250 if (!(o instanceof Color)) o = color(o);
2251 if (!o) return new Hsl;
2252 if (o instanceof Hsl) return o;
2257 min = Math.min(r, g, b),
2258 max = Math.max(r, g, b),
2261 l = (max + min) / 2;
2263 if (r === max) h = (g - b) / s + (g < b) * 6;
2264 else if (g === max) h = (b - r) / s + 2;
2265 else h = (r - g) / s + 4;
2266 s /= l < 0.5 ? max + min : 2 - max - min;
2269 s = l > 0 && l < 1 ? 0 : h;
2271 return new Hsl(h, s, l, o.opacity);
2274 function hsl(h, s, l, opacity) {
2275 return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2278 function Hsl(h, s, l, opacity) {
2282 this.opacity = +opacity;
2285 define(Hsl, hsl, extend(Color, {
2286 brighter: function(k) {
2287 k = k == null ? brighter : Math.pow(brighter, k);
2288 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2290 darker: function(k) {
2291 k = k == null ? darker : Math.pow(darker, k);
2292 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2295 var h = this.h % 360 + (this.h < 0) * 360,
2296 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2298 m2 = l + (l < 0.5 ? l : 1 - l) * s,
2301 hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2303 hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2307 displayable: function() {
2308 return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2309 && (0 <= this.l && this.l <= 1)
2310 && (0 <= this.opacity && this.opacity <= 1);
2314 /* From FvD 13.37, CSS Color Module Level 3 */
2315 function hsl2rgb(h, m1, m2) {
2316 return (h < 60 ? m1 + (m2 - m1) * h / 60
2318 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2322 var deg2rad = Math.PI / 180;
2323 var rad2deg = 180 / Math.PI;
2331 var t2 = 3 * t1 * t1;
2332 var t3 = t1 * t1 * t1;
2334 function labConvert(o) {
2335 if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2336 if (o instanceof Hcl) {
2337 var h = o.h * deg2rad;
2338 return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2340 if (!(o instanceof Rgb)) o = rgbConvert(o);
2341 var b = rgb2xyz(o.r),
2344 x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2345 y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2346 z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2347 return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2350 function lab(l, a, b, opacity) {
2351 return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2354 function Lab(l, a, b, opacity) {
2358 this.opacity = +opacity;
2361 define(Lab, lab, extend(Color, {
2362 brighter: function(k) {
2363 return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2365 darker: function(k) {
2366 return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2369 var y = (this.l + 16) / 116,
2370 x = isNaN(this.a) ? y : y + this.a / 500,
2371 z = isNaN(this.b) ? y : y - this.b / 200;
2372 y = Yn * lab2xyz(y);
2373 x = Xn * lab2xyz(x);
2374 z = Zn * lab2xyz(z);
2376 xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2377 xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2378 xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2384 function xyz2lab(t) {
2385 return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2388 function lab2xyz(t) {
2389 return t > t1 ? t * t * t : t2 * (t - t0);
2392 function xyz2rgb(x) {
2393 return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2396 function rgb2xyz(x) {
2397 return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2400 function hclConvert(o) {
2401 if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2402 if (!(o instanceof Lab)) o = labConvert(o);
2403 var h = Math.atan2(o.b, o.a) * rad2deg;
2404 return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2407 function hcl(h, c, l, opacity) {
2408 return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2411 function Hcl(h, c, l, opacity) {
2415 this.opacity = +opacity;
2418 define(Hcl, hcl, extend(Color, {
2419 brighter: function(k) {
2420 return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2422 darker: function(k) {
2423 return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2426 return labConvert(this).rgb();
2437 var BC_DA = B * C - D * A;
2439 function cubehelixConvert(o) {
2440 if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2441 if (!(o instanceof Rgb)) o = rgbConvert(o);
2445 l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2447 k = (E * (g - l) - C * bl) / D,
2448 s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2449 h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2450 return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2453 function cubehelix(h, s, l, opacity) {
2454 return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2457 function Cubehelix(h, s, l, opacity) {
2461 this.opacity = +opacity;
2464 define(Cubehelix, cubehelix, extend(Color, {
2465 brighter: function(k) {
2466 k = k == null ? brighter : Math.pow(brighter, k);
2467 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2469 darker: function(k) {
2470 k = k == null ? darker : Math.pow(darker, k);
2471 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2474 var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2476 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2480 255 * (l + a * (A * cosh + B * sinh)),
2481 255 * (l + a * (C * cosh + D * sinh)),
2482 255 * (l + a * (E * cosh)),
2488 function basis(t1, v0, v1, v2, v3) {
2489 var t2 = t1 * t1, t3 = t2 * t1;
2490 return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2491 + (4 - 6 * t2 + 3 * t3) * v1
2492 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2496 var basis$1 = function(values) {
2497 var n = values.length - 1;
2498 return function(t) {
2499 var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2502 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2503 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2504 return basis((t - i / n) * n, v0, v1, v2, v3);
2508 var basisClosed = function(values) {
2509 var n = values.length;
2510 return function(t) {
2511 var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2512 v0 = values[(i + n - 1) % n],
2514 v2 = values[(i + 1) % n],
2515 v3 = values[(i + 2) % n];
2516 return basis((t - i / n) * n, v0, v1, v2, v3);
2520 var constant$3 = function(x) {
2526 function linear(a, d) {
2527 return function(t) {
2532 function exponential(a, b, y) {
2533 return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2534 return Math.pow(a + t * b, y);
2538 function hue(a, b) {
2540 return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2544 return (y = +y) === 1 ? nogamma : function(a, b) {
2545 return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2549 function nogamma(a, b) {
2551 return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2554 var d3_interpolateRgb = (function rgbGamma(y) {
2555 var color$$1 = gamma(y);
2557 function rgb$$1(start, end) {
2558 var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2559 g = color$$1(start.g, end.g),
2560 b = color$$1(start.b, end.b),
2561 opacity = nogamma(start.opacity, end.opacity);
2562 return function(t) {
2566 start.opacity = opacity(t);
2571 rgb$$1.gamma = rgbGamma;
2576 function rgbSpline(spline) {
2577 return function(colors) {
2578 var n = colors.length,
2583 for (i = 0; i < n; ++i) {
2584 color$$1 = rgb(colors[i]);
2585 r[i] = color$$1.r || 0;
2586 g[i] = color$$1.g || 0;
2587 b[i] = color$$1.b || 0;
2592 color$$1.opacity = 1;
2593 return function(t) {
2597 return color$$1 + "";
2602 var rgbBasis = rgbSpline(basis$1);
2603 var rgbBasisClosed = rgbSpline(basisClosed);
2605 var array$1 = function(a, b) {
2606 var nb = b ? b.length : 0,
2607 na = a ? Math.min(nb, a.length) : 0,
2612 for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
2613 for (; i < nb; ++i) c[i] = b[i];
2615 return function(t) {
2616 for (i = 0; i < na; ++i) c[i] = x[i](t);
2621 var date = function(a, b) {
2623 return a = +a, b -= a, function(t) {
2624 return d.setTime(a + b * t), d;
2628 var d3_interpolateNumber = function(a, b) {
2629 return a = +a, b -= a, function(t) {
2634 var object = function(a, b) {
2639 if (a === null || typeof a !== "object") a = {};
2640 if (b === null || typeof b !== "object") b = {};
2644 i[k] = d3_interpolate(a[k], b[k]);
2650 return function(t) {
2651 for (k in i) c[k] = i[k](t);
2656 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
2657 var reB = new RegExp(reA.source, "g");
2666 return function(t) {
2671 var interpolateString = function(a, b) {
2672 var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2673 am, // current match in a
2674 bm, // current match in b
2675 bs, // string preceding current number in b, if any
2676 i = -1, // index in s
2677 s = [], // string constants and placeholders
2678 q = []; // number interpolators
2680 // Coerce inputs to strings.
2681 a = a + "", b = b + "";
2683 // Interpolate pairs of numbers in a & b.
2684 while ((am = reA.exec(a))
2685 && (bm = reB.exec(b))) {
2686 if ((bs = bm.index) > bi) { // a string precedes the next number in b
2687 bs = b.slice(bi, bs);
2688 if (s[i]) s[i] += bs; // coalesce with previous string
2691 if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2692 if (s[i]) s[i] += bm; // coalesce with previous string
2694 } else { // interpolate non-matching numbers
2696 q.push({i: i, x: d3_interpolateNumber(am, bm)});
2701 // Add remains of b.
2702 if (bi < b.length) {
2704 if (s[i]) s[i] += bs; // coalesce with previous string
2708 // Special optimization for only a single match.
2709 // Otherwise, interpolate each of the numbers and rejoin the string.
2710 return s.length < 2 ? (q[0]
2713 : (b = q.length, function(t) {
2714 for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2719 var d3_interpolate = function(a, b) {
2720 var t = typeof b, c;
2721 return b == null || t === "boolean" ? constant$3(b)
2722 : (t === "number" ? d3_interpolateNumber
2723 : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2724 : b instanceof color ? d3_interpolateRgb
2725 : b instanceof Date ? date
2726 : Array.isArray(b) ? array$1
2727 : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2728 : d3_interpolateNumber)(a, b);
2731 var interpolateRound = function(a, b) {
2732 return a = +a, b -= a, function(t) {
2733 return Math.round(a + b * t);
2737 var degrees = 180 / Math.PI;
2748 var decompose = function(a, b, c, d, e, f) {
2749 var scaleX, scaleY, skewX;
2750 if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2751 if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2752 if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2753 if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2757 rotate: Math.atan2(b, a) * degrees,
2758 skewX: Math.atan(skewX) * degrees,
2769 function parseCss(value) {
2770 if (value === "none") return identity$2;
2771 if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2772 cssNode.style.transform = value;
2773 value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2774 cssRoot.removeChild(cssNode);
2775 value = value.slice(7, -1).split(",");
2776 return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2779 function parseSvg(value) {
2780 if (value == null) return identity$2;
2781 if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2782 svgNode.setAttribute("transform", value);
2783 if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2784 value = value.matrix;
2785 return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2788 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2791 return s.length ? s.pop() + " " : "";
2794 function translate(xa, ya, xb, yb, s, q) {
2795 if (xa !== xb || ya !== yb) {
2796 var i = s.push("translate(", null, pxComma, null, pxParen);
2797 q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2798 } else if (xb || yb) {
2799 s.push("translate(" + xb + pxComma + yb + pxParen);
2803 function rotate(a, b, s, q) {
2805 if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2806 q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2808 s.push(pop(s) + "rotate(" + b + degParen);
2812 function skewX(a, b, s, q) {
2814 q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2816 s.push(pop(s) + "skewX(" + b + degParen);
2820 function scale(xa, ya, xb, yb, s, q) {
2821 if (xa !== xb || ya !== yb) {
2822 var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2823 q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2824 } else if (xb !== 1 || yb !== 1) {
2825 s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2829 return function(a, b) {
2830 var s = [], // string constants and placeholders
2831 q = []; // number interpolators
2832 a = parse(a), b = parse(b);
2833 translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2834 rotate(a.rotate, b.rotate, s, q);
2835 skewX(a.skewX, b.skewX, s, q);
2836 scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2838 return function(t) {
2839 var i = -1, n = q.length, o;
2840 while (++i < n) s[(o = q[i]).i] = o.x(t);
2846 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2847 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2849 var rho = Math.SQRT2;
2852 var epsilon2 = 1e-12;
2855 return ((x = Math.exp(x)) + 1 / x) / 2;
2859 return ((x = Math.exp(x)) - 1 / x) / 2;
2863 return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2866 // p0 = [ux0, uy0, w0]
2867 // p1 = [ux1, uy1, w1]
2868 var interpolateZoom = function(p0, p1) {
2869 var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2870 ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2873 d2 = dx * dx + dy * dy,
2877 // Special case for u0 ≅ u1.
2878 if (d2 < epsilon2) {
2879 S = Math.log(w1 / w0) / rho;
2884 w0 * Math.exp(rho * t * S)
2891 var d1 = Math.sqrt(d2),
2892 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2893 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2894 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2895 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2896 S = (r1 - r0) / rho;
2900 u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2904 w0 * coshr0 / cosh(rho * s + r0)
2909 i.duration = S * 1000;
2914 function hsl$1(hue$$1) {
2915 return function(start, end) {
2916 var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2917 s = nogamma(start.s, end.s),
2918 l = nogamma(start.l, end.l),
2919 opacity = nogamma(start.opacity, end.opacity);
2920 return function(t) {
2924 start.opacity = opacity(t);
2930 var hsl$2 = hsl$1(hue);
2931 var hslLong = hsl$1(nogamma);
2933 function lab$1(start, end) {
2934 var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2935 a = nogamma(start.a, end.a),
2936 b = nogamma(start.b, end.b),
2937 opacity = nogamma(start.opacity, end.opacity);
2938 return function(t) {
2942 start.opacity = opacity(t);
2947 function hcl$1(hue$$1) {
2948 return function(start, end) {
2949 var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2950 c = nogamma(start.c, end.c),
2951 l = nogamma(start.l, end.l),
2952 opacity = nogamma(start.opacity, end.opacity);
2953 return function(t) {
2957 start.opacity = opacity(t);
2963 var hcl$2 = hcl$1(hue);
2964 var hclLong = hcl$1(nogamma);
2966 function cubehelix$1(hue$$1) {
2967 return (function cubehelixGamma(y) {
2970 function cubehelix$$1(start, end) {
2971 var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2972 s = nogamma(start.s, end.s),
2973 l = nogamma(start.l, end.l),
2974 opacity = nogamma(start.opacity, end.opacity);
2975 return function(t) {
2978 start.l = l(Math.pow(t, y));
2979 start.opacity = opacity(t);
2984 cubehelix$$1.gamma = cubehelixGamma;
2986 return cubehelix$$1;
2990 var cubehelix$2 = cubehelix$1(hue);
2991 var cubehelixLong = cubehelix$1(nogamma);
2993 var d3_quantize = function(interpolator, n) {
2994 var samples = new Array(n);
2995 for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3002 var pokeDelay = 1000;
3008 var clock = typeof performance === "object" && performance.now ? performance : Date;
3009 var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3012 return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3015 function clearNow() {
3025 Timer.prototype = timer.prototype = {
3027 restart: function(callback, delay, time) {
3028 if (typeof callback !== "function") throw new TypeError("callback is not a function");
3029 time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3030 if (!this._next && taskTail !== this) {
3031 if (taskTail) taskTail._next = this;
3032 else taskHead = this;
3035 this._call = callback;
3042 this._time = Infinity;
3048 function timer(callback, delay, time) {
3050 t.restart(callback, delay, time);
3054 function timerFlush() {
3055 now(); // Get the current time, if not already set.
3056 ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3057 var t = taskHead, e;
3059 if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3066 clockNow = (clockLast = clock.now()) + clockSkew;
3067 frame = timeout = 0;
3078 var now = clock.now(), delay = now - clockLast;
3079 if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3083 var t0, t1 = taskHead, t2, time = Infinity;
3086 if (time > t1._time) time = t1._time;
3087 t0 = t1, t1 = t1._next;
3089 t2 = t1._next, t1._next = null;
3090 t1 = t0 ? t0._next = t2 : taskHead = t2;
3097 function sleep(time) {
3098 if (frame) return; // Soonest alarm already set, or will be.
3099 if (timeout) timeout = clearTimeout(timeout);
3100 var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3102 if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3103 if (interval) interval = clearInterval(interval);
3105 if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3106 frame = 1, setFrame(wake);
3110 var d3_timeout = function(callback, delay, time) {
3112 delay = delay == null ? 0 : +delay;
3113 t.restart(function(elapsed) {
3115 callback(elapsed + delay);
3120 var interval$1 = function(callback, delay, time) {
3121 var t = new Timer, total = delay;
3122 if (delay == null) return t.restart(callback, delay, time), t;
3123 delay = +delay, time = time == null ? now() : +time;
3124 t.restart(function tick(elapsed) {
3126 t.restart(tick, total += delay, time);
3132 var emptyOn = dispatch("start", "end", "interrupt");
3133 var emptyTween = [];
3143 var schedule = function(node, name, id, index, group, timing) {
3144 var schedules = node.__transition;
3145 if (!schedules) node.__transition = {};
3146 else if (id in schedules) return;
3149 index: index, // For context during callback.
3150 group: group, // For context during callback.
3154 delay: timing.delay,
3155 duration: timing.duration,
3162 function init(node, id) {
3163 var schedule = node.__transition;
3164 if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
3168 function set$1(node, id) {
3169 var schedule = node.__transition;
3170 if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
3174 function get$1(node, id) {
3175 var schedule = node.__transition;
3176 if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
3180 function create(node, id, self) {
3181 var schedules = node.__transition,
3184 // Initialize the self timer when the transition is created.
3185 // Note the actual delay is not known until the first callback!
3186 schedules[id] = self;
3187 self.timer = timer(schedule, 0, self.time);
3189 function schedule(elapsed) {
3190 self.state = SCHEDULED;
3191 self.timer.restart(start, self.delay, self.time);
3193 // If the elapsed delay is less than our first sleep, start immediately.
3194 if (self.delay <= elapsed) start(elapsed - self.delay);
3197 function start(elapsed) {
3200 // If the state is not SCHEDULED, then we previously errored on start.
3201 if (self.state !== SCHEDULED) return stop();
3203 for (i in schedules) {
3205 if (o.name !== self.name) continue;
3207 // While this element already has a starting transition during this frame,
3208 // defer starting an interrupting transition until that transition has a
3209 // chance to tick (and possibly end); see d3/d3-transition#54!
3210 if (o.state === STARTED) return d3_timeout(start);
3212 // Interrupt the active transition, if any.
3213 // Dispatch the interrupt event.
3214 if (o.state === RUNNING) {
3217 o.on.call("interrupt", node, node.__data__, o.index, o.group);
3218 delete schedules[i];
3221 // Cancel any pre-empted transitions. No interrupt event is dispatched
3222 // because the cancelled transitions never started. Note that this also
3223 // removes this transition from the pending list!
3227 delete schedules[i];
3231 // Defer the first tick to end of the current frame; see d3/d3#1576.
3232 // Note the transition may be canceled after start and before the first tick!
3233 // Note this must be scheduled before the start event; see d3/d3-transition#16!
3234 // Assuming this is successful, subsequent callbacks go straight to tick.
3235 d3_timeout(function() {
3236 if (self.state === STARTED) {
3237 self.state = RUNNING;
3238 self.timer.restart(tick, self.delay, self.time);
3243 // Dispatch the start event.
3244 // Note this must be done before the tween are initialized.
3245 self.state = STARTING;
3246 self.on.call("start", node, node.__data__, self.index, self.group);
3247 if (self.state !== STARTING) return; // interrupted
3248 self.state = STARTED;
3250 // Initialize the tween, deleting null tween.
3251 tween = new Array(n = self.tween.length);
3252 for (i = 0, j = -1; i < n; ++i) {
3253 if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3257 tween.length = j + 1;
3260 function tick(elapsed) {
3261 var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3266 tween[i].call(null, t);
3269 // Dispatch the end event.
3270 if (self.state === ENDING) {
3271 self.on.call("end", node, node.__data__, self.index, self.group);
3279 delete schedules[id];
3280 for (var i in schedules) return; // eslint-disable-line no-unused-vars
3281 delete node.__transition;
3285 var interrupt = function(node, name) {
3286 var schedules = node.__transition,
3292 if (!schedules) return;
3294 name = name == null ? null : name + "";
3296 for (i in schedules) {
3297 if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3298 active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3299 schedule$$1.state = ENDED;
3300 schedule$$1.timer.stop();
3301 if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3302 delete schedules[i];
3305 if (empty) delete node.__transition;
3308 var selection_interrupt = function(name) {
3309 return this.each(function() {
3310 interrupt(this, name);
3314 function tweenRemove(id, name) {
3317 var schedule$$1 = set$1(this, id),
3318 tween = schedule$$1.tween;
3320 // If this node shared tween with the previous node,
3321 // just assign the updated shared tween and we’re done!
3322 // Otherwise, copy-on-write.
3323 if (tween !== tween0) {
3324 tween1 = tween0 = tween;
3325 for (var i = 0, n = tween1.length; i < n; ++i) {
3326 if (tween1[i].name === name) {
3327 tween1 = tween1.slice();
3328 tween1.splice(i, 1);
3334 schedule$$1.tween = tween1;
3338 function tweenFunction(id, name, value) {
3340 if (typeof value !== "function") throw new Error;
3342 var schedule$$1 = set$1(this, id),
3343 tween = schedule$$1.tween;
3345 // If this node shared tween with the previous node,
3346 // just assign the updated shared tween and we’re done!
3347 // Otherwise, copy-on-write.
3348 if (tween !== tween0) {
3349 tween1 = (tween0 = tween).slice();
3350 for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3351 if (tween1[i].name === name) {
3356 if (i === n) tween1.push(t);
3359 schedule$$1.tween = tween1;
3363 var transition_tween = function(name, value) {
3368 if (arguments.length < 2) {
3369 var tween = get$1(this.node(), id).tween;
3370 for (var i = 0, n = tween.length, t; i < n; ++i) {
3371 if ((t = tween[i]).name === name) {
3378 return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3381 function tweenValue(transition, name, value) {
3382 var id = transition._id;
3384 transition.each(function() {
3385 var schedule$$1 = set$1(this, id);
3386 (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3389 return function(node) {
3390 return get$1(node, id).value[name];
3394 var interpolate = function(a, b) {
3396 return (typeof b === "number" ? d3_interpolateNumber
3397 : b instanceof color ? d3_interpolateRgb
3398 : (c = color(b)) ? (b = c, d3_interpolateRgb)
3399 : interpolateString)(a, b);
3402 function attrRemove$1(name) {
3404 this.removeAttribute(name);
3408 function attrRemoveNS$1(fullname) {
3410 this.removeAttributeNS(fullname.space, fullname.local);
3414 function attrConstant$1(name, interpolate$$1, value1) {
3418 var value0 = this.getAttribute(name);
3419 return value0 === value1 ? null
3420 : value0 === value00 ? interpolate0
3421 : interpolate0 = interpolate$$1(value00 = value0, value1);
3425 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3429 var value0 = this.getAttributeNS(fullname.space, fullname.local);
3430 return value0 === value1 ? null
3431 : value0 === value00 ? interpolate0
3432 : interpolate0 = interpolate$$1(value00 = value0, value1);
3436 function attrFunction$1(name, interpolate$$1, value) {
3441 var value0, value1 = value(this);
3442 if (value1 == null) return void this.removeAttribute(name);
3443 value0 = this.getAttribute(name);
3444 return value0 === value1 ? null
3445 : value0 === value00 && value1 === value10 ? interpolate0
3446 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3450 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3455 var value0, value1 = value(this);
3456 if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3457 value0 = this.getAttributeNS(fullname.space, fullname.local);
3458 return value0 === value1 ? null
3459 : value0 === value00 && value1 === value10 ? interpolate0
3460 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3464 var transition_attr = function(name, value) {
3465 var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
3466 return this.attrTween(name, typeof value === "function"
3467 ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3468 : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3469 : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3472 function attrTweenNS(fullname, value) {
3474 var node = this, i = value.apply(node, arguments);
3475 return i && function(t) {
3476 node.setAttributeNS(fullname.space, fullname.local, i(t));
3479 tween._value = value;
3483 function attrTween(name, value) {
3485 var node = this, i = value.apply(node, arguments);
3486 return i && function(t) {
3487 node.setAttribute(name, i(t));
3490 tween._value = value;
3494 var transition_attrTween = function(name, value) {
3495 var key = "attr." + name;
3496 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3497 if (value == null) return this.tween(key, null);
3498 if (typeof value !== "function") throw new Error;
3499 var fullname = namespace(name);
3500 return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3503 function delayFunction(id, value) {
3505 init(this, id).delay = +value.apply(this, arguments);
3509 function delayConstant(id, value) {
3510 return value = +value, function() {
3511 init(this, id).delay = value;
3515 var transition_delay = function(value) {
3518 return arguments.length
3519 ? this.each((typeof value === "function"
3521 : delayConstant)(id, value))
3522 : get$1(this.node(), id).delay;
3525 function durationFunction(id, value) {
3527 set$1(this, id).duration = +value.apply(this, arguments);
3531 function durationConstant(id, value) {
3532 return value = +value, function() {
3533 set$1(this, id).duration = value;
3537 var transition_duration = function(value) {
3540 return arguments.length
3541 ? this.each((typeof value === "function"
3543 : durationConstant)(id, value))
3544 : get$1(this.node(), id).duration;
3547 function easeConstant(id, value) {
3548 if (typeof value !== "function") throw new Error;
3550 set$1(this, id).ease = value;
3554 var transition_ease = function(value) {
3557 return arguments.length
3558 ? this.each(easeConstant(id, value))
3559 : get$1(this.node(), id).ease;
3562 var transition_filter = function(match) {
3563 if (typeof match !== "function") match = matcher$1(match);
3565 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3566 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3567 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3568 subgroup.push(node);
3573 return new Transition(subgroups, this._parents, this._name, this._id);
3576 var transition_merge = function(transition$$1) {
3577 if (transition$$1._id !== this._id) throw new Error;
3579 for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3580 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3581 if (node = group0[i] || group1[i]) {
3587 for (; j < m0; ++j) {
3588 merges[j] = groups0[j];
3591 return new Transition(merges, this._parents, this._name, this._id);
3594 function start(name) {
3595 return (name + "").trim().split(/^|\s+/).every(function(t) {
3596 var i = t.indexOf(".");
3597 if (i >= 0) t = t.slice(0, i);
3598 return !t || t === "start";
3602 function onFunction(id, name, listener) {
3603 var on0, on1, sit = start(name) ? init : set$1;
3605 var schedule$$1 = sit(this, id),
3606 on = schedule$$1.on;
3608 // If this node shared a dispatch with the previous node,
3609 // just assign the updated shared dispatch and we’re done!
3610 // Otherwise, copy-on-write.
3611 if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3613 schedule$$1.on = on1;
3617 var transition_on = function(name, listener) {
3620 return arguments.length < 2
3621 ? get$1(this.node(), id).on.on(name)
3622 : this.each(onFunction(id, name, listener));
3625 function removeFunction(id) {
3627 var parent = this.parentNode;
3628 for (var i in this.__transition) if (+i !== id) return;
3629 if (parent) parent.removeChild(this);
3633 var transition_remove = function() {
3634 return this.on("end.remove", removeFunction(this._id));
3637 var transition_select = function(select) {
3638 var name = this._name,
3641 if (typeof select !== "function") select = selector(select);
3643 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3644 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3645 if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
3646 if ("__data__" in node) subnode.__data__ = node.__data__;
3647 subgroup[i] = subnode;
3648 schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3653 return new Transition(subgroups, this._parents, name, id);
3656 var transition_selectAll = function(select) {
3657 var name = this._name,
3660 if (typeof select !== "function") select = selectorAll(select);
3662 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3663 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3664 if (node = group[i]) {
3665 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3666 if (child = children[k]) {
3667 schedule(child, name, id, k, children, inherit);
3670 subgroups.push(children);
3676 return new Transition(subgroups, parents, name, id);
3679 var Selection$1 = selection.prototype.constructor;
3681 var transition_selection = function() {
3682 return new Selection$1(this._groups, this._parents);
3685 function styleRemove$1(name, interpolate$$1) {
3690 var value0 = styleValue(this, name),
3691 value1 = (this.style.removeProperty(name), styleValue(this, name));
3692 return value0 === value1 ? null
3693 : value0 === value00 && value1 === value10 ? interpolate0
3694 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3698 function styleRemoveEnd(name) {
3700 this.style.removeProperty(name);
3704 function styleConstant$1(name, interpolate$$1, value1) {
3708 var value0 = styleValue(this, name);
3709 return value0 === value1 ? null
3710 : value0 === value00 ? interpolate0
3711 : interpolate0 = interpolate$$1(value00 = value0, value1);
3715 function styleFunction$1(name, interpolate$$1, value) {
3720 var value0 = styleValue(this, name),
3721 value1 = value(this);
3722 if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3723 return value0 === value1 ? null
3724 : value0 === value00 && value1 === value10 ? interpolate0
3725 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3729 var transition_style = function(name, value, priority) {
3730 var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
3731 return value == null ? this
3732 .styleTween(name, styleRemove$1(name, i))
3733 .on("end.style." + name, styleRemoveEnd(name))
3734 : this.styleTween(name, typeof value === "function"
3735 ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3736 : styleConstant$1(name, i, value + ""), priority);
3739 function styleTween(name, value, priority) {
3741 var node = this, i = value.apply(node, arguments);
3742 return i && function(t) {
3743 node.style.setProperty(name, i(t), priority);
3746 tween._value = value;
3750 var transition_styleTween = function(name, value, priority) {
3751 var key = "style." + (name += "");
3752 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3753 if (value == null) return this.tween(key, null);
3754 if (typeof value !== "function") throw new Error;
3755 return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3758 function textConstant$1(value) {
3760 this.textContent = value;
3764 function textFunction$1(value) {
3766 var value1 = value(this);
3767 this.textContent = value1 == null ? "" : value1;
3771 var transition_text = function(value) {
3772 return this.tween("text", typeof value === "function"
3773 ? textFunction$1(tweenValue(this, "text", value))
3774 : textConstant$1(value == null ? "" : value + ""));
3777 var transition_transition = function() {
3778 var name = this._name,
3782 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3783 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3784 if (node = group[i]) {
3785 var inherit = get$1(node, id0);
3786 schedule(node, name, id1, i, group, {
3787 time: inherit.time + inherit.delay + inherit.duration,
3789 duration: inherit.duration,
3796 return new Transition(groups, this._parents, name, id1);
3801 function Transition(groups, parents, name, id) {
3802 this._groups = groups;
3803 this._parents = parents;
3808 function transition(name) {
3809 return selection().transition(name);
3816 var selection_prototype = selection.prototype;
3818 Transition.prototype = transition.prototype = {
3819 constructor: Transition,
3820 select: transition_select,
3821 selectAll: transition_selectAll,
3822 filter: transition_filter,
3823 merge: transition_merge,
3824 selection: transition_selection,
3825 transition: transition_transition,
3826 call: selection_prototype.call,
3827 nodes: selection_prototype.nodes,
3828 node: selection_prototype.node,
3829 size: selection_prototype.size,
3830 empty: selection_prototype.empty,
3831 each: selection_prototype.each,
3833 attr: transition_attr,
3834 attrTween: transition_attrTween,
3835 style: transition_style,
3836 styleTween: transition_styleTween,
3837 text: transition_text,
3838 remove: transition_remove,
3839 tween: transition_tween,
3840 delay: transition_delay,
3841 duration: transition_duration,
3842 ease: transition_ease
3845 function linear$1(t) {
3849 function quadIn(t) {
3853 function quadOut(t) {
3857 function quadInOut(t) {
3858 return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3861 function cubicIn(t) {
3865 function cubicOut(t) {
3866 return --t * t * t + 1;
3869 function cubicInOut(t) {
3870 return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3875 var polyIn = (function custom(e) {
3878 function polyIn(t) {
3879 return Math.pow(t, e);
3882 polyIn.exponent = custom;
3887 var polyOut = (function custom(e) {
3890 function polyOut(t) {
3891 return 1 - Math.pow(1 - t, e);
3894 polyOut.exponent = custom;
3899 var polyInOut = (function custom(e) {
3902 function polyInOut(t) {
3903 return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3906 polyInOut.exponent = custom;
3912 var halfPi = pi / 2;
3915 return 1 - Math.cos(t * halfPi);
3918 function sinOut(t) {
3919 return Math.sin(t * halfPi);
3922 function sinInOut(t) {
3923 return (1 - Math.cos(pi * t)) / 2;
3927 return Math.pow(2, 10 * t - 10);
3930 function expOut(t) {
3931 return 1 - Math.pow(2, -10 * t);
3934 function expInOut(t) {
3935 return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3938 function circleIn(t) {
3939 return 1 - Math.sqrt(1 - t * t);
3942 function circleOut(t) {
3943 return Math.sqrt(1 - --t * t);
3946 function circleInOut(t) {
3947 return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3959 var b0 = 1 / b1 / b1;
3961 function bounceIn(t) {
3962 return 1 - bounceOut(1 - t);
3965 function bounceOut(t) {
3966 return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
3969 function bounceInOut(t) {
3970 return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3973 var overshoot = 1.70158;
3975 var backIn = (function custom(s) {
3978 function backIn(t) {
3979 return t * t * ((s + 1) * t - s);
3982 backIn.overshoot = custom;
3987 var backOut = (function custom(s) {
3990 function backOut(t) {
3991 return --t * t * ((s + 1) * t + s) + 1;
3994 backOut.overshoot = custom;
3999 var backInOut = (function custom(s) {
4002 function backInOut(t) {
4003 return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4006 backInOut.overshoot = custom;
4011 var tau = 2 * Math.PI;
4015 var elasticIn = (function custom(a, p) {
4016 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4018 function elasticIn(t) {
4019 return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4022 elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4023 elasticIn.period = function(p) { return custom(a, p); };
4026 })(amplitude, period);
4028 var elasticOut = (function custom(a, p) {
4029 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4031 function elasticOut(t) {
4032 return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4035 elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4036 elasticOut.period = function(p) { return custom(a, p); };
4039 })(amplitude, period);
4041 var elasticInOut = (function custom(a, p) {
4042 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4044 function elasticInOut(t) {
4045 return ((t = t * 2 - 1) < 0
4046 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4047 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4050 elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4051 elasticInOut.period = function(p) { return custom(a, p); };
4053 return elasticInOut;
4054 })(amplitude, period);
4056 var defaultTiming = {
4057 time: null, // Set on use.
4063 function inherit(node, id) {
4065 while (!(timing = node.__transition) || !(timing = timing[id])) {
4066 if (!(node = node.parentNode)) {
4067 return defaultTiming.time = now(), defaultTiming;
4073 var selection_transition = function(name) {
4077 if (name instanceof Transition) {
4078 id = name._id, name = name._name;
4080 id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4083 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4084 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4085 if (node = group[i]) {
4086 schedule(node, name, id, i, group, timing || inherit(node, id));
4091 return new Transition(groups, this._parents, name, id);
4094 selection.prototype.interrupt = selection_interrupt;
4095 selection.prototype.transition = selection_transition;
4097 var root$1 = [null];
4099 var active = function(node, name) {
4100 var schedules = node.__transition,
4105 name = name == null ? null : name + "";
4106 for (i in schedules) {
4107 if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4108 return new Transition([[node]], root$1, name, +i);
4116 var constant$4 = function(x) {
4122 var BrushEvent = function(target, type, selection) {
4123 this.target = target;
4125 this.selection = selection;
4128 function nopropagation$1() {
4129 event.stopImmediatePropagation();
4132 var noevent$1 = function() {
4133 event.preventDefault();
4134 event.stopImmediatePropagation();
4137 var MODE_DRAG = {name: "drag"};
4138 var MODE_SPACE = {name: "space"};
4139 var MODE_HANDLE = {name: "handle"};
4140 var MODE_CENTER = {name: "center"};
4144 handles: ["e", "w"].map(type),
4145 input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4146 output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4151 handles: ["n", "s"].map(type),
4152 input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4153 output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4158 handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4159 input: function(xy) { return xy; },
4160 output: function(xy) { return xy; }
4164 overlay: "crosshair",
4224 // Ignore right-click, since that should open the context menu.
4225 function defaultFilter() {
4226 return !event.button;
4229 function defaultExtent() {
4230 var svg = this.ownerSVGElement || this;
4231 return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4234 // Like d3.local, but with the name “__brush” rather than auto-generated.
4235 function local$$1(node) {
4236 while (!node.__brush) if (!(node = node.parentNode)) return;
4237 return node.__brush;
4240 function empty(extent) {
4241 return extent[0][0] === extent[1][0]
4242 || extent[0][1] === extent[1][1];
4245 function brushSelection(node) {
4246 var state = node.__brush;
4247 return state ? state.dim.output(state.selection) : null;
4258 var brush = function() {
4262 function brush$1(dim) {
4263 var extent = defaultExtent,
4264 filter = defaultFilter,
4265 listeners = dispatch(brush, "start", "brush", "end"),
4269 function brush(group) {
4271 .property("__brush", initialize)
4272 .selectAll(".overlay")
4273 .data([type("overlay")]);
4275 overlay.enter().append("rect")
4276 .attr("class", "overlay")
4277 .attr("pointer-events", "all")
4278 .attr("cursor", cursors.overlay)
4281 var extent = local$$1(this).extent;
4283 .attr("x", extent[0][0])
4284 .attr("y", extent[0][1])
4285 .attr("width", extent[1][0] - extent[0][0])
4286 .attr("height", extent[1][1] - extent[0][1]);
4289 group.selectAll(".selection")
4290 .data([type("selection")])
4291 .enter().append("rect")
4292 .attr("class", "selection")
4293 .attr("cursor", cursors.selection)
4294 .attr("fill", "#777")
4295 .attr("fill-opacity", 0.3)
4296 .attr("stroke", "#fff")
4297 .attr("shape-rendering", "crispEdges");
4299 var handle = group.selectAll(".handle")
4300 .data(dim.handles, function(d) { return d.type; });
4302 handle.exit().remove();
4304 handle.enter().append("rect")
4305 .attr("class", function(d) { return "handle handle--" + d.type; })
4306 .attr("cursor", function(d) { return cursors[d.type]; });
4310 .attr("fill", "none")
4311 .attr("pointer-events", "all")
4312 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4313 .on("mousedown.brush touchstart.brush", started);
4316 brush.move = function(group, selection) {
4317 if (group.selection) {
4319 .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4320 .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4321 .tween("brush", function() {
4323 state = that.__brush,
4324 emit = emitter(that, arguments),
4325 selection0 = state.selection,
4326 selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
4327 i = d3_interpolate(selection0, selection1);
4330 state.selection = t === 1 && empty(selection1) ? null : i(t);
4335 return selection0 && selection1 ? tween : tween(1);
4342 state = that.__brush,
4343 selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
4344 emit = emitter(that, args).beforestart();
4347 state.selection = selection1 == null || empty(selection1) ? null : selection1;
4349 emit.start().brush().end();
4355 var group = d3_select(this),
4356 selection = local$$1(this).selection;
4359 group.selectAll(".selection")
4360 .style("display", null)
4361 .attr("x", selection[0][0])
4362 .attr("y", selection[0][1])
4363 .attr("width", selection[1][0] - selection[0][0])
4364 .attr("height", selection[1][1] - selection[0][1]);
4366 group.selectAll(".handle")
4367 .style("display", null)
4368 .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
4369 .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
4370 .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
4371 .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
4375 group.selectAll(".selection,.handle")
4376 .style("display", "none")
4379 .attr("width", null)
4380 .attr("height", null);
4384 function emitter(that, args) {
4385 return that.__brush.emitter || new Emitter(that, args);
4388 function Emitter(that, args) {
4391 this.state = that.__brush;
4395 Emitter.prototype = {
4396 beforestart: function() {
4397 if (++this.active === 1) this.state.emitter = this, this.starting = true;
4401 if (this.starting) this.starting = false, this.emit("start");
4409 if (--this.active === 0) delete this.state.emitter, this.emit("end");
4412 emit: function(type) {
4413 customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4417 function started() {
4418 if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4419 else if (touchending) return;
4420 if (!filter.apply(this, arguments)) return;
4423 type = event.target.__data__.type,
4424 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4425 signX = dim === Y ? null : signsX[type],
4426 signY = dim === X ? null : signsY[type],
4427 state = local$$1(that),
4428 extent = state.extent,
4429 selection = state.selection,
4430 W = extent[0][0], w0, w1,
4431 N = extent[0][1], n0, n1,
4432 E = extent[1][0], e0, e1,
4433 S = extent[1][1], s0, s1,
4437 shifting = signX && signY && event.shiftKey,
4440 point0 = d3_mouse(that),
4442 emit = emitter(that, arguments).beforestart();
4444 if (type === "overlay") {
4445 state.selection = selection = [
4446 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4447 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4450 w0 = selection[0][0];
4451 n0 = selection[0][1];
4452 e0 = selection[1][0];
4453 s0 = selection[1][1];
4461 var group = d3_select(that)
4462 .attr("pointer-events", "none");
4464 var overlay = group.selectAll(".overlay")
4465 .attr("cursor", cursors[type]);
4467 if (event.touches) {
4469 .on("touchmove.brush", moved, true)
4470 .on("touchend.brush touchcancel.brush", ended, true);
4472 var view = d3_select(event.view)
4473 .on("keydown.brush", keydowned, true)
4474 .on("keyup.brush", keyupped, true)
4475 .on("mousemove.brush", moved, true)
4476 .on("mouseup.brush", ended, true);
4478 dragDisable(event.view);
4487 var point1 = d3_mouse(that);
4488 if (shifting && !lockX && !lockY) {
4489 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
4501 dx = point[0] - point0[0];
4502 dy = point[1] - point0[1];
4507 if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4508 if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4512 if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4513 else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4514 if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4515 else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4519 if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4520 if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4527 t = w0, w0 = e0, e0 = t;
4528 t = w1, w1 = e1, e1 = t;
4529 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4534 t = n0, n0 = s0, s0 = t;
4535 t = n1, n1 = s1, s1 = t;
4536 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4539 if (state.selection) selection = state.selection; // May be set by brush.move!
4540 if (lockX) w1 = selection[0][0], e1 = selection[1][0];
4541 if (lockY) n1 = selection[0][1], s1 = selection[1][1];
4543 if (selection[0][0] !== w1
4544 || selection[0][1] !== n1
4545 || selection[1][0] !== e1
4546 || selection[1][1] !== s1) {
4547 state.selection = [[w1, n1], [e1, s1]];
4555 if (event.touches) {
4556 if (event.touches.length) return;
4557 if (touchending) clearTimeout(touchending);
4558 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4559 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4561 yesdrag(event.view, moving);
4562 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4564 group.attr("pointer-events", "all");
4565 overlay.attr("cursor", cursors.overlay);
4566 if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
4567 if (empty(selection)) state.selection = null, redraw.call(that);
4571 function keydowned() {
4572 switch (event.keyCode) {
4574 shifting = signX && signY;
4578 if (mode === MODE_HANDLE) {
4579 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4580 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4586 case 32: { // SPACE; takes priority over ALT
4587 if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4588 if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4589 if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4591 overlay.attr("cursor", cursors.selection);
4601 function keyupped() {
4602 switch (event.keyCode) {
4605 lockX = lockY = shifting = false;
4611 if (mode === MODE_CENTER) {
4612 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4613 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4620 if (mode === MODE_SPACE) {
4622 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4623 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4626 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4627 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4630 overlay.attr("cursor", cursors[type]);
4641 function initialize() {
4642 var state = this.__brush || {selection: null};
4643 state.extent = extent.apply(this, arguments);
4648 brush.extent = function(_) {
4649 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4652 brush.filter = function(_) {
4653 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4656 brush.handleSize = function(_) {
4657 return arguments.length ? (handleSize = +_, brush) : handleSize;
4660 brush.on = function() {
4661 var value = listeners.on.apply(listeners, arguments);
4662 return value === listeners ? brush : value;
4671 var halfPi$1 = pi$1 / 2;
4672 var tau$1 = pi$1 * 2;
4673 var max$1 = Math.max;
4675 function compareValue(compare) {
4676 return function(a, b) {
4678 a.source.value + a.target.value,
4679 b.source.value + b.target.value
4684 var chord = function() {
4687 sortSubgroups = null,
4690 function chord(matrix) {
4691 var n = matrix.length,
4693 groupIndex = d3_range(n),
4696 groups = chords.groups = new Array(n),
4697 subgroups = new Array(n * n),
4706 k = 0, i = -1; while (++i < n) {
4707 x = 0, j = -1; while (++j < n) {
4711 subgroupIndex.push(d3_range(n));
4716 if (sortGroups) groupIndex.sort(function(a, b) {
4717 return sortGroups(groupSums[a], groupSums[b]);
4721 if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4722 d.sort(function(a, b) {
4723 return sortSubgroups(matrix[i][a], matrix[i][b]);
4727 // Convert the sum to scaling factor for [0, 2pi].
4728 // TODO Allow start and end angle to be specified?
4729 // TODO Allow padding to be specified as percentage?
4730 k = max$1(0, tau$1 - padAngle * n) / k;
4731 dx = k ? padAngle : tau$1 / n;
4733 // Compute the start and end angle for each group and subgroup.
4734 // Note: Opera has a bug reordering object literal properties!
4735 x = 0, i = -1; while (++i < n) {
4736 x0 = x, j = -1; while (++j < n) {
4737 var di = groupIndex[i],
4738 dj = subgroupIndex[di][j],
4742 subgroups[dj * n + di] = {
4754 value: groupSums[di]
4759 // Generate chords for each (non-empty) subgroup-subgroup link.
4760 i = -1; while (++i < n) {
4761 j = i - 1; while (++j < n) {
4762 var source = subgroups[j * n + i],
4763 target = subgroups[i * n + j];
4764 if (source.value || target.value) {
4765 chords.push(source.value < target.value
4766 ? {source: target, target: source}
4767 : {source: source, target: target});
4772 return sortChords ? chords.sort(sortChords) : chords;
4775 chord.padAngle = function(_) {
4776 return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4779 chord.sortGroups = function(_) {
4780 return arguments.length ? (sortGroups = _, chord) : sortGroups;
4783 chord.sortSubgroups = function(_) {
4784 return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4787 chord.sortChords = function(_) {
4788 return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4794 var slice$2 = Array.prototype.slice;
4796 var constant$5 = function(x) {
4803 var tau$2 = 2 * pi$2;
4804 var epsilon$1 = 1e-6;
4805 var tauEpsilon = tau$2 - epsilon$1;
4808 this._x0 = this._y0 = // start of current subpath
4809 this._x1 = this._y1 = null; // end of current subpath
4817 Path.prototype = path.prototype = {
4819 moveTo: function(x, y) {
4820 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4822 closePath: function() {
4823 if (this._x1 !== null) {
4824 this._x1 = this._x0, this._y1 = this._y0;
4828 lineTo: function(x, y) {
4829 this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4831 quadraticCurveTo: function(x1, y1, x, y) {
4832 this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4834 bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4835 this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4837 arcTo: function(x1, y1, x2, y2, r) {
4838 x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4845 l01_2 = x01 * x01 + y01 * y01;
4847 // Is the radius negative? Error.
4848 if (r < 0) throw new Error("negative radius: " + r);
4850 // Is this path empty? Move to (x1,y1).
4851 if (this._x1 === null) {
4852 this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4855 // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4856 else if (!(l01_2 > epsilon$1)) {}
4858 // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4859 // Equivalently, is (x1,y1) coincident with (x2,y2)?
4860 // Or, is the radius zero? Line to (x1,y1).
4861 else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4862 this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4865 // Otherwise, draw an arc!
4869 l21_2 = x21 * x21 + y21 * y21,
4870 l20_2 = x20 * x20 + y20 * y20,
4871 l21 = Math.sqrt(l21_2),
4872 l01 = Math.sqrt(l01_2),
4873 l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4877 // If the start tangent is not coincident with (x0,y0), line to.
4878 if (Math.abs(t01 - 1) > epsilon$1) {
4879 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4882 this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4885 arc: function(x, y, r, a0, a1, ccw) {
4886 x = +x, y = +y, r = +r;
4887 var dx = r * Math.cos(a0),
4888 dy = r * Math.sin(a0),
4892 da = ccw ? a0 - a1 : a1 - a0;
4894 // Is the radius negative? Error.
4895 if (r < 0) throw new Error("negative radius: " + r);
4897 // Is this path empty? Move to (x0,y0).
4898 if (this._x1 === null) {
4899 this._ += "M" + x0 + "," + y0;
4902 // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4903 else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4904 this._ += "L" + x0 + "," + y0;
4907 // Is this arc empty? We’re done.
4910 // Does the angle go the wrong way? Flip the direction.
4911 if (da < 0) da = da % tau$2 + tau$2;
4913 // Is this a complete circle? Draw two arcs to complete the circle.
4914 if (da > tauEpsilon) {
4915 this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4918 // Is this arc non-empty? Draw an arc!
4919 else if (da > epsilon$1) {
4920 this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4923 rect: function(x, y, w, h) {
4924 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4926 toString: function() {
4931 function defaultSource(d) {
4935 function defaultTarget(d) {
4939 function defaultRadius(d) {
4943 function defaultStartAngle(d) {
4944 return d.startAngle;
4947 function defaultEndAngle(d) {
4951 var ribbon = function() {
4952 var source = defaultSource,
4953 target = defaultTarget,
4954 radius = defaultRadius,
4955 startAngle = defaultStartAngle,
4956 endAngle = defaultEndAngle,
4961 argv = slice$2.call(arguments),
4962 s = source.apply(this, argv),
4963 t = target.apply(this, argv),
4964 sr = +radius.apply(this, (argv[0] = s, argv)),
4965 sa0 = startAngle.apply(this, argv) - halfPi$1,
4966 sa1 = endAngle.apply(this, argv) - halfPi$1,
4967 sx0 = sr * cos(sa0),
4968 sy0 = sr * sin(sa0),
4969 tr = +radius.apply(this, (argv[0] = t, argv)),
4970 ta0 = startAngle.apply(this, argv) - halfPi$1,
4971 ta1 = endAngle.apply(this, argv) - halfPi$1;
4973 if (!context) context = buffer = path();
4975 context.moveTo(sx0, sy0);
4976 context.arc(0, 0, sr, sa0, sa1);
4977 if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4978 context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4979 context.arc(0, 0, tr, ta0, ta1);
4981 context.quadraticCurveTo(0, 0, sx0, sy0);
4982 context.closePath();
4984 if (buffer) return context = null, buffer + "" || null;
4987 ribbon.radius = function(_) {
4988 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
4991 ribbon.startAngle = function(_) {
4992 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
4995 ribbon.endAngle = function(_) {
4996 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
4999 ribbon.source = function(_) {
5000 return arguments.length ? (source = _, ribbon) : source;
5003 ribbon.target = function(_) {
5004 return arguments.length ? (target = _, ribbon) : target;
5007 ribbon.context = function(_) {
5008 return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5018 Map.prototype = map$1.prototype = {
5020 has: function(key) {
5021 return (prefix + key) in this;
5023 get: function(key) {
5024 return this[prefix + key];
5026 set: function(key, value) {
5027 this[prefix + key] = value;
5030 remove: function(key) {
5031 var property = prefix + key;
5032 return property in this && delete this[property];
5035 for (var property in this) if (property[0] === prefix) delete this[property];
5039 for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5042 values: function() {
5044 for (var property in this) if (property[0] === prefix) values.push(this[property]);
5047 entries: function() {
5049 for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5054 for (var property in this) if (property[0] === prefix) ++size;
5058 for (var property in this) if (property[0] === prefix) return false;
5062 for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5066 function map$1(object, f) {
5069 // Copy constructor.
5070 if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5072 // Index array by numeric index or specified key function.
5073 else if (Array.isArray(object)) {
5078 if (f == null) while (++i < n) map.set(i, object[i]);
5079 else while (++i < n) map.set(f(o = object[i], i, object), o);
5082 // Convert object to map.
5083 else if (object) for (var key in object) map.set(key, object[key]);
5088 var nest = function() {
5095 function apply(array, depth, createResult, setResult) {
5096 if (depth >= keys.length) {
5097 if (sortValues != null) array.sort(sortValues);
5098 return rollup != null ? rollup(array) : array;
5103 key = keys[depth++],
5106 valuesByKey = map$1(),
5108 result = createResult();
5111 if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5114 valuesByKey.set(keyValue, [value]);
5118 valuesByKey.each(function(values, key) {
5119 setResult(result, key, apply(values, depth, createResult, setResult));
5125 function entries(map, depth) {
5126 if (++depth > keys.length) return map;
5127 var array, sortKey = sortKeys[depth - 1];
5128 if (rollup != null && depth >= keys.length) array = map.entries();
5129 else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5130 return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5134 object: function(array) { return apply(array, 0, createObject, setObject); },
5135 map: function(array) { return apply(array, 0, createMap, setMap); },
5136 entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5137 key: function(d) { keys.push(d); return nest; },
5138 sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5139 sortValues: function(order) { sortValues = order; return nest; },
5140 rollup: function(f) { rollup = f; return nest; }
5144 function createObject() {
5148 function setObject(object, key, value) {
5149 object[key] = value;
5152 function createMap() {
5156 function setMap(map, key, value) {
5157 map.set(key, value);
5162 var proto = map$1.prototype;
5164 Set.prototype = set$2.prototype = {
5167 add: function(value) {
5169 this[prefix + value] = value;
5172 remove: proto.remove,
5180 function set$2(object, f) {
5183 // Copy constructor.
5184 if (object instanceof Set) object.each(function(value) { set.add(value); });
5186 // Otherwise, assume it’s an array.
5188 var i = -1, n = object.length;
5189 if (f == null) while (++i < n) set.add(object[i]);
5190 else while (++i < n) set.add(f(object[i], i, object));
5196 var keys = function(map) {
5198 for (var key in map) keys.push(key);
5202 var values = function(map) {
5204 for (var key in map) values.push(map[key]);
5208 var entries = function(map) {
5210 for (var key in map) entries.push({key: key, value: map[key]});
5220 function objectConverter(columns) {
5221 return new Function("d", "return {" + columns.map(function(name, i) {
5222 return JSON.stringify(name) + ": d[" + i + "]";
5223 }).join(",") + "}");
5226 function customConverter(columns, f) {
5227 var object = objectConverter(columns);
5228 return function(row, i) {
5229 return f(object(row), i, columns);
5233 // Compute unique columns in order of discovery.
5234 function inferColumns(rows) {
5235 var columnSet = Object.create(null),
5238 rows.forEach(function(row) {
5239 for (var column in row) {
5240 if (!(column in columnSet)) {
5241 columns.push(columnSet[column] = column);
5249 var dsv = function(delimiter) {
5250 var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5251 DELIMITER = delimiter.charCodeAt(0);
5253 function parse(text, f) {
5254 var convert, columns, rows = parseRows(text, function(row, i) {
5255 if (convert) return convert(row, i - 1);
5256 columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5258 rows.columns = columns;
5262 function parseRows(text, f) {
5263 var rows = [], // output rows
5265 I = 0, // current character index
5266 n = 0, // current line number
5268 eof = N <= 0, // current token followed by EOF?
5269 eol = false; // current token followed by EOL?
5271 // Strip the trailing newline.
5272 if (text.charCodeAt(N - 1) === NEWLINE) --N;
5273 if (text.charCodeAt(N - 1) === RETURN) --N;
5276 if (eof) return EOF;
5277 if (eol) return eol = false, EOL;
5281 if (text.charCodeAt(j) === QUOTE) {
5282 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5283 if ((i = I) >= N) eof = true;
5284 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5285 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5286 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5289 // Find next delimiter or newline.
5291 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5292 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5293 else if (c !== DELIMITER) continue;
5294 return text.slice(j, i);
5297 // Return last token before EOF.
5298 return eof = true, text.slice(j, N);
5301 while ((t = token()) !== EOF) {
5303 while (t !== EOL && t !== EOF) row.push(t), t = token();
5304 if (f && (row = f(row, n++)) == null) continue;
5311 function format(rows, columns) {
5312 if (columns == null) columns = inferColumns(rows);
5313 return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5314 return columns.map(function(column) {
5315 return formatValue(row[column]);
5320 function formatRows(rows) {
5321 return rows.map(formatRow).join("\n");
5324 function formatRow(row) {
5325 return row.map(formatValue).join(delimiter);
5328 function formatValue(text) {
5329 return text == null ? ""
5330 : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5336 parseRows: parseRows,
5338 formatRows: formatRows
5344 var csvParse = csv.parse;
5345 var csvParseRows = csv.parseRows;
5346 var csvFormat = csv.format;
5347 var csvFormatRows = csv.formatRows;
5349 var tsv = dsv("\t");
5351 var tsvParse = tsv.parse;
5352 var tsvParseRows = tsv.parseRows;
5353 var tsvFormat = tsv.format;
5354 var tsvFormatRows = tsv.formatRows;
5356 var center$1 = function(x, y) {
5359 if (x == null) x = 0;
5360 if (y == null) y = 0;
5369 for (i = 0; i < n; ++i) {
5370 node = nodes[i], sx += node.x, sy += node.y;
5373 for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5374 node = nodes[i], node.x -= sx, node.y -= sy;
5378 force.initialize = function(_) {
5382 force.x = function(_) {
5383 return arguments.length ? (x = +_, force) : x;
5386 force.y = function(_) {
5387 return arguments.length ? (y = +_, force) : y;
5393 var constant$6 = function(x) {
5399 var jiggle = function() {
5400 return (Math.random() - 0.5) * 1e-6;
5403 var tree_add = function(d) {
5404 var x = +this._x.call(null, d),
5405 y = +this._y.call(null, d);
5406 return add(this.cover(x, y), x, y, d);
5409 function add(tree, x, y, d) {
5410 if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428 // If the tree is empty, initialize the root as a leaf.
5429 if (!node) return tree._root = leaf, tree;
5431 // Find the existing leaf for the new point, or add it.
5432 while (node.length) {
5433 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5434 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5435 if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5438 // Is the new point is exactly coincident with the existing point?
5439 xp = +tree._x.call(null, node.data);
5440 yp = +tree._y.call(null, node.data);
5441 if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5443 // Otherwise, split the leaf node until the old and new point are separated.
5445 parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5446 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5447 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5448 } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5449 return parent[j] = node, parent[i] = leaf, tree;
5452 function addAll(data) {
5453 var d, i, n = data.length,
5463 // Compute the points and their extent.
5464 for (i = 0; i < n; ++i) {
5465 if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5474 // If there were no (valid) points, inherit the existing extent.
5475 if (x1 < x0) x0 = this._x0, x1 = this._x1;
5476 if (y1 < y0) y0 = this._y0, y1 = this._y1;
5478 // Expand the tree to cover the new points.
5479 this.cover(x0, y0).cover(x1, y1);
5481 // Add the new points.
5482 for (i = 0; i < n; ++i) {
5483 add(this, xz[i], yz[i], data[i]);
5489 var tree_cover = function(x, y) {
5490 if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5497 // If the quadtree has no extent, initialize them.
5498 // Integer extent are necessary so that if we later double the extent,
5499 // the existing quadrant boundaries don’t change due to floating point error!
5501 x1 = (x0 = Math.floor(x)) + 1;
5502 y1 = (y0 = Math.floor(y)) + 1;
5505 // Otherwise, double repeatedly to cover.
5506 else if (x0 > x || x > x1 || y0 > y || y > y1) {
5512 switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5514 do parent = new Array(4), parent[i] = node, node = parent;
5515 while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5519 do parent = new Array(4), parent[i] = node, node = parent;
5520 while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5524 do parent = new Array(4), parent[i] = node, node = parent;
5525 while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5529 do parent = new Array(4), parent[i] = node, node = parent;
5530 while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5535 if (this._root && this._root.length) this._root = node;
5538 // If the quadtree covers the point already, just return.
5548 var tree_data = function() {
5550 this.visit(function(node) {
5551 if (!node.length) do data.push(node.data); while (node = node.next)
5556 var tree_extent = function(_) {
5557 return arguments.length
5558 ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5559 : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5562 var Quad = function(node, x0, y0, x1, y1) {
5570 var tree_find = function(x, y, radius) {
5585 if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5586 if (radius == null) radius = Infinity;
5588 x0 = x - radius, y0 = y - radius;
5589 x3 = x + radius, y3 = y + radius;
5593 while (q = quads.pop()) {
5595 // Stop searching if this quadrant can’t contain a closer node.
5596 if (!(node = q.node)
5600 || (y2 = q.y1) < y0) continue;
5602 // Bisect the current quadrant.
5604 var xm = (x1 + x2) / 2,
5608 new Quad(node[3], xm, ym, x2, y2),
5609 new Quad(node[2], x1, ym, xm, y2),
5610 new Quad(node[1], xm, y1, x2, ym),
5611 new Quad(node[0], x1, y1, xm, ym)
5614 // Visit the closest quadrant first.
5615 if (i = (y >= ym) << 1 | (x >= xm)) {
5616 q = quads[quads.length - 1];
5617 quads[quads.length - 1] = quads[quads.length - 1 - i];
5618 quads[quads.length - 1 - i] = q;
5622 // Visit this point. (Visiting coincident points isn’t necessary!)
5624 var dx = x - +this._x.call(null, node.data),
5625 dy = y - +this._y.call(null, node.data),
5626 d2 = dx * dx + dy * dy;
5628 var d = Math.sqrt(radius = d2);
5629 x0 = x - d, y0 = y - d;
5630 x3 = x + d, y3 = y + d;
5639 var tree_remove = function(d) {
5640 if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5660 // If the tree is empty, initialize the root as a leaf.
5661 if (!node) return this;
5663 // Find the leaf node for the point.
5664 // While descending, also retain the deepest parent with a non-removed sibling.
5665 if (node.length) while (true) {
5666 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5667 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5668 if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5669 if (!node.length) break;
5670 if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5673 // Find the point to remove.
5674 while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5675 if (next = node.next) delete node.next;
5677 // If there are multiple coincident points, remove just the point.
5678 if (previous) return (next ? previous.next = next : delete previous.next), this;
5680 // If this is the root point, remove it.
5681 if (!parent) return this._root = next, this;
5683 // Remove this leaf.
5684 next ? parent[i] = next : delete parent[i];
5686 // If the parent now contains exactly one leaf, collapse superfluous parents.
5687 if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5688 && node === (parent[3] || parent[2] || parent[1] || parent[0])
5690 if (retainer) retainer[j] = node;
5691 else this._root = node;
5697 function removeAll(data) {
5698 for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5702 var tree_root = function() {
5706 var tree_size = function() {
5708 this.visit(function(node) {
5709 if (!node.length) do ++size; while (node = node.next)
5714 var tree_visit = function(callback) {
5715 var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5716 if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5717 while (q = quads.pop()) {
5718 if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5719 var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5720 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5721 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5722 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5723 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5729 var tree_visitAfter = function(callback) {
5730 var quads = [], next = [], q;
5731 if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5732 while (q = quads.pop()) {
5735 var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5736 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5737 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5738 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5743 while (q = next.pop()) {
5744 callback(q.node, q.x0, q.y0, q.x1, q.y1);
5749 function defaultX(d) {
5753 var tree_x = function(_) {
5754 return arguments.length ? (this._x = _, this) : this._x;
5757 function defaultY(d) {
5761 var tree_y = function(_) {
5762 return arguments.length ? (this._y = _, this) : this._y;
5765 function quadtree(nodes, x, y) {
5766 var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5767 return nodes == null ? tree : tree.addAll(nodes);
5770 function Quadtree(x, y, x0, y0, x1, y1) {
5777 this._root = undefined;
5780 function leaf_copy(leaf) {
5781 var copy = {data: leaf.data}, next = copy;
5782 while (leaf = leaf.next) next = next.next = {data: leaf.data};
5786 var treeProto = quadtree.prototype = Quadtree.prototype;
5788 treeProto.copy = function() {
5789 var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5794 if (!node) return copy;
5796 if (!node.length) return copy._root = leaf_copy(node), copy;
5798 nodes = [{source: node, target: copy._root = new Array(4)}];
5799 while (node = nodes.pop()) {
5800 for (var i = 0; i < 4; ++i) {
5801 if (child = node.source[i]) {
5802 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5803 else node.target[i] = leaf_copy(child);
5811 treeProto.add = tree_add;
5812 treeProto.addAll = addAll;
5813 treeProto.cover = tree_cover;
5814 treeProto.data = tree_data;
5815 treeProto.extent = tree_extent;
5816 treeProto.find = tree_find;
5817 treeProto.remove = tree_remove;
5818 treeProto.removeAll = removeAll;
5819 treeProto.root = tree_root;
5820 treeProto.size = tree_size;
5821 treeProto.visit = tree_visit;
5822 treeProto.visitAfter = tree_visitAfter;
5823 treeProto.x = tree_x;
5824 treeProto.y = tree_y;
5834 var collide = function(radius) {
5840 if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5843 var i, n = nodes.length,
5851 for (var k = 0; k < iterations; ++k) {
5852 tree = quadtree(nodes, x, y).visitAfter(prepare);
5853 for (i = 0; i < n; ++i) {
5855 ri = radii[node.index], ri2 = ri * ri;
5856 xi = node.x + node.vx;
5857 yi = node.y + node.vy;
5862 function apply(quad, x0, y0, x1, y1) {
5863 var data = quad.data, rj = quad.r, r = ri + rj;
5865 if (data.index > node.index) {
5866 var x = xi - data.x - data.vx,
5867 y = yi - data.y - data.vy,
5870 if (x === 0) x = jiggle(), l += x * x;
5871 if (y === 0) y = jiggle(), l += y * y;
5872 l = (r - (l = Math.sqrt(l))) / l * strength;
5873 node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5874 node.vy += (y *= l) * r;
5875 data.vx -= x * (r = 1 - r);
5881 return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5885 function prepare(quad) {
5886 if (quad.data) return quad.r = radii[quad.data.index];
5887 for (var i = quad.r = 0; i < 4; ++i) {
5888 if (quad[i] && quad[i].r > quad.r) {
5894 function initialize() {
5896 var i, n = nodes.length, node;
5897 radii = new Array(n);
5898 for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5901 force.initialize = function(_) {
5906 force.iterations = function(_) {
5907 return arguments.length ? (iterations = +_, force) : iterations;
5910 force.strength = function(_) {
5911 return arguments.length ? (strength = +_, force) : strength;
5914 force.radius = function(_) {
5915 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5921 function index$1(d) {
5925 function find(nodeById, nodeId) {
5926 var node = nodeById.get(nodeId);
5927 if (!node) throw new Error("missing: " + nodeId);
5931 var link = function(links) {
5933 strength = defaultStrength,
5935 distance = constant$6(30),
5942 if (links == null) links = [];
5944 function defaultStrength(link) {
5945 return 1 / Math.min(count[link.source.index], count[link.target.index]);
5948 function force(alpha) {
5949 for (var k = 0, n = links.length; k < iterations; ++k) {
5950 for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5951 link = links[i], source = link.source, target = link.target;
5952 x = target.x + target.vx - source.x - source.vx || jiggle();
5953 y = target.y + target.vy - source.y - source.vy || jiggle();
5954 l = Math.sqrt(x * x + y * y);
5955 l = (l - distances[i]) / l * alpha * strengths[i];
5957 target.vx -= x * (b = bias[i]);
5959 source.vx += x * (b = 1 - b);
5965 function initialize() {
5971 nodeById = map$1(nodes, id),
5974 for (i = 0, count = new Array(n); i < m; ++i) {
5975 link = links[i], link.index = i;
5976 if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5977 if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5978 count[link.source.index] = (count[link.source.index] || 0) + 1;
5979 count[link.target.index] = (count[link.target.index] || 0) + 1;
5982 for (i = 0, bias = new Array(m); i < m; ++i) {
5983 link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
5986 strengths = new Array(m), initializeStrength();
5987 distances = new Array(m), initializeDistance();
5990 function initializeStrength() {
5993 for (var i = 0, n = links.length; i < n; ++i) {
5994 strengths[i] = +strength(links[i], i, links);
5998 function initializeDistance() {
6001 for (var i = 0, n = links.length; i < n; ++i) {
6002 distances[i] = +distance(links[i], i, links);
6006 force.initialize = function(_) {
6011 force.links = function(_) {
6012 return arguments.length ? (links = _, initialize(), force) : links;
6015 force.id = function(_) {
6016 return arguments.length ? (id = _, force) : id;
6019 force.iterations = function(_) {
6020 return arguments.length ? (iterations = +_, force) : iterations;
6023 force.strength = function(_) {
6024 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6027 force.distance = function(_) {
6028 return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6042 var initialRadius = 10;
6043 var initialAngle = Math.PI * (3 - Math.sqrt(5));
6045 var simulation = function(nodes) {
6049 alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6051 velocityDecay = 0.6,
6053 stepper = timer(step),
6054 event = dispatch("tick", "end");
6056 if (nodes == null) nodes = [];
6060 event.call("tick", simulation);
6061 if (alpha < alphaMin) {
6063 event.call("end", simulation);
6068 var i, n = nodes.length, node;
6070 alpha += (alphaTarget - alpha) * alphaDecay;
6072 forces.each(function(force) {
6076 for (i = 0; i < n; ++i) {
6078 if (node.fx == null) node.x += node.vx *= velocityDecay;
6079 else node.x = node.fx, node.vx = 0;
6080 if (node.fy == null) node.y += node.vy *= velocityDecay;
6081 else node.y = node.fy, node.vy = 0;
6085 function initializeNodes() {
6086 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6087 node = nodes[i], node.index = i;
6088 if (isNaN(node.x) || isNaN(node.y)) {
6089 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6090 node.x = radius * Math.cos(angle);
6091 node.y = radius * Math.sin(angle);
6093 if (isNaN(node.vx) || isNaN(node.vy)) {
6094 node.vx = node.vy = 0;
6099 function initializeForce(force) {
6100 if (force.initialize) force.initialize(nodes);
6106 return simulation = {
6109 restart: function() {
6110 return stepper.restart(step), simulation;
6114 return stepper.stop(), simulation;
6117 nodes: function(_) {
6118 return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6121 alpha: function(_) {
6122 return arguments.length ? (alpha = +_, simulation) : alpha;
6125 alphaMin: function(_) {
6126 return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6129 alphaDecay: function(_) {
6130 return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6133 alphaTarget: function(_) {
6134 return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6137 velocityDecay: function(_) {
6138 return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6141 force: function(name, _) {
6142 return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6145 find: function(x, y, radius) {
6154 if (radius == null) radius = Infinity;
6155 else radius *= radius;
6157 for (i = 0; i < n; ++i) {
6161 d2 = dx * dx + dy * dy;
6162 if (d2 < radius) closest = node, radius = d2;
6168 on: function(name, _) {
6169 return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6174 var manyBody = function() {
6178 strength = constant$6(-30),
6181 distanceMax2 = Infinity,
6185 var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6186 for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6189 function initialize() {
6191 var i, n = nodes.length, node;
6192 strengths = new Array(n);
6193 for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6196 function accumulate(quad) {
6197 var strength = 0, q, c, weight = 0, x, y, i;
6199 // For internal nodes, accumulate forces from child quadrants.
6201 for (x = y = i = 0; i < 4; ++i) {
6202 if ((q = quad[i]) && (c = Math.abs(q.value))) {
6203 strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6206 quad.x = x / weight;
6207 quad.y = y / weight;
6210 // For leaf nodes, accumulate forces from coincident quadrants.
6215 do strength += strengths[q.data.index];
6219 quad.value = strength;
6222 function apply(quad, x1, _, x2) {
6223 if (!quad.value) return true;
6225 var x = quad.x - node.x,
6226 y = quad.y - node.y,
6230 // Apply the Barnes-Hut approximation if possible.
6231 // Limit forces for very close nodes; randomize direction if coincident.
6232 if (w * w / theta2 < l) {
6233 if (l < distanceMax2) {
6234 if (x === 0) x = jiggle(), l += x * x;
6235 if (y === 0) y = jiggle(), l += y * y;
6236 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6237 node.vx += x * quad.value * alpha / l;
6238 node.vy += y * quad.value * alpha / l;
6243 // Otherwise, process points directly.
6244 else if (quad.length || l >= distanceMax2) return;
6246 // Limit forces for very close nodes; randomize direction if coincident.
6247 if (quad.data !== node || quad.next) {
6248 if (x === 0) x = jiggle(), l += x * x;
6249 if (y === 0) y = jiggle(), l += y * y;
6250 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6253 do if (quad.data !== node) {
6254 w = strengths[quad.data.index] * alpha / l;
6257 } while (quad = quad.next);
6260 force.initialize = function(_) {
6265 force.strength = function(_) {
6266 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6269 force.distanceMin = function(_) {
6270 return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6273 force.distanceMax = function(_) {
6274 return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6277 force.theta = function(_) {
6278 return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6284 var radial = function(radius, x, y) {
6286 strength = constant$6(0.1),
6290 if (typeof radius !== "function") radius = constant$6(+radius);
6291 if (x == null) x = 0;
6292 if (y == null) y = 0;
6294 function force(alpha) {
6295 for (var i = 0, n = nodes.length; i < n; ++i) {
6296 var node = nodes[i],
6297 dx = node.x - x || 1e-6,
6298 dy = node.y - y || 1e-6,
6299 r = Math.sqrt(dx * dx + dy * dy),
6300 k = (radiuses[i] - r) * strengths[i] * alpha / r;
6306 function initialize() {
6308 var i, n = nodes.length;
6309 strengths = new Array(n);
6310 radiuses = new Array(n);
6311 for (i = 0; i < n; ++i) {
6312 radiuses[i] = +radius(nodes[i], i, nodes);
6313 strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6317 force.initialize = function(_) {
6318 nodes = _, initialize();
6321 force.strength = function(_) {
6322 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6325 force.radius = function(_) {
6326 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6329 force.x = function(_) {
6330 return arguments.length ? (x = +_, force) : x;
6333 force.y = function(_) {
6334 return arguments.length ? (y = +_, force) : y;
6340 var x$2 = function(x) {
6341 var strength = constant$6(0.1),
6346 if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6348 function force(alpha) {
6349 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6350 node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6354 function initialize() {
6356 var i, n = nodes.length;
6357 strengths = new Array(n);
6359 for (i = 0; i < n; ++i) {
6360 strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6364 force.initialize = function(_) {
6369 force.strength = function(_) {
6370 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6373 force.x = function(_) {
6374 return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6380 var y$2 = function(y) {
6381 var strength = constant$6(0.1),
6386 if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6388 function force(alpha) {
6389 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6390 node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6394 function initialize() {
6396 var i, n = nodes.length;
6397 strengths = new Array(n);
6399 for (i = 0; i < n; ++i) {
6400 strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6404 force.initialize = function(_) {
6409 force.strength = function(_) {
6410 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6413 force.y = function(_) {
6414 return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6420 // Computes the decimal coefficient and exponent of the specified number x with
6421 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6422 // For example, formatDecimal(1.23) returns ["123", 0].
6423 var formatDecimal = function(x, p) {
6424 if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6425 var i, coefficient = x.slice(0, i);
6427 // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6428 // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6430 coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6435 var exponent$1 = function(x) {
6436 return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6439 var formatGroup = function(grouping, thousands) {
6440 return function(value, width) {
6441 var i = value.length,
6447 while (i > 0 && g > 0) {
6448 if (length + g + 1 > width) g = Math.max(1, width - length);
6449 t.push(value.substring(i -= g, i + g));
6450 if ((length += g + 1) > width) break;
6451 g = grouping[j = (j + 1) % grouping.length];
6454 return t.reverse().join(thousands);
6458 var formatNumerals = function(numerals) {
6459 return function(value) {
6460 return value.replace(/[0-9]/g, function(i) {
6461 return numerals[+i];
6466 var formatDefault = function(x, p) {
6467 x = x.toPrecision(p);
6469 out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6471 case ".": i0 = i1 = i; break;
6472 case "0": if (i0 === 0) i0 = i; i1 = i; break;
6473 case "e": break out;
6474 default: if (i0 > 0) i0 = 0; break;
6478 return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6483 var formatPrefixAuto = function(x, p) {
6484 var d = formatDecimal(x, p);
6485 if (!d) return x + "";
6486 var coefficient = d[0],
6488 i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6489 n = coefficient.length;
6490 return i === n ? coefficient
6491 : i > n ? coefficient + new Array(i - n + 1).join("0")
6492 : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6493 : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6496 var formatRounded = function(x, p) {
6497 var d = formatDecimal(x, p);
6498 if (!d) return x + "";
6499 var coefficient = d[0],
6501 return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6502 : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6503 : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6508 "%": function(x, p) { return (x * 100).toFixed(p); },
6509 "b": function(x) { return Math.round(x).toString(2); },
6510 "c": function(x) { return x + ""; },
6511 "d": function(x) { return Math.round(x).toString(10); },
6512 "e": function(x, p) { return x.toExponential(p); },
6513 "f": function(x, p) { return x.toFixed(p); },
6514 "g": function(x, p) { return x.toPrecision(p); },
6515 "o": function(x) { return Math.round(x).toString(8); },
6516 "p": function(x, p) { return formatRounded(x * 100, p); },
6518 "s": formatPrefixAuto,
6519 "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6520 "x": function(x) { return Math.round(x).toString(16); }
6523 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6524 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6526 function formatSpecifier(specifier) {
6527 return new FormatSpecifier(specifier);
6530 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6532 function FormatSpecifier(specifier) {
6533 if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6536 fill = match[1] || " ",
6537 align = match[2] || ">",
6538 sign = match[3] || "-",
6539 symbol = match[4] || "",
6541 width = match[6] && +match[6],
6543 precision = match[8] && +match[8].slice(1),
6544 type = match[9] || "";
6546 // The "n" type is an alias for ",g".
6547 if (type === "n") comma = true, type = "g";
6549 // Map invalid types to the default format.
6550 else if (!formatTypes[type]) type = "";
6552 // If zero fill is specified, padding goes after sign and before digits.
6553 if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6558 this.symbol = symbol;
6562 this.precision = precision;
6566 FormatSpecifier.prototype.toString = function() {
6571 + (this.zero ? "0" : "")
6572 + (this.width == null ? "" : Math.max(1, this.width | 0))
6573 + (this.comma ? "," : "")
6574 + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6578 var identity$3 = function(x) {
6582 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6584 var formatLocale = function(locale) {
6585 var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6586 currency = locale.currency,
6587 decimal = locale.decimal,
6588 numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6589 percent = locale.percent || "%";
6591 function newFormat(specifier) {
6592 specifier = formatSpecifier(specifier);
6594 var fill = specifier.fill,
6595 align = specifier.align,
6596 sign = specifier.sign,
6597 symbol = specifier.symbol,
6598 zero = specifier.zero,
6599 width = specifier.width,
6600 comma = specifier.comma,
6601 precision = specifier.precision,
6602 type = specifier.type;
6604 // Compute the prefix and suffix.
6605 // For SI-prefix, the suffix is lazily computed.
6606 var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6607 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6609 // What format function should we use?
6610 // Is this an integer type?
6611 // Can this type generate exponential notation?
6612 var formatType = formatTypes[type],
6613 maybeSuffix = !type || /[defgprs%]/.test(type);
6615 // Set the default precision if not specified,
6616 // or clamp the specified precision to the supported range.
6617 // For significant precision, it must be in [1, 21].
6618 // For fixed precision, it must be in [0, 20].
6619 precision = precision == null ? (type ? 6 : 12)
6620 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6621 : Math.max(0, Math.min(20, precision));
6623 function format(value) {
6624 var valuePrefix = prefix,
6625 valueSuffix = suffix,
6629 valueSuffix = formatType(value) + valueSuffix;
6634 // Perform the initial formatting.
6635 var valueNegative = value < 0;
6636 value = formatType(Math.abs(value), precision);
6638 // If a negative value rounds to zero during formatting, treat as positive.
6639 if (valueNegative && +value === 0) valueNegative = false;
6641 // Compute the prefix and suffix.
6642 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6643 valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
6645 // Break the formatted value into the integer “value” part that can be
6646 // grouped, and fractional or exponential “suffix” part that is not.
6648 i = -1, n = value.length;
6650 if (c = value.charCodeAt(i), 48 > c || c > 57) {
6651 valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6652 value = value.slice(0, i);
6659 // If the fill character is not "0", grouping is applied before padding.
6660 if (comma && !zero) value = group(value, Infinity);
6662 // Compute the padding.
6663 var length = valuePrefix.length + value.length + valueSuffix.length,
6664 padding = length < width ? new Array(width - length + 1).join(fill) : "";
6666 // If the fill character is "0", grouping is applied after padding.
6667 if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6669 // Reconstruct the final output based on the desired alignment.
6671 case "<": value = valuePrefix + value + valueSuffix + padding; break;
6672 case "=": value = valuePrefix + padding + value + valueSuffix; break;
6673 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6674 default: value = padding + valuePrefix + value + valueSuffix; break;
6677 return numerals(value);
6680 format.toString = function() {
6681 return specifier + "";
6687 function formatPrefix(specifier, value) {
6688 var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6689 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6690 k = Math.pow(10, -e),
6691 prefix = prefixes[8 + e / 3];
6692 return function(value) {
6693 return f(k * value) + prefix;
6699 formatPrefix: formatPrefix
6714 function defaultLocale(definition) {
6715 locale$1 = formatLocale(definition);
6716 format = locale$1.format;
6717 formatPrefix = locale$1.formatPrefix;
6721 var precisionFixed = function(step) {
6722 return Math.max(0, -exponent$1(Math.abs(step)));
6725 var precisionPrefix = function(step, value) {
6726 return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6729 var precisionRound = function(step, max) {
6730 step = Math.abs(step), max = Math.abs(max) - step;
6731 return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6734 // Adds floating point numbers with twice the normal precision.
6735 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6736 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6738 // Code adapted from GeographicLib by Charles F. F. Karney,
6739 // http://geographiclib.sourceforge.net/
6741 var adder = function() {
6752 this.s = // rounded value
6753 this.t = 0; // exact error
6756 add$1(temp, y, this.t);
6757 add$1(this, temp.s, this.s);
6758 if (this.s) this.t += temp.t;
6759 else this.s = temp.t;
6761 valueOf: function() {
6766 var temp = new Adder;
6768 function add$1(adder, a, b) {
6769 var x = adder.s = a + b,
6772 adder.t = (a - av) + (b - bv);
6775 var epsilon$2 = 1e-6;
6776 var epsilon2$1 = 1e-12;
6778 var halfPi$2 = pi$3 / 2;
6779 var quarterPi = pi$3 / 4;
6780 var tau$3 = pi$3 * 2;
6782 var degrees$1 = 180 / pi$3;
6783 var radians = pi$3 / 180;
6786 var atan = Math.atan;
6787 var atan2 = Math.atan2;
6788 var cos$1 = Math.cos;
6789 var ceil = Math.ceil;
6794 var sin$1 = Math.sin;
6795 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6796 var sqrt = Math.sqrt;
6800 return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6804 return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6807 function haversin(x) {
6808 return (x = sin$1(x / 2)) * x;
6811 function noop$1() {}
6813 function streamGeometry(geometry, stream) {
6814 if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6815 streamGeometryType[geometry.type](geometry, stream);
6819 var streamObjectType = {
6820 Feature: function(object, stream) {
6821 streamGeometry(object.geometry, stream);
6823 FeatureCollection: function(object, stream) {
6824 var features = object.features, i = -1, n = features.length;
6825 while (++i < n) streamGeometry(features[i].geometry, stream);
6829 var streamGeometryType = {
6830 Sphere: function(object, stream) {
6833 Point: function(object, stream) {
6834 object = object.coordinates;
6835 stream.point(object[0], object[1], object[2]);
6837 MultiPoint: function(object, stream) {
6838 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6839 while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6841 LineString: function(object, stream) {
6842 streamLine(object.coordinates, stream, 0);
6844 MultiLineString: function(object, stream) {
6845 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6846 while (++i < n) streamLine(coordinates[i], stream, 0);
6848 Polygon: function(object, stream) {
6849 streamPolygon(object.coordinates, stream);
6851 MultiPolygon: function(object, stream) {
6852 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6853 while (++i < n) streamPolygon(coordinates[i], stream);
6855 GeometryCollection: function(object, stream) {
6856 var geometries = object.geometries, i = -1, n = geometries.length;
6857 while (++i < n) streamGeometry(geometries[i], stream);
6861 function streamLine(coordinates, stream, closed) {
6862 var i = -1, n = coordinates.length - closed, coordinate;
6864 while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6868 function streamPolygon(coordinates, stream) {
6869 var i = -1, n = coordinates.length;
6870 stream.polygonStart();
6871 while (++i < n) streamLine(coordinates[i], stream, 1);
6872 stream.polygonEnd();
6875 var d3_geoStream = function(object, stream) {
6876 if (object && streamObjectType.hasOwnProperty(object.type)) {
6877 streamObjectType[object.type](object, stream);
6879 streamGeometry(object, stream);
6883 var areaRingSum = adder();
6885 var areaSum = adder();
6896 polygonStart: function() {
6897 areaRingSum.reset();
6898 areaStream.lineStart = areaRingStart;
6899 areaStream.lineEnd = areaRingEnd;
6901 polygonEnd: function() {
6902 var areaRing = +areaRingSum;
6903 areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6904 this.lineStart = this.lineEnd = this.point = noop$1;
6906 sphere: function() {
6911 function areaRingStart() {
6912 areaStream.point = areaPointFirst;
6915 function areaRingEnd() {
6916 areaPoint(lambda00, phi00);
6919 function areaPointFirst(lambda, phi) {
6920 areaStream.point = areaPoint;
6921 lambda00 = lambda, phi00 = phi;
6922 lambda *= radians, phi *= radians;
6923 lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6926 function areaPoint(lambda, phi) {
6927 lambda *= radians, phi *= radians;
6928 phi = phi / 2 + quarterPi; // half the angular distance from south pole
6930 // Spherical excess E for a spherical triangle with vertices: south pole,
6931 // previous point, current point. Uses a formula derived from Cagnoli’s
6932 // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6933 var dLambda = lambda - lambda0,
6934 sdLambda = dLambda >= 0 ? 1 : -1,
6935 adLambda = sdLambda * dLambda,
6936 cosPhi = cos$1(phi),
6937 sinPhi = sin$1(phi),
6938 k = sinPhi0 * sinPhi,
6939 u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6940 v = k * sdLambda * sin$1(adLambda);
6941 areaRingSum.add(atan2(v, u));
6943 // Advance the previous points.
6944 lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6947 var d3_geoArea = function(object) {
6949 d3_geoStream(object, areaStream);
6953 function spherical(cartesian) {
6954 return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6957 function cartesian(spherical) {
6958 var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6959 return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6962 function cartesianDot(a, b) {
6963 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6966 function cartesianCross(a, b) {
6967 return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
6971 function cartesianAddInPlace(a, b) {
6972 a[0] += b[0], a[1] += b[1], a[2] += b[2];
6975 function cartesianScale(vector, k) {
6976 return [vector[0] * k, vector[1] * k, vector[2] * k];
6980 function cartesianNormalizeInPlace(d) {
6981 var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6982 d[0] /= l, d[1] /= l, d[2] /= l;
6993 var deltaSum = adder();
6997 var boundsStream = {
6999 lineStart: boundsLineStart,
7000 lineEnd: boundsLineEnd,
7001 polygonStart: function() {
7002 boundsStream.point = boundsRingPoint;
7003 boundsStream.lineStart = boundsRingStart;
7004 boundsStream.lineEnd = boundsRingEnd;
7006 areaStream.polygonStart();
7008 polygonEnd: function() {
7009 areaStream.polygonEnd();
7010 boundsStream.point = boundsPoint;
7011 boundsStream.lineStart = boundsLineStart;
7012 boundsStream.lineEnd = boundsLineEnd;
7013 if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7014 else if (deltaSum > epsilon$2) phi1 = 90;
7015 else if (deltaSum < -epsilon$2) phi0 = -90;
7016 range[0] = lambda0$1, range[1] = lambda1;
7020 function boundsPoint(lambda, phi) {
7021 ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7022 if (phi < phi0) phi0 = phi;
7023 if (phi > phi1) phi1 = phi;
7026 function linePoint(lambda, phi) {
7027 var p = cartesian([lambda * radians, phi * radians]);
7029 var normal = cartesianCross(p0, p),
7030 equatorial = [normal[1], -normal[0], 0],
7031 inflection = cartesianCross(equatorial, normal);
7032 cartesianNormalizeInPlace(inflection);
7033 inflection = spherical(inflection);
7034 var delta = lambda - lambda2,
7035 sign$$1 = delta > 0 ? 1 : -1,
7036 lambdai = inflection[0] * degrees$1 * sign$$1,
7038 antimeridian = abs(delta) > 180;
7039 if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7040 phii = inflection[1] * degrees$1;
7041 if (phii > phi1) phi1 = phii;
7042 } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7043 phii = -inflection[1] * degrees$1;
7044 if (phii < phi0) phi0 = phii;
7046 if (phi < phi0) phi0 = phi;
7047 if (phi > phi1) phi1 = phi;
7050 if (lambda < lambda2) {
7051 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7053 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7056 if (lambda1 >= lambda0$1) {
7057 if (lambda < lambda0$1) lambda0$1 = lambda;
7058 if (lambda > lambda1) lambda1 = lambda;
7060 if (lambda > lambda2) {
7061 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7063 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7068 ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7070 if (phi < phi0) phi0 = phi;
7071 if (phi > phi1) phi1 = phi;
7072 p0 = p, lambda2 = lambda;
7075 function boundsLineStart() {
7076 boundsStream.point = linePoint;
7079 function boundsLineEnd() {
7080 range[0] = lambda0$1, range[1] = lambda1;
7081 boundsStream.point = boundsPoint;
7085 function boundsRingPoint(lambda, phi) {
7087 var delta = lambda - lambda2;
7088 deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7090 lambda00$1 = lambda, phi00$1 = phi;
7092 areaStream.point(lambda, phi);
7093 linePoint(lambda, phi);
7096 function boundsRingStart() {
7097 areaStream.lineStart();
7100 function boundsRingEnd() {
7101 boundsRingPoint(lambda00$1, phi00$1);
7102 areaStream.lineEnd();
7103 if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7104 range[0] = lambda0$1, range[1] = lambda1;
7108 // Finds the left-right distance between two longitudes.
7109 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7110 // the distance between ±180° to be 360°.
7111 function angle(lambda0, lambda1) {
7112 return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7115 function rangeCompare(a, b) {
7119 function rangeContains(range, x) {
7120 return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7123 var d3_geoBounds = function(feature) {
7124 var i, n, a, b, merged, deltaMax, delta;
7126 phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7128 d3_geoStream(feature, boundsStream);
7130 // First, sort ranges by their minimum longitudes.
7131 if (n = ranges.length) {
7132 ranges.sort(rangeCompare);
7134 // Then, merge any ranges that overlap.
7135 for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7137 if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7138 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7139 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7145 // Finally, find the largest gap between the merged ranges.
7146 // The final bounding box will be the inverse of this gap.
7147 for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7149 if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7153 ranges = range = null;
7155 return lambda0$1 === Infinity || phi0 === Infinity
7156 ? [[NaN, NaN], [NaN, NaN]]
7157 : [[lambda0$1, phi0], [lambda1, phi1]];
7175 var z0; // previous point
7177 var centroidStream = {
7179 point: centroidPoint,
7180 lineStart: centroidLineStart,
7181 lineEnd: centroidLineEnd,
7182 polygonStart: function() {
7183 centroidStream.lineStart = centroidRingStart;
7184 centroidStream.lineEnd = centroidRingEnd;
7186 polygonEnd: function() {
7187 centroidStream.lineStart = centroidLineStart;
7188 centroidStream.lineEnd = centroidLineEnd;
7192 // Arithmetic mean of Cartesian vectors.
7193 function centroidPoint(lambda, phi) {
7194 lambda *= radians, phi *= radians;
7195 var cosPhi = cos$1(phi);
7196 centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7199 function centroidPointCartesian(x, y, z) {
7201 X0 += (x - X0) / W0;
7202 Y0 += (y - Y0) / W0;
7203 Z0 += (z - Z0) / W0;
7206 function centroidLineStart() {
7207 centroidStream.point = centroidLinePointFirst;
7210 function centroidLinePointFirst(lambda, phi) {
7211 lambda *= radians, phi *= radians;
7212 var cosPhi = cos$1(phi);
7213 x0 = cosPhi * cos$1(lambda);
7214 y0 = cosPhi * sin$1(lambda);
7216 centroidStream.point = centroidLinePoint;
7217 centroidPointCartesian(x0, y0, z0);
7220 function centroidLinePoint(lambda, phi) {
7221 lambda *= radians, phi *= radians;
7222 var cosPhi = cos$1(phi),
7223 x = cosPhi * cos$1(lambda),
7224 y = cosPhi * sin$1(lambda),
7226 w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
7228 X1 += w * (x0 + (x0 = x));
7229 Y1 += w * (y0 + (y0 = y));
7230 Z1 += w * (z0 + (z0 = z));
7231 centroidPointCartesian(x0, y0, z0);
7234 function centroidLineEnd() {
7235 centroidStream.point = centroidPoint;
7238 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7239 // J. Applied Mechanics 42, 239 (1975).
7240 function centroidRingStart() {
7241 centroidStream.point = centroidRingPointFirst;
7244 function centroidRingEnd() {
7245 centroidRingPoint(lambda00$2, phi00$2);
7246 centroidStream.point = centroidPoint;
7249 function centroidRingPointFirst(lambda, phi) {
7250 lambda00$2 = lambda, phi00$2 = phi;
7251 lambda *= radians, phi *= radians;
7252 centroidStream.point = centroidRingPoint;
7253 var cosPhi = cos$1(phi);
7254 x0 = cosPhi * cos$1(lambda);
7255 y0 = cosPhi * sin$1(lambda);
7257 centroidPointCartesian(x0, y0, z0);
7260 function centroidRingPoint(lambda, phi) {
7261 lambda *= radians, phi *= radians;
7262 var cosPhi = cos$1(phi),
7263 x = cosPhi * cos$1(lambda),
7264 y = cosPhi * sin$1(lambda),
7266 cx = y0 * z - z0 * y,
7267 cy = z0 * x - x0 * z,
7268 cz = x0 * y - y0 * x,
7269 m = sqrt(cx * cx + cy * cy + cz * cz),
7270 w = asin(m), // line weight = angle
7271 v = m && -w / m; // area weight multiplier
7276 X1 += w * (x0 + (x0 = x));
7277 Y1 += w * (y0 + (y0 = y));
7278 Z1 += w * (z0 + (z0 = z));
7279 centroidPointCartesian(x0, y0, z0);
7282 var d3_geoCentroid = function(object) {
7287 d3_geoStream(object, centroidStream);
7292 m = x * x + y * y + z * z;
7294 // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7295 if (m < epsilon2$1) {
7296 x = X1, y = Y1, z = Z1;
7297 // If the feature has zero length, fall back to arithmetic mean of point vectors.
7298 if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7299 m = x * x + y * y + z * z;
7300 // If the feature still has an undefined ccentroid, then return.
7301 if (m < epsilon2$1) return [NaN, NaN];
7304 return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307 var constant$7 = function(x) {
7313 var compose = function(a, b) {
7315 function compose(x, y) {
7316 return x = a(x, y), b(x[0], x[1]);
7319 if (a.invert && b.invert) compose.invert = function(x, y) {
7320 return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7326 function rotationIdentity(lambda, phi) {
7327 return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330 rotationIdentity.invert = rotationIdentity;
7332 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7333 return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7334 : rotationLambda(deltaLambda))
7335 : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7336 : rotationIdentity);
7339 function forwardRotationLambda(deltaLambda) {
7340 return function(lambda, phi) {
7341 return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7345 function rotationLambda(deltaLambda) {
7346 var rotation = forwardRotationLambda(deltaLambda);
7347 rotation.invert = forwardRotationLambda(-deltaLambda);
7351 function rotationPhiGamma(deltaPhi, deltaGamma) {
7352 var cosDeltaPhi = cos$1(deltaPhi),
7353 sinDeltaPhi = sin$1(deltaPhi),
7354 cosDeltaGamma = cos$1(deltaGamma),
7355 sinDeltaGamma = sin$1(deltaGamma);
7357 function rotation(lambda, phi) {
7358 var cosPhi = cos$1(phi),
7359 x = cos$1(lambda) * cosPhi,
7360 y = sin$1(lambda) * cosPhi,
7362 k = z * cosDeltaPhi + x * sinDeltaPhi;
7364 atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7365 asin(k * cosDeltaGamma + y * sinDeltaGamma)
7369 rotation.invert = function(lambda, phi) {
7370 var cosPhi = cos$1(phi),
7371 x = cos$1(lambda) * cosPhi,
7372 y = sin$1(lambda) * cosPhi,
7374 k = z * cosDeltaGamma - y * sinDeltaGamma;
7376 atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7377 asin(k * cosDeltaPhi - x * sinDeltaPhi)
7384 var rotation = function(rotate) {
7385 rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7387 function forward(coordinates) {
7388 coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7389 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392 forward.invert = function(coordinates) {
7393 coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7394 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7400 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7401 function circleStream(stream, radius, delta, direction, t0, t1) {
7403 var cosRadius = cos$1(radius),
7404 sinRadius = sin$1(radius),
7405 step = direction * delta;
7407 t0 = radius + direction * tau$3;
7408 t1 = radius - step / 2;
7410 t0 = circleRadius(cosRadius, t0);
7411 t1 = circleRadius(cosRadius, t1);
7412 if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7414 for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7415 point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7416 stream.point(point[0], point[1]);
7420 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7421 function circleRadius(cosRadius, point) {
7422 point = cartesian(point), point[0] -= cosRadius;
7423 cartesianNormalizeInPlace(point);
7424 var radius = acos(-point[1]);
7425 return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7428 var circle = function() {
7429 var center = constant$7([0, 0]),
7430 radius = constant$7(90),
7431 precision = constant$7(6),
7434 stream = {point: point};
7436 function point(x, y) {
7437 ring.push(x = rotate(x, y));
7438 x[0] *= degrees$1, x[1] *= degrees$1;
7442 var c = center.apply(this, arguments),
7443 r = radius.apply(this, arguments) * radians,
7444 p = precision.apply(this, arguments) * radians;
7446 rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7447 circleStream(stream, r, p, 1);
7448 c = {type: "Polygon", coordinates: [ring]};
7449 ring = rotate = null;
7453 circle.center = function(_) {
7454 return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457 circle.radius = function(_) {
7458 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461 circle.precision = function(_) {
7462 return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7468 var clipBuffer = function() {
7472 point: function(x, y) {
7475 lineStart: function() {
7476 lines.push(line = []);
7479 rejoin: function() {
7480 if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7482 result: function() {
7491 var pointEqual = function(a, b) {
7492 return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495 function Intersection(point, points, other, entry) {
7498 this.o = other; // another intersection
7499 this.e = entry; // is an entry?
7500 this.v = false; // visited
7501 this.n = this.p = null; // next & previous
7504 // A generalized polygon clipping algorithm: given a polygon that has been cut
7505 // into its visible line segments, and rejoins the segments by interpolating
7506 // along the clip edge.
7507 var clipRejoin = function(segments, compareIntersection, startInside, interpolate, stream) {
7513 segments.forEach(function(segment) {
7514 if ((n = segment.length - 1) <= 0) return;
7515 var n, p0 = segment[0], p1 = segment[n], x;
7517 // If the first and last points of a segment are coincident, then treat as a
7518 // closed ring. TODO if all rings are closed, then the winding order of the
7519 // exterior ring should be checked.
7520 if (pointEqual(p0, p1)) {
7522 for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7527 subject.push(x = new Intersection(p0, segment, null, true));
7528 clip.push(x.o = new Intersection(p0, null, x, false));
7529 subject.push(x = new Intersection(p1, segment, null, false));
7530 clip.push(x.o = new Intersection(p1, null, x, true));
7533 if (!subject.length) return;
7535 clip.sort(compareIntersection);
7539 for (i = 0, n = clip.length; i < n; ++i) {
7540 clip[i].e = startInside = !startInside;
7543 var start = subject[0],
7548 // Find first unvisited intersection.
7549 var current = start,
7551 while (current.v) if ((current = current.n) === start) return;
7555 current.v = current.o.v = true;
7558 for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7560 interpolate(current.x, current.n.x, 1, stream);
7562 current = current.n;
7565 points = current.p.z;
7566 for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7568 interpolate(current.x, current.p.x, -1, stream);
7570 current = current.p;
7572 current = current.o;
7574 isSubject = !isSubject;
7575 } while (!current.v);
7580 function link$1(array) {
7581 if (!(n = array.length)) return;
7595 var sum$1 = adder();
7597 var polygonContains = function(polygon, point) {
7598 var lambda = point[0],
7600 normal = [sin$1(lambda), -cos$1(lambda), 0],
7606 for (var i = 0, n = polygon.length; i < n; ++i) {
7607 if (!(m = (ring = polygon[i]).length)) continue;
7610 point0 = ring[m - 1],
7611 lambda0 = point0[0],
7612 phi0 = point0[1] / 2 + quarterPi,
7613 sinPhi0 = sin$1(phi0),
7614 cosPhi0 = cos$1(phi0);
7616 for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7617 var point1 = ring[j],
7618 lambda1 = point1[0],
7619 phi1 = point1[1] / 2 + quarterPi,
7620 sinPhi1 = sin$1(phi1),
7621 cosPhi1 = cos$1(phi1),
7622 delta = lambda1 - lambda0,
7623 sign$$1 = delta >= 0 ? 1 : -1,
7624 absDelta = sign$$1 * delta,
7625 antimeridian = absDelta > pi$3,
7626 k = sinPhi0 * sinPhi1;
7628 sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7629 angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7631 // Are the longitudes either side of the point’s meridian (lambda),
7632 // and are the latitudes smaller than the parallel (phi)?
7633 if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7634 var arc = cartesianCross(cartesian(point0), cartesian(point1));
7635 cartesianNormalizeInPlace(arc);
7636 var intersection = cartesianCross(normal, arc);
7637 cartesianNormalizeInPlace(intersection);
7638 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7639 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7640 winding += antimeridian ^ delta >= 0 ? 1 : -1;
7646 // First, determine whether the South pole is inside or outside:
7649 // * the polygon winds around it in a clockwise direction.
7650 // * the polygon does not (cumulatively) wind around it, but has a negative
7651 // (counter-clockwise) area.
7653 // Second, count the (signed) number of times a segment crosses a lambda
7654 // from the point to the South pole. If it is zero, then the point is the
7655 // same side as the South pole.
7657 return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660 var clip = function(pointVisible, clipLine, interpolate, start) {
7661 return function(sink) {
7662 var line = clipLine(sink),
7663 ringBuffer = clipBuffer(),
7664 ringSink = clipLine(ringBuffer),
7665 polygonStarted = false,
7672 lineStart: lineStart,
7674 polygonStart: function() {
7675 clip.point = pointRing;
7676 clip.lineStart = ringStart;
7677 clip.lineEnd = ringEnd;
7681 polygonEnd: function() {
7683 clip.lineStart = lineStart;
7684 clip.lineEnd = lineEnd;
7685 segments = merge(segments);
7686 var startInside = polygonContains(polygon, start);
7687 if (segments.length) {
7688 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7689 clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7690 } else if (startInside) {
7691 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7693 interpolate(null, null, 1, sink);
7696 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7697 segments = polygon = null;
7699 sphere: function() {
7700 sink.polygonStart();
7702 interpolate(null, null, 1, sink);
7708 function point(lambda, phi) {
7709 if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712 function pointLine(lambda, phi) {
7713 line.point(lambda, phi);
7716 function lineStart() {
7717 clip.point = pointLine;
7721 function lineEnd() {
7726 function pointRing(lambda, phi) {
7727 ring.push([lambda, phi]);
7728 ringSink.point(lambda, phi);
7731 function ringStart() {
7732 ringSink.lineStart();
7736 function ringEnd() {
7737 pointRing(ring[0][0], ring[0][1]);
7740 var clean = ringSink.clean(),
7741 ringSegments = ringBuffer.result(),
7742 i, n = ringSegments.length, m,
7752 // No intersections.
7754 segment = ringSegments[0];
7755 if ((m = segment.length - 1) > 0) {
7756 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7758 for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7764 // Rejoin connected segments.
7765 // TODO reuse ringBuffer.rejoin()?
7766 if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7768 segments.push(ringSegments.filter(validSegment));
7775 function validSegment(segment) {
7776 return segment.length > 1;
7779 // Intersections are sorted along the clip edge. For both antimeridian cutting
7780 // and circle clipping, the same comparison is used.
7781 function compareIntersection(a, b) {
7782 return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7783 - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7786 var clipAntimeridian = clip(
7787 function() { return true; },
7788 clipAntimeridianLine,
7789 clipAntimeridianInterpolate,
7793 // Takes a line and cuts into visible segments. Return values: 0 - there were
7794 // intersections or the line was empty; 1 - no intersections; 2 - there were
7795 // intersections, and the first and last segments should be rejoined.
7796 function clipAntimeridianLine(stream) {
7800 clean; // no intersections
7803 lineStart: function() {
7807 point: function(lambda1, phi1) {
7808 var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7809 delta = abs(lambda1 - lambda0);
7810 if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7811 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7812 stream.point(sign0, phi0);
7815 stream.point(sign1, phi0);
7816 stream.point(lambda1, phi0);
7818 } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7819 if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7820 if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7821 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7822 stream.point(sign0, phi0);
7825 stream.point(sign1, phi0);
7828 stream.point(lambda0 = lambda1, phi0 = phi1);
7831 lineEnd: function() {
7833 lambda0 = phi0 = NaN;
7836 return 2 - clean; // if intersections, rejoin first and last segments
7841 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844 sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7845 return abs(sinLambda0Lambda1) > epsilon$2
7846 ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7847 - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7848 / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7849 : (phi0 + phi1) / 2;
7852 function clipAntimeridianInterpolate(from, to, direction, stream) {
7855 phi = direction * halfPi$2;
7856 stream.point(-pi$3, phi);
7857 stream.point(0, phi);
7858 stream.point(pi$3, phi);
7859 stream.point(pi$3, 0);
7860 stream.point(pi$3, -phi);
7861 stream.point(0, -phi);
7862 stream.point(-pi$3, -phi);
7863 stream.point(-pi$3, 0);
7864 stream.point(-pi$3, phi);
7865 } else if (abs(from[0] - to[0]) > epsilon$2) {
7866 var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7867 phi = direction * lambda / 2;
7868 stream.point(-lambda, phi);
7869 stream.point(0, phi);
7870 stream.point(lambda, phi);
7872 stream.point(to[0], to[1]);
7876 var clipCircle = function(radius) {
7877 var cr = cos$1(radius),
7878 delta = 6 * radians,
7879 smallRadius = cr > 0,
7880 notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7882 function interpolate(from, to, direction, stream) {
7883 circleStream(stream, radius, delta, direction, from, to);
7886 function visible(lambda, phi) {
7887 return cos$1(lambda) * cos$1(phi) > cr;
7890 // Takes a line and cuts into visible segments. Return values used for polygon
7891 // clipping: 0 - there were intersections or the line was empty; 1 - no
7892 // intersections 2 - there were intersections, and the first and last segments
7893 // should be rejoined.
7894 function clipLine(stream) {
7895 var point0, // previous point
7896 c0, // code for previous point
7897 v0, // visibility of previous point
7898 v00, // visibility of first point
7899 clean; // no intersections
7901 lineStart: function() {
7905 point: function(lambda, phi) {
7906 var point1 = [lambda, phi],
7908 v = visible(lambda, phi),
7910 ? v ? 0 : code(lambda, phi)
7911 : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7912 if (!point0 && (v00 = v0 = v)) stream.lineStart();
7913 // Handle degeneracies.
7914 // TODO ignore if not clipping polygons.
7916 point2 = intersect(point0, point1);
7917 if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7918 point1[0] += epsilon$2;
7919 point1[1] += epsilon$2;
7920 v = visible(point1[0], point1[1]);
7928 point2 = intersect(point1, point0);
7929 stream.point(point2[0], point2[1]);
7932 point2 = intersect(point0, point1);
7933 stream.point(point2[0], point2[1]);
7937 } else if (notHemisphere && point0 && smallRadius ^ v) {
7939 // If the codes for two points are different, or are both zero,
7940 // and there this segment intersects with the small circle.
7941 if (!(c & c0) && (t = intersect(point1, point0, true))) {
7945 stream.point(t[0][0], t[0][1]);
7946 stream.point(t[1][0], t[1][1]);
7949 stream.point(t[1][0], t[1][1]);
7952 stream.point(t[0][0], t[0][1]);
7956 if (v && (!point0 || !pointEqual(point0, point1))) {
7957 stream.point(point1[0], point1[1]);
7959 point0 = point1, v0 = v, c0 = c;
7961 lineEnd: function() {
7962 if (v0) stream.lineEnd();
7965 // Rejoin first and last segments if there were intersections and the first
7966 // and last points were visible.
7968 return clean | ((v00 && v0) << 1);
7973 // Intersects the great circle between a and b with the clip circle.
7974 function intersect(a, b, two) {
7975 var pa = cartesian(a),
7978 // We have two planes, n1.p = d1 and n2.p = d2.
7979 // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7980 var n1 = [1, 0, 0], // normal
7981 n2 = cartesianCross(pa, pb),
7982 n2n2 = cartesianDot(n2, n2),
7983 n1n2 = n2[0], // cartesianDot(n1, n2),
7984 determinant = n2n2 - n1n2 * n1n2;
7986 // Two polar points.
7987 if (!determinant) return !two && a;
7989 var c1 = cr * n2n2 / determinant,
7990 c2 = -cr * n1n2 / determinant,
7991 n1xn2 = cartesianCross(n1, n2),
7992 A = cartesianScale(n1, c1),
7993 B = cartesianScale(n2, c2);
7994 cartesianAddInPlace(A, B);
7996 // Solve |p(t)|^2 = 1.
7998 w = cartesianDot(A, u),
7999 uu = cartesianDot(u, u),
8000 t2 = w * w - uu * (cartesianDot(A, A) - 1);
8005 q = cartesianScale(u, (-w - t) / uu);
8006 cartesianAddInPlace(q, A);
8011 // Two intersection points.
8018 if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8020 var delta = lambda1 - lambda0,
8021 polar = abs(delta - pi$3) < epsilon$2,
8022 meridian = polar || delta < epsilon$2;
8024 if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8026 // Check that the first point is between a and b.
8029 ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8030 : phi0 <= q[1] && q[1] <= phi1
8031 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8032 var q1 = cartesianScale(u, (-w + t) / uu);
8033 cartesianAddInPlace(q1, A);
8034 return [q, spherical(q1)];
8038 // Generates a 4-bit vector representing the location of a point relative to
8039 // the small circle's bounding box.
8040 function code(lambda, phi) {
8041 var r = smallRadius ? radius : pi$3 - radius,
8043 if (lambda < -r) code |= 1; // left
8044 else if (lambda > r) code |= 2; // right
8045 if (phi < -r) code |= 4; // below
8046 else if (phi > r) code |= 8; // above
8050 return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053 var clipLine = function(a, b, x0, y0, x1, y1) {
8065 if (!dx && r > 0) return;
8070 } else if (dx > 0) {
8076 if (!dx && r < 0) return;
8081 } else if (dx > 0) {
8087 if (!dy && r > 0) return;
8092 } else if (dy > 0) {
8098 if (!dy && r < 0) return;
8103 } else if (dy > 0) {
8108 if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8109 if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8114 var clipMin = -clipMax;
8116 // TODO Use d3-polygon’s polygonContains here for the ring check?
8117 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119 function clipRectangle(x0, y0, x1, y1) {
8121 function visible(x, y) {
8122 return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8125 function interpolate(from, to, direction, stream) {
8128 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8129 || comparePoint(from, to) < 0 ^ direction > 0) {
8130 do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8131 while ((a = (a + direction + 4) % 4) !== a1);
8133 stream.point(to[0], to[1]);
8137 function corner(p, direction) {
8138 return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8139 : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8140 : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8141 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8144 function compareIntersection(a, b) {
8145 return comparePoint(a.x, b.x);
8148 function comparePoint(a, b) {
8149 var ca = corner(a, 1),
8151 return ca !== cb ? ca - cb
8152 : ca === 0 ? b[1] - a[1]
8153 : ca === 1 ? a[0] - b[0]
8154 : ca === 2 ? a[1] - b[1]
8158 return function(stream) {
8159 var activeStream = stream,
8160 bufferStream = clipBuffer(),
8164 x__, y__, v__, // first point
8165 x_, y_, v_, // previous point
8171 lineStart: lineStart,
8173 polygonStart: polygonStart,
8174 polygonEnd: polygonEnd
8177 function point(x, y) {
8178 if (visible(x, y)) activeStream.point(x, y);
8181 function polygonInside() {
8184 for (var i = 0, n = polygon.length; i < n; ++i) {
8185 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8186 a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8187 if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8188 else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8195 // Buffer geometry within a polygon and then clip it en masse.
8196 function polygonStart() {
8197 activeStream = bufferStream, segments = [], polygon = [], clean = true;
8200 function polygonEnd() {
8201 var startInside = polygonInside(),
8202 cleanInside = clean && startInside,
8203 visible = (segments = merge(segments)).length;
8204 if (cleanInside || visible) {
8205 stream.polygonStart();
8208 interpolate(null, null, 1, stream);
8212 clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214 stream.polygonEnd();
8216 activeStream = stream, segments = polygon = ring = null;
8219 function lineStart() {
8220 clipStream.point = linePoint;
8221 if (polygon) polygon.push(ring = []);
8227 // TODO rather than special-case polygons, simply handle them separately.
8228 // Ideally, coincident intersection points should be jittered to avoid
8230 function lineEnd() {
8232 linePoint(x__, y__);
8233 if (v__ && v_) bufferStream.rejoin();
8234 segments.push(bufferStream.result());
8236 clipStream.point = point;
8237 if (v_) activeStream.lineEnd();
8240 function linePoint(x, y) {
8241 var v = visible(x, y);
8242 if (polygon) ring.push([x, y]);
8244 x__ = x, y__ = y, v__ = v;
8247 activeStream.lineStart();
8248 activeStream.point(x, y);
8251 if (v && v_) activeStream.point(x, y);
8253 var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8254 b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8255 if (clipLine(a, b, x0, y0, x1, y1)) {
8257 activeStream.lineStart();
8258 activeStream.point(a[0], a[1]);
8260 activeStream.point(b[0], b[1]);
8261 if (!v) activeStream.lineEnd();
8264 activeStream.lineStart();
8265 activeStream.point(x, y);
8270 x_ = x, y_ = y, v_ = v;
8277 var extent$1 = function() {
8287 stream: function(stream) {
8288 return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290 extent: function(_) {
8291 return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8296 var lengthSum = adder();
8301 var lengthStream = {
8304 lineStart: lengthLineStart,
8306 polygonStart: noop$1,
8310 function lengthLineStart() {
8311 lengthStream.point = lengthPointFirst;
8312 lengthStream.lineEnd = lengthLineEnd;
8315 function lengthLineEnd() {
8316 lengthStream.point = lengthStream.lineEnd = noop$1;
8319 function lengthPointFirst(lambda, phi) {
8320 lambda *= radians, phi *= radians;
8321 lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8322 lengthStream.point = lengthPoint;
8325 function lengthPoint(lambda, phi) {
8326 lambda *= radians, phi *= radians;
8327 var sinPhi = sin$1(phi),
8328 cosPhi = cos$1(phi),
8329 delta = abs(lambda - lambda0$2),
8330 cosDelta = cos$1(delta),
8331 sinDelta = sin$1(delta),
8332 x = cosPhi * sinDelta,
8333 y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8334 z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8335 lengthSum.add(atan2(sqrt(x * x + y * y), z));
8336 lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8339 var d3_geoLength = function(object) {
8341 d3_geoStream(object, lengthStream);
8345 var coordinates = [null, null];
8346 var object$1 = {type: "LineString", coordinates: coordinates};
8348 var distance = function(a, b) {
8351 return d3_geoLength(object$1);
8354 var containsObjectType = {
8355 Feature: function(object, point) {
8356 return containsGeometry(object.geometry, point);
8358 FeatureCollection: function(object, point) {
8359 var features = object.features, i = -1, n = features.length;
8360 while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8365 var containsGeometryType = {
8366 Sphere: function() {
8369 Point: function(object, point) {
8370 return containsPoint(object.coordinates, point);
8372 MultiPoint: function(object, point) {
8373 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8374 while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8377 LineString: function(object, point) {
8378 return containsLine(object.coordinates, point);
8380 MultiLineString: function(object, point) {
8381 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8382 while (++i < n) if (containsLine(coordinates[i], point)) return true;
8385 Polygon: function(object, point) {
8386 return containsPolygon(object.coordinates, point);
8388 MultiPolygon: function(object, point) {
8389 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8390 while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8393 GeometryCollection: function(object, point) {
8394 var geometries = object.geometries, i = -1, n = geometries.length;
8395 while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8400 function containsGeometry(geometry, point) {
8401 return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8402 ? containsGeometryType[geometry.type](geometry, point)
8406 function containsPoint(coordinates, point) {
8407 return distance(coordinates, point) === 0;
8410 function containsLine(coordinates, point) {
8411 var ab = distance(coordinates[0], coordinates[1]),
8412 ao = distance(coordinates[0], point),
8413 ob = distance(point, coordinates[1]);
8414 return ao + ob <= ab + epsilon$2;
8417 function containsPolygon(coordinates, point) {
8418 return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8421 function ringRadians(ring) {
8422 return ring = ring.map(pointRadians), ring.pop(), ring;
8425 function pointRadians(point) {
8426 return [point[0] * radians, point[1] * radians];
8429 var contains = function(object, point) {
8430 return (object && containsObjectType.hasOwnProperty(object.type)
8431 ? containsObjectType[object.type]
8432 : containsGeometry)(object, point);
8435 function graticuleX(y0, y1, dy) {
8436 var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
8437 return function(x) { return y.map(function(y) { return [x, y]; }); };
8440 function graticuleY(x0, x1, dx) {
8441 var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
8442 return function(y) { return x.map(function(x) { return [x, y]; }); };
8445 function graticule() {
8448 dx = 10, dy = dx, DX = 90, DY = 360,
8452 function graticule() {
8453 return {type: "MultiLineString", coordinates: lines()};
8457 return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8458 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8459 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8460 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8463 graticule.lines = function() {
8464 return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8467 graticule.outline = function() {
8473 X(X1).reverse().slice(1),
8474 Y(Y0).reverse().slice(1))
8479 graticule.extent = function(_) {
8480 if (!arguments.length) return graticule.extentMinor();
8481 return graticule.extentMajor(_).extentMinor(_);
8484 graticule.extentMajor = function(_) {
8485 if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8486 X0 = +_[0][0], X1 = +_[1][0];
8487 Y0 = +_[0][1], Y1 = +_[1][1];
8488 if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8489 if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8490 return graticule.precision(precision);
8493 graticule.extentMinor = function(_) {
8494 if (!arguments.length) return [[x0, y0], [x1, y1]];
8495 x0 = +_[0][0], x1 = +_[1][0];
8496 y0 = +_[0][1], y1 = +_[1][1];
8497 if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8498 if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8499 return graticule.precision(precision);
8502 graticule.step = function(_) {
8503 if (!arguments.length) return graticule.stepMinor();
8504 return graticule.stepMajor(_).stepMinor(_);
8507 graticule.stepMajor = function(_) {
8508 if (!arguments.length) return [DX, DY];
8509 DX = +_[0], DY = +_[1];
8513 graticule.stepMinor = function(_) {
8514 if (!arguments.length) return [dx, dy];
8515 dx = +_[0], dy = +_[1];
8519 graticule.precision = function(_) {
8520 if (!arguments.length) return precision;
8522 x = graticuleX(y0, y1, 90);
8523 y = graticuleY(x0, x1, precision);
8524 X = graticuleX(Y0, Y1, 90);
8525 Y = graticuleY(X0, X1, precision);
8530 .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8531 .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8534 function graticule10() {
8535 return graticule()();
8538 var interpolate$1 = function(a, b) {
8539 var x0 = a[0] * radians,
8540 y0 = a[1] * radians,
8541 x1 = b[0] * radians,
8542 y1 = b[1] * radians,
8547 kx0 = cy0 * cos$1(x0),
8548 ky0 = cy0 * sin$1(x0),
8549 kx1 = cy1 * cos$1(x1),
8550 ky1 = cy1 * sin$1(x1),
8551 d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8554 var interpolate = d ? function(t) {
8555 var B = sin$1(t *= d) / k,
8556 A = sin$1(d - t) / k,
8557 x = A * kx0 + B * kx1,
8558 y = A * ky0 + B * ky1,
8559 z = A * sy0 + B * sy1;
8561 atan2(y, x) * degrees$1,
8562 atan2(z, sqrt(x * x + y * y)) * degrees$1
8565 return [x0 * degrees$1, y0 * degrees$1];
8568 interpolate.distance = d;
8573 var identity$4 = function(x) {
8577 var areaSum$1 = adder();
8578 var areaRingSum$1 = adder();
8584 var areaStream$1 = {
8588 polygonStart: function() {
8589 areaStream$1.lineStart = areaRingStart$1;
8590 areaStream$1.lineEnd = areaRingEnd$1;
8592 polygonEnd: function() {
8593 areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8594 areaSum$1.add(abs(areaRingSum$1));
8595 areaRingSum$1.reset();
8597 result: function() {
8598 var area = areaSum$1 / 2;
8604 function areaRingStart$1() {
8605 areaStream$1.point = areaPointFirst$1;
8608 function areaPointFirst$1(x, y) {
8609 areaStream$1.point = areaPoint$1;
8610 x00 = x0$1 = x, y00 = y0$1 = y;
8613 function areaPoint$1(x, y) {
8614 areaRingSum$1.add(y0$1 * x - x0$1 * y);
8618 function areaRingEnd$1() {
8619 areaPoint$1(x00, y00);
8622 var x0$2 = Infinity;
8627 var boundsStream$1 = {
8628 point: boundsPoint$1,
8631 polygonStart: noop$1,
8633 result: function() {
8634 var bounds = [[x0$2, y0$2], [x1, y1]];
8635 x1 = y1 = -(y0$2 = x0$2 = Infinity);
8640 function boundsPoint$1(x, y) {
8641 if (x < x0$2) x0$2 = x;
8643 if (y < y0$2) y0$2 = y;
8647 // TODO Enforce positive area for exterior, negative area for interior?
8663 var centroidStream$1 = {
8664 point: centroidPoint$1,
8665 lineStart: centroidLineStart$1,
8666 lineEnd: centroidLineEnd$1,
8667 polygonStart: function() {
8668 centroidStream$1.lineStart = centroidRingStart$1;
8669 centroidStream$1.lineEnd = centroidRingEnd$1;
8671 polygonEnd: function() {
8672 centroidStream$1.point = centroidPoint$1;
8673 centroidStream$1.lineStart = centroidLineStart$1;
8674 centroidStream$1.lineEnd = centroidLineEnd$1;
8676 result: function() {
8677 var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8678 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8679 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8681 X0$1 = Y0$1 = Z0$1 =
8682 X1$1 = Y1$1 = Z1$1 =
8683 X2$1 = Y2$1 = Z2$1 = 0;
8688 function centroidPoint$1(x, y) {
8694 function centroidLineStart$1() {
8695 centroidStream$1.point = centroidPointFirstLine;
8698 function centroidPointFirstLine(x, y) {
8699 centroidStream$1.point = centroidPointLine;
8700 centroidPoint$1(x0$3 = x, y0$3 = y);
8703 function centroidPointLine(x, y) {
8704 var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8705 X1$1 += z * (x0$3 + x) / 2;
8706 Y1$1 += z * (y0$3 + y) / 2;
8708 centroidPoint$1(x0$3 = x, y0$3 = y);
8711 function centroidLineEnd$1() {
8712 centroidStream$1.point = centroidPoint$1;
8715 function centroidRingStart$1() {
8716 centroidStream$1.point = centroidPointFirstRing;
8719 function centroidRingEnd$1() {
8720 centroidPointRing(x00$1, y00$1);
8723 function centroidPointFirstRing(x, y) {
8724 centroidStream$1.point = centroidPointRing;
8725 centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8728 function centroidPointRing(x, y) {
8731 z = sqrt(dx * dx + dy * dy);
8733 X1$1 += z * (x0$3 + x) / 2;
8734 Y1$1 += z * (y0$3 + y) / 2;
8737 z = y0$3 * x - x0$3 * y;
8738 X2$1 += z * (x0$3 + x);
8739 Y2$1 += z * (y0$3 + y);
8741 centroidPoint$1(x0$3 = x, y0$3 = y);
8744 function PathContext(context) {
8745 this._context = context;
8748 PathContext.prototype = {
8750 pointRadius: function(_) {
8751 return this._radius = _, this;
8753 polygonStart: function() {
8756 polygonEnd: function() {
8759 lineStart: function() {
8762 lineEnd: function() {
8763 if (this._line === 0) this._context.closePath();
8766 point: function(x, y) {
8767 switch (this._point) {
8769 this._context.moveTo(x, y);
8774 this._context.lineTo(x, y);
8778 this._context.moveTo(x + this._radius, y);
8779 this._context.arc(x, y, this._radius, 0, tau$3);
8787 var lengthSum$1 = adder();
8794 var lengthStream$1 = {
8796 lineStart: function() {
8797 lengthStream$1.point = lengthPointFirst$1;
8799 lineEnd: function() {
8800 if (lengthRing) lengthPoint$1(x00$2, y00$2);
8801 lengthStream$1.point = noop$1;
8803 polygonStart: function() {
8806 polygonEnd: function() {
8809 result: function() {
8810 var length = +lengthSum$1;
8811 lengthSum$1.reset();
8816 function lengthPointFirst$1(x, y) {
8817 lengthStream$1.point = lengthPoint$1;
8818 x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8821 function lengthPoint$1(x, y) {
8822 x0$4 -= x, y0$4 -= y;
8823 lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8827 function PathString() {
8831 PathString.prototype = {
8833 _circle: circle$1(4.5),
8834 pointRadius: function(_) {
8835 if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8838 polygonStart: function() {
8841 polygonEnd: function() {
8844 lineStart: function() {
8847 lineEnd: function() {
8848 if (this._line === 0) this._string.push("Z");
8851 point: function(x, y) {
8852 switch (this._point) {
8854 this._string.push("M", x, ",", y);
8859 this._string.push("L", x, ",", y);
8863 if (this._circle == null) this._circle = circle$1(this._radius);
8864 this._string.push("M", x, ",", y, this._circle);
8869 result: function() {
8870 if (this._string.length) {
8871 var result = this._string.join("");
8880 function circle$1(radius) {
8881 return "m0," + radius
8882 + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8883 + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8887 var d3_geoPath = function(projection, context) {
8888 var pointRadius = 4.5,
8892 function path(object) {
8894 if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8895 d3_geoStream(object, projectionStream(contextStream));
8897 return contextStream.result();
8900 path.area = function(object) {
8901 d3_geoStream(object, projectionStream(areaStream$1));
8902 return areaStream$1.result();
8905 path.measure = function(object) {
8906 d3_geoStream(object, projectionStream(lengthStream$1));
8907 return lengthStream$1.result();
8910 path.bounds = function(object) {
8911 d3_geoStream(object, projectionStream(boundsStream$1));
8912 return boundsStream$1.result();
8915 path.centroid = function(object) {
8916 d3_geoStream(object, projectionStream(centroidStream$1));
8917 return centroidStream$1.result();
8920 path.projection = function(_) {
8921 return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8924 path.context = function(_) {
8925 if (!arguments.length) return context;
8926 contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8927 if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8931 path.pointRadius = function(_) {
8932 if (!arguments.length) return pointRadius;
8933 pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8937 return path.projection(projection).context(context);
8940 var d3_geoTransform = function(methods) {
8942 stream: transformer(methods)
8946 function transformer(methods) {
8947 return function(stream) {
8948 var s = new TransformStream;
8949 for (var key in methods) s[key] = methods[key];
8955 function TransformStream() {}
8957 TransformStream.prototype = {
8958 constructor: TransformStream,
8959 point: function(x, y) { this.stream.point(x, y); },
8960 sphere: function() { this.stream.sphere(); },
8961 lineStart: function() { this.stream.lineStart(); },
8962 lineEnd: function() { this.stream.lineEnd(); },
8963 polygonStart: function() { this.stream.polygonStart(); },
8964 polygonEnd: function() { this.stream.polygonEnd(); }
8967 function fitExtent(projection, extent, object) {
8968 var w = extent[1][0] - extent[0][0],
8969 h = extent[1][1] - extent[0][1],
8970 clip = projection.clipExtent && projection.clipExtent();
8976 if (clip != null) projection.clipExtent(null);
8978 d3_geoStream(object, projection.stream(boundsStream$1));
8980 var b = boundsStream$1.result(),
8981 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8982 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8983 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985 if (clip != null) projection.clipExtent(clip);
8992 function fitSize(projection, size, object) {
8993 return fitExtent(projection, [[0, 0], size], object);
8997 var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
8999 var resample = function(project, delta2) {
9000 return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9003 function resampleNone(project) {
9004 return transformer({
9005 point: function(x, y) {
9007 this.stream.point(x[0], x[1]);
9012 function resample$1(project, delta2) {
9014 function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9017 d2 = dx * dx + dy * dy;
9018 if (d2 > 4 * delta2 && depth--) {
9022 m = sqrt(a * a + b * b + c * c),
9023 phi2 = asin(c /= m),
9024 lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9025 p = project(lambda2, phi2),
9030 dz = dy * dx2 - dx * dy2;
9031 if (dz * dz / d2 > delta2 // perpendicular projected distance
9032 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9033 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9034 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9035 stream.point(x2, y2);
9036 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9040 return function(stream) {
9041 var lambda00, x00, y00, a00, b00, c00, // first point
9042 lambda0, x0, y0, a0, b0, c0; // previous point
9044 var resampleStream = {
9046 lineStart: lineStart,
9048 polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9049 polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9052 function point(x, y) {
9054 stream.point(x[0], x[1]);
9057 function lineStart() {
9059 resampleStream.point = linePoint;
9063 function linePoint(lambda, phi) {
9064 var c = cartesian([lambda, phi]), p = project(lambda, phi);
9065 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
9066 stream.point(x0, y0);
9069 function lineEnd() {
9070 resampleStream.point = point;
9074 function ringStart() {
9076 resampleStream.point = ringPoint;
9077 resampleStream.lineEnd = ringEnd;
9080 function ringPoint(lambda, phi) {
9081 linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9082 resampleStream.point = linePoint;
9085 function ringEnd() {
9086 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9087 resampleStream.lineEnd = lineEnd;
9091 return resampleStream;
9095 var transformRadians = transformer({
9096 point: function(x, y) {
9097 this.stream.point(x * radians, y * radians);
9101 function transformRotate(rotate) {
9102 return transformer({
9103 point: function(x, y) {
9104 var r = rotate(x, y);
9105 return this.stream.point(r[0], r[1]);
9110 function projection(project) {
9111 return projectionMutator(function() { return project; })();
9114 function projectionMutator(projectAt) {
9117 x = 480, y = 250, // translate
9118 dx, dy, lambda = 0, phi = 0, // center
9119 deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9120 theta = null, preclip = clipAntimeridian, // clip angle
9121 x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9122 delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9126 function projection(point) {
9127 point = projectRotate(point[0] * radians, point[1] * radians);
9128 return [point[0] * k + dx, dy - point[1] * k];
9131 function invert(point) {
9132 point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9133 return point && [point[0] * degrees$1, point[1] * degrees$1];
9136 function projectTransform(x, y) {
9137 return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9140 projection.stream = function(stream) {
9141 return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9144 projection.preclip = function(_) {
9145 return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9148 projection.postclip = function(_) {
9149 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9152 projection.clipAngle = function(_) {
9153 return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9156 projection.clipExtent = function(_) {
9157 return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9160 projection.scale = function(_) {
9161 return arguments.length ? (k = +_, recenter()) : k;
9164 projection.translate = function(_) {
9165 return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9168 projection.center = function(_) {
9169 return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9172 projection.rotate = function(_) {
9173 return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
9176 projection.precision = function(_) {
9177 return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9180 projection.fitExtent = function(extent, object) {
9181 return fitExtent(projection, extent, object);
9184 projection.fitSize = function(size, object) {
9185 return fitSize(projection, size, object);
9188 function recenter() {
9189 projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9190 var center = project(lambda, phi);
9191 dx = x - center[0] * k;
9192 dy = y + center[1] * k;
9197 cache = cacheStream = null;
9202 project = projectAt.apply(this, arguments);
9203 projection.invert = project.invert && invert;
9208 function conicProjection(projectAt) {
9211 m = projectionMutator(projectAt),
9214 p.parallels = function(_) {
9215 return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9221 function cylindricalEqualAreaRaw(phi0) {
9222 var cosPhi0 = cos$1(phi0);
9224 function forward(lambda, phi) {
9225 return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9228 forward.invert = function(x, y) {
9229 return [x / cosPhi0, asin(y * cosPhi0)];
9235 function conicEqualAreaRaw(y0, y1) {
9236 var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9238 // Are the parallels symmetrical around the Equator?
9239 if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9241 var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9243 function project(x, y) {
9244 var r = sqrt(c - 2 * n * sin$1(y)) / n;
9245 return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9248 project.invert = function(x, y) {
9250 return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9256 var conicEqualArea = function() {
9257 return conicProjection(conicEqualAreaRaw)
9259 .center([0, 33.6442]);
9262 var albers = function() {
9263 return conicEqualArea()
9264 .parallels([29.5, 45.5])
9266 .translate([480, 250])
9268 .center([-0.6, 38.7]);
9271 // The projections must have mutually exclusive clip regions on the sphere,
9272 // as this will avoid emitting interleaving lines and polygons.
9273 function multiplex(streams) {
9274 var n = streams.length;
9276 point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9277 sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9278 lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9279 lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9280 polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9281 polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9285 // A composite projection for the United States, configured by default for
9286 // 960×500. The projection also works quite well at 960×600 if you change the
9287 // scale to 1285 and adjust the translate accordingly. The set of standard
9288 // parallels for each region comes from USGS, which is published here:
9289 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9290 var albersUsa = function() {
9293 lower48 = albers(), lower48Point,
9294 alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9295 hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9296 point, pointStream = {point: function(x, y) { point = [x, y]; }};
9298 function albersUsa(coordinates) {
9299 var x = coordinates[0], y = coordinates[1];
9300 return point = null,
9301 (lower48Point.point(x, y), point)
9302 || (alaskaPoint.point(x, y), point)
9303 || (hawaiiPoint.point(x, y), point);
9306 albersUsa.invert = function(coordinates) {
9307 var k = lower48.scale(),
9308 t = lower48.translate(),
9309 x = (coordinates[0] - t[0]) / k,
9310 y = (coordinates[1] - t[1]) / k;
9311 return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9312 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9313 : lower48).invert(coordinates);
9316 albersUsa.stream = function(stream) {
9317 return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9320 albersUsa.precision = function(_) {
9321 if (!arguments.length) return lower48.precision();
9322 lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9326 albersUsa.scale = function(_) {
9327 if (!arguments.length) return lower48.scale();
9328 lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9329 return albersUsa.translate(lower48.translate());
9332 albersUsa.translate = function(_) {
9333 if (!arguments.length) return lower48.translate();
9334 var k = lower48.scale(), x = +_[0], y = +_[1];
9336 lower48Point = lower48
9338 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9339 .stream(pointStream);
9341 alaskaPoint = alaska
9342 .translate([x - 0.307 * k, y + 0.201 * k])
9343 .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9344 .stream(pointStream);
9346 hawaiiPoint = hawaii
9347 .translate([x - 0.205 * k, y + 0.212 * k])
9348 .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9349 .stream(pointStream);
9354 albersUsa.fitExtent = function(extent, object) {
9355 return fitExtent(albersUsa, extent, object);
9358 albersUsa.fitSize = function(size, object) {
9359 return fitSize(albersUsa, size, object);
9363 cache = cacheStream = null;
9367 return albersUsa.scale(1070);
9370 function azimuthalRaw(scale) {
9371 return function(x, y) {
9382 function azimuthalInvert(angle) {
9383 return function(x, y) {
9384 var z = sqrt(x * x + y * y),
9389 atan2(x * sc, z * cc),
9390 asin(z && y * sc / z)
9395 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9396 return sqrt(2 / (1 + cxcy));
9399 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9400 return 2 * asin(z / 2);
9403 var azimuthalEqualArea = function() {
9404 return projection(azimuthalEqualAreaRaw)
9406 .clipAngle(180 - 1e-3);
9409 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9410 return (c = acos(c)) && c / sin$1(c);
9413 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9417 var azimuthalEquidistant = function() {
9418 return projection(azimuthalEquidistantRaw)
9420 .clipAngle(180 - 1e-3);
9423 function mercatorRaw(lambda, phi) {
9424 return [lambda, log(tan((halfPi$2 + phi) / 2))];
9427 mercatorRaw.invert = function(x, y) {
9428 return [x, 2 * atan(exp(y)) - halfPi$2];
9431 var mercator = function() {
9432 return mercatorProjection(mercatorRaw)
9433 .scale(961 / tau$3);
9436 function mercatorProjection(project) {
9437 var m = projection(project),
9440 translate = m.translate,
9441 clipExtent = m.clipExtent,
9442 x0 = null, y0, x1, y1; // clip extent
9444 m.scale = function(_) {
9445 return arguments.length ? (scale(_), reclip()) : scale();
9448 m.translate = function(_) {
9449 return arguments.length ? (translate(_), reclip()) : translate();
9452 m.center = function(_) {
9453 return arguments.length ? (center(_), reclip()) : center();
9456 m.clipExtent = function(_) {
9457 return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9461 var k = pi$3 * scale(),
9462 t = m(rotation(m.rotate()).invert([0, 0]));
9463 return clipExtent(x0 == null
9464 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9465 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9466 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9473 return tan((halfPi$2 + y) / 2);
9476 function conicConformalRaw(y0, y1) {
9477 var cy0 = cos$1(y0),
9478 n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9479 f = cy0 * pow(tany(y0), n) / n;
9481 if (!n) return mercatorRaw;
9483 function project(x, y) {
9484 if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9485 else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9486 var r = f / pow(tany(y), n);
9487 return [r * sin$1(n * x), f - r * cos$1(n * x)];
9490 project.invert = function(x, y) {
9491 var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9492 return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9498 var conicConformal = function() {
9499 return conicProjection(conicConformalRaw)
9501 .parallels([30, 30]);
9504 function equirectangularRaw(lambda, phi) {
9505 return [lambda, phi];
9508 equirectangularRaw.invert = equirectangularRaw;
9510 var equirectangular = function() {
9511 return projection(equirectangularRaw)
9515 function conicEquidistantRaw(y0, y1) {
9516 var cy0 = cos$1(y0),
9517 n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9520 if (abs(n) < epsilon$2) return equirectangularRaw;
9522 function project(x, y) {
9523 var gy = g - y, nx = n * x;
9524 return [gy * sin$1(nx), g - gy * cos$1(nx)];
9527 project.invert = function(x, y) {
9529 return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9535 var conicEquidistant = function() {
9536 return conicProjection(conicEquidistantRaw)
9538 .center([0, 13.9389]);
9541 function gnomonicRaw(x, y) {
9542 var cy = cos$1(y), k = cos$1(x) * cy;
9543 return [cy * sin$1(x) / k, sin$1(y) / k];
9546 gnomonicRaw.invert = azimuthalInvert(atan);
9548 var gnomonic = function() {
9549 return projection(gnomonicRaw)
9554 function scaleTranslate(kx, ky, tx, ty) {
9555 return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9556 point: function(x, y) {
9557 this.stream.point(x * kx + tx, y * ky + ty);
9562 var d3_geoIdentity = function() {
9563 var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9564 x0 = null, y0, x1, y1, // clip extent
9565 postclip = identity$4,
9571 cache = cacheStream = null;
9575 return projection = {
9576 stream: function(stream) {
9577 return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9579 postclip: function(_) {
9580 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9582 clipExtent: function(_) {
9583 return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9585 scale: function(_) {
9586 return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9588 translate: function(_) {
9589 return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9591 reflectX: function(_) {
9592 return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9594 reflectY: function(_) {
9595 return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9597 fitExtent: function(extent, object) {
9598 return fitExtent(projection, extent, object);
9600 fitSize: function(size, object) {
9601 return fitSize(projection, size, object);
9606 function naturalEarth1Raw(lambda, phi) {
9607 var phi2 = phi * phi, phi4 = phi2 * phi2;
9609 lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9610 phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9614 naturalEarth1Raw.invert = function(x, y) {
9615 var phi = y, i = 25, delta;
9617 var phi2 = phi * phi, phi4 = phi2 * phi2;
9618 phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9619 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9620 } while (abs(delta) > epsilon$2 && --i > 0);
9622 x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9627 var naturalEarth1 = function() {
9628 return projection(naturalEarth1Raw)
9632 function orthographicRaw(x, y) {
9633 return [cos$1(y) * sin$1(x), sin$1(y)];
9636 orthographicRaw.invert = azimuthalInvert(asin);
9638 var orthographic = function() {
9639 return projection(orthographicRaw)
9641 .clipAngle(90 + epsilon$2);
9644 function stereographicRaw(x, y) {
9645 var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9646 return [cy * sin$1(x) / k, sin$1(y) / k];
9649 stereographicRaw.invert = azimuthalInvert(function(z) {
9653 var stereographic = function() {
9654 return projection(stereographicRaw)
9659 function transverseMercatorRaw(lambda, phi) {
9660 return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9663 transverseMercatorRaw.invert = function(x, y) {
9664 return [-y, 2 * atan(exp(x)) - halfPi$2];
9667 var transverseMercator = function() {
9668 var m = mercatorProjection(transverseMercatorRaw),
9672 m.center = function(_) {
9673 return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9676 m.rotate = function(_) {
9677 return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9680 return rotate([0, 0, 90])
9684 function defaultSeparation(a, b) {
9685 return a.parent === b.parent ? 1 : 2;
9688 function meanX(children) {
9689 return children.reduce(meanXReduce, 0) / children.length;
9692 function meanXReduce(x, c) {
9696 function maxY(children) {
9697 return 1 + children.reduce(maxYReduce, 0);
9700 function maxYReduce(y, c) {
9701 return Math.max(y, c.y);
9704 function leafLeft(node) {
9706 while (children = node.children) node = children[0];
9710 function leafRight(node) {
9712 while (children = node.children) node = children[children.length - 1];
9716 var cluster = function() {
9717 var separation = defaultSeparation,
9722 function cluster(root) {
9726 // First walk, computing the initial x & y values.
9727 root.eachAfter(function(node) {
9728 var children = node.children;
9730 node.x = meanX(children);
9731 node.y = maxY(children);
9733 node.x = previousNode ? x += separation(node, previousNode) : 0;
9735 previousNode = node;
9739 var left = leafLeft(root),
9740 right = leafRight(root),
9741 x0 = left.x - separation(left, right) / 2,
9742 x1 = right.x + separation(right, left) / 2;
9744 // Second walk, normalizing x & y to the desired size.
9745 return root.eachAfter(nodeSize ? function(node) {
9746 node.x = (node.x - root.x) * dx;
9747 node.y = (root.y - node.y) * dy;
9748 } : function(node) {
9749 node.x = (node.x - x0) / (x1 - x0) * dx;
9750 node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9754 cluster.separation = function(x) {
9755 return arguments.length ? (separation = x, cluster) : separation;
9758 cluster.size = function(x) {
9759 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9762 cluster.nodeSize = function(x) {
9763 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9769 function count(node) {
9771 children = node.children,
9772 i = children && children.length;
9774 else while (--i >= 0) sum += children[i].value;
9778 var node_count = function() {
9779 return this.eachAfter(count);
9782 var node_each = function(callback) {
9783 var node = this, current, next = [node], children, i, n;
9785 current = next.reverse(), next = [];
9786 while (node = current.pop()) {
9787 callback(node), children = node.children;
9788 if (children) for (i = 0, n = children.length; i < n; ++i) {
9789 next.push(children[i]);
9792 } while (next.length);
9796 var node_eachBefore = function(callback) {
9797 var node = this, nodes = [node], children, i;
9798 while (node = nodes.pop()) {
9799 callback(node), children = node.children;
9800 if (children) for (i = children.length - 1; i >= 0; --i) {
9801 nodes.push(children[i]);
9807 var node_eachAfter = function(callback) {
9808 var node = this, nodes = [node], next = [], children, i, n;
9809 while (node = nodes.pop()) {
9810 next.push(node), children = node.children;
9811 if (children) for (i = 0, n = children.length; i < n; ++i) {
9812 nodes.push(children[i]);
9815 while (node = next.pop()) {
9821 var node_sum = function(value) {
9822 return this.eachAfter(function(node) {
9823 var sum = +value(node.data) || 0,
9824 children = node.children,
9825 i = children && children.length;
9826 while (--i >= 0) sum += children[i].value;
9831 var node_sort = function(compare) {
9832 return this.eachBefore(function(node) {
9833 if (node.children) {
9834 node.children.sort(compare);
9839 var node_path = function(end) {
9841 ancestor = leastCommonAncestor(start, end),
9843 while (start !== ancestor) {
9844 start = start.parent;
9847 var k = nodes.length;
9848 while (end !== ancestor) {
9849 nodes.splice(k, 0, end);
9855 function leastCommonAncestor(a, b) {
9856 if (a === b) return a;
9857 var aNodes = a.ancestors(),
9858 bNodes = b.ancestors(),
9870 var node_ancestors = function() {
9871 var node = this, nodes = [node];
9872 while (node = node.parent) {
9878 var node_descendants = function() {
9880 this.each(function(node) {
9886 var node_leaves = function() {
9888 this.eachBefore(function(node) {
9889 if (!node.children) {
9896 var node_links = function() {
9897 var root = this, links = [];
9898 root.each(function(node) {
9899 if (node !== root) { // Don’t include the root’s parent, if any.
9900 links.push({source: node.parent, target: node});
9906 function hierarchy(data, children) {
9907 var root = new Node(data),
9908 valued = +data.value && (root.value = data.value),
9916 if (children == null) children = defaultChildren;
9918 while (node = nodes.pop()) {
9919 if (valued) node.value = +node.data.value;
9920 if ((childs = children(node.data)) && (n = childs.length)) {
9921 node.children = new Array(n);
9922 for (i = n - 1; i >= 0; --i) {
9923 nodes.push(child = node.children[i] = new Node(childs[i]));
9924 child.parent = node;
9925 child.depth = node.depth + 1;
9930 return root.eachBefore(computeHeight);
9933 function node_copy() {
9934 return hierarchy(this).eachBefore(copyData);
9937 function defaultChildren(d) {
9941 function copyData(node) {
9942 node.data = node.data.data;
9945 function computeHeight(node) {
9947 do node.height = height;
9948 while ((node = node.parent) && (node.height < ++height));
9951 function Node(data) {
9958 Node.prototype = hierarchy.prototype = {
9962 eachAfter: node_eachAfter,
9963 eachBefore: node_eachBefore,
9967 ancestors: node_ancestors,
9968 descendants: node_descendants,
9969 leaves: node_leaves,
9974 var slice$3 = Array.prototype.slice;
9976 function shuffle$1(array) {
9977 var m = array.length,
9982 i = Math.random() * m-- | 0;
9984 array[m] = array[i];
9991 var enclose = function(circles) {
9992 var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
9996 if (e && enclosesWeak(e, p)) ++i;
9997 else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10003 function extendBasis(B, p) {
10006 if (enclosesWeakAll(p, B)) return [p];
10008 // If we get here then B must have at least one element.
10009 for (i = 0; i < B.length; ++i) {
10010 if (enclosesNot(p, B[i])
10011 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10016 // If we get here then B must have at least two elements.
10017 for (i = 0; i < B.length - 1; ++i) {
10018 for (j = i + 1; j < B.length; ++j) {
10019 if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10020 && enclosesNot(encloseBasis2(B[i], p), B[j])
10021 && enclosesNot(encloseBasis2(B[j], p), B[i])
10022 && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10023 return [B[i], B[j], p];
10028 // If we get here then something is very wrong.
10032 function enclosesNot(a, b) {
10033 var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10034 return dr < 0 || dr * dr < dx * dx + dy * dy;
10037 function enclosesWeak(a, b) {
10038 var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10039 return dr > 0 && dr * dr > dx * dx + dy * dy;
10042 function enclosesWeakAll(a, B) {
10043 for (var i = 0; i < B.length; ++i) {
10044 if (!enclosesWeak(a, B[i])) {
10051 function encloseBasis(B) {
10052 switch (B.length) {
10053 case 1: return encloseBasis1(B[0]);
10054 case 2: return encloseBasis2(B[0], B[1]);
10055 case 3: return encloseBasis3(B[0], B[1], B[2]);
10059 function encloseBasis1(a) {
10067 function encloseBasis2(a, b) {
10068 var x1 = a.x, y1 = a.y, r1 = a.r,
10069 x2 = b.x, y2 = b.y, r2 = b.r,
10070 x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10071 l = Math.sqrt(x21 * x21 + y21 * y21);
10073 x: (x1 + x2 + x21 / l * r21) / 2,
10074 y: (y1 + y2 + y21 / l * r21) / 2,
10075 r: (l + r1 + r2) / 2
10079 function encloseBasis3(a, b, c) {
10080 var x1 = a.x, y1 = a.y, r1 = a.r,
10081 x2 = b.x, y2 = b.y, r2 = b.r,
10082 x3 = c.x, y3 = c.y, r3 = c.r,
10089 d1 = x1 * x1 + y1 * y1 - r1 * r1,
10090 d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10091 d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10092 ab = a3 * b2 - a2 * b3,
10093 xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10094 xb = (b3 * c2 - b2 * c3) / ab,
10095 ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10096 yb = (a2 * c3 - a3 * c2) / ab,
10097 A = xb * xb + yb * yb - 1,
10098 B = 2 * (r1 + xa * xb + ya * yb),
10099 C = xa * xa + ya * ya - r1 * r1,
10100 r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10102 x: x1 + xa + xb * r,
10103 y: y1 + ya + yb * r,
10108 function place(a, b, c) {
10115 dc = dx * dx + dy * dy;
10117 var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10118 y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10119 c.x = ax + x * dx + y * dy;
10120 c.y = ay + x * dy - y * dx;
10127 function intersects(a, b) {
10128 var dx = b.x - a.x,
10131 return dr * dr - 1e-6 > dx * dx + dy * dy;
10134 function score(node) {
10138 dx = (a.x * b.r + b.x * a.r) / ab,
10139 dy = (a.y * b.r + b.y * a.r) / ab;
10140 return dx * dx + dy * dy;
10143 function Node$1(circle) {
10146 this.previous = null;
10149 function packEnclose(circles) {
10150 if (!(n = circles.length)) return 0;
10152 var a, b, c, n, aa, ca, i, j, k, sj, sk;
10154 // Place the first circle.
10155 a = circles[0], a.x = 0, a.y = 0;
10156 if (!(n > 1)) return a.r;
10158 // Place the second circle.
10159 b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10160 if (!(n > 2)) return a.r + b.r;
10162 // Place the third circle.
10163 place(b, a, c = circles[2]);
10165 // Initialize the front-chain using the first three circles a, b and c.
10166 a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10167 a.next = c.previous = b;
10168 b.next = a.previous = c;
10169 c.next = b.previous = a;
10171 // Attempt to place each remaining circle…
10172 pack: for (i = 3; i < n; ++i) {
10173 place(a._, b._, c = circles[i]), c = new Node$1(c);
10175 // Find the closest intersecting circle on the front-chain, if any.
10176 // “Closeness” is determined by linear distance along the front-chain.
10177 // “Ahead” or “behind” is likewise determined by linear distance.
10178 j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10181 if (intersects(j._, c._)) {
10182 b = j, a.next = b, b.previous = a, --i;
10185 sj += j._.r, j = j.next;
10187 if (intersects(k._, c._)) {
10188 a = k, a.next = b, b.previous = a, --i;
10191 sk += k._.r, k = k.previous;
10193 } while (j !== k.next);
10195 // Success! Insert the new circle c between a and b.
10196 c.previous = a, c.next = b, a.next = b.previous = b = c;
10198 // Compute the new closest circle pair to the centroid.
10200 while ((c = c.next) !== b) {
10201 if ((ca = score(c)) < aa) {
10208 // Compute the enclosing circle of the front chain.
10209 a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10211 // Translate the circles to put the enclosing circle around the origin.
10212 for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10217 var siblings = function(circles) {
10218 packEnclose(circles);
10222 function optional(f) {
10223 return f == null ? null : required(f);
10226 function required(f) {
10227 if (typeof f !== "function") throw new Error;
10231 function constantZero() {
10235 var constant$8 = function(x) {
10236 return function() {
10241 function defaultRadius$1(d) {
10242 return Math.sqrt(d.value);
10245 var index$2 = function() {
10249 padding = constantZero;
10251 function pack(root) {
10252 root.x = dx / 2, root.y = dy / 2;
10254 root.eachBefore(radiusLeaf(radius))
10255 .eachAfter(packChildren(padding, 0.5))
10256 .eachBefore(translateChild(1));
10258 root.eachBefore(radiusLeaf(defaultRadius$1))
10259 .eachAfter(packChildren(constantZero, 1))
10260 .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10261 .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10266 pack.radius = function(x) {
10267 return arguments.length ? (radius = optional(x), pack) : radius;
10270 pack.size = function(x) {
10271 return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10274 pack.padding = function(x) {
10275 return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10281 function radiusLeaf(radius) {
10282 return function(node) {
10283 if (!node.children) {
10284 node.r = Math.max(0, +radius(node) || 0);
10289 function packChildren(padding, k) {
10290 return function(node) {
10291 if (children = node.children) {
10294 n = children.length,
10295 r = padding(node) * k || 0,
10298 if (r) for (i = 0; i < n; ++i) children[i].r += r;
10299 e = packEnclose(children);
10300 if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10306 function translateChild(k) {
10307 return function(node) {
10308 var parent = node.parent;
10311 node.x = parent.x + k * node.x;
10312 node.y = parent.y + k * node.y;
10317 var roundNode = function(node) {
10318 node.x0 = Math.round(node.x0);
10319 node.y0 = Math.round(node.y0);
10320 node.x1 = Math.round(node.x1);
10321 node.y1 = Math.round(node.y1);
10324 var treemapDice = function(parent, x0, y0, x1, y1) {
10325 var nodes = parent.children,
10329 k = parent.value && (x1 - x0) / parent.value;
10332 node = nodes[i], node.y0 = y0, node.y1 = y1;
10333 node.x0 = x0, node.x1 = x0 += node.value * k;
10337 var partition = function() {
10343 function partition(root) {
10344 var n = root.height + 1;
10349 root.eachBefore(positionNode(dy, n));
10350 if (round) root.eachBefore(roundNode);
10354 function positionNode(dy, n) {
10355 return function(node) {
10356 if (node.children) {
10357 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10361 x1 = node.x1 - padding,
10362 y1 = node.y1 - padding;
10363 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10364 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10372 partition.round = function(x) {
10373 return arguments.length ? (round = !!x, partition) : round;
10376 partition.size = function(x) {
10377 return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10380 partition.padding = function(x) {
10381 return arguments.length ? (padding = +x, partition) : padding;
10387 var keyPrefix$1 = "$";
10388 var preroot = {depth: -1};
10389 var ambiguous = {};
10391 function defaultId(d) {
10395 function defaultParentId(d) {
10399 var stratify = function() {
10400 var id = defaultId,
10401 parentId = defaultParentId;
10403 function stratify(data) {
10410 nodes = new Array(n),
10415 for (i = 0; i < n; ++i) {
10416 d = data[i], node = nodes[i] = new Node(d);
10417 if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10418 nodeKey = keyPrefix$1 + (node.id = nodeId);
10419 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10423 for (i = 0; i < n; ++i) {
10424 node = nodes[i], nodeId = parentId(data[i], i, data);
10425 if (nodeId == null || !(nodeId += "")) {
10426 if (root) throw new Error("multiple roots");
10429 parent = nodeByKey[keyPrefix$1 + nodeId];
10430 if (!parent) throw new Error("missing: " + nodeId);
10431 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10432 if (parent.children) parent.children.push(node);
10433 else parent.children = [node];
10434 node.parent = parent;
10438 if (!root) throw new Error("no root");
10439 root.parent = preroot;
10440 root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10441 root.parent = null;
10442 if (n > 0) throw new Error("cycle");
10447 stratify.id = function(x) {
10448 return arguments.length ? (id = required(x), stratify) : id;
10451 stratify.parentId = function(x) {
10452 return arguments.length ? (parentId = required(x), stratify) : parentId;
10458 function defaultSeparation$1(a, b) {
10459 return a.parent === b.parent ? 1 : 2;
10462 // function radialSeparation(a, b) {
10463 // return (a.parent === b.parent ? 1 : 2) / a.depth;
10466 // This function is used to traverse the left contour of a subtree (or
10467 // subforest). It returns the successor of v on this contour. This successor is
10468 // either given by the leftmost child of v or by the thread of v. The function
10469 // returns null if and only if v is on the highest level of its subtree.
10470 function nextLeft(v) {
10471 var children = v.children;
10472 return children ? children[0] : v.t;
10475 // This function works analogously to nextLeft.
10476 function nextRight(v) {
10477 var children = v.children;
10478 return children ? children[children.length - 1] : v.t;
10481 // Shifts the current subtree rooted at w+. This is done by increasing
10482 // prelim(w+) and mod(w+) by shift.
10483 function moveSubtree(wm, wp, shift) {
10484 var change = shift / (wp.i - wm.i);
10492 // All other shifts, applied to the smaller subtrees between w- and w+, are
10493 // performed by this function. To prepare the shifts, we have to adjust
10494 // change(w+), shift(w+), and change(w-).
10495 function executeShifts(v) {
10498 children = v.children,
10499 i = children.length,
10505 shift += w.s + (change += w.c);
10509 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10510 // returns the specified (default) ancestor.
10511 function nextAncestor(vim, v, ancestor) {
10512 return vim.a.parent === v.parent ? vim.a : ancestor;
10515 function TreeNode(node, i) {
10517 this.parent = null;
10518 this.children = null;
10519 this.A = null; // default ancestor
10520 this.a = this; // ancestor
10521 this.z = 0; // prelim
10523 this.c = 0; // change
10524 this.s = 0; // shift
10525 this.t = null; // thread
10526 this.i = i; // number
10529 TreeNode.prototype = Object.create(Node.prototype);
10531 function treeRoot(root) {
10532 var tree = new TreeNode(root, 0),
10540 while (node = nodes.pop()) {
10541 if (children = node._.children) {
10542 node.children = new Array(n = children.length);
10543 for (i = n - 1; i >= 0; --i) {
10544 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10545 child.parent = node;
10550 (tree.parent = new TreeNode(null, 0)).children = [tree];
10554 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10555 var tree = function() {
10556 var separation = defaultSeparation$1,
10561 function tree(root) {
10562 var t = treeRoot(root);
10564 // Compute the layout using Buchheim et al.’s algorithm.
10565 t.eachAfter(firstWalk), t.parent.m = -t.z;
10566 t.eachBefore(secondWalk);
10568 // If a fixed node size is specified, scale x and y.
10569 if (nodeSize) root.eachBefore(sizeNode);
10571 // If a fixed tree size is specified, scale x and y based on the extent.
10572 // Compute the left-most, right-most, and depth-most nodes for extents.
10577 root.eachBefore(function(node) {
10578 if (node.x < left.x) left = node;
10579 if (node.x > right.x) right = node;
10580 if (node.depth > bottom.depth) bottom = node;
10582 var s = left === right ? 1 : separation(left, right) / 2,
10584 kx = dx / (right.x + s + tx),
10585 ky = dy / (bottom.depth || 1);
10586 root.eachBefore(function(node) {
10587 node.x = (node.x + tx) * kx;
10588 node.y = node.depth * ky;
10595 // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10596 // applied recursively to the children of v, as well as the function
10597 // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10598 // node v is placed to the midpoint of its outermost children.
10599 function firstWalk(v) {
10600 var children = v.children,
10601 siblings = v.parent.children,
10602 w = v.i ? siblings[v.i - 1] : null;
10605 var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10607 v.z = w.z + separation(v._, w._);
10608 v.m = v.z - midpoint;
10613 v.z = w.z + separation(v._, w._);
10615 v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10618 // Computes all real x-coordinates by summing up the modifiers recursively.
10619 function secondWalk(v) {
10620 v._.x = v.z + v.parent.m;
10624 // The core of the algorithm. Here, a new subtree is combined with the
10625 // previous subtrees. Threads are used to traverse the inside and outside
10626 // contours of the left and right subtree up to the highest common level. The
10627 // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10628 // superscript o means outside and i means inside, the subscript - means left
10629 // subtree and + means right subtree. For summing up the modifiers along the
10630 // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10631 // nodes of the inside contours conflict, we compute the left one of the
10632 // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10633 // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10634 // Finally, we add a new thread (if necessary).
10635 function apportion(v, w, ancestor) {
10640 vom = vip.parent.children[0],
10646 while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10647 vom = nextLeft(vom);
10648 vop = nextRight(vop);
10650 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10652 moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10661 if (vim && !nextRight(vop)) {
10663 vop.m += sim - sop;
10665 if (vip && !nextLeft(vom)) {
10667 vom.m += sip - som;
10674 function sizeNode(node) {
10676 node.y = node.depth * dy;
10679 tree.separation = function(x) {
10680 return arguments.length ? (separation = x, tree) : separation;
10683 tree.size = function(x) {
10684 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10687 tree.nodeSize = function(x) {
10688 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10694 var treemapSlice = function(parent, x0, y0, x1, y1) {
10695 var nodes = parent.children,
10699 k = parent.value && (y1 - y0) / parent.value;
10702 node = nodes[i], node.x0 = x0, node.x1 = x1;
10703 node.y0 = y0, node.y1 = y0 += node.value * k;
10707 var phi = (1 + Math.sqrt(5)) / 2;
10709 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10711 nodes = parent.children,
10718 value = parent.value,
10728 dx = x1 - x0, dy = y1 - y0;
10730 // Find the next non-empty node.
10731 do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10732 minValue = maxValue = sumValue;
10733 alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10734 beta = sumValue * sumValue * alpha;
10735 minRatio = Math.max(maxValue / beta, beta / minValue);
10737 // Keep adding nodes while the aspect ratio maintains or improves.
10738 for (; i1 < n; ++i1) {
10739 sumValue += nodeValue = nodes[i1].value;
10740 if (nodeValue < minValue) minValue = nodeValue;
10741 if (nodeValue > maxValue) maxValue = nodeValue;
10742 beta = sumValue * sumValue * alpha;
10743 newRatio = Math.max(maxValue / beta, beta / minValue);
10744 if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10745 minRatio = newRatio;
10748 // Position and record the row orientation.
10749 rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10750 if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10751 else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10752 value -= sumValue, i0 = i1;
10758 var squarify = (function custom(ratio) {
10760 function squarify(parent, x0, y0, x1, y1) {
10761 squarifyRatio(ratio, parent, x0, y0, x1, y1);
10764 squarify.ratio = function(x) {
10765 return custom((x = +x) > 1 ? x : 1);
10771 var index$3 = function() {
10772 var tile = squarify,
10776 paddingStack = [0],
10777 paddingInner = constantZero,
10778 paddingTop = constantZero,
10779 paddingRight = constantZero,
10780 paddingBottom = constantZero,
10781 paddingLeft = constantZero;
10783 function treemap(root) {
10788 root.eachBefore(positionNode);
10789 paddingStack = [0];
10790 if (round) root.eachBefore(roundNode);
10794 function positionNode(node) {
10795 var p = paddingStack[node.depth],
10800 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10801 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10806 if (node.children) {
10807 p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10808 x0 += paddingLeft(node) - p;
10809 y0 += paddingTop(node) - p;
10810 x1 -= paddingRight(node) - p;
10811 y1 -= paddingBottom(node) - p;
10812 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10813 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10814 tile(node, x0, y0, x1, y1);
10818 treemap.round = function(x) {
10819 return arguments.length ? (round = !!x, treemap) : round;
10822 treemap.size = function(x) {
10823 return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10826 treemap.tile = function(x) {
10827 return arguments.length ? (tile = required(x), treemap) : tile;
10830 treemap.padding = function(x) {
10831 return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10834 treemap.paddingInner = function(x) {
10835 return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10838 treemap.paddingOuter = function(x) {
10839 return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10842 treemap.paddingTop = function(x) {
10843 return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10846 treemap.paddingRight = function(x) {
10847 return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10850 treemap.paddingBottom = function(x) {
10851 return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10854 treemap.paddingLeft = function(x) {
10855 return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10861 var binary = function(parent, x0, y0, x1, y1) {
10862 var nodes = parent.children,
10863 i, n = nodes.length,
10864 sum, sums = new Array(n + 1);
10866 for (sums[0] = sum = i = 0; i < n; ++i) {
10867 sums[i + 1] = sum += nodes[i].value;
10870 partition(0, n, parent.value, x0, y0, x1, y1);
10872 function partition(i, j, value, x0, y0, x1, y1) {
10874 var node = nodes[i];
10875 node.x0 = x0, node.y0 = y0;
10876 node.x1 = x1, node.y1 = y1;
10880 var valueOffset = sums[i],
10881 valueTarget = (value / 2) + valueOffset,
10886 var mid = k + hi >>> 1;
10887 if (sums[mid] < valueTarget) k = mid + 1;
10891 if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10893 var valueLeft = sums[k] - valueOffset,
10894 valueRight = value - valueLeft;
10896 if ((x1 - x0) > (y1 - y0)) {
10897 var xk = (x0 * valueRight + x1 * valueLeft) / value;
10898 partition(i, k, valueLeft, x0, y0, xk, y1);
10899 partition(k, j, valueRight, xk, y0, x1, y1);
10901 var yk = (y0 * valueRight + y1 * valueLeft) / value;
10902 partition(i, k, valueLeft, x0, y0, x1, yk);
10903 partition(k, j, valueRight, x0, yk, x1, y1);
10908 var sliceDice = function(parent, x0, y0, x1, y1) {
10909 (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10912 var resquarify = (function custom(ratio) {
10914 function resquarify(parent, x0, y0, x1, y1) {
10915 if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10923 value = parent.value;
10926 row = rows[j], nodes = row.children;
10927 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10928 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10929 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10930 value -= row.value;
10933 parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10934 rows.ratio = ratio;
10938 resquarify.ratio = function(x) {
10939 return custom((x = +x) > 1 ? x : 1);
10945 var d3_polygonArea = function(polygon) {
10947 n = polygon.length,
10949 b = polygon[n - 1],
10955 area += a[1] * b[0] - a[0] * b[1];
10961 var d3_polygonCentroid = function(polygon) {
10963 n = polygon.length,
10967 b = polygon[n - 1],
10974 k += c = a[0] * b[1] - b[0] * a[1];
10975 x += (a[0] + b[0]) * c;
10976 y += (a[1] + b[1]) * c;
10979 return k *= 3, [x / k, y / k];
10982 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
10983 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
10984 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
10985 // negative if clockwise, and zero if the points are collinear.
10986 var cross$1 = function(a, b, c) {
10987 return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
10990 function lexicographicOrder(a, b) {
10991 return a[0] - b[0] || a[1] - b[1];
10994 // Computes the upper convex hull per the monotone chain algorithm.
10995 // Assumes points.length >= 3, is sorted by x, unique in y.
10996 // Returns an array of indices into points in left-to-right order.
10997 function computeUpperHullIndexes(points) {
10998 var n = points.length,
11002 for (var i = 2; i < n; ++i) {
11003 while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11004 indexes[size++] = i;
11007 return indexes.slice(0, size); // remove popped points
11010 var d3_polygonHull = function(points) {
11011 if ((n = points.length) < 3) return null;
11015 sortedPoints = new Array(n),
11016 flippedPoints = new Array(n);
11018 for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11019 sortedPoints.sort(lexicographicOrder);
11020 for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11022 var upperIndexes = computeUpperHullIndexes(sortedPoints),
11023 lowerIndexes = computeUpperHullIndexes(flippedPoints);
11025 // Construct the hull polygon, removing possible duplicate endpoints.
11026 var skipLeft = lowerIndexes[0] === upperIndexes[0],
11027 skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11030 // Add upper hull in right-to-l order.
11031 // Then add lower hull in left-to-right order.
11032 for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11033 for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11038 var contains$1 = function(polygon, point) {
11039 var n = polygon.length,
11040 p = polygon[n - 1],
11041 x = point[0], y = point[1],
11042 x0 = p[0], y0 = p[1],
11046 for (var i = 0; i < n; ++i) {
11047 p = polygon[i], x1 = p[0], y1 = p[1];
11048 if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11055 var length$1 = function(polygon) {
11057 n = polygon.length,
11058 b = polygon[n - 1],
11073 perimeter += Math.sqrt(xa * xa + ya * ya);
11079 var slice$4 = [].slice;
11083 function Queue(size) {
11086 this._error = null;
11092 this._start = 0; // inside a synchronous task callback?
11095 Queue.prototype = queue.prototype = {
11096 constructor: Queue,
11097 defer: function(callback) {
11098 if (typeof callback !== "function") throw new Error("invalid callback");
11099 if (this._call) throw new Error("defer after await");
11100 if (this._error != null) return this;
11101 var t = slice$4.call(arguments, 1);
11103 ++this._waiting, this._tasks.push(t);
11107 abort: function() {
11108 if (this._error == null) abort(this, new Error("abort"));
11111 await: function(callback) {
11112 if (typeof callback !== "function") throw new Error("invalid callback");
11113 if (this._call) throw new Error("multiple await");
11114 this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11118 awaitAll: function(callback) {
11119 if (typeof callback !== "function") throw new Error("invalid callback");
11120 if (this._call) throw new Error("multiple await");
11121 this._call = callback;
11127 function poke$1(q) {
11129 try { start$1(q); } // let the current task complete
11131 if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11132 else if (!q._data) throw e; // await callback errored synchronously
11137 function start$1(q) {
11138 while (q._start = q._waiting && q._active < q._size) {
11139 var i = q._ended + q._active,
11144 --q._waiting, ++q._active;
11145 t = c.apply(null, t);
11146 if (!q._tasks[i]) continue; // task finished synchronously
11147 q._tasks[i] = t || noabort;
11151 function end(q, i) {
11152 return function(e, r) {
11153 if (!q._tasks[i]) return; // ignore multiple callbacks
11154 --q._active, ++q._ended;
11155 q._tasks[i] = null;
11156 if (q._error != null) return; // ignore secondary errors
11161 if (q._waiting) poke$1(q);
11162 else maybeNotify(q);
11167 function abort(q, e) {
11168 var i = q._tasks.length, t;
11169 q._error = e; // ignore active callbacks
11170 q._data = undefined; // allow gc
11171 q._waiting = NaN; // prevent starting
11174 if (t = q._tasks[i]) {
11175 q._tasks[i] = null;
11178 catch (e) { /* ignore */ }
11183 q._active = NaN; // allow notification
11187 function maybeNotify(q) {
11188 if (!q._active && q._call) {
11190 q._data = undefined; // allow gc
11191 q._call(q._error, d);
11195 function queue(concurrency) {
11196 if (concurrency == null) concurrency = Infinity;
11197 else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11198 return new Queue(concurrency);
11201 var defaultSource$1 = function() {
11202 return Math.random();
11205 var uniform = (function sourceRandomUniform(source) {
11206 function randomUniform(min, max) {
11207 min = min == null ? 0 : +min;
11208 max = max == null ? 1 : +max;
11209 if (arguments.length === 1) max = min, min = 0;
11211 return function() {
11212 return source() * max + min;
11216 randomUniform.source = sourceRandomUniform;
11218 return randomUniform;
11219 })(defaultSource$1);
11221 var normal = (function sourceRandomNormal(source) {
11222 function randomNormal(mu, sigma) {
11224 mu = mu == null ? 0 : +mu;
11225 sigma = sigma == null ? 1 : +sigma;
11226 return function() {
11229 // If available, use the second previously-generated uniform random.
11230 if (x != null) y = x, x = null;
11232 // Otherwise, generate a new x and y.
11234 x = source() * 2 - 1;
11235 y = source() * 2 - 1;
11237 } while (!r || r > 1);
11239 return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11243 randomNormal.source = sourceRandomNormal;
11245 return randomNormal;
11246 })(defaultSource$1);
11248 var logNormal = (function sourceRandomLogNormal(source) {
11249 function randomLogNormal() {
11250 var randomNormal = normal.source(source).apply(this, arguments);
11251 return function() {
11252 return Math.exp(randomNormal());
11256 randomLogNormal.source = sourceRandomLogNormal;
11258 return randomLogNormal;
11259 })(defaultSource$1);
11261 var irwinHall = (function sourceRandomIrwinHall(source) {
11262 function randomIrwinHall(n) {
11263 return function() {
11264 for (var sum = 0, i = 0; i < n; ++i) sum += source();
11269 randomIrwinHall.source = sourceRandomIrwinHall;
11271 return randomIrwinHall;
11272 })(defaultSource$1);
11274 var bates = (function sourceRandomBates(source) {
11275 function randomBates(n) {
11276 var randomIrwinHall = irwinHall.source(source)(n);
11277 return function() {
11278 return randomIrwinHall() / n;
11282 randomBates.source = sourceRandomBates;
11284 return randomBates;
11285 })(defaultSource$1);
11287 var exponential$1 = (function sourceRandomExponential(source) {
11288 function randomExponential(lambda) {
11289 return function() {
11290 return -Math.log(1 - source()) / lambda;
11294 randomExponential.source = sourceRandomExponential;
11296 return randomExponential;
11297 })(defaultSource$1);
11299 var d3_request = function(url, callback) {
11301 event = dispatch("beforesend", "progress", "load", "error"),
11304 xhr = new XMLHttpRequest,
11311 // If IE does not support CORS, use XDomainRequest.
11312 if (typeof XDomainRequest !== "undefined"
11313 && !("withCredentials" in xhr)
11314 && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11317 ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11318 : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11320 function respond(o) {
11321 var status = xhr.status, result;
11322 if (!status && hasResponse(xhr)
11323 || status >= 200 && status < 300
11324 || status === 304) {
11327 result = response.call(request, xhr);
11329 event.call("error", request, e);
11335 event.call("load", request, result);
11337 event.call("error", request, o);
11341 xhr.onprogress = function(e) {
11342 event.call("progress", request, e);
11346 header: function(name, value) {
11347 name = (name + "").toLowerCase();
11348 if (arguments.length < 2) return headers.get(name);
11349 if (value == null) headers.remove(name);
11350 else headers.set(name, value + "");
11354 // If mimeType is non-null and no Accept header is set, a default is used.
11355 mimeType: function(value) {
11356 if (!arguments.length) return mimeType;
11357 mimeType = value == null ? null : value + "";
11361 // Specifies what type the response value should take;
11362 // for instance, arraybuffer, blob, document, or text.
11363 responseType: function(value) {
11364 if (!arguments.length) return responseType;
11365 responseType = value;
11369 timeout: function(value) {
11370 if (!arguments.length) return timeout;
11375 user: function(value) {
11376 return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11379 password: function(value) {
11380 return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11383 // Specify how to convert the response content to a specific type;
11384 // changes the callback value on "load" events.
11385 response: function(value) {
11390 // Alias for send("GET", …).
11391 get: function(data, callback) {
11392 return request.send("GET", data, callback);
11395 // Alias for send("POST", …).
11396 post: function(data, callback) {
11397 return request.send("POST", data, callback);
11400 // If callback is non-null, it will be used for error and load events.
11401 send: function(method, data, callback) {
11402 xhr.open(method, url, true, user, password);
11403 if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11404 if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11405 if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11406 if (responseType != null) xhr.responseType = responseType;
11407 if (timeout > 0) xhr.timeout = timeout;
11408 if (callback == null && typeof data === "function") callback = data, data = null;
11409 if (callback != null && callback.length === 1) callback = fixCallback(callback);
11410 if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11411 event.call("beforesend", request, xhr);
11412 xhr.send(data == null ? null : data);
11416 abort: function() {
11422 var value = event.on.apply(event, arguments);
11423 return value === event ? request : value;
11427 if (callback != null) {
11428 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11429 return request.get(callback);
11435 function fixCallback(callback) {
11436 return function(error, xhr) {
11437 callback(error == null ? xhr : null);
11441 function hasResponse(xhr) {
11442 var type = xhr.responseType;
11443 return type && type !== "text"
11444 ? xhr.response // null on error
11445 : xhr.responseText; // "" on error
11448 var type$1 = function(defaultMimeType, response) {
11449 return function(url, callback) {
11450 var r = d3_request(url).mimeType(defaultMimeType).response(response);
11451 if (callback != null) {
11452 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11453 return r.get(callback);
11459 var html = type$1("text/html", function(xhr) {
11460 return document.createRange().createContextualFragment(xhr.responseText);
11463 var d3_json = type$1("application/json", function(xhr) {
11464 return JSON.parse(xhr.responseText);
11467 var d3_text = type$1("text/plain", function(xhr) {
11468 return xhr.responseText;
11471 var d3_xml = type$1("application/xml", function(xhr) {
11472 var xml = xhr.responseXML;
11473 if (!xml) throw new Error("parse error");
11477 var dsv$1 = function(defaultMimeType, parse) {
11478 return function(url, row, callback) {
11479 if (arguments.length < 3) callback = row, row = null;
11480 var r = d3_request(url).mimeType(defaultMimeType);
11481 r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11483 return callback ? r.get(callback) : r;
11487 function responseOf(parse, row) {
11488 return function(request) {
11489 return parse(request.responseText, row);
11493 var csv$1 = dsv$1("text/csv", csvParse);
11495 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11497 var array$2 = Array.prototype;
11499 var map$3 = array$2.map;
11500 var slice$5 = array$2.slice;
11502 var implicit = {name: "implicit"};
11504 function ordinal(range) {
11505 var index = map$1(),
11507 unknown = implicit;
11509 range = range == null ? [] : slice$5.call(range);
11511 function scale(d) {
11512 var key = d + "", i = index.get(key);
11514 if (unknown !== implicit) return unknown;
11515 index.set(key, i = domain.push(d));
11517 return range[(i - 1) % range.length];
11520 scale.domain = function(_) {
11521 if (!arguments.length) return domain.slice();
11522 domain = [], index = map$1();
11523 var i = -1, n = _.length, d, key;
11524 while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11528 scale.range = function(_) {
11529 return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11532 scale.unknown = function(_) {
11533 return arguments.length ? (unknown = _, scale) : unknown;
11536 scale.copy = function() {
11547 var scale = ordinal().unknown(undefined),
11548 domain = scale.domain,
11549 ordinalRange = scale.range,
11558 delete scale.unknown;
11560 function rescale() {
11561 var n = domain().length,
11562 reverse = range[1] < range[0],
11563 start = range[reverse - 0],
11564 stop = range[1 - reverse];
11565 step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11566 if (round) step = Math.floor(step);
11567 start += (stop - start - step * (n - paddingInner)) * align;
11568 bandwidth = step * (1 - paddingInner);
11569 if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11570 var values = d3_range(n).map(function(i) { return start + step * i; });
11571 return ordinalRange(reverse ? values.reverse() : values);
11574 scale.domain = function(_) {
11575 return arguments.length ? (domain(_), rescale()) : domain();
11578 scale.range = function(_) {
11579 return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
11582 scale.rangeRound = function(_) {
11583 return range = [+_[0], +_[1]], round = true, rescale();
11586 scale.bandwidth = function() {
11590 scale.step = function() {
11594 scale.round = function(_) {
11595 return arguments.length ? (round = !!_, rescale()) : round;
11598 scale.padding = function(_) {
11599 return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11602 scale.paddingInner = function(_) {
11603 return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11606 scale.paddingOuter = function(_) {
11607 return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11610 scale.align = function(_) {
11611 return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11614 scale.copy = function() {
11619 .paddingInner(paddingInner)
11620 .paddingOuter(paddingOuter)
11627 function pointish(scale) {
11628 var copy = scale.copy;
11630 scale.padding = scale.paddingOuter;
11631 delete scale.paddingInner;
11632 delete scale.paddingOuter;
11634 scale.copy = function() {
11635 return pointish(copy());
11641 function point$1() {
11642 return pointish(band().paddingInner(1));
11645 var constant$9 = function(x) {
11646 return function() {
11651 var number$2 = function(x) {
11657 function deinterpolateLinear(a, b) {
11658 return (b -= (a = +a))
11659 ? function(x) { return (x - a) / b; }
11663 function deinterpolateClamp(deinterpolate) {
11664 return function(a, b) {
11665 var d = deinterpolate(a = +a, b = +b);
11666 return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11670 function reinterpolateClamp(reinterpolate) {
11671 return function(a, b) {
11672 var r = reinterpolate(a = +a, b = +b);
11673 return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11677 function bimap(domain, range, deinterpolate, reinterpolate) {
11678 var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11679 if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11680 else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11681 return function(x) { return r0(d0(x)); };
11684 function polymap(domain, range, deinterpolate, reinterpolate) {
11685 var j = Math.min(domain.length, range.length) - 1,
11690 // Reverse descending domains.
11691 if (domain[j] < domain[0]) {
11692 domain = domain.slice().reverse();
11693 range = range.slice().reverse();
11697 d[i] = deinterpolate(domain[i], domain[i + 1]);
11698 r[i] = reinterpolate(range[i], range[i + 1]);
11701 return function(x) {
11702 var i = bisectRight(domain, x, 1, j) - 1;
11703 return r[i](d[i](x));
11707 function copy(source, target) {
11709 .domain(source.domain())
11710 .range(source.range())
11711 .interpolate(source.interpolate())
11712 .clamp(source.clamp());
11715 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11716 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11717 function continuous(deinterpolate, reinterpolate) {
11720 interpolate = d3_interpolate,
11726 function rescale() {
11727 piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11728 output = input = null;
11732 function scale(x) {
11733 return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);
11736 scale.invert = function(y) {
11737 return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11740 scale.domain = function(_) {
11741 return arguments.length ? (domain = map$3.call(_, number$2), rescale()) : domain.slice();
11744 scale.range = function(_) {
11745 return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11748 scale.rangeRound = function(_) {
11749 return range = slice$5.call(_), interpolate = interpolateRound, rescale();
11752 scale.clamp = function(_) {
11753 return arguments.length ? (clamp = !!_, rescale()) : clamp;
11756 scale.interpolate = function(_) {
11757 return arguments.length ? (interpolate = _, rescale()) : interpolate;
11763 var tickFormat = function(domain, count, specifier) {
11764 var start = domain[0],
11765 stop = domain[domain.length - 1],
11766 step = tickStep(start, stop, count == null ? 10 : count),
11768 specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11769 switch (specifier.type) {
11771 var value = Math.max(Math.abs(start), Math.abs(stop));
11772 if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11773 return formatPrefix(specifier, value);
11780 if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11785 if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11789 return format(specifier);
11792 function linearish(scale) {
11793 var domain = scale.domain;
11795 scale.ticks = function(count) {
11797 return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11800 scale.tickFormat = function(count, specifier) {
11801 return tickFormat(domain(), count, specifier);
11804 scale.nice = function(count) {
11805 if (count == null) count = 10;
11814 if (stop < start) {
11815 step = start, start = stop, stop = step;
11816 step = i0, i0 = i1, i1 = step;
11819 step = tickIncrement(start, stop, count);
11822 start = Math.floor(start / step) * step;
11823 stop = Math.ceil(stop / step) * step;
11824 step = tickIncrement(start, stop, count);
11825 } else if (step < 0) {
11826 start = Math.ceil(start * step) / step;
11827 stop = Math.floor(stop * step) / step;
11828 step = tickIncrement(start, stop, count);
11832 d[i0] = Math.floor(start / step) * step;
11833 d[i1] = Math.ceil(stop / step) * step;
11835 } else if (step < 0) {
11836 d[i0] = Math.ceil(start * step) / step;
11837 d[i1] = Math.floor(stop * step) / step;
11847 function linear$2() {
11848 var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11850 scale.copy = function() {
11851 return copy(scale, linear$2());
11854 return linearish(scale);
11857 function identity$5() {
11858 var domain = [0, 1];
11860 function scale(x) {
11864 scale.invert = scale;
11866 scale.domain = scale.range = function(_) {
11867 return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice();
11870 scale.copy = function() {
11871 return identity$5().domain(domain);
11874 return linearish(scale);
11877 var nice = function(domain, interval) {
11878 domain = domain.slice();
11881 i1 = domain.length - 1,
11887 t = i0, i0 = i1, i1 = t;
11888 t = x0, x0 = x1, x1 = t;
11891 domain[i0] = interval.floor(x0);
11892 domain[i1] = interval.ceil(x1);
11896 function deinterpolate(a, b) {
11897 return (b = Math.log(b / a))
11898 ? function(x) { return Math.log(x / a) / b; }
11902 function reinterpolate(a, b) {
11904 ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11905 : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11908 function pow10(x) {
11909 return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11912 function powp(base) {
11913 return base === 10 ? pow10
11914 : base === Math.E ? Math.exp
11915 : function(x) { return Math.pow(base, x); };
11918 function logp(base) {
11919 return base === Math.E ? Math.log
11920 : base === 10 && Math.log10
11921 || base === 2 && Math.log2
11922 || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11925 function reflect(f) {
11926 return function(x) {
11932 var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11933 domain = scale.domain,
11938 function rescale() {
11939 logs = logp(base), pows = powp(base);
11940 if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11944 scale.base = function(_) {
11945 return arguments.length ? (base = +_, rescale()) : base;
11948 scale.domain = function(_) {
11949 return arguments.length ? (domain(_), rescale()) : domain();
11952 scale.ticks = function(count) {
11955 v = d[d.length - 1],
11958 if (r = v < u) i = u, u = v, v = i;
11965 n = count == null ? 10 : +count,
11968 if (!(base % 1) && j - i < n) {
11969 i = Math.round(i) - 1, j = Math.round(j) + 1;
11970 if (u > 0) for (; i < j; ++i) {
11971 for (k = 1, p = pows(i); k < base; ++k) {
11973 if (t < u) continue;
11977 } else for (; i < j; ++i) {
11978 for (k = base - 1, p = pows(i); k >= 1; --k) {
11980 if (t < u) continue;
11986 z = ticks(i, j, Math.min(j - i, n)).map(pows);
11989 return r ? z.reverse() : z;
11992 scale.tickFormat = function(count, specifier) {
11993 if (specifier == null) specifier = base === 10 ? ".0e" : ",";
11994 if (typeof specifier !== "function") specifier = format(specifier);
11995 if (count === Infinity) return specifier;
11996 if (count == null) count = 10;
11997 var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
11998 return function(d) {
11999 var i = d / pows(Math.round(logs(d)));
12000 if (i * base < base - 0.5) i *= base;
12001 return i <= k ? specifier(d) : "";
12005 scale.nice = function() {
12006 return domain(nice(domain(), {
12007 floor: function(x) { return pows(Math.floor(logs(x))); },
12008 ceil: function(x) { return pows(Math.ceil(logs(x))); }
12012 scale.copy = function() {
12013 return copy(scale, log$1().base(base));
12019 function raise$1(x, exponent) {
12020 return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12025 scale = continuous(deinterpolate, reinterpolate),
12026 domain = scale.domain;
12028 function deinterpolate(a, b) {
12029 return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12030 ? function(x) { return (raise$1(x, exponent) - a) / b; }
12034 function reinterpolate(a, b) {
12035 b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12036 return function(t) { return raise$1(a + b * t, 1 / exponent); };
12039 scale.exponent = function(_) {
12040 return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12043 scale.copy = function() {
12044 return copy(scale, pow$1().exponent(exponent));
12047 return linearish(scale);
12050 function sqrt$1() {
12051 return pow$1().exponent(0.5);
12054 function quantile() {
12059 function rescale() {
12060 var i = 0, n = Math.max(1, range.length);
12061 thresholds = new Array(n - 1);
12062 while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12066 function scale(x) {
12067 if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12070 scale.invertExtent = function(y) {
12071 var i = range.indexOf(y);
12072 return i < 0 ? [NaN, NaN] : [
12073 i > 0 ? thresholds[i - 1] : domain[0],
12074 i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12078 scale.domain = function(_) {
12079 if (!arguments.length) return domain.slice();
12081 for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12082 domain.sort(d3_ascending);
12086 scale.range = function(_) {
12087 return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12090 scale.quantiles = function() {
12091 return thresholds.slice();
12094 scale.copy = function() {
12103 function quantize() {
12110 function scale(x) {
12111 if (x <= x) return range[bisectRight(domain, x, 0, n)];
12114 function rescale() {
12116 domain = new Array(n);
12117 while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12121 scale.domain = function(_) {
12122 return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12125 scale.range = function(_) {
12126 return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12129 scale.invertExtent = function(y) {
12130 var i = range.indexOf(y);
12131 return i < 0 ? [NaN, NaN]
12132 : i < 1 ? [x0, domain[0]]
12133 : i >= n ? [domain[n - 1], x1]
12134 : [domain[i - 1], domain[i]];
12137 scale.copy = function() {
12143 return linearish(scale);
12146 function threshold$1() {
12147 var domain = [0.5],
12151 function scale(x) {
12152 if (x <= x) return range[bisectRight(domain, x, 0, n)];
12155 scale.domain = function(_) {
12156 return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12159 scale.range = function(_) {
12160 return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12163 scale.invertExtent = function(y) {
12164 var i = range.indexOf(y);
12165 return [domain[i - 1], domain[i]];
12168 scale.copy = function() {
12169 return threshold$1()
12177 var t0$1 = new Date;
12178 var t1$1 = new Date;
12180 function newInterval(floori, offseti, count, field) {
12182 function interval(date) {
12183 return floori(date = new Date(+date)), date;
12186 interval.floor = interval;
12188 interval.ceil = function(date) {
12189 return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12192 interval.round = function(date) {
12193 var d0 = interval(date),
12194 d1 = interval.ceil(date);
12195 return date - d0 < d1 - date ? d0 : d1;
12198 interval.offset = function(date, step) {
12199 return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12202 interval.range = function(start, stop, step) {
12204 start = interval.ceil(start);
12205 step = step == null ? 1 : Math.floor(step);
12206 if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12207 do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
12211 interval.filter = function(test) {
12212 return newInterval(function(date) {
12213 if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12214 }, function(date, step) {
12215 if (date >= date) {
12216 if (step < 0) while (++step <= 0) {
12217 while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12218 } else while (--step >= 0) {
12219 while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12226 interval.count = function(start, end) {
12227 t0$1.setTime(+start), t1$1.setTime(+end);
12228 floori(t0$1), floori(t1$1);
12229 return Math.floor(count(t0$1, t1$1));
12232 interval.every = function(step) {
12233 step = Math.floor(step);
12234 return !isFinite(step) || !(step > 0) ? null
12235 : !(step > 1) ? interval
12236 : interval.filter(field
12237 ? function(d) { return field(d) % step === 0; }
12238 : function(d) { return interval.count(0, d) % step === 0; });
12245 var millisecond = newInterval(function() {
12247 }, function(date, step) {
12248 date.setTime(+date + step);
12249 }, function(start, end) {
12250 return end - start;
12253 // An optimized implementation for this simple case.
12254 millisecond.every = function(k) {
12256 if (!isFinite(k) || !(k > 0)) return null;
12257 if (!(k > 1)) return millisecond;
12258 return newInterval(function(date) {
12259 date.setTime(Math.floor(date / k) * k);
12260 }, function(date, step) {
12261 date.setTime(+date + step * k);
12262 }, function(start, end) {
12263 return (end - start) / k;
12267 var milliseconds = millisecond.range;
12269 var durationSecond$1 = 1e3;
12270 var durationMinute$1 = 6e4;
12271 var durationHour$1 = 36e5;
12272 var durationDay$1 = 864e5;
12273 var durationWeek$1 = 6048e5;
12275 var second = newInterval(function(date) {
12276 date.setTime(Math.floor(date / durationSecond$1) * durationSecond$1);
12277 }, function(date, step) {
12278 date.setTime(+date + step * durationSecond$1);
12279 }, function(start, end) {
12280 return (end - start) / durationSecond$1;
12281 }, function(date) {
12282 return date.getUTCSeconds();
12285 var seconds = second.range;
12287 var minute = newInterval(function(date) {
12288 date.setTime(Math.floor(date / durationMinute$1) * durationMinute$1);
12289 }, function(date, step) {
12290 date.setTime(+date + step * durationMinute$1);
12291 }, function(start, end) {
12292 return (end - start) / durationMinute$1;
12293 }, function(date) {
12294 return date.getMinutes();
12297 var minutes = minute.range;
12299 var hour = newInterval(function(date) {
12300 var offset = date.getTimezoneOffset() * durationMinute$1 % durationHour$1;
12301 if (offset < 0) offset += durationHour$1;
12302 date.setTime(Math.floor((+date - offset) / durationHour$1) * durationHour$1 + offset);
12303 }, function(date, step) {
12304 date.setTime(+date + step * durationHour$1);
12305 }, function(start, end) {
12306 return (end - start) / durationHour$1;
12307 }, function(date) {
12308 return date.getHours();
12311 var hours = hour.range;
12313 var day = newInterval(function(date) {
12314 date.setHours(0, 0, 0, 0);
12315 }, function(date, step) {
12316 date.setDate(date.getDate() + step);
12317 }, function(start, end) {
12318 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1;
12319 }, function(date) {
12320 return date.getDate() - 1;
12323 var days = day.range;
12325 function weekday(i) {
12326 return newInterval(function(date) {
12327 date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12328 date.setHours(0, 0, 0, 0);
12329 }, function(date, step) {
12330 date.setDate(date.getDate() + step * 7);
12331 }, function(start, end) {
12332 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;
12336 var sunday = weekday(0);
12337 var monday = weekday(1);
12338 var tuesday = weekday(2);
12339 var wednesday = weekday(3);
12340 var thursday = weekday(4);
12341 var friday = weekday(5);
12342 var saturday = weekday(6);
12344 var sundays = sunday.range;
12345 var mondays = monday.range;
12346 var tuesdays = tuesday.range;
12347 var wednesdays = wednesday.range;
12348 var thursdays = thursday.range;
12349 var fridays = friday.range;
12350 var saturdays = saturday.range;
12352 var month = newInterval(function(date) {
12354 date.setHours(0, 0, 0, 0);
12355 }, function(date, step) {
12356 date.setMonth(date.getMonth() + step);
12357 }, function(start, end) {
12358 return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12359 }, function(date) {
12360 return date.getMonth();
12363 var months = month.range;
12365 var year = newInterval(function(date) {
12366 date.setMonth(0, 1);
12367 date.setHours(0, 0, 0, 0);
12368 }, function(date, step) {
12369 date.setFullYear(date.getFullYear() + step);
12370 }, function(start, end) {
12371 return end.getFullYear() - start.getFullYear();
12372 }, function(date) {
12373 return date.getFullYear();
12376 // An optimized implementation for this simple case.
12377 year.every = function(k) {
12378 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12379 date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12380 date.setMonth(0, 1);
12381 date.setHours(0, 0, 0, 0);
12382 }, function(date, step) {
12383 date.setFullYear(date.getFullYear() + step * k);
12387 var years = year.range;
12389 var utcMinute = newInterval(function(date) {
12390 date.setUTCSeconds(0, 0);
12391 }, function(date, step) {
12392 date.setTime(+date + step * durationMinute$1);
12393 }, function(start, end) {
12394 return (end - start) / durationMinute$1;
12395 }, function(date) {
12396 return date.getUTCMinutes();
12399 var utcMinutes = utcMinute.range;
12401 var utcHour = newInterval(function(date) {
12402 date.setUTCMinutes(0, 0, 0);
12403 }, function(date, step) {
12404 date.setTime(+date + step * durationHour$1);
12405 }, function(start, end) {
12406 return (end - start) / durationHour$1;
12407 }, function(date) {
12408 return date.getUTCHours();
12411 var utcHours = utcHour.range;
12413 var utcDay = newInterval(function(date) {
12414 date.setUTCHours(0, 0, 0, 0);
12415 }, function(date, step) {
12416 date.setUTCDate(date.getUTCDate() + step);
12417 }, function(start, end) {
12418 return (end - start) / durationDay$1;
12419 }, function(date) {
12420 return date.getUTCDate() - 1;
12423 var utcDays = utcDay.range;
12425 function utcWeekday(i) {
12426 return newInterval(function(date) {
12427 date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12428 date.setUTCHours(0, 0, 0, 0);
12429 }, function(date, step) {
12430 date.setUTCDate(date.getUTCDate() + step * 7);
12431 }, function(start, end) {
12432 return (end - start) / durationWeek$1;
12436 var utcSunday = utcWeekday(0);
12437 var utcMonday = utcWeekday(1);
12438 var utcTuesday = utcWeekday(2);
12439 var utcWednesday = utcWeekday(3);
12440 var utcThursday = utcWeekday(4);
12441 var utcFriday = utcWeekday(5);
12442 var utcSaturday = utcWeekday(6);
12444 var utcSundays = utcSunday.range;
12445 var utcMondays = utcMonday.range;
12446 var utcTuesdays = utcTuesday.range;
12447 var utcWednesdays = utcWednesday.range;
12448 var utcThursdays = utcThursday.range;
12449 var utcFridays = utcFriday.range;
12450 var utcSaturdays = utcSaturday.range;
12452 var utcMonth = newInterval(function(date) {
12453 date.setUTCDate(1);
12454 date.setUTCHours(0, 0, 0, 0);
12455 }, function(date, step) {
12456 date.setUTCMonth(date.getUTCMonth() + step);
12457 }, function(start, end) {
12458 return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12459 }, function(date) {
12460 return date.getUTCMonth();
12463 var utcMonths = utcMonth.range;
12465 var utcYear = newInterval(function(date) {
12466 date.setUTCMonth(0, 1);
12467 date.setUTCHours(0, 0, 0, 0);
12468 }, function(date, step) {
12469 date.setUTCFullYear(date.getUTCFullYear() + step);
12470 }, function(start, end) {
12471 return end.getUTCFullYear() - start.getUTCFullYear();
12472 }, function(date) {
12473 return date.getUTCFullYear();
12476 // An optimized implementation for this simple case.
12477 utcYear.every = function(k) {
12478 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12479 date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12480 date.setUTCMonth(0, 1);
12481 date.setUTCHours(0, 0, 0, 0);
12482 }, function(date, step) {
12483 date.setUTCFullYear(date.getUTCFullYear() + step * k);
12487 var utcYears = utcYear.range;
12489 function localDate(d) {
12490 if (0 <= d.y && d.y < 100) {
12491 var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12492 date.setFullYear(d.y);
12495 return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12498 function utcDate(d) {
12499 if (0 <= d.y && d.y < 100) {
12500 var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12501 date.setUTCFullYear(d.y);
12504 return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12507 function newYear(y) {
12508 return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12511 function formatLocale$1(locale) {
12512 var locale_dateTime = locale.dateTime,
12513 locale_date = locale.date,
12514 locale_time = locale.time,
12515 locale_periods = locale.periods,
12516 locale_weekdays = locale.days,
12517 locale_shortWeekdays = locale.shortDays,
12518 locale_months = locale.months,
12519 locale_shortMonths = locale.shortMonths;
12521 var periodRe = formatRe(locale_periods),
12522 periodLookup = formatLookup(locale_periods),
12523 weekdayRe = formatRe(locale_weekdays),
12524 weekdayLookup = formatLookup(locale_weekdays),
12525 shortWeekdayRe = formatRe(locale_shortWeekdays),
12526 shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12527 monthRe = formatRe(locale_months),
12528 monthLookup = formatLookup(locale_months),
12529 shortMonthRe = formatRe(locale_shortMonths),
12530 shortMonthLookup = formatLookup(locale_shortMonths);
12533 "a": formatShortWeekday,
12534 "A": formatWeekday,
12535 "b": formatShortMonth,
12538 "d": formatDayOfMonth,
12539 "e": formatDayOfMonth,
12542 "j": formatDayOfYear,
12543 "L": formatMilliseconds,
12544 "m": formatMonthNumber,
12545 "M": formatMinutes,
12547 "S": formatSeconds,
12548 "U": formatWeekNumberSunday,
12549 "w": formatWeekdayNumber,
12550 "W": formatWeekNumberMonday,
12554 "Y": formatFullYear,
12556 "%": formatLiteralPercent
12560 "a": formatUTCShortWeekday,
12561 "A": formatUTCWeekday,
12562 "b": formatUTCShortMonth,
12563 "B": formatUTCMonth,
12565 "d": formatUTCDayOfMonth,
12566 "e": formatUTCDayOfMonth,
12567 "H": formatUTCHour24,
12568 "I": formatUTCHour12,
12569 "j": formatUTCDayOfYear,
12570 "L": formatUTCMilliseconds,
12571 "m": formatUTCMonthNumber,
12572 "M": formatUTCMinutes,
12573 "p": formatUTCPeriod,
12574 "S": formatUTCSeconds,
12575 "U": formatUTCWeekNumberSunday,
12576 "w": formatUTCWeekdayNumber,
12577 "W": formatUTCWeekNumberMonday,
12580 "y": formatUTCYear,
12581 "Y": formatUTCFullYear,
12582 "Z": formatUTCZone,
12583 "%": formatLiteralPercent
12587 "a": parseShortWeekday,
12589 "b": parseShortMonth,
12591 "c": parseLocaleDateTime,
12592 "d": parseDayOfMonth,
12593 "e": parseDayOfMonth,
12596 "j": parseDayOfYear,
12597 "L": parseMilliseconds,
12598 "m": parseMonthNumber,
12602 "U": parseWeekNumberSunday,
12603 "w": parseWeekdayNumber,
12604 "W": parseWeekNumberMonday,
12605 "x": parseLocaleDate,
12606 "X": parseLocaleTime,
12608 "Y": parseFullYear,
12610 "%": parseLiteralPercent
12613 // These recursive directive definitions must be deferred.
12614 formats.x = newFormat(locale_date, formats);
12615 formats.X = newFormat(locale_time, formats);
12616 formats.c = newFormat(locale_dateTime, formats);
12617 utcFormats.x = newFormat(locale_date, utcFormats);
12618 utcFormats.X = newFormat(locale_time, utcFormats);
12619 utcFormats.c = newFormat(locale_dateTime, utcFormats);
12621 function newFormat(specifier, formats) {
12622 return function(date) {
12626 n = specifier.length,
12631 if (!(date instanceof Date)) date = new Date(+date);
12634 if (specifier.charCodeAt(i) === 37) {
12635 string.push(specifier.slice(j, i));
12636 if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12637 else pad = c === "e" ? " " : "0";
12638 if (format = formats[c]) c = format(date, pad);
12644 string.push(specifier.slice(j, i));
12645 return string.join("");
12649 function newParse(specifier, newDate) {
12650 return function(string) {
12651 var d = newYear(1900),
12652 i = parseSpecifier(d, specifier, string += "", 0);
12653 if (i != string.length) return null;
12655 // The am-pm flag is 0 for AM, and 1 for PM.
12656 if ("p" in d) d.H = d.H % 12 + d.p * 12;
12658 // Convert day-of-week and week-of-year to day-of-year.
12659 if ("W" in d || "U" in d) {
12660 if (!("w" in d)) d.w = "W" in d ? 1 : 0;
12661 var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12663 d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
12666 // If a time zone is specified, all fields are interpreted as UTC and then
12667 // offset according to the specified time zone.
12669 d.H += d.Z / 100 | 0;
12674 // Otherwise, all fields are in local time.
12679 function parseSpecifier(d, specifier, string, j) {
12681 n = specifier.length,
12687 if (j >= m) return -1;
12688 c = specifier.charCodeAt(i++);
12690 c = specifier.charAt(i++);
12691 parse = parses[c in pads ? specifier.charAt(i++) : c];
12692 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12693 } else if (c != string.charCodeAt(j++)) {
12701 function parsePeriod(d, string, i) {
12702 var n = periodRe.exec(string.slice(i));
12703 return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12706 function parseShortWeekday(d, string, i) {
12707 var n = shortWeekdayRe.exec(string.slice(i));
12708 return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12711 function parseWeekday(d, string, i) {
12712 var n = weekdayRe.exec(string.slice(i));
12713 return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12716 function parseShortMonth(d, string, i) {
12717 var n = shortMonthRe.exec(string.slice(i));
12718 return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12721 function parseMonth(d, string, i) {
12722 var n = monthRe.exec(string.slice(i));
12723 return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12726 function parseLocaleDateTime(d, string, i) {
12727 return parseSpecifier(d, locale_dateTime, string, i);
12730 function parseLocaleDate(d, string, i) {
12731 return parseSpecifier(d, locale_date, string, i);
12734 function parseLocaleTime(d, string, i) {
12735 return parseSpecifier(d, locale_time, string, i);
12738 function formatShortWeekday(d) {
12739 return locale_shortWeekdays[d.getDay()];
12742 function formatWeekday(d) {
12743 return locale_weekdays[d.getDay()];
12746 function formatShortMonth(d) {
12747 return locale_shortMonths[d.getMonth()];
12750 function formatMonth(d) {
12751 return locale_months[d.getMonth()];
12754 function formatPeriod(d) {
12755 return locale_periods[+(d.getHours() >= 12)];
12758 function formatUTCShortWeekday(d) {
12759 return locale_shortWeekdays[d.getUTCDay()];
12762 function formatUTCWeekday(d) {
12763 return locale_weekdays[d.getUTCDay()];
12766 function formatUTCShortMonth(d) {
12767 return locale_shortMonths[d.getUTCMonth()];
12770 function formatUTCMonth(d) {
12771 return locale_months[d.getUTCMonth()];
12774 function formatUTCPeriod(d) {
12775 return locale_periods[+(d.getUTCHours() >= 12)];
12779 format: function(specifier) {
12780 var f = newFormat(specifier += "", formats);
12781 f.toString = function() { return specifier; };
12784 parse: function(specifier) {
12785 var p = newParse(specifier += "", localDate);
12786 p.toString = function() { return specifier; };
12789 utcFormat: function(specifier) {
12790 var f = newFormat(specifier += "", utcFormats);
12791 f.toString = function() { return specifier; };
12794 utcParse: function(specifier) {
12795 var p = newParse(specifier, utcDate);
12796 p.toString = function() { return specifier; };
12802 var pads = {"-": "", "_": " ", "0": "0"};
12803 var numberRe = /^\s*\d+/;
12804 var percentRe = /^%/;
12805 var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
12807 function pad(value, fill, width) {
12808 var sign = value < 0 ? "-" : "",
12809 string = (sign ? -value : value) + "",
12810 length = string.length;
12811 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12814 function requote(s) {
12815 return s.replace(requoteRe, "\\$&");
12818 function formatRe(names) {
12819 return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12822 function formatLookup(names) {
12823 var map = {}, i = -1, n = names.length;
12824 while (++i < n) map[names[i].toLowerCase()] = i;
12828 function parseWeekdayNumber(d, string, i) {
12829 var n = numberRe.exec(string.slice(i, i + 1));
12830 return n ? (d.w = +n[0], i + n[0].length) : -1;
12833 function parseWeekNumberSunday(d, string, i) {
12834 var n = numberRe.exec(string.slice(i));
12835 return n ? (d.U = +n[0], i + n[0].length) : -1;
12838 function parseWeekNumberMonday(d, string, i) {
12839 var n = numberRe.exec(string.slice(i));
12840 return n ? (d.W = +n[0], i + n[0].length) : -1;
12843 function parseFullYear(d, string, i) {
12844 var n = numberRe.exec(string.slice(i, i + 4));
12845 return n ? (d.y = +n[0], i + n[0].length) : -1;
12848 function parseYear(d, string, i) {
12849 var n = numberRe.exec(string.slice(i, i + 2));
12850 return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12853 function parseZone(d, string, i) {
12854 var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
12855 return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12858 function parseMonthNumber(d, string, i) {
12859 var n = numberRe.exec(string.slice(i, i + 2));
12860 return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12863 function parseDayOfMonth(d, string, i) {
12864 var n = numberRe.exec(string.slice(i, i + 2));
12865 return n ? (d.d = +n[0], i + n[0].length) : -1;
12868 function parseDayOfYear(d, string, i) {
12869 var n = numberRe.exec(string.slice(i, i + 3));
12870 return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12873 function parseHour24(d, string, i) {
12874 var n = numberRe.exec(string.slice(i, i + 2));
12875 return n ? (d.H = +n[0], i + n[0].length) : -1;
12878 function parseMinutes(d, string, i) {
12879 var n = numberRe.exec(string.slice(i, i + 2));
12880 return n ? (d.M = +n[0], i + n[0].length) : -1;
12883 function parseSeconds(d, string, i) {
12884 var n = numberRe.exec(string.slice(i, i + 2));
12885 return n ? (d.S = +n[0], i + n[0].length) : -1;
12888 function parseMilliseconds(d, string, i) {
12889 var n = numberRe.exec(string.slice(i, i + 3));
12890 return n ? (d.L = +n[0], i + n[0].length) : -1;
12893 function parseLiteralPercent(d, string, i) {
12894 var n = percentRe.exec(string.slice(i, i + 1));
12895 return n ? i + n[0].length : -1;
12898 function formatDayOfMonth(d, p) {
12899 return pad(d.getDate(), p, 2);
12902 function formatHour24(d, p) {
12903 return pad(d.getHours(), p, 2);
12906 function formatHour12(d, p) {
12907 return pad(d.getHours() % 12 || 12, p, 2);
12910 function formatDayOfYear(d, p) {
12911 return pad(1 + day.count(year(d), d), p, 3);
12914 function formatMilliseconds(d, p) {
12915 return pad(d.getMilliseconds(), p, 3);
12918 function formatMonthNumber(d, p) {
12919 return pad(d.getMonth() + 1, p, 2);
12922 function formatMinutes(d, p) {
12923 return pad(d.getMinutes(), p, 2);
12926 function formatSeconds(d, p) {
12927 return pad(d.getSeconds(), p, 2);
12930 function formatWeekNumberSunday(d, p) {
12931 return pad(sunday.count(year(d), d), p, 2);
12934 function formatWeekdayNumber(d) {
12938 function formatWeekNumberMonday(d, p) {
12939 return pad(monday.count(year(d), d), p, 2);
12942 function formatYear(d, p) {
12943 return pad(d.getFullYear() % 100, p, 2);
12946 function formatFullYear(d, p) {
12947 return pad(d.getFullYear() % 10000, p, 4);
12950 function formatZone(d) {
12951 var z = d.getTimezoneOffset();
12952 return (z > 0 ? "-" : (z *= -1, "+"))
12953 + pad(z / 60 | 0, "0", 2)
12954 + pad(z % 60, "0", 2);
12957 function formatUTCDayOfMonth(d, p) {
12958 return pad(d.getUTCDate(), p, 2);
12961 function formatUTCHour24(d, p) {
12962 return pad(d.getUTCHours(), p, 2);
12965 function formatUTCHour12(d, p) {
12966 return pad(d.getUTCHours() % 12 || 12, p, 2);
12969 function formatUTCDayOfYear(d, p) {
12970 return pad(1 + utcDay.count(utcYear(d), d), p, 3);
12973 function formatUTCMilliseconds(d, p) {
12974 return pad(d.getUTCMilliseconds(), p, 3);
12977 function formatUTCMonthNumber(d, p) {
12978 return pad(d.getUTCMonth() + 1, p, 2);
12981 function formatUTCMinutes(d, p) {
12982 return pad(d.getUTCMinutes(), p, 2);
12985 function formatUTCSeconds(d, p) {
12986 return pad(d.getUTCSeconds(), p, 2);
12989 function formatUTCWeekNumberSunday(d, p) {
12990 return pad(utcSunday.count(utcYear(d), d), p, 2);
12993 function formatUTCWeekdayNumber(d) {
12994 return d.getUTCDay();
12997 function formatUTCWeekNumberMonday(d, p) {
12998 return pad(utcMonday.count(utcYear(d), d), p, 2);
13001 function formatUTCYear(d, p) {
13002 return pad(d.getUTCFullYear() % 100, p, 2);
13005 function formatUTCFullYear(d, p) {
13006 return pad(d.getUTCFullYear() % 10000, p, 4);
13009 function formatUTCZone() {
13013 function formatLiteralPercent() {
13024 dateTime: "%x, %X",
13025 date: "%-m/%-d/%Y",
13026 time: "%-I:%M:%S %p",
13027 periods: ["AM", "PM"],
13028 days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13029 shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13030 months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13031 shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13034 function defaultLocale$1(definition) {
13035 locale$2 = formatLocale$1(definition);
13036 timeFormat = locale$2.format;
13037 timeParse = locale$2.parse;
13038 utcFormat = locale$2.utcFormat;
13039 utcParse = locale$2.utcParse;
13043 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13045 function formatIsoNative(date) {
13046 return date.toISOString();
13049 var formatIso = Date.prototype.toISOString
13051 : utcFormat(isoSpecifier);
13053 function parseIsoNative(string) {
13054 var date = new Date(string);
13055 return isNaN(date) ? null : date;
13058 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13060 : utcParse(isoSpecifier);
13062 var durationSecond = 1000;
13063 var durationMinute = durationSecond * 60;
13064 var durationHour = durationMinute * 60;
13065 var durationDay = durationHour * 24;
13066 var durationWeek = durationDay * 7;
13067 var durationMonth = durationDay * 30;
13068 var durationYear = durationDay * 365;
13070 function date$1(t) {
13071 return new Date(t);
13074 function number$3(t) {
13075 return t instanceof Date ? +t : +new Date(+t);
13078 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13079 var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13080 invert = scale.invert,
13081 domain = scale.domain;
13083 var formatMillisecond = format(".%L"),
13084 formatSecond = format(":%S"),
13085 formatMinute = format("%I:%M"),
13086 formatHour = format("%I %p"),
13087 formatDay = format("%a %d"),
13088 formatWeek = format("%b %d"),
13089 formatMonth = format("%B"),
13090 formatYear = format("%Y");
13092 var tickIntervals = [
13093 [second$$1, 1, durationSecond],
13094 [second$$1, 5, 5 * durationSecond],
13095 [second$$1, 15, 15 * durationSecond],
13096 [second$$1, 30, 30 * durationSecond],
13097 [minute$$1, 1, durationMinute],
13098 [minute$$1, 5, 5 * durationMinute],
13099 [minute$$1, 15, 15 * durationMinute],
13100 [minute$$1, 30, 30 * durationMinute],
13101 [ hour$$1, 1, durationHour ],
13102 [ hour$$1, 3, 3 * durationHour ],
13103 [ hour$$1, 6, 6 * durationHour ],
13104 [ hour$$1, 12, 12 * durationHour ],
13105 [ day$$1, 1, durationDay ],
13106 [ day$$1, 2, 2 * durationDay ],
13107 [ week, 1, durationWeek ],
13108 [ month$$1, 1, durationMonth ],
13109 [ month$$1, 3, 3 * durationMonth ],
13110 [ year$$1, 1, durationYear ]
13113 function tickFormat(date$$1) {
13114 return (second$$1(date$$1) < date$$1 ? formatMillisecond
13115 : minute$$1(date$$1) < date$$1 ? formatSecond
13116 : hour$$1(date$$1) < date$$1 ? formatMinute
13117 : day$$1(date$$1) < date$$1 ? formatHour
13118 : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13119 : year$$1(date$$1) < date$$1 ? formatMonth
13120 : formatYear)(date$$1);
13123 function tickInterval(interval$$1, start, stop, step) {
13124 if (interval$$1 == null) interval$$1 = 10;
13126 // If a desired tick count is specified, pick a reasonable tick interval
13127 // based on the extent of the domain and a rough estimate of tick size.
13128 // Otherwise, assume interval is already a time interval and use it.
13129 if (typeof interval$$1 === "number") {
13130 var target = Math.abs(stop - start) / interval$$1,
13131 i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13132 if (i === tickIntervals.length) {
13133 step = tickStep(start / durationYear, stop / durationYear, interval$$1);
13134 interval$$1 = year$$1;
13136 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13138 interval$$1 = i[0];
13140 step = tickStep(start, stop, interval$$1);
13141 interval$$1 = millisecond$$1;
13145 return step == null ? interval$$1 : interval$$1.every(step);
13148 scale.invert = function(y) {
13149 return new Date(invert(y));
13152 scale.domain = function(_) {
13153 return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1);
13156 scale.ticks = function(interval$$1, step) {
13159 t1 = d[d.length - 1],
13162 if (r) t = t0, t0 = t1, t1 = t;
13163 t = tickInterval(interval$$1, t0, t1, step);
13164 t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13165 return r ? t.reverse() : t;
13168 scale.tickFormat = function(count, specifier) {
13169 return specifier == null ? tickFormat : format(specifier);
13172 scale.nice = function(interval$$1, step) {
13174 return (interval$$1 = tickInterval(interval$$1, d[0], d[d.length - 1], step))
13175 ? domain(nice(d, interval$$1))
13179 scale.copy = function() {
13180 return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13186 var time = function() {
13187 return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13190 var utcTime = function() {
13191 return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13194 var colors = function(s) {
13195 return s.match(/.{6}/g).map(function(x) {
13200 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13202 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13204 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13206 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13208 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13210 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13212 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13214 var rainbow = cubehelix();
13216 var rainbow$1 = function(t) {
13217 if (t < 0 || t > 1) t -= Math.floor(t);
13218 var ts = Math.abs(t - 0.5);
13219 rainbow.h = 360 * t - 100;
13220 rainbow.s = 1.5 - 1.5 * ts;
13221 rainbow.l = 0.8 - 0.9 * ts;
13222 return rainbow + "";
13225 function ramp(range) {
13226 var n = range.length;
13227 return function(t) {
13228 return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13232 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13234 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13236 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13238 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13240 function sequential(interpolator) {
13245 function scale(x) {
13246 var t = (x - x0) / (x1 - x0);
13247 return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13250 scale.domain = function(_) {
13251 return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13254 scale.clamp = function(_) {
13255 return arguments.length ? (clamp = !!_, scale) : clamp;
13258 scale.interpolator = function(_) {
13259 return arguments.length ? (interpolator = _, scale) : interpolator;
13262 scale.copy = function() {
13263 return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13266 return linearish(scale);
13269 var constant$10 = function(x) {
13270 return function constant() {
13275 var abs$1 = Math.abs;
13276 var atan2$1 = Math.atan2;
13277 var cos$2 = Math.cos;
13278 var max$2 = Math.max;
13279 var min$1 = Math.min;
13280 var sin$2 = Math.sin;
13281 var sqrt$2 = Math.sqrt;
13283 var epsilon$3 = 1e-12;
13284 var pi$4 = Math.PI;
13285 var halfPi$3 = pi$4 / 2;
13286 var tau$4 = 2 * pi$4;
13288 function acos$1(x) {
13289 return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13292 function asin$1(x) {
13293 return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13296 function arcInnerRadius(d) {
13297 return d.innerRadius;
13300 function arcOuterRadius(d) {
13301 return d.outerRadius;
13304 function arcStartAngle(d) {
13305 return d.startAngle;
13308 function arcEndAngle(d) {
13312 function arcPadAngle(d) {
13313 return d && d.padAngle; // Note: optional!
13316 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13317 var x10 = x1 - x0, y10 = y1 - y0,
13318 x32 = x3 - x2, y32 = y3 - y2,
13319 t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13320 return [x0 + t * x10, y0 + t * y10];
13323 // Compute perpendicular offset line of length rc.
13324 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13325 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13328 lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13335 x00 = (x11 + x10) / 2,
13336 y00 = (y11 + y10) / 2,
13339 d2 = dx * dx + dy * dy,
13341 D = x11 * y10 - x10 * y11,
13342 d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13343 cx0 = (D * dy - dx * d) / d2,
13344 cy0 = (-D * dx - dy * d) / d2,
13345 cx1 = (D * dy + dx * d) / d2,
13346 cy1 = (-D * dx + dy * d) / d2,
13352 // Pick the closer of the two intersection points.
13353 // TODO Is there a faster way to determine which intersection to use?
13354 if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13361 x11: cx0 * (r1 / r - 1),
13362 y11: cy0 * (r1 / r - 1)
13366 var arc = function() {
13367 var innerRadius = arcInnerRadius,
13368 outerRadius = arcOuterRadius,
13369 cornerRadius = constant$10(0),
13371 startAngle = arcStartAngle,
13372 endAngle = arcEndAngle,
13373 padAngle = arcPadAngle,
13379 r0 = +innerRadius.apply(this, arguments),
13380 r1 = +outerRadius.apply(this, arguments),
13381 a0 = startAngle.apply(this, arguments) - halfPi$3,
13382 a1 = endAngle.apply(this, arguments) - halfPi$3,
13383 da = abs$1(a1 - a0),
13386 if (!context) context = buffer = path();
13388 // Ensure that the outer radius is always larger than the inner radius.
13389 if (r1 < r0) r = r1, r1 = r0, r0 = r;
13392 if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13394 // Or is it a circle or annulus?
13395 else if (da > tau$4 - epsilon$3) {
13396 context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13397 context.arc(0, 0, r1, a0, a1, !cw);
13398 if (r0 > epsilon$3) {
13399 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13400 context.arc(0, 0, r0, a1, a0, cw);
13404 // Or is it a circular or annular sector?
13412 ap = padAngle.apply(this, arguments) / 2,
13413 rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13414 rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13420 // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13421 if (rp > epsilon$3) {
13422 var p0 = asin$1(rp / r0 * sin$2(ap)),
13423 p1 = asin$1(rp / r1 * sin$2(ap));
13424 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13425 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13426 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13427 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13430 var x01 = r1 * cos$2(a01),
13431 y01 = r1 * sin$2(a01),
13432 x10 = r0 * cos$2(a10),
13433 y10 = r0 * sin$2(a10);
13435 // Apply rounded corners?
13436 if (rc > epsilon$3) {
13437 var x11 = r1 * cos$2(a11),
13438 y11 = r1 * sin$2(a11),
13439 x00 = r0 * cos$2(a00),
13440 y00 = r0 * sin$2(a00);
13442 // Restrict the corner radius according to the sector angle.
13444 var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13449 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13450 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13451 rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13452 rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13456 // Is the sector collapsed to a line?
13457 if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13459 // Does the sector’s outer ring have rounded corners?
13460 else if (rc1 > epsilon$3) {
13461 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13462 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13464 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13466 // Have the corners merged?
13467 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13469 // Otherwise, draw the two corners and the ring.
13471 context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13472 context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
13473 context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13477 // Or is the outer ring just a circular arc?
13478 else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13480 // Is there no inner ring, and it’s a circular sector?
13481 // Or perhaps it’s an annular sector collapsed due to padding?
13482 if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13484 // Does the sector’s inner ring (or point) have rounded corners?
13485 else if (rc0 > epsilon$3) {
13486 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13487 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13489 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13491 // Have the corners merged?
13492 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13494 // Otherwise, draw the two corners and the ring.
13496 context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13497 context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
13498 context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13502 // Or is the inner ring just a circular arc?
13503 else context.arc(0, 0, r0, a10, a00, cw);
13506 context.closePath();
13508 if (buffer) return context = null, buffer + "" || null;
13511 arc.centroid = function() {
13512 var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13513 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13514 return [cos$2(a) * r, sin$2(a) * r];
13517 arc.innerRadius = function(_) {
13518 return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13521 arc.outerRadius = function(_) {
13522 return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13525 arc.cornerRadius = function(_) {
13526 return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13529 arc.padRadius = function(_) {
13530 return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13533 arc.startAngle = function(_) {
13534 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13537 arc.endAngle = function(_) {
13538 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13541 arc.padAngle = function(_) {
13542 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13545 arc.context = function(_) {
13546 return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13552 function Linear(context) {
13553 this._context = context;
13556 Linear.prototype = {
13557 areaStart: function() {
13560 areaEnd: function() {
13563 lineStart: function() {
13566 lineEnd: function() {
13567 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13568 this._line = 1 - this._line;
13570 point: function(x, y) {
13572 switch (this._point) {
13573 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13574 case 1: this._point = 2; // proceed
13575 default: this._context.lineTo(x, y); break;
13580 var curveLinear = function(context) {
13581 return new Linear(context);
13592 var line = function() {
13595 defined = constant$10(true),
13597 curve = curveLinear,
13600 function line(data) {
13607 if (context == null) output = curve(buffer = path());
13609 for (i = 0; i <= n; ++i) {
13610 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13611 if (defined0 = !defined0) output.lineStart();
13612 else output.lineEnd();
13614 if (defined0) output.point(+x(d, i, data), +y(d, i, data));
13617 if (buffer) return output = null, buffer + "" || null;
13620 line.x = function(_) {
13621 return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), line) : x;
13624 line.y = function(_) {
13625 return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), line) : y;
13628 line.defined = function(_) {
13629 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13632 line.curve = function(_) {
13633 return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13636 line.context = function(_) {
13637 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13643 var area = function() {
13646 y0 = constant$10(0),
13648 defined = constant$10(true),
13650 curve = curveLinear,
13653 function area(data) {
13661 x0z = new Array(n),
13662 y0z = new Array(n);
13664 if (context == null) output = curve(buffer = path());
13666 for (i = 0; i <= n; ++i) {
13667 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13668 if (defined0 = !defined0) {
13670 output.areaStart();
13671 output.lineStart();
13674 output.lineStart();
13675 for (k = i - 1; k >= j; --k) {
13676 output.point(x0z[k], y0z[k]);
13683 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13684 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13688 if (buffer) return output = null, buffer + "" || null;
13691 function arealine() {
13692 return line().defined(defined).curve(curve).context(context);
13695 area.x = function(_) {
13696 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13699 area.x0 = function(_) {
13700 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13703 area.x1 = function(_) {
13704 return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13707 area.y = function(_) {
13708 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13711 area.y0 = function(_) {
13712 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13715 area.y1 = function(_) {
13716 return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13720 area.lineY0 = function() {
13721 return arealine().x(x0).y(y0);
13724 area.lineY1 = function() {
13725 return arealine().x(x0).y(y1);
13728 area.lineX1 = function() {
13729 return arealine().x(x1).y(y0);
13732 area.defined = function(_) {
13733 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13736 area.curve = function(_) {
13737 return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13740 area.context = function(_) {
13741 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13747 var descending = function(a, b) {
13748 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13751 var identity$6 = function(d) {
13755 var pie = function() {
13756 var value = identity$6,
13757 sortValues = descending,
13759 startAngle = constant$10(0),
13760 endAngle = constant$10(tau$4),
13761 padAngle = constant$10(0);
13763 function pie(data) {
13769 index = new Array(n),
13770 arcs = new Array(n),
13771 a0 = +startAngle.apply(this, arguments),
13772 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13774 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13775 pa = p * (da < 0 ? -1 : 1),
13778 for (i = 0; i < n; ++i) {
13779 if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13784 // Optionally sort the arcs by previously-computed values or by data.
13785 if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13786 else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13788 // Compute the arcs! They are stored in the original data's order.
13789 for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13790 j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13803 pie.value = function(_) {
13804 return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13807 pie.sortValues = function(_) {
13808 return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13811 pie.sort = function(_) {
13812 return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13815 pie.startAngle = function(_) {
13816 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13819 pie.endAngle = function(_) {
13820 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13823 pie.padAngle = function(_) {
13824 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13830 var curveRadialLinear = curveRadial(curveLinear);
13832 function Radial(curve) {
13833 this._curve = curve;
13836 Radial.prototype = {
13837 areaStart: function() {
13838 this._curve.areaStart();
13840 areaEnd: function() {
13841 this._curve.areaEnd();
13843 lineStart: function() {
13844 this._curve.lineStart();
13846 lineEnd: function() {
13847 this._curve.lineEnd();
13849 point: function(a, r) {
13850 this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13854 function curveRadial(curve) {
13856 function radial(context) {
13857 return new Radial(curve(context));
13860 radial._curve = curve;
13865 function lineRadial(l) {
13868 l.angle = l.x, delete l.x;
13869 l.radius = l.y, delete l.y;
13871 l.curve = function(_) {
13872 return arguments.length ? c(curveRadial(_)) : c()._curve;
13878 var lineRadial$1 = function() {
13879 return lineRadial(line().curve(curveRadialLinear));
13882 var areaRadial = function() {
13883 var a = area().curve(curveRadialLinear),
13890 a.angle = a.x, delete a.x;
13891 a.startAngle = a.x0, delete a.x0;
13892 a.endAngle = a.x1, delete a.x1;
13893 a.radius = a.y, delete a.y;
13894 a.innerRadius = a.y0, delete a.y0;
13895 a.outerRadius = a.y1, delete a.y1;
13896 a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
13897 a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
13898 a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
13899 a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
13901 a.curve = function(_) {
13902 return arguments.length ? c(curveRadial(_)) : c()._curve;
13908 var pointRadial = function(x, y) {
13909 return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
13912 var slice$6 = Array.prototype.slice;
13914 function linkSource(d) {
13918 function linkTarget(d) {
13922 function link$2(curve) {
13923 var source = linkSource,
13924 target = linkTarget,
13930 var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
13931 if (!context) context = buffer = path();
13932 curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
13933 if (buffer) return context = null, buffer + "" || null;
13936 link.source = function(_) {
13937 return arguments.length ? (source = _, link) : source;
13940 link.target = function(_) {
13941 return arguments.length ? (target = _, link) : target;
13944 link.x = function(_) {
13945 return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), link) : x;
13948 link.y = function(_) {
13949 return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), link) : y;
13952 link.context = function(_) {
13953 return arguments.length ? ((context = _ == null ? null : _), link) : context;
13959 function curveHorizontal(context, x0, y0, x1, y1) {
13960 context.moveTo(x0, y0);
13961 context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
13964 function curveVertical(context, x0, y0, x1, y1) {
13965 context.moveTo(x0, y0);
13966 context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
13969 function curveRadial$1(context, x0, y0, x1, y1) {
13970 var p0 = pointRadial(x0, y0),
13971 p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
13972 p2 = pointRadial(x1, y0),
13973 p3 = pointRadial(x1, y1);
13974 context.moveTo(p0[0], p0[1]);
13975 context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
13978 function linkHorizontal() {
13979 return link$2(curveHorizontal);
13982 function linkVertical() {
13983 return link$2(curveVertical);
13986 function linkRadial() {
13987 var l = link$2(curveRadial$1);
13988 l.angle = l.x, delete l.x;
13989 l.radius = l.y, delete l.y;
13994 draw: function(context, size) {
13995 var r = Math.sqrt(size / pi$4);
13996 context.moveTo(r, 0);
13997 context.arc(0, 0, r, 0, tau$4);
14002 draw: function(context, size) {
14003 var r = Math.sqrt(size / 5) / 2;
14004 context.moveTo(-3 * r, -r);
14005 context.lineTo(-r, -r);
14006 context.lineTo(-r, -3 * r);
14007 context.lineTo(r, -3 * r);
14008 context.lineTo(r, -r);
14009 context.lineTo(3 * r, -r);
14010 context.lineTo(3 * r, r);
14011 context.lineTo(r, r);
14012 context.lineTo(r, 3 * r);
14013 context.lineTo(-r, 3 * r);
14014 context.lineTo(-r, r);
14015 context.lineTo(-3 * r, r);
14016 context.closePath();
14020 var tan30 = Math.sqrt(1 / 3);
14021 var tan30_2 = tan30 * 2;
14024 draw: function(context, size) {
14025 var y = Math.sqrt(size / tan30_2),
14027 context.moveTo(0, -y);
14028 context.lineTo(x, 0);
14029 context.lineTo(0, y);
14030 context.lineTo(-x, 0);
14031 context.closePath();
14035 var ka = 0.89081309152928522810;
14036 var kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10);
14037 var kx = Math.sin(tau$4 / 10) * kr;
14038 var ky = -Math.cos(tau$4 / 10) * kr;
14041 draw: function(context, size) {
14042 var r = Math.sqrt(size * ka),
14045 context.moveTo(0, -r);
14046 context.lineTo(x, y);
14047 for (var i = 1; i < 5; ++i) {
14048 var a = tau$4 * i / 5,
14051 context.lineTo(s * r, -c * r);
14052 context.lineTo(c * x - s * y, s * x + c * y);
14054 context.closePath();
14059 draw: function(context, size) {
14060 var w = Math.sqrt(size),
14062 context.rect(x, x, w, w);
14066 var sqrt3 = Math.sqrt(3);
14069 draw: function(context, size) {
14070 var y = -Math.sqrt(size / (sqrt3 * 3));
14071 context.moveTo(0, y * 2);
14072 context.lineTo(-sqrt3 * y, -y);
14073 context.lineTo(sqrt3 * y, -y);
14074 context.closePath();
14079 var s = Math.sqrt(3) / 2;
14080 var k = 1 / Math.sqrt(12);
14081 var a = (k / 2 + 1) * 3;
14084 draw: function(context, size) {
14085 var r = Math.sqrt(size / a),
14092 context.moveTo(x0, y0);
14093 context.lineTo(x1, y1);
14094 context.lineTo(x2, y2);
14095 context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14096 context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14097 context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14098 context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14099 context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14100 context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14101 context.closePath();
14115 var symbol = function() {
14116 var type = constant$10(circle$2),
14117 size = constant$10(64),
14120 function symbol() {
14122 if (!context) context = buffer = path();
14123 type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14124 if (buffer) return context = null, buffer + "" || null;
14127 symbol.type = function(_) {
14128 return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14131 symbol.size = function(_) {
14132 return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14135 symbol.context = function(_) {
14136 return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14142 var noop$2 = function() {};
14144 function point$2(that, x, y) {
14145 that._context.bezierCurveTo(
14146 (2 * that._x0 + that._x1) / 3,
14147 (2 * that._y0 + that._y1) / 3,
14148 (that._x0 + 2 * that._x1) / 3,
14149 (that._y0 + 2 * that._y1) / 3,
14150 (that._x0 + 4 * that._x1 + x) / 6,
14151 (that._y0 + 4 * that._y1 + y) / 6
14155 function Basis(context) {
14156 this._context = context;
14159 Basis.prototype = {
14160 areaStart: function() {
14163 areaEnd: function() {
14166 lineStart: function() {
14167 this._x0 = this._x1 =
14168 this._y0 = this._y1 = NaN;
14171 lineEnd: function() {
14172 switch (this._point) {
14173 case 3: point$2(this, this._x1, this._y1); // proceed
14174 case 2: this._context.lineTo(this._x1, this._y1); break;
14176 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14177 this._line = 1 - this._line;
14179 point: function(x, y) {
14181 switch (this._point) {
14182 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14183 case 1: this._point = 2; break;
14184 case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14185 default: point$2(this, x, y); break;
14187 this._x0 = this._x1, this._x1 = x;
14188 this._y0 = this._y1, this._y1 = y;
14192 var basis$2 = function(context) {
14193 return new Basis(context);
14196 function BasisClosed(context) {
14197 this._context = context;
14200 BasisClosed.prototype = {
14203 lineStart: function() {
14204 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14205 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14208 lineEnd: function() {
14209 switch (this._point) {
14211 this._context.moveTo(this._x2, this._y2);
14212 this._context.closePath();
14216 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14217 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14218 this._context.closePath();
14222 this.point(this._x2, this._y2);
14223 this.point(this._x3, this._y3);
14224 this.point(this._x4, this._y4);
14229 point: function(x, y) {
14231 switch (this._point) {
14232 case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14233 case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14234 case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
14235 default: point$2(this, x, y); break;
14237 this._x0 = this._x1, this._x1 = x;
14238 this._y0 = this._y1, this._y1 = y;
14242 var basisClosed$1 = function(context) {
14243 return new BasisClosed(context);
14246 function BasisOpen(context) {
14247 this._context = context;
14250 BasisOpen.prototype = {
14251 areaStart: function() {
14254 areaEnd: function() {
14257 lineStart: function() {
14258 this._x0 = this._x1 =
14259 this._y0 = this._y1 = NaN;
14262 lineEnd: function() {
14263 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14264 this._line = 1 - this._line;
14266 point: function(x, y) {
14268 switch (this._point) {
14269 case 0: this._point = 1; break;
14270 case 1: this._point = 2; break;
14271 case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
14272 case 3: this._point = 4; // proceed
14273 default: point$2(this, x, y); break;
14275 this._x0 = this._x1, this._x1 = x;
14276 this._y0 = this._y1, this._y1 = y;
14280 var basisOpen = function(context) {
14281 return new BasisOpen(context);
14284 function Bundle(context, beta) {
14285 this._basis = new Basis(context);
14289 Bundle.prototype = {
14290 lineStart: function() {
14293 this._basis.lineStart();
14295 lineEnd: function() {
14311 this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14312 this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14317 this._x = this._y = null;
14318 this._basis.lineEnd();
14320 point: function(x, y) {
14326 var bundle = (function custom(beta) {
14328 function bundle(context) {
14329 return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14332 bundle.beta = function(beta) {
14333 return custom(+beta);
14339 function point$3(that, x, y) {
14340 that._context.bezierCurveTo(
14341 that._x1 + that._k * (that._x2 - that._x0),
14342 that._y1 + that._k * (that._y2 - that._y0),
14343 that._x2 + that._k * (that._x1 - x),
14344 that._y2 + that._k * (that._y1 - y),
14350 function Cardinal(context, tension) {
14351 this._context = context;
14352 this._k = (1 - tension) / 6;
14355 Cardinal.prototype = {
14356 areaStart: function() {
14359 areaEnd: function() {
14362 lineStart: function() {
14363 this._x0 = this._x1 = this._x2 =
14364 this._y0 = this._y1 = this._y2 = NaN;
14367 lineEnd: function() {
14368 switch (this._point) {
14369 case 2: this._context.lineTo(this._x2, this._y2); break;
14370 case 3: point$3(this, this._x1, this._y1); break;
14372 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14373 this._line = 1 - this._line;
14375 point: function(x, y) {
14377 switch (this._point) {
14378 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14379 case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14380 case 2: this._point = 3; // proceed
14381 default: point$3(this, x, y); break;
14383 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14384 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14388 var cardinal = (function custom(tension) {
14390 function cardinal(context) {
14391 return new Cardinal(context, tension);
14394 cardinal.tension = function(tension) {
14395 return custom(+tension);
14401 function CardinalClosed(context, tension) {
14402 this._context = context;
14403 this._k = (1 - tension) / 6;
14406 CardinalClosed.prototype = {
14409 lineStart: function() {
14410 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14411 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14414 lineEnd: function() {
14415 switch (this._point) {
14417 this._context.moveTo(this._x3, this._y3);
14418 this._context.closePath();
14422 this._context.lineTo(this._x3, this._y3);
14423 this._context.closePath();
14427 this.point(this._x3, this._y3);
14428 this.point(this._x4, this._y4);
14429 this.point(this._x5, this._y5);
14434 point: function(x, y) {
14436 switch (this._point) {
14437 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14438 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14439 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14440 default: point$3(this, x, y); break;
14442 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14443 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14447 var cardinalClosed = (function custom(tension) {
14449 function cardinal$$1(context) {
14450 return new CardinalClosed(context, tension);
14453 cardinal$$1.tension = function(tension) {
14454 return custom(+tension);
14457 return cardinal$$1;
14460 function CardinalOpen(context, tension) {
14461 this._context = context;
14462 this._k = (1 - tension) / 6;
14465 CardinalOpen.prototype = {
14466 areaStart: function() {
14469 areaEnd: function() {
14472 lineStart: function() {
14473 this._x0 = this._x1 = this._x2 =
14474 this._y0 = this._y1 = this._y2 = NaN;
14477 lineEnd: function() {
14478 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14479 this._line = 1 - this._line;
14481 point: function(x, y) {
14483 switch (this._point) {
14484 case 0: this._point = 1; break;
14485 case 1: this._point = 2; break;
14486 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14487 case 3: this._point = 4; // proceed
14488 default: point$3(this, x, y); break;
14490 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14491 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14495 var cardinalOpen = (function custom(tension) {
14497 function cardinal$$1(context) {
14498 return new CardinalOpen(context, tension);
14501 cardinal$$1.tension = function(tension) {
14502 return custom(+tension);
14505 return cardinal$$1;
14508 function point$4(that, x, y) {
14514 if (that._l01_a > epsilon$3) {
14515 var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14516 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14517 x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14518 y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14521 if (that._l23_a > epsilon$3) {
14522 var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14523 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14524 x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14525 y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14528 that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14531 function CatmullRom(context, alpha) {
14532 this._context = context;
14533 this._alpha = alpha;
14536 CatmullRom.prototype = {
14537 areaStart: function() {
14540 areaEnd: function() {
14543 lineStart: function() {
14544 this._x0 = this._x1 = this._x2 =
14545 this._y0 = this._y1 = this._y2 = NaN;
14546 this._l01_a = this._l12_a = this._l23_a =
14547 this._l01_2a = this._l12_2a = this._l23_2a =
14550 lineEnd: function() {
14551 switch (this._point) {
14552 case 2: this._context.lineTo(this._x2, this._y2); break;
14553 case 3: this.point(this._x2, this._y2); break;
14555 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14556 this._line = 1 - this._line;
14558 point: function(x, y) {
14562 var x23 = this._x2 - x,
14563 y23 = this._y2 - y;
14564 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14567 switch (this._point) {
14568 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14569 case 1: this._point = 2; break;
14570 case 2: this._point = 3; // proceed
14571 default: point$4(this, x, y); break;
14574 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14575 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14576 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14577 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14581 var catmullRom = (function custom(alpha) {
14583 function catmullRom(context) {
14584 return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14587 catmullRom.alpha = function(alpha) {
14588 return custom(+alpha);
14594 function CatmullRomClosed(context, alpha) {
14595 this._context = context;
14596 this._alpha = alpha;
14599 CatmullRomClosed.prototype = {
14602 lineStart: function() {
14603 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14604 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14605 this._l01_a = this._l12_a = this._l23_a =
14606 this._l01_2a = this._l12_2a = this._l23_2a =
14609 lineEnd: function() {
14610 switch (this._point) {
14612 this._context.moveTo(this._x3, this._y3);
14613 this._context.closePath();
14617 this._context.lineTo(this._x3, this._y3);
14618 this._context.closePath();
14622 this.point(this._x3, this._y3);
14623 this.point(this._x4, this._y4);
14624 this.point(this._x5, this._y5);
14629 point: function(x, y) {
14633 var x23 = this._x2 - x,
14634 y23 = this._y2 - y;
14635 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14638 switch (this._point) {
14639 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14640 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14641 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14642 default: point$4(this, x, y); break;
14645 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14646 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14647 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14648 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14652 var catmullRomClosed = (function custom(alpha) {
14654 function catmullRom$$1(context) {
14655 return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14658 catmullRom$$1.alpha = function(alpha) {
14659 return custom(+alpha);
14662 return catmullRom$$1;
14665 function CatmullRomOpen(context, alpha) {
14666 this._context = context;
14667 this._alpha = alpha;
14670 CatmullRomOpen.prototype = {
14671 areaStart: function() {
14674 areaEnd: function() {
14677 lineStart: function() {
14678 this._x0 = this._x1 = this._x2 =
14679 this._y0 = this._y1 = this._y2 = NaN;
14680 this._l01_a = this._l12_a = this._l23_a =
14681 this._l01_2a = this._l12_2a = this._l23_2a =
14684 lineEnd: function() {
14685 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14686 this._line = 1 - this._line;
14688 point: function(x, y) {
14692 var x23 = this._x2 - x,
14693 y23 = this._y2 - y;
14694 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14697 switch (this._point) {
14698 case 0: this._point = 1; break;
14699 case 1: this._point = 2; break;
14700 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14701 case 3: this._point = 4; // proceed
14702 default: point$4(this, x, y); break;
14705 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14706 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14707 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14708 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14712 var catmullRomOpen = (function custom(alpha) {
14714 function catmullRom$$1(context) {
14715 return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14718 catmullRom$$1.alpha = function(alpha) {
14719 return custom(+alpha);
14722 return catmullRom$$1;
14725 function LinearClosed(context) {
14726 this._context = context;
14729 LinearClosed.prototype = {
14732 lineStart: function() {
14735 lineEnd: function() {
14736 if (this._point) this._context.closePath();
14738 point: function(x, y) {
14740 if (this._point) this._context.lineTo(x, y);
14741 else this._point = 1, this._context.moveTo(x, y);
14745 var linearClosed = function(context) {
14746 return new LinearClosed(context);
14749 function sign$1(x) {
14750 return x < 0 ? -1 : 1;
14753 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14754 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14755 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14756 // NOV(II), P. 443, 1990.
14757 function slope3(that, x2, y2) {
14758 var h0 = that._x1 - that._x0,
14759 h1 = x2 - that._x1,
14760 s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14761 s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14762 p = (s0 * h1 + s1 * h0) / (h0 + h1);
14763 return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14766 // Calculate a one-sided slope.
14767 function slope2(that, t) {
14768 var h = that._x1 - that._x0;
14769 return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14772 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14773 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14774 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14775 function point$5(that, t0, t1) {
14780 dx = (x1 - x0) / 3;
14781 that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14784 function MonotoneX(context) {
14785 this._context = context;
14788 MonotoneX.prototype = {
14789 areaStart: function() {
14792 areaEnd: function() {
14795 lineStart: function() {
14796 this._x0 = this._x1 =
14797 this._y0 = this._y1 =
14801 lineEnd: function() {
14802 switch (this._point) {
14803 case 2: this._context.lineTo(this._x1, this._y1); break;
14804 case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14806 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14807 this._line = 1 - this._line;
14809 point: function(x, y) {
14813 if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14814 switch (this._point) {
14815 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14816 case 1: this._point = 2; break;
14817 case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14818 default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14821 this._x0 = this._x1, this._x1 = x;
14822 this._y0 = this._y1, this._y1 = y;
14827 function MonotoneY(context) {
14828 this._context = new ReflectContext(context);
14831 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14832 MonotoneX.prototype.point.call(this, y, x);
14835 function ReflectContext(context) {
14836 this._context = context;
14839 ReflectContext.prototype = {
14840 moveTo: function(x, y) { this._context.moveTo(y, x); },
14841 closePath: function() { this._context.closePath(); },
14842 lineTo: function(x, y) { this._context.lineTo(y, x); },
14843 bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14846 function monotoneX(context) {
14847 return new MonotoneX(context);
14850 function monotoneY(context) {
14851 return new MonotoneY(context);
14854 function Natural(context) {
14855 this._context = context;
14858 Natural.prototype = {
14859 areaStart: function() {
14862 areaEnd: function() {
14865 lineStart: function() {
14869 lineEnd: function() {
14875 this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
14877 this._context.lineTo(x[1], y[1]);
14879 var px = controlPoints(x),
14880 py = controlPoints(y);
14881 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
14882 this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
14887 if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
14888 this._line = 1 - this._line;
14889 this._x = this._y = null;
14891 point: function(x, y) {
14897 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
14898 function controlPoints(x) {
14905 a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
14906 for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
14907 a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
14908 for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
14909 a[n - 1] = r[n - 1] / b[n - 1];
14910 for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
14911 b[n - 1] = (x[n] + a[n - 1]) / 2;
14912 for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
14916 var natural = function(context) {
14917 return new Natural(context);
14920 function Step(context, t) {
14921 this._context = context;
14926 areaStart: function() {
14929 areaEnd: function() {
14932 lineStart: function() {
14933 this._x = this._y = NaN;
14936 lineEnd: function() {
14937 if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
14938 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14939 if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
14941 point: function(x, y) {
14943 switch (this._point) {
14944 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14945 case 1: this._point = 2; // proceed
14947 if (this._t <= 0) {
14948 this._context.lineTo(this._x, y);
14949 this._context.lineTo(x, y);
14951 var x1 = this._x * (1 - this._t) + x * this._t;
14952 this._context.lineTo(x1, this._y);
14953 this._context.lineTo(x1, y);
14958 this._x = x, this._y = y;
14962 var step = function(context) {
14963 return new Step(context, 0.5);
14966 function stepBefore(context) {
14967 return new Step(context, 0);
14970 function stepAfter(context) {
14971 return new Step(context, 1);
14974 var none$1 = function(series, order) {
14975 if (!((n = series.length) > 1)) return;
14976 for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
14977 s0 = s1, s1 = series[order[i]];
14978 for (j = 0; j < m; ++j) {
14979 s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
14984 var none$2 = function(series) {
14985 var n = series.length, o = new Array(n);
14986 while (--n >= 0) o[n] = n;
14990 function stackValue(d, key) {
14994 var stack = function() {
14995 var keys = constant$10([]),
14998 value = stackValue;
15000 function stack(data) {
15001 var kz = keys.apply(this, arguments),
15008 for (i = 0; i < n; ++i) {
15009 for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15010 si[j] = sij = [0, +value(data[j], ki, j, data)];
15011 sij.data = data[j];
15016 for (i = 0, oz = order(sz); i < n; ++i) {
15017 sz[oz[i]].index = i;
15024 stack.keys = function(_) {
15025 return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15028 stack.value = function(_) {
15029 return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15032 stack.order = function(_) {
15033 return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15036 stack.offset = function(_) {
15037 return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15043 var expand = function(series, order) {
15044 if (!((n = series.length) > 0)) return;
15045 for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15046 for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15047 if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15049 none$1(series, order);
15052 var diverging = function(series, order) {
15053 if (!((n = series.length) > 1)) return;
15054 for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15055 for (yp = yn = 0, i = 0; i < n; ++i) {
15056 if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15057 d[0] = yp, d[1] = yp += dy;
15058 } else if (dy < 0) {
15059 d[1] = yn, d[0] = yn += dy;
15067 var silhouette = function(series, order) {
15068 if (!((n = series.length) > 0)) return;
15069 for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15070 for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15071 s0[j][1] += s0[j][0] = -y / 2;
15073 none$1(series, order);
15076 var wiggle = function(series, order) {
15077 if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15078 for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15079 for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15080 var si = series[order[i]],
15081 sij0 = si[j][1] || 0,
15082 sij1 = si[j - 1][1] || 0,
15083 s3 = (sij0 - sij1) / 2;
15084 for (var k = 0; k < i; ++k) {
15085 var sk = series[order[k]],
15086 skj0 = sk[j][1] || 0,
15087 skj1 = sk[j - 1][1] || 0;
15090 s1 += sij0, s2 += s3 * sij0;
15092 s0[j - 1][1] += s0[j - 1][0] = y;
15093 if (s1) y -= s2 / s1;
15095 s0[j - 1][1] += s0[j - 1][0] = y;
15096 none$1(series, order);
15099 var ascending$1 = function(series) {
15100 var sums = series.map(sum$2);
15101 return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15104 function sum$2(series) {
15105 var s = 0, i = -1, n = series.length, v;
15106 while (++i < n) if (v = +series[i][1]) s += v;
15110 var descending$1 = function(series) {
15111 return ascending$1(series).reverse();
15114 var insideOut = function(series) {
15115 var n = series.length,
15118 sums = series.map(sum$2),
15119 order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15125 for (i = 0; i < n; ++i) {
15127 if (top < bottom) {
15136 return bottoms.reverse().concat(tops);
15139 var reverse = function(series) {
15140 return none$2(series).reverse();
15143 var constant$11 = function(x) {
15144 return function() {
15157 function RedBlackTree() {
15158 this._ = null; // root node
15161 function RedBlackNode(node) {
15162 node.U = // parent node
15163 node.C = // color - true for red, false for black
15164 node.L = // left node
15165 node.R = // right node
15166 node.P = // previous node
15167 node.N = null; // next node
15170 RedBlackTree.prototype = {
15171 constructor: RedBlackTree,
15173 insert: function(after, node) {
15174 var parent, grandpa, uncle;
15179 if (after.N) after.N.P = node;
15183 while (after.L) after = after.L;
15189 } else if (this._) {
15190 after = RedBlackFirst(this._);
15193 after.P = after.L = node;
15196 node.P = node.N = null;
15200 node.L = node.R = null;
15205 while (parent && parent.C) {
15206 grandpa = parent.U;
15207 if (parent === grandpa.L) {
15209 if (uncle && uncle.C) {
15210 parent.C = uncle.C = false;
15214 if (after === parent.R) {
15215 RedBlackRotateLeft(this, parent);
15221 RedBlackRotateRight(this, grandpa);
15225 if (uncle && uncle.C) {
15226 parent.C = uncle.C = false;
15230 if (after === parent.L) {
15231 RedBlackRotateRight(this, parent);
15237 RedBlackRotateLeft(this, grandpa);
15245 remove: function(node) {
15246 if (node.N) node.N.P = node.P;
15247 if (node.P) node.P.N = node.N;
15248 node.N = node.P = null;
15250 var parent = node.U,
15257 if (!left) next = right;
15258 else if (!right) next = left;
15259 else next = RedBlackFirst(right);
15262 if (parent.L === node) parent.L = next;
15263 else parent.R = next;
15268 if (left && right) {
15273 if (next !== right) {
15290 if (node) node.U = parent;
15292 if (node && node.C) { node.C = false; return; }
15295 if (node === this._) break;
15296 if (node === parent.L) {
15297 sibling = parent.R;
15301 RedBlackRotateLeft(this, parent);
15302 sibling = parent.R;
15304 if ((sibling.L && sibling.L.C)
15305 || (sibling.R && sibling.R.C)) {
15306 if (!sibling.R || !sibling.R.C) {
15307 sibling.L.C = false;
15309 RedBlackRotateRight(this, sibling);
15310 sibling = parent.R;
15312 sibling.C = parent.C;
15313 parent.C = sibling.R.C = false;
15314 RedBlackRotateLeft(this, parent);
15319 sibling = parent.L;
15323 RedBlackRotateRight(this, parent);
15324 sibling = parent.L;
15326 if ((sibling.L && sibling.L.C)
15327 || (sibling.R && sibling.R.C)) {
15328 if (!sibling.L || !sibling.L.C) {
15329 sibling.R.C = false;
15331 RedBlackRotateLeft(this, sibling);
15332 sibling = parent.L;
15334 sibling.C = parent.C;
15335 parent.C = sibling.L.C = false;
15336 RedBlackRotateRight(this, parent);
15346 if (node) node.C = false;
15350 function RedBlackRotateLeft(tree, node) {
15356 if (parent.L === p) parent.L = q;
15365 if (p.R) p.R.U = p;
15369 function RedBlackRotateRight(tree, node) {
15375 if (parent.L === p) parent.L = q;
15384 if (p.L) p.L.U = p;
15388 function RedBlackFirst(node) {
15389 while (node.L) node = node.L;
15393 function createEdge(left, right, v0, v1) {
15394 var edge = [null, null],
15395 index = edges.push(edge) - 1;
15397 edge.right = right;
15398 if (v0) setEdgeEnd(edge, left, right, v0);
15399 if (v1) setEdgeEnd(edge, right, left, v1);
15400 cells[left.index].halfedges.push(index);
15401 cells[right.index].halfedges.push(index);
15405 function createBorderEdge(left, v0, v1) {
15406 var edge = [v0, v1];
15411 function setEdgeEnd(edge, left, right, vertex) {
15412 if (!edge[0] && !edge[1]) {
15415 edge.right = right;
15416 } else if (edge.left === right) {
15423 // Liang–Barsky line clipping.
15424 function clipEdge(edge, x0, y0, x1, y1) {
15438 if (!dx && r > 0) return;
15441 if (r < t0) return;
15442 if (r < t1) t1 = r;
15443 } else if (dx > 0) {
15444 if (r > t1) return;
15445 if (r > t0) t0 = r;
15449 if (!dx && r < 0) return;
15452 if (r > t1) return;
15453 if (r > t0) t0 = r;
15454 } else if (dx > 0) {
15455 if (r < t0) return;
15456 if (r < t1) t1 = r;
15460 if (!dy && r > 0) return;
15463 if (r < t0) return;
15464 if (r < t1) t1 = r;
15465 } else if (dy > 0) {
15466 if (r > t1) return;
15467 if (r > t0) t0 = r;
15471 if (!dy && r < 0) return;
15474 if (r > t1) return;
15475 if (r > t0) t0 = r;
15476 } else if (dy > 0) {
15477 if (r < t0) return;
15478 if (r < t1) t1 = r;
15481 if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15483 if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15484 if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15488 function connectEdge(edge, x0, y0, x1, y1) {
15490 if (v1) return true;
15494 right = edge.right,
15499 fx = (lx + rx) / 2,
15500 fy = (ly + ry) / 2,
15505 if (fx < x0 || fx >= x1) return;
15507 if (!v0) v0 = [fx, y0];
15508 else if (v0[1] >= y1) return;
15511 if (!v0) v0 = [fx, y1];
15512 else if (v0[1] < y0) return;
15516 fm = (lx - rx) / (ry - ly);
15518 if (fm < -1 || fm > 1) {
15520 if (!v0) v0 = [(y0 - fb) / fm, y0];
15521 else if (v0[1] >= y1) return;
15522 v1 = [(y1 - fb) / fm, y1];
15524 if (!v0) v0 = [(y1 - fb) / fm, y1];
15525 else if (v0[1] < y0) return;
15526 v1 = [(y0 - fb) / fm, y0];
15530 if (!v0) v0 = [x0, fm * x0 + fb];
15531 else if (v0[0] >= x1) return;
15532 v1 = [x1, fm * x1 + fb];
15534 if (!v0) v0 = [x1, fm * x1 + fb];
15535 else if (v0[0] < x0) return;
15536 v1 = [x0, fm * x0 + fb];
15546 function clipEdges(x0, y0, x1, y1) {
15547 var i = edges.length,
15551 if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15552 || !clipEdge(edge, x0, y0, x1, y1)
15553 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15554 || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15560 function createCell(site) {
15561 return cells[site.index] = {
15567 function cellHalfedgeAngle(cell, edge) {
15568 var site = cell.site,
15571 if (site === vb) vb = va, va = site;
15572 if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15573 if (site === va) va = edge[1], vb = edge[0];
15574 else va = edge[0], vb = edge[1];
15575 return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15578 function cellHalfedgeStart(cell, edge) {
15579 return edge[+(edge.left !== cell.site)];
15582 function cellHalfedgeEnd(cell, edge) {
15583 return edge[+(edge.left === cell.site)];
15586 function sortCellHalfedges() {
15587 for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15588 if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15589 var index = new Array(m),
15590 array = new Array(m);
15591 for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15592 index.sort(function(i, j) { return array[j] - array[i]; });
15593 for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15594 for (j = 0; j < m; ++j) halfedges[j] = array[j];
15599 function clipCells(x0, y0, x1, y1) {
15600 var nCells = cells.length,
15615 for (iCell = 0; iCell < nCells; ++iCell) {
15616 if (cell = cells[iCell]) {
15618 halfedges = cell.halfedges;
15619 iHalfedge = halfedges.length;
15621 // Remove any dangling clipped edges.
15622 while (iHalfedge--) {
15623 if (!edges[halfedges[iHalfedge]]) {
15624 halfedges.splice(iHalfedge, 1);
15628 // Insert any border edges as necessary.
15629 iHalfedge = 0, nHalfedges = halfedges.length;
15630 while (iHalfedge < nHalfedges) {
15631 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15632 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15633 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15634 halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15635 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15636 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15637 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15638 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15644 if (nHalfedges) cover = false;
15648 // If there weren’t any edges, have the closest site cover the extent.
15649 // It doesn’t matter which corner of the extent we measure!
15651 var dx, dy, d2, dc = Infinity;
15653 for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15654 if (cell = cells[iCell]) {
15658 d2 = dx * dx + dy * dy;
15659 if (d2 < dc) dc = d2, cover = cell;
15664 var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15665 cover.halfedges.push(
15666 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15667 edges.push(createBorderEdge(site, v01, v11)) - 1,
15668 edges.push(createBorderEdge(site, v11, v10)) - 1,
15669 edges.push(createBorderEdge(site, v10, v00)) - 1
15674 // Lastly delete any cells with no edges; these were entirely clipped.
15675 for (iCell = 0; iCell < nCells; ++iCell) {
15676 if (cell = cells[iCell]) {
15677 if (!cell.halfedges.length) {
15678 delete cells[iCell];
15684 var circlePool = [];
15688 function Circle() {
15689 RedBlackNode(this);
15697 function attachCircle(arc) {
15701 if (!lArc || !rArc) return;
15703 var lSite = lArc.site,
15707 if (lSite === rSite) return;
15711 ax = lSite[0] - bx,
15712 ay = lSite[1] - by,
15713 cx = rSite[0] - bx,
15714 cy = rSite[1] - by;
15716 var d = 2 * (ax * cy - ay * cx);
15717 if (d >= -epsilon2$2) return;
15719 var ha = ax * ax + ay * ay,
15720 hc = cx * cx + cy * cy,
15721 x = (cy * ha - ay * hc) / d,
15722 y = (ax * hc - cx * ha) / d;
15724 var circle = circlePool.pop() || new Circle;
15726 circle.site = cSite;
15728 circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15730 arc.circle = circle;
15736 if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15737 if (node.L) node = node.L;
15738 else { before = node.P; break; }
15740 if (node.R) node = node.R;
15741 else { before = node; break; }
15745 circles.insert(before, circle);
15746 if (!before) firstCircle = circle;
15749 function detachCircle(arc) {
15750 var circle = arc.circle;
15752 if (!circle.P) firstCircle = circle.N;
15753 circles.remove(circle);
15754 circlePool.push(circle);
15755 RedBlackNode(circle);
15760 var beachPool = [];
15763 RedBlackNode(this);
15766 this.circle = null;
15769 function createBeach(site) {
15770 var beach = beachPool.pop() || new Beach;
15775 function detachBeach(beach) {
15776 detachCircle(beach);
15777 beaches.remove(beach);
15778 beachPool.push(beach);
15779 RedBlackNode(beach);
15782 function removeBeach(beach) {
15783 var circle = beach.circle,
15787 previous = beach.P,
15789 disappearing = [beach];
15791 detachBeach(beach);
15793 var lArc = previous;
15795 && Math.abs(x - lArc.circle.x) < epsilon$4
15796 && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15798 disappearing.unshift(lArc);
15803 disappearing.unshift(lArc);
15804 detachCircle(lArc);
15808 && Math.abs(x - rArc.circle.x) < epsilon$4
15809 && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15811 disappearing.push(rArc);
15816 disappearing.push(rArc);
15817 detachCircle(rArc);
15819 var nArcs = disappearing.length,
15821 for (iArc = 1; iArc < nArcs; ++iArc) {
15822 rArc = disappearing[iArc];
15823 lArc = disappearing[iArc - 1];
15824 setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15827 lArc = disappearing[0];
15828 rArc = disappearing[nArcs - 1];
15829 rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15831 attachCircle(lArc);
15832 attachCircle(rArc);
15835 function addBeach(site) {
15837 directrix = site[1],
15845 dxl = leftBreakPoint(node, directrix) - x;
15846 if (dxl > epsilon$4) node = node.L; else {
15847 dxr = x - rightBreakPoint(node, directrix);
15848 if (dxr > epsilon$4) {
15855 if (dxl > -epsilon$4) {
15858 } else if (dxr > -epsilon$4) {
15862 lArc = rArc = node;
15870 var newArc = createBeach(site);
15871 beaches.insert(lArc, newArc);
15873 if (!lArc && !rArc) return;
15875 if (lArc === rArc) {
15876 detachCircle(lArc);
15877 rArc = createBeach(lArc.site);
15878 beaches.insert(newArc, rArc);
15879 newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
15880 attachCircle(lArc);
15881 attachCircle(rArc);
15885 if (!rArc) { // && lArc
15886 newArc.edge = createEdge(lArc.site, newArc.site);
15890 // else lArc !== rArc
15891 detachCircle(lArc);
15892 detachCircle(rArc);
15894 var lSite = lArc.site,
15900 cx = rSite[0] - ax,
15901 cy = rSite[1] - ay,
15902 d = 2 * (bx * cy - by * cx),
15903 hb = bx * bx + by * by,
15904 hc = cx * cx + cy * cy,
15905 vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
15907 setEdgeEnd(rArc.edge, lSite, rSite, vertex);
15908 newArc.edge = createEdge(lSite, site, null, vertex);
15909 rArc.edge = createEdge(site, rSite, null, vertex);
15910 attachCircle(lArc);
15911 attachCircle(rArc);
15914 function leftBreakPoint(arc, directrix) {
15915 var site = arc.site,
15918 pby2 = rfocy - directrix;
15920 if (!pby2) return rfocx;
15923 if (!lArc) return -Infinity;
15926 var lfocx = site[0],
15928 plby2 = lfocy - directrix;
15930 if (!plby2) return lfocx;
15932 var hl = lfocx - rfocx,
15933 aby2 = 1 / pby2 - 1 / plby2,
15936 if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
15938 return (rfocx + lfocx) / 2;
15941 function rightBreakPoint(arc, directrix) {
15943 if (rArc) return leftBreakPoint(rArc, directrix);
15944 var site = arc.site;
15945 return site[1] === directrix ? site[0] : Infinity;
15948 var epsilon$4 = 1e-6;
15949 var epsilon2$2 = 1e-12;
15955 function triangleArea(a, b, c) {
15956 return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
15959 function lexicographic(a, b) {
15964 function Diagram(sites, extent) {
15965 var site = sites.sort(lexicographic).pop(),
15971 cells = new Array(sites.length);
15972 beaches = new RedBlackTree;
15973 circles = new RedBlackTree;
15976 circle = firstCircle;
15977 if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
15978 if (site[0] !== x || site[1] !== y) {
15980 x = site[0], y = site[1];
15982 site = sites.pop();
15983 } else if (circle) {
15984 removeBeach(circle.arc);
15990 sortCellHalfedges();
15993 var x0 = +extent[0][0],
15994 y0 = +extent[0][1],
15995 x1 = +extent[1][0],
15996 y1 = +extent[1][1];
15997 clipEdges(x0, y0, x1, y1);
15998 clipCells(x0, y0, x1, y1);
16001 this.edges = edges;
16002 this.cells = cells;
16010 Diagram.prototype = {
16011 constructor: Diagram,
16013 polygons: function() {
16014 var edges = this.edges;
16016 return this.cells.map(function(cell) {
16017 var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16018 polygon.data = cell.site.data;
16023 triangles: function() {
16024 var triangles = [],
16025 edges = this.edges;
16027 this.cells.forEach(function(cell, i) {
16028 if (!(m = (halfedges = cell.halfedges).length)) return;
16029 var site = cell.site,
16034 e1 = edges[halfedges[m - 1]],
16035 s1 = e1.left === site ? e1.right : e1.left;
16039 e1 = edges[halfedges[j]];
16040 s1 = e1.left === site ? e1.right : e1.left;
16041 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16042 triangles.push([site.data, s0.data, s1.data]);
16050 links: function() {
16051 return this.edges.filter(function(edge) {
16053 }).map(function(edge) {
16055 source: edge.left.data,
16056 target: edge.right.data
16061 find: function(x, y, radius) {
16062 var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16064 // Use the previously-found cell, or start with an arbitrary one.
16065 while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16066 var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16068 // Traverse the half-edges to find a closer cell, if any.
16070 cell = that.cells[i0 = i1], i1 = null;
16071 cell.halfedges.forEach(function(e) {
16072 var edge = that.edges[e], v = edge.left;
16073 if ((v === cell.site || !v) && !(v = edge.right)) return;
16074 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16075 if (v2 < d2) d2 = v2, i1 = v.index;
16077 } while (i1 !== null);
16081 return radius == null || d2 <= radius * radius ? cell.site : null;
16085 var voronoi = function() {
16090 function voronoi(data) {
16091 return new Diagram(data.map(function(d, i) {
16092 var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
16099 voronoi.polygons = function(data) {
16100 return voronoi(data).polygons();
16103 voronoi.links = function(data) {
16104 return voronoi(data).links();
16107 voronoi.triangles = function(data) {
16108 return voronoi(data).triangles();
16111 voronoi.x = function(_) {
16112 return arguments.length ? (x = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x;
16115 voronoi.y = function(_) {
16116 return arguments.length ? (y = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y;
16119 voronoi.extent = function(_) {
16120 return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
16123 voronoi.size = function(_) {
16124 return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16130 var constant$12 = function(x) {
16131 return function() {
16136 function ZoomEvent(target, type, transform) {
16137 this.target = target;
16139 this.transform = transform;
16142 function Transform(k, x, y) {
16148 Transform.prototype = {
16149 constructor: Transform,
16150 scale: function(k) {
16151 return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16153 translate: function(x, y) {
16154 return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16156 apply: function(point) {
16157 return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16159 applyX: function(x) {
16160 return x * this.k + this.x;
16162 applyY: function(y) {
16163 return y * this.k + this.y;
16165 invert: function(location) {
16166 return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16168 invertX: function(x) {
16169 return (x - this.x) / this.k;
16171 invertY: function(y) {
16172 return (y - this.y) / this.k;
16174 rescaleX: function(x) {
16175 return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16177 rescaleY: function(y) {
16178 return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16180 toString: function() {
16181 return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16185 var identity$7 = new Transform(1, 0, 0);
16187 transform.prototype = Transform.prototype;
16189 function transform(node) {
16190 return node.__zoom || identity$7;
16193 function nopropagation$2() {
16194 event.stopImmediatePropagation();
16197 var noevent$2 = function() {
16198 event.preventDefault();
16199 event.stopImmediatePropagation();
16202 // Ignore right-click, since that should open the context menu.
16203 function defaultFilter$2() {
16204 return !event.button;
16207 function defaultExtent$1() {
16208 var e = this, w, h;
16209 if (e instanceof SVGElement) {
16210 e = e.ownerSVGElement || e;
16211 w = e.width.baseVal.value;
16212 h = e.height.baseVal.value;
16215 h = e.clientHeight;
16217 return [[0, 0], [w, h]];
16220 function defaultTransform() {
16221 return this.__zoom || identity$7;
16224 function defaultWheelDelta() {
16225 return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16228 function defaultTouchable$1() {
16229 return "ontouchstart" in this;
16232 var d3_zoom = function() {
16233 var filter = defaultFilter$2,
16234 extent = defaultExtent$1,
16235 wheelDelta = defaultWheelDelta,
16236 touchable = defaultTouchable$1,
16244 interpolate = interpolateZoom,
16246 listeners = dispatch("start", "zoom", "end"),
16251 clickDistance2 = 0;
16253 function zoom(selection$$1) {
16255 .property("__zoom", defaultTransform)
16256 .on("wheel.zoom", wheeled)
16257 .on("mousedown.zoom", mousedowned)
16258 .on("dblclick.zoom", dblclicked)
16260 .on("touchstart.zoom", touchstarted)
16261 .on("touchmove.zoom", touchmoved)
16262 .on("touchend.zoom touchcancel.zoom", touchended)
16263 .style("touch-action", "none")
16264 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16267 zoom.transform = function(collection, transform$$1) {
16268 var selection$$1 = collection.selection ? collection.selection() : collection;
16269 selection$$1.property("__zoom", defaultTransform);
16270 if (collection !== selection$$1) {
16271 schedule(collection, transform$$1);
16273 selection$$1.interrupt().each(function() {
16274 gesture(this, arguments)
16276 .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16282 zoom.scaleBy = function(selection$$1, k) {
16283 zoom.scaleTo(selection$$1, function() {
16284 var k0 = this.__zoom.k,
16285 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16290 zoom.scaleTo = function(selection$$1, k) {
16291 zoom.transform(selection$$1, function() {
16292 var e = extent.apply(this, arguments),
16295 p1 = t0.invert(p0),
16296 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16297 return constrain(translate(scale(t0, k1), p0, p1), e);
16301 zoom.translateBy = function(selection$$1, x, y) {
16302 zoom.transform(selection$$1, function() {
16303 return constrain(this.__zoom.translate(
16304 typeof x === "function" ? x.apply(this, arguments) : x,
16305 typeof y === "function" ? y.apply(this, arguments) : y
16306 ), extent.apply(this, arguments));
16310 zoom.translateTo = function(selection$$1, x, y) {
16311 zoom.transform(selection$$1, function() {
16312 var e = extent.apply(this, arguments),
16315 return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16316 typeof x === "function" ? -x.apply(this, arguments) : -x,
16317 typeof y === "function" ? -y.apply(this, arguments) : -y
16322 function scale(transform$$1, k) {
16323 k = Math.max(k0, Math.min(k1, k));
16324 return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16327 function translate(transform$$1, p0, p1) {
16328 var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16329 return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16332 function constrain(transform$$1, extent) {
16333 var dx0 = transform$$1.invertX(extent[0][0]) - x0,
16334 dx1 = transform$$1.invertX(extent[1][0]) - x1,
16335 dy0 = transform$$1.invertY(extent[0][1]) - y0,
16336 dy1 = transform$$1.invertY(extent[1][1]) - y1;
16337 return transform$$1.translate(
16338 dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16339 dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16343 function centroid(extent) {
16344 return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16347 function schedule(transition$$1, transform$$1, center) {
16349 .on("start.zoom", function() { gesture(this, arguments).start(); })
16350 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16351 .tween("zoom", function() {
16354 g = gesture(that, args),
16355 e = extent.apply(that, args),
16356 p = center || centroid(e),
16357 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16359 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16360 i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16361 return function(t) {
16362 if (t === 1) t = b; // Avoid rounding error on end.
16363 else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16369 function gesture(that, args) {
16370 for (var i = 0, n = gestures.length, g; i < n; ++i) {
16371 if ((g = gestures[i]).that === that) {
16375 return new Gesture(that, args);
16378 function Gesture(that, args) {
16383 this.extent = extent.apply(that, args);
16386 Gesture.prototype = {
16387 start: function() {
16388 if (++this.active === 1) {
16389 this.index = gestures.push(this) - 1;
16390 this.emit("start");
16394 zoom: function(key, transform$$1) {
16395 if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16396 if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16397 if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16398 this.that.__zoom = transform$$1;
16403 if (--this.active === 0) {
16404 gestures.splice(this.index, 1);
16410 emit: function(type) {
16411 customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16415 function wheeled() {
16416 if (!filter.apply(this, arguments)) return;
16417 var g = gesture(this, arguments),
16419 k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16420 p = d3_mouse(this);
16422 // If the mouse is in the same location as before, reuse it.
16423 // If there were recent wheel events, reset the wheel idle timeout.
16425 if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16426 g.mouse[1] = t.invert(g.mouse[0] = p);
16428 clearTimeout(g.wheel);
16431 // If this wheel event won’t trigger a transform change, ignore it.
16432 else if (t.k === k) return;
16434 // Otherwise, capture the mouse point and location at the start.
16436 g.mouse = [p, t.invert(p)];
16442 g.wheel = setTimeout(wheelidled, wheelDelay);
16443 g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent));
16445 function wheelidled() {
16451 function mousedowned() {
16452 if (touchending || !filter.apply(this, arguments)) return;
16453 var g = gesture(this, arguments),
16454 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16455 p = d3_mouse(this),
16456 x0 = event.clientX,
16457 y0 = event.clientY;
16459 dragDisable(event.view);
16461 g.mouse = [p, this.__zoom.invert(p)];
16465 function mousemoved() {
16468 var dx = event.clientX - x0, dy = event.clientY - y0;
16469 g.moved = dx * dx + dy * dy > clickDistance2;
16471 g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent));
16474 function mouseupped() {
16475 v.on("mousemove.zoom mouseup.zoom", null);
16476 yesdrag(event.view, g.moved);
16482 function dblclicked() {
16483 if (!filter.apply(this, arguments)) return;
16484 var t0 = this.__zoom,
16485 p0 = d3_mouse(this),
16486 p1 = t0.invert(p0),
16487 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16488 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments));
16491 if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16492 else d3_select(this).call(zoom.transform, t1);
16495 function touchstarted() {
16496 if (!filter.apply(this, arguments)) return;
16497 var g = gesture(this, arguments),
16498 touches = event.changedTouches,
16500 n = touches.length, i, t, p;
16503 for (i = 0; i < n; ++i) {
16504 t = touches[i], p = touch(this, touches, t.identifier);
16505 p = [p, this.__zoom.invert(p), t.identifier];
16506 if (!g.touch0) g.touch0 = p, started = true;
16507 else if (!g.touch1) g.touch1 = p;
16510 // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16511 if (touchstarting) {
16512 touchstarting = clearTimeout(touchstarting);
16515 p = d3_select(this).on("dblclick.zoom");
16516 if (p) p.apply(this, arguments);
16522 touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16528 function touchmoved() {
16529 var g = gesture(this, arguments),
16530 touches = event.changedTouches,
16531 n = touches.length, i, t, p, l;
16534 if (touchstarting) touchstarting = clearTimeout(touchstarting);
16535 for (i = 0; i < n; ++i) {
16536 t = touches[i], p = touch(this, touches, t.identifier);
16537 if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16538 else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16542 var p0 = g.touch0[0], l0 = g.touch0[1],
16543 p1 = g.touch1[0], l1 = g.touch1[1],
16544 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16545 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16546 t = scale(t, Math.sqrt(dp / dl));
16547 p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16548 l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16550 else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16552 g.zoom("touch", constrain(translate(t, p, l), g.extent));
16555 function touchended() {
16556 var g = gesture(this, arguments),
16557 touches = event.changedTouches,
16558 n = touches.length, i, t;
16561 if (touchending) clearTimeout(touchending);
16562 touchending = setTimeout(function() { touchending = null; }, touchDelay);
16563 for (i = 0; i < n; ++i) {
16565 if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16566 else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16568 if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16569 if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16573 zoom.wheelDelta = function(_) {
16574 return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16577 zoom.filter = function(_) {
16578 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16581 zoom.touchable = function(_) {
16582 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16585 zoom.extent = function(_) {
16586 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16589 zoom.scaleExtent = function(_) {
16590 return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1];
16593 zoom.translateExtent = function(_) {
16594 return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]];
16597 zoom.duration = function(_) {
16598 return arguments.length ? (duration = +_, zoom) : duration;
16601 zoom.interpolate = function(_) {
16602 return arguments.length ? (interpolate = _, zoom) : interpolate;
16605 zoom.on = function() {
16606 var value = listeners.on.apply(listeners, arguments);
16607 return value === listeners ? zoom : value;
16610 zoom.clickDistance = function(_) {
16611 return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16619 var index = Object.freeze({
16621 bisect: bisectRight,
16622 bisectRight: bisectRight,
16623 bisectLeft: bisectLeft,
16624 ascending: d3_ascending,
16625 bisector: d3_bisector,
16627 descending: d3_descending,
16628 deviation: deviation,
16630 histogram: histogram,
16631 thresholdFreedmanDiaconis: freedmanDiaconis,
16632 thresholdScott: scott,
16633 thresholdSturges: sturges,
16641 quantile: threshold,
16647 tickIncrement: tickIncrement,
16648 tickStep: tickStep,
16649 transpose: transpose,
16650 variance: variance,
16653 axisRight: axisRight,
16654 axisBottom: axisBottom,
16655 axisLeft: axisLeft,
16659 brushSelection: brushSelection,
16673 cubehelix: cubehelix,
16674 dispatch: dispatch,
16676 dragDisable: dragDisable,
16677 dragEnable: yesdrag,
16679 csvParse: csvParse,
16680 csvParseRows: csvParseRows,
16681 csvFormat: csvFormat,
16682 csvFormatRows: csvFormatRows,
16683 tsvParse: tsvParse,
16684 tsvParseRows: tsvParseRows,
16685 tsvFormat: tsvFormat,
16686 tsvFormatRows: tsvFormatRows,
16687 easeLinear: linear$1,
16688 easeQuad: quadInOut,
16689 easeQuadIn: quadIn,
16690 easeQuadOut: quadOut,
16691 easeQuadInOut: quadInOut,
16692 easeCubic: cubicInOut,
16693 easeCubicIn: cubicIn,
16694 easeCubicOut: cubicOut,
16695 easeCubicInOut: cubicInOut,
16696 easePoly: polyInOut,
16697 easePolyIn: polyIn,
16698 easePolyOut: polyOut,
16699 easePolyInOut: polyInOut,
16702 easeSinOut: sinOut,
16703 easeSinInOut: sinInOut,
16706 easeExpOut: expOut,
16707 easeExpInOut: expInOut,
16708 easeCircle: circleInOut,
16709 easeCircleIn: circleIn,
16710 easeCircleOut: circleOut,
16711 easeCircleInOut: circleInOut,
16712 easeBounce: bounceOut,
16713 easeBounceIn: bounceIn,
16714 easeBounceOut: bounceOut,
16715 easeBounceInOut: bounceInOut,
16716 easeBack: backInOut,
16717 easeBackIn: backIn,
16718 easeBackOut: backOut,
16719 easeBackInOut: backInOut,
16720 easeElastic: elasticOut,
16721 easeElasticIn: elasticIn,
16722 easeElasticOut: elasticOut,
16723 easeElasticInOut: elasticInOut,
16724 forceCenter: center$1,
16725 forceCollide: collide,
16727 forceManyBody: manyBody,
16728 forceRadial: radial,
16729 forceSimulation: simulation,
16732 formatDefaultLocale: defaultLocale,
16733 get format () { return format; },
16734 get formatPrefix () { return formatPrefix; },
16735 formatLocale: formatLocale,
16736 formatSpecifier: formatSpecifier,
16737 precisionFixed: precisionFixed,
16738 precisionPrefix: precisionPrefix,
16739 precisionRound: precisionRound,
16740 geoArea: d3_geoArea,
16741 geoBounds: d3_geoBounds,
16742 geoCentroid: d3_geoCentroid,
16744 geoClipAntimeridian: clipAntimeridian,
16745 geoClipCircle: clipCircle,
16746 geoClipExtent: extent$1,
16747 geoClipRectangle: clipRectangle,
16748 geoContains: contains,
16749 geoDistance: distance,
16750 geoGraticule: graticule,
16751 geoGraticule10: graticule10,
16752 geoInterpolate: interpolate$1,
16753 geoLength: d3_geoLength,
16754 geoPath: d3_geoPath,
16756 geoAlbersUsa: albersUsa,
16757 geoAzimuthalEqualArea: azimuthalEqualArea,
16758 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16759 geoAzimuthalEquidistant: azimuthalEquidistant,
16760 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16761 geoConicConformal: conicConformal,
16762 geoConicConformalRaw: conicConformalRaw,
16763 geoConicEqualArea: conicEqualArea,
16764 geoConicEqualAreaRaw: conicEqualAreaRaw,
16765 geoConicEquidistant: conicEquidistant,
16766 geoConicEquidistantRaw: conicEquidistantRaw,
16767 geoEquirectangular: equirectangular,
16768 geoEquirectangularRaw: equirectangularRaw,
16769 geoGnomonic: gnomonic,
16770 geoGnomonicRaw: gnomonicRaw,
16771 geoIdentity: d3_geoIdentity,
16772 geoProjection: projection,
16773 geoProjectionMutator: projectionMutator,
16774 geoMercator: mercator,
16775 geoMercatorRaw: mercatorRaw,
16776 geoNaturalEarth1: naturalEarth1,
16777 geoNaturalEarth1Raw: naturalEarth1Raw,
16778 geoOrthographic: orthographic,
16779 geoOrthographicRaw: orthographicRaw,
16780 geoStereographic: stereographic,
16781 geoStereographicRaw: stereographicRaw,
16782 geoTransverseMercator: transverseMercator,
16783 geoTransverseMercatorRaw: transverseMercatorRaw,
16784 geoRotation: rotation,
16785 geoStream: d3_geoStream,
16786 geoTransform: d3_geoTransform,
16788 hierarchy: hierarchy,
16790 packSiblings: siblings,
16791 packEnclose: enclose,
16792 partition: partition,
16793 stratify: stratify,
16796 treemapBinary: binary,
16797 treemapDice: treemapDice,
16798 treemapSlice: treemapSlice,
16799 treemapSliceDice: sliceDice,
16800 treemapSquarify: squarify,
16801 treemapResquarify: resquarify,
16802 interpolate: d3_interpolate,
16803 interpolateArray: array$1,
16804 interpolateBasis: basis$1,
16805 interpolateBasisClosed: basisClosed,
16806 interpolateDate: date,
16807 interpolateNumber: d3_interpolateNumber,
16808 interpolateObject: object,
16809 interpolateRound: interpolateRound,
16810 interpolateString: interpolateString,
16811 interpolateTransformCss: interpolateTransformCss,
16812 interpolateTransformSvg: interpolateTransformSvg,
16813 interpolateZoom: interpolateZoom,
16814 interpolateRgb: d3_interpolateRgb,
16815 interpolateRgbBasis: rgbBasis,
16816 interpolateRgbBasisClosed: rgbBasisClosed,
16817 interpolateHsl: hsl$2,
16818 interpolateHslLong: hslLong,
16819 interpolateLab: lab$1,
16820 interpolateHcl: hcl$2,
16821 interpolateHclLong: hclLong,
16822 interpolateCubehelix: cubehelix$2,
16823 interpolateCubehelixLong: cubehelixLong,
16824 quantize: d3_quantize,
16826 polygonArea: d3_polygonArea,
16827 polygonCentroid: d3_polygonCentroid,
16828 polygonHull: d3_polygonHull,
16829 polygonContains: contains$1,
16830 polygonLength: length$1,
16831 quadtree: quadtree,
16833 randomUniform: uniform,
16834 randomNormal: normal,
16835 randomLogNormal: logNormal,
16836 randomBates: bates,
16837 randomIrwinHall: irwinHall,
16838 randomExponential: exponential$1,
16839 request: d3_request,
16847 scalePoint: point$1,
16848 scaleIdentity: identity$5,
16849 scaleLinear: linear$2,
16851 scaleOrdinal: ordinal,
16852 scaleImplicit: implicit,
16855 scaleQuantile: quantile,
16856 scaleQuantize: quantize,
16857 scaleThreshold: threshold$1,
16860 schemeCategory10: category10,
16861 schemeCategory20b: category20b,
16862 schemeCategory20c: category20c,
16863 schemeCategory20: category20,
16864 interpolateCubehelixDefault: cubehelix$3,
16865 interpolateRainbow: rainbow$1,
16866 interpolateWarm: warm,
16867 interpolateCool: cool,
16868 interpolateViridis: viridis,
16869 interpolateMagma: magma,
16870 interpolateInferno: inferno,
16871 interpolatePlasma: plasma,
16872 scaleSequential: sequential,
16875 matcher: matcher$1,
16877 namespace: namespace,
16878 namespaces: namespaces,
16880 selectAll: d3_selectAll,
16881 selection: selection,
16882 selector: selector,
16883 selectorAll: selectorAll,
16886 touches: d3_touches,
16887 window: defaultView,
16888 get event () { return event; },
16889 customEvent: customEvent,
16894 areaRadial: areaRadial,
16895 radialArea: areaRadial,
16896 lineRadial: lineRadial$1,
16897 radialLine: lineRadial$1,
16898 pointRadial: pointRadial,
16899 linkHorizontal: linkHorizontal,
16900 linkVertical: linkVertical,
16901 linkRadial: linkRadial,
16904 symbolCircle: circle$2,
16905 symbolCross: cross$2,
16906 symbolDiamond: diamond,
16907 symbolSquare: square,
16909 symbolTriangle: triangle,
16911 curveBasisClosed: basisClosed$1,
16912 curveBasisOpen: basisOpen,
16913 curveBasis: basis$2,
16914 curveBundle: bundle,
16915 curveCardinalClosed: cardinalClosed,
16916 curveCardinalOpen: cardinalOpen,
16917 curveCardinal: cardinal,
16918 curveCatmullRomClosed: catmullRomClosed,
16919 curveCatmullRomOpen: catmullRomOpen,
16920 curveCatmullRom: catmullRom,
16921 curveLinearClosed: linearClosed,
16922 curveLinear: curveLinear,
16923 curveMonotoneX: monotoneX,
16924 curveMonotoneY: monotoneY,
16925 curveNatural: natural,
16927 curveStepAfter: stepAfter,
16928 curveStepBefore: stepBefore,
16930 stackOffsetExpand: expand,
16931 stackOffsetDiverging: diverging,
16932 stackOffsetNone: none$1,
16933 stackOffsetSilhouette: silhouette,
16934 stackOffsetWiggle: wiggle,
16935 stackOrderAscending: ascending$1,
16936 stackOrderDescending: descending$1,
16937 stackOrderInsideOut: insideOut,
16938 stackOrderNone: none$2,
16939 stackOrderReverse: reverse,
16940 timeInterval: newInterval,
16941 timeMillisecond: millisecond,
16942 timeMilliseconds: milliseconds,
16943 utcMillisecond: millisecond,
16944 utcMilliseconds: milliseconds,
16945 timeSecond: second,
16946 timeSeconds: seconds,
16948 utcSeconds: seconds,
16949 timeMinute: minute,
16950 timeMinutes: minutes,
16956 timeWeeks: sundays,
16957 timeSunday: sunday,
16958 timeSundays: sundays,
16959 timeMonday: monday,
16960 timeMondays: mondays,
16961 timeTuesday: tuesday,
16962 timeTuesdays: tuesdays,
16963 timeWednesday: wednesday,
16964 timeWednesdays: wednesdays,
16965 timeThursday: thursday,
16966 timeThursdays: thursdays,
16967 timeFriday: friday,
16968 timeFridays: fridays,
16969 timeSaturday: saturday,
16970 timeSaturdays: saturdays,
16972 timeMonths: months,
16975 utcMinute: utcMinute,
16976 utcMinutes: utcMinutes,
16978 utcHours: utcHours,
16981 utcWeek: utcSunday,
16982 utcWeeks: utcSundays,
16983 utcSunday: utcSunday,
16984 utcSundays: utcSundays,
16985 utcMonday: utcMonday,
16986 utcMondays: utcMondays,
16987 utcTuesday: utcTuesday,
16988 utcTuesdays: utcTuesdays,
16989 utcWednesday: utcWednesday,
16990 utcWednesdays: utcWednesdays,
16991 utcThursday: utcThursday,
16992 utcThursdays: utcThursdays,
16993 utcFriday: utcFriday,
16994 utcFridays: utcFridays,
16995 utcSaturday: utcSaturday,
16996 utcSaturdays: utcSaturdays,
16997 utcMonth: utcMonth,
16998 utcMonths: utcMonths,
17000 utcYears: utcYears,
17001 timeFormatDefaultLocale: defaultLocale$1,
17002 get timeFormat () { return timeFormat; },
17003 get timeParse () { return timeParse; },
17004 get utcFormat () { return utcFormat; },
17005 get utcParse () { return utcParse; },
17006 timeFormatLocale: formatLocale$1,
17007 isoFormat: formatIso,
17008 isoParse: parseIso,
17011 timerFlush: timerFlush,
17012 timeout: d3_timeout,
17013 interval: interval$1,
17014 transition: transition,
17016 interrupt: interrupt,
17019 zoomTransform: transform,
17020 zoomIdentity: identity$7
17023 function actionAddEntity(way) {
17024 return function(graph) {
17025 return graph.replace(way);
17030 * Creates an array with all falsey values removed. The values `false`, `null`,
17031 * `0`, `""`, `undefined`, and `NaN` are falsey.
17037 * @param {Array} array The array to compact.
17038 * @returns {Array} Returns the new array of filtered values.
17041 * _.compact([0, 1, false, 2, '', 3]);
17044 function compact(array) {
17046 length = array == null ? 0 : array.length,
17050 while (++index < length) {
17051 var value = array[index];
17053 result[resIndex++] = value;
17059 /** Detect free variable `global` from Node.js. */
17060 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17062 /** Detect free variable `self`. */
17063 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17065 /** Used as a reference to the global object. */
17066 var root$2 = freeGlobal || freeSelf || Function('return this')();
17068 /** Built-in value references. */
17069 var Symbol = root$2.Symbol;
17071 /** Used for built-in method references. */
17072 var objectProto$2 = Object.prototype;
17074 /** Used to check objects for own properties. */
17075 var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
17078 * Used to resolve the
17079 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17082 var nativeObjectToString = objectProto$2.toString;
17084 /** Built-in value references. */
17085 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17088 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17091 * @param {*} value The value to query.
17092 * @returns {string} Returns the raw `toStringTag`.
17094 function getRawTag(value) {
17095 var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
17096 tag = value[symToStringTag$1];
17099 value[symToStringTag$1] = undefined;
17100 var unmasked = true;
17103 var result = nativeObjectToString.call(value);
17106 value[symToStringTag$1] = tag;
17108 delete value[symToStringTag$1];
17114 /** Used for built-in method references. */
17115 var objectProto$3 = Object.prototype;
17118 * Used to resolve the
17119 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17122 var nativeObjectToString$1 = objectProto$3.toString;
17125 * Converts `value` to a string using `Object.prototype.toString`.
17128 * @param {*} value The value to convert.
17129 * @returns {string} Returns the converted string.
17131 function objectToString(value) {
17132 return nativeObjectToString$1.call(value);
17135 /** `Object#toString` result references. */
17136 var nullTag = '[object Null]';
17137 var undefinedTag = '[object Undefined]';
17139 /** Built-in value references. */
17140 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17143 * The base implementation of `getTag` without fallbacks for buggy environments.
17146 * @param {*} value The value to query.
17147 * @returns {string} Returns the `toStringTag`.
17149 function baseGetTag(value) {
17150 if (value == null) {
17151 return value === undefined ? undefinedTag : nullTag;
17153 return (symToStringTag && symToStringTag in Object(value))
17155 : objectToString(value);
17159 * Checks if `value` is the
17160 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17161 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17167 * @param {*} value The value to check.
17168 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17174 * _.isObject([1, 2, 3]);
17177 * _.isObject(_.noop);
17180 * _.isObject(null);
17183 function isObject(value) {
17184 var type = typeof value;
17185 return value != null && (type == 'object' || type == 'function');
17188 /** `Object#toString` result references. */
17189 var asyncTag = '[object AsyncFunction]';
17190 var funcTag = '[object Function]';
17191 var genTag = '[object GeneratorFunction]';
17192 var proxyTag = '[object Proxy]';
17195 * Checks if `value` is classified as a `Function` object.
17201 * @param {*} value The value to check.
17202 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17208 * _.isFunction(/abc/);
17211 function isFunction(value) {
17212 if (!isObject(value)) {
17215 // The use of `Object#toString` avoids issues with the `typeof` operator
17216 // in Safari 9 which returns 'object' for typed arrays and other constructors.
17217 var tag = baseGetTag(value);
17218 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17221 /** Used to detect overreaching core-js shims. */
17222 var coreJsData = root$2['__core-js_shared__'];
17224 /** Used to detect methods masquerading as native. */
17225 var maskSrcKey = (function() {
17226 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17227 return uid ? ('Symbol(src)_1.' + uid) : '';
17231 * Checks if `func` has its source masked.
17234 * @param {Function} func The function to check.
17235 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17237 function isMasked(func) {
17238 return !!maskSrcKey && (maskSrcKey in func);
17241 /** Used for built-in method references. */
17242 var funcProto$1 = Function.prototype;
17244 /** Used to resolve the decompiled source of functions. */
17245 var funcToString$1 = funcProto$1.toString;
17248 * Converts `func` to its source code.
17251 * @param {Function} func The function to convert.
17252 * @returns {string} Returns the source code.
17254 function toSource(func) {
17255 if (func != null) {
17257 return funcToString$1.call(func);
17260 return (func + '');
17267 * Used to match `RegExp`
17268 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17270 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17272 /** Used to detect host constructors (Safari). */
17273 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17275 /** Used for built-in method references. */
17276 var funcProto = Function.prototype;
17277 var objectProto$1 = Object.prototype;
17279 /** Used to resolve the decompiled source of functions. */
17280 var funcToString = funcProto.toString;
17282 /** Used to check objects for own properties. */
17283 var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
17285 /** Used to detect if a method is native. */
17286 var reIsNative = RegExp('^' +
17287 funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17288 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17292 * The base implementation of `_.isNative` without bad shim checks.
17295 * @param {*} value The value to check.
17296 * @returns {boolean} Returns `true` if `value` is a native function,
17299 function baseIsNative(value) {
17300 if (!isObject(value) || isMasked(value)) {
17303 var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17304 return pattern.test(toSource(value));
17308 * Gets the value at `key` of `object`.
17311 * @param {Object} [object] The object to query.
17312 * @param {string} key The key of the property to get.
17313 * @returns {*} Returns the property value.
17315 function getValue(object, key) {
17316 return object == null ? undefined : object[key];
17320 * Gets the native function at `key` of `object`.
17323 * @param {Object} object The object to query.
17324 * @param {string} key The key of the method to get.
17325 * @returns {*} Returns the function if it's native, else `undefined`.
17327 function getNative(object, key) {
17328 var value = getValue(object, key);
17329 return baseIsNative(value) ? value : undefined;
17332 var defineProperty = (function() {
17334 var func = getNative(Object, 'defineProperty');
17341 * The base implementation of `assignValue` and `assignMergeValue` without
17345 * @param {Object} object The object to modify.
17346 * @param {string} key The key of the property to assign.
17347 * @param {*} value The value to assign.
17349 function baseAssignValue(object, key, value) {
17350 if (key == '__proto__' && defineProperty) {
17351 defineProperty(object, key, {
17352 'configurable': true,
17353 'enumerable': true,
17358 object[key] = value;
17364 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17365 * comparison between two values to determine if they are equivalent.
17371 * @param {*} value The value to compare.
17372 * @param {*} other The other value to compare.
17373 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17376 * var object = { 'a': 1 };
17377 * var other = { 'a': 1 };
17379 * _.eq(object, object);
17382 * _.eq(object, other);
17388 * _.eq('a', Object('a'));
17394 function eq(value, other) {
17395 return value === other || (value !== value && other !== other);
17398 /** Used for built-in method references. */
17399 var objectProto = Object.prototype;
17401 /** Used to check objects for own properties. */
17402 var hasOwnProperty = objectProto.hasOwnProperty;
17405 * Assigns `value` to `key` of `object` if the existing value is not equivalent
17406 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17407 * for equality comparisons.
17410 * @param {Object} object The object to modify.
17411 * @param {string} key The key of the property to assign.
17412 * @param {*} value The value to assign.
17414 function assignValue(object, key, value) {
17415 var objValue = object[key];
17416 if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
17417 (value === undefined && !(key in object))) {
17418 baseAssignValue(object, key, value);
17423 * Copies properties of `source` to `object`.
17426 * @param {Object} source The object to copy properties from.
17427 * @param {Array} props The property identifiers to copy.
17428 * @param {Object} [object={}] The object to copy properties to.
17429 * @param {Function} [customizer] The function to customize copied values.
17430 * @returns {Object} Returns `object`.
17432 function copyObject(source, props, object, customizer) {
17433 var isNew = !object;
17434 object || (object = {});
17437 length = props.length;
17439 while (++index < length) {
17440 var key = props[index];
17442 var newValue = customizer
17443 ? customizer(object[key], source[key], key, object, source)
17446 if (newValue === undefined) {
17447 newValue = source[key];
17450 baseAssignValue(object, key, newValue);
17452 assignValue(object, key, newValue);
17459 * This method returns the first argument it receives.
17465 * @param {*} value Any value.
17466 * @returns {*} Returns `value`.
17469 * var object = { 'a': 1 };
17471 * console.log(_.identity(object) === object);
17474 function identity$8(value) {
17479 * A faster alternative to `Function#apply`, this function invokes `func`
17480 * with the `this` binding of `thisArg` and the arguments of `args`.
17483 * @param {Function} func The function to invoke.
17484 * @param {*} thisArg The `this` binding of `func`.
17485 * @param {Array} args The arguments to invoke `func` with.
17486 * @returns {*} Returns the result of `func`.
17488 function apply(func, thisArg, args) {
17489 switch (args.length) {
17490 case 0: return func.call(thisArg);
17491 case 1: return func.call(thisArg, args[0]);
17492 case 2: return func.call(thisArg, args[0], args[1]);
17493 case 3: return func.call(thisArg, args[0], args[1], args[2]);
17495 return func.apply(thisArg, args);
17498 /* Built-in method references for those with the same name as other `lodash` methods. */
17499 var nativeMax = Math.max;
17502 * A specialized version of `baseRest` which transforms the rest array.
17505 * @param {Function} func The function to apply a rest parameter to.
17506 * @param {number} [start=func.length-1] The start position of the rest parameter.
17507 * @param {Function} transform The rest array transform.
17508 * @returns {Function} Returns the new function.
17510 function overRest(func, start, transform) {
17511 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
17512 return function() {
17513 var args = arguments,
17515 length = nativeMax(args.length - start, 0),
17516 array = Array(length);
17518 while (++index < length) {
17519 array[index] = args[start + index];
17522 var otherArgs = Array(start + 1);
17523 while (++index < start) {
17524 otherArgs[index] = args[index];
17526 otherArgs[start] = transform(array);
17527 return apply(func, this, otherArgs);
17532 * Creates a function that returns `value`.
17538 * @param {*} value The value to return from the new function.
17539 * @returns {Function} Returns the new constant function.
17542 * var objects = _.times(2, _.constant({ 'a': 1 }));
17544 * console.log(objects);
17545 * // => [{ 'a': 1 }, { 'a': 1 }]
17547 * console.log(objects[0] === objects[1]);
17550 function constant$13(value) {
17551 return function() {
17557 * The base implementation of `setToString` without support for hot loop shorting.
17560 * @param {Function} func The function to modify.
17561 * @param {Function} string The `toString` result.
17562 * @returns {Function} Returns `func`.
17564 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
17565 return defineProperty(func, 'toString', {
17566 'configurable': true,
17567 'enumerable': false,
17568 'value': constant$13(string),
17573 /** Used to detect hot functions by number of calls within a span of milliseconds. */
17574 var HOT_COUNT = 800;
17577 /* Built-in method references for those with the same name as other `lodash` methods. */
17578 var nativeNow = Date.now;
17581 * Creates a function that'll short out and invoke `identity` instead
17582 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
17586 * @param {Function} func The function to restrict.
17587 * @returns {Function} Returns the new shortable function.
17589 function shortOut(func) {
17593 return function() {
17594 var stamp = nativeNow(),
17595 remaining = HOT_SPAN - (stamp - lastCalled);
17597 lastCalled = stamp;
17598 if (remaining > 0) {
17599 if (++count >= HOT_COUNT) {
17600 return arguments[0];
17605 return func.apply(undefined, arguments);
17610 * Sets the `toString` method of `func` to return `string`.
17613 * @param {Function} func The function to modify.
17614 * @param {Function} string The `toString` result.
17615 * @returns {Function} Returns `func`.
17617 var setToString = shortOut(baseSetToString);
17620 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
17623 * @param {Function} func The function to apply a rest parameter to.
17624 * @param {number} [start=func.length-1] The start position of the rest parameter.
17625 * @returns {Function} Returns the new function.
17627 function baseRest(func, start) {
17628 return setToString(overRest(func, start, identity$8), func + '');
17631 /** Used as references for various `Number` constants. */
17632 var MAX_SAFE_INTEGER = 9007199254740991;
17635 * Checks if `value` is a valid array-like length.
17637 * **Note:** This method is loosely based on
17638 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
17644 * @param {*} value The value to check.
17645 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
17651 * _.isLength(Number.MIN_VALUE);
17654 * _.isLength(Infinity);
17660 function isLength(value) {
17661 return typeof value == 'number' &&
17662 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
17666 * Checks if `value` is array-like. A value is considered array-like if it's
17667 * not a function and has a `value.length` that's an integer greater than or
17668 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
17674 * @param {*} value The value to check.
17675 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
17678 * _.isArrayLike([1, 2, 3]);
17681 * _.isArrayLike(document.body.children);
17684 * _.isArrayLike('abc');
17687 * _.isArrayLike(_.noop);
17690 function isArrayLike(value) {
17691 return value != null && isLength(value.length) && !isFunction(value);
17694 /** Used as references for various `Number` constants. */
17695 var MAX_SAFE_INTEGER$1 = 9007199254740991;
17697 /** Used to detect unsigned integer values. */
17698 var reIsUint = /^(?:0|[1-9]\d*)$/;
17701 * Checks if `value` is a valid array-like index.
17704 * @param {*} value The value to check.
17705 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
17706 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
17708 function isIndex(value, length) {
17709 length = length == null ? MAX_SAFE_INTEGER$1 : length;
17711 (typeof value == 'number' || reIsUint.test(value)) &&
17712 (value > -1 && value % 1 == 0 && value < length);
17716 * Checks if the given arguments are from an iteratee call.
17719 * @param {*} value The potential iteratee value argument.
17720 * @param {*} index The potential iteratee index or key argument.
17721 * @param {*} object The potential iteratee object argument.
17722 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
17725 function isIterateeCall(value, index, object) {
17726 if (!isObject(object)) {
17729 var type = typeof index;
17730 if (type == 'number'
17731 ? (isArrayLike(object) && isIndex(index, object.length))
17732 : (type == 'string' && index in object)
17734 return eq(object[index], value);
17740 * Creates a function like `_.assign`.
17743 * @param {Function} assigner The function to assign values.
17744 * @returns {Function} Returns the new assigner function.
17746 function createAssigner(assigner) {
17747 return baseRest(function(object, sources) {
17749 length = sources.length,
17750 customizer = length > 1 ? sources[length - 1] : undefined,
17751 guard = length > 2 ? sources[2] : undefined;
17753 customizer = (assigner.length > 3 && typeof customizer == 'function')
17754 ? (length--, customizer)
17757 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
17758 customizer = length < 3 ? undefined : customizer;
17761 object = Object(object);
17762 while (++index < length) {
17763 var source = sources[index];
17765 assigner(object, source, index, customizer);
17773 * The base implementation of `_.times` without support for iteratee shorthands
17774 * or max array length checks.
17777 * @param {number} n The number of times to invoke `iteratee`.
17778 * @param {Function} iteratee The function invoked per iteration.
17779 * @returns {Array} Returns the array of results.
17781 function baseTimes(n, iteratee) {
17785 while (++index < n) {
17786 result[index] = iteratee(index);
17792 * Checks if `value` is object-like. A value is object-like if it's not `null`
17793 * and has a `typeof` result of "object".
17799 * @param {*} value The value to check.
17800 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
17803 * _.isObjectLike({});
17806 * _.isObjectLike([1, 2, 3]);
17809 * _.isObjectLike(_.noop);
17812 * _.isObjectLike(null);
17815 function isObjectLike(value) {
17816 return value != null && typeof value == 'object';
17819 /** `Object#toString` result references. */
17820 var argsTag = '[object Arguments]';
17823 * The base implementation of `_.isArguments`.
17826 * @param {*} value The value to check.
17827 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17829 function baseIsArguments(value) {
17830 return isObjectLike(value) && baseGetTag(value) == argsTag;
17833 /** Used for built-in method references. */
17834 var objectProto$5 = Object.prototype;
17836 /** Used to check objects for own properties. */
17837 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
17839 /** Built-in value references. */
17840 var propertyIsEnumerable = objectProto$5.propertyIsEnumerable;
17843 * Checks if `value` is likely an `arguments` object.
17849 * @param {*} value The value to check.
17850 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17854 * _.isArguments(function() { return arguments; }());
17857 * _.isArguments([1, 2, 3]);
17860 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
17861 return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') &&
17862 !propertyIsEnumerable.call(value, 'callee');
17866 * Checks if `value` is classified as an `Array` object.
17872 * @param {*} value The value to check.
17873 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
17876 * _.isArray([1, 2, 3]);
17879 * _.isArray(document.body.children);
17882 * _.isArray('abc');
17885 * _.isArray(_.noop);
17888 var isArray = Array.isArray;
17891 * This method returns `false`.
17897 * @returns {boolean} Returns `false`.
17900 * _.times(2, _.stubFalse);
17901 * // => [false, false]
17903 function stubFalse() {
17907 /** Detect free variable `exports`. */
17908 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
17910 /** Detect free variable `module`. */
17911 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
17913 /** Detect the popular CommonJS extension `module.exports`. */
17914 var moduleExports = freeModule && freeModule.exports === freeExports;
17916 /** Built-in value references. */
17917 var Buffer = moduleExports ? root$2.Buffer : undefined;
17919 /* Built-in method references for those with the same name as other `lodash` methods. */
17920 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
17923 * Checks if `value` is a buffer.
17929 * @param {*} value The value to check.
17930 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
17933 * _.isBuffer(new Buffer(2));
17936 * _.isBuffer(new Uint8Array(2));
17939 var isBuffer = nativeIsBuffer || stubFalse;
17941 /** `Object#toString` result references. */
17942 var argsTag$1 = '[object Arguments]';
17943 var arrayTag = '[object Array]';
17944 var boolTag = '[object Boolean]';
17945 var dateTag = '[object Date]';
17946 var errorTag = '[object Error]';
17947 var funcTag$1 = '[object Function]';
17948 var mapTag = '[object Map]';
17949 var numberTag = '[object Number]';
17950 var objectTag = '[object Object]';
17951 var regexpTag = '[object RegExp]';
17952 var setTag = '[object Set]';
17953 var stringTag = '[object String]';
17954 var weakMapTag = '[object WeakMap]';
17956 var arrayBufferTag = '[object ArrayBuffer]';
17957 var dataViewTag = '[object DataView]';
17958 var float32Tag = '[object Float32Array]';
17959 var float64Tag = '[object Float64Array]';
17960 var int8Tag = '[object Int8Array]';
17961 var int16Tag = '[object Int16Array]';
17962 var int32Tag = '[object Int32Array]';
17963 var uint8Tag = '[object Uint8Array]';
17964 var uint8ClampedTag = '[object Uint8ClampedArray]';
17965 var uint16Tag = '[object Uint16Array]';
17966 var uint32Tag = '[object Uint32Array]';
17968 /** Used to identify `toStringTag` values of typed arrays. */
17969 var typedArrayTags = {};
17970 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
17971 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
17972 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
17973 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
17974 typedArrayTags[uint32Tag] = true;
17975 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
17976 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
17977 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
17978 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
17979 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
17980 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
17981 typedArrayTags[setTag] = typedArrayTags[stringTag] =
17982 typedArrayTags[weakMapTag] = false;
17985 * The base implementation of `_.isTypedArray` without Node.js optimizations.
17988 * @param {*} value The value to check.
17989 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
17991 function baseIsTypedArray(value) {
17992 return isObjectLike(value) &&
17993 isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
17997 * The base implementation of `_.unary` without support for storing metadata.
18000 * @param {Function} func The function to cap arguments for.
18001 * @returns {Function} Returns the new capped function.
18003 function baseUnary(func) {
18004 return function(value) {
18005 return func(value);
18009 /** Detect free variable `exports`. */
18010 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18012 /** Detect free variable `module`. */
18013 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18015 /** Detect the popular CommonJS extension `module.exports`. */
18016 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18018 /** Detect free variable `process` from Node.js. */
18019 var freeProcess = moduleExports$1 && freeGlobal.process;
18021 /** Used to access faster Node.js helpers. */
18022 var nodeUtil = (function() {
18024 return freeProcess && freeProcess.binding && freeProcess.binding('util');
18028 /* Node.js helper references. */
18029 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18032 * Checks if `value` is classified as a typed array.
18038 * @param {*} value The value to check.
18039 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18042 * _.isTypedArray(new Uint8Array);
18045 * _.isTypedArray([]);
18048 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18050 /** Used for built-in method references. */
18051 var objectProto$4 = Object.prototype;
18053 /** Used to check objects for own properties. */
18054 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
18057 * Creates an array of the enumerable property names of the array-like `value`.
18060 * @param {*} value The value to query.
18061 * @param {boolean} inherited Specify returning inherited property names.
18062 * @returns {Array} Returns the array of property names.
18064 function arrayLikeKeys(value, inherited) {
18065 var isArr = isArray(value),
18066 isArg = !isArr && isArguments(value),
18067 isBuff = !isArr && !isArg && isBuffer(value),
18068 isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18069 skipIndexes = isArr || isArg || isBuff || isType,
18070 result = skipIndexes ? baseTimes(value.length, String) : [],
18071 length = result.length;
18073 for (var key in value) {
18074 if ((inherited || hasOwnProperty$3.call(value, key)) &&
18076 // Safari 9 has enumerable `arguments.length` in strict mode.
18078 // Node.js 0.10 has enumerable non-index properties on buffers.
18079 (isBuff && (key == 'offset' || key == 'parent')) ||
18080 // PhantomJS 2 has enumerable non-index properties on typed arrays.
18081 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18082 // Skip index properties.
18083 isIndex(key, length)
18091 /** Used for built-in method references. */
18092 var objectProto$7 = Object.prototype;
18095 * Checks if `value` is likely a prototype object.
18098 * @param {*} value The value to check.
18099 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18101 function isPrototype(value) {
18102 var Ctor = value && value.constructor,
18103 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$7;
18105 return value === proto;
18109 * This function is like
18110 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18111 * except that it includes inherited enumerable properties.
18114 * @param {Object} object The object to query.
18115 * @returns {Array} Returns the array of property names.
18117 function nativeKeysIn(object) {
18119 if (object != null) {
18120 for (var key in Object(object)) {
18127 /** Used for built-in method references. */
18128 var objectProto$6 = Object.prototype;
18130 /** Used to check objects for own properties. */
18131 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18134 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18137 * @param {Object} object The object to query.
18138 * @returns {Array} Returns the array of property names.
18140 function baseKeysIn(object) {
18141 if (!isObject(object)) {
18142 return nativeKeysIn(object);
18144 var isProto = isPrototype(object),
18147 for (var key in object) {
18148 if (!(key == 'constructor' && (isProto || !hasOwnProperty$5.call(object, key)))) {
18156 * Creates an array of the own and inherited enumerable property names of `object`.
18158 * **Note:** Non-object values are coerced to objects.
18164 * @param {Object} object The object to query.
18165 * @returns {Array} Returns the array of property names.
18173 * Foo.prototype.c = 3;
18175 * _.keysIn(new Foo);
18176 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18178 function keysIn$1(object) {
18179 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18183 * This method is like `_.assign` except that it iterates over own and
18184 * inherited source properties.
18186 * **Note:** This method mutates `object`.
18193 * @param {Object} object The destination object.
18194 * @param {...Object} [sources] The source objects.
18195 * @returns {Object} Returns `object`.
18207 * Foo.prototype.b = 2;
18208 * Bar.prototype.d = 4;
18210 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
18211 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
18213 var assignIn$1 = createAssigner(function(object, source) {
18214 copyObject(source, keysIn$1(source), object);
18218 * A specialized version of `_.filter` for arrays without support for
18219 * iteratee shorthands.
18222 * @param {Array} [array] The array to iterate over.
18223 * @param {Function} predicate The function invoked per iteration.
18224 * @returns {Array} Returns the new filtered array.
18226 function arrayFilter(array, predicate) {
18228 length = array == null ? 0 : array.length,
18232 while (++index < length) {
18233 var value = array[index];
18234 if (predicate(value, index, array)) {
18235 result[resIndex++] = value;
18242 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
18245 * @param {boolean} [fromRight] Specify iterating from right to left.
18246 * @returns {Function} Returns the new base function.
18248 function createBaseFor(fromRight) {
18249 return function(object, iteratee, keysFunc) {
18251 iterable = Object(object),
18252 props = keysFunc(object),
18253 length = props.length;
18256 var key = props[fromRight ? length : ++index];
18257 if (iteratee(iterable[key], key, iterable) === false) {
18266 * The base implementation of `baseForOwn` which iterates over `object`
18267 * properties returned by `keysFunc` and invokes `iteratee` for each property.
18268 * Iteratee functions may exit iteration early by explicitly returning `false`.
18271 * @param {Object} object The object to iterate over.
18272 * @param {Function} iteratee The function invoked per iteration.
18273 * @param {Function} keysFunc The function to get the keys of `object`.
18274 * @returns {Object} Returns `object`.
18276 var baseFor = createBaseFor();
18279 * Creates a unary function that invokes `func` with its argument transformed.
18282 * @param {Function} func The function to wrap.
18283 * @param {Function} transform The argument transform.
18284 * @returns {Function} Returns the new function.
18286 function overArg(func, transform) {
18287 return function(arg) {
18288 return func(transform(arg));
18292 /* Built-in method references for those with the same name as other `lodash` methods. */
18293 var nativeKeys = overArg(Object.keys, Object);
18295 /** Used for built-in method references. */
18296 var objectProto$8 = Object.prototype;
18298 /** Used to check objects for own properties. */
18299 var hasOwnProperty$6 = objectProto$8.hasOwnProperty;
18302 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18305 * @param {Object} object The object to query.
18306 * @returns {Array} Returns the array of property names.
18308 function baseKeys(object) {
18309 if (!isPrototype(object)) {
18310 return nativeKeys(object);
18313 for (var key in Object(object)) {
18314 if (hasOwnProperty$6.call(object, key) && key != 'constructor') {
18322 * Creates an array of the own enumerable property names of `object`.
18324 * **Note:** Non-object values are coerced to objects. See the
18325 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18326 * for more details.
18332 * @param {Object} object The object to query.
18333 * @returns {Array} Returns the array of property names.
18341 * Foo.prototype.c = 3;
18344 * // => ['a', 'b'] (iteration order is not guaranteed)
18349 function keys$1(object) {
18350 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18354 * The base implementation of `_.forOwn` without support for iteratee shorthands.
18357 * @param {Object} object The object to iterate over.
18358 * @param {Function} iteratee The function invoked per iteration.
18359 * @returns {Object} Returns `object`.
18361 function baseForOwn(object, iteratee) {
18362 return object && baseFor(object, iteratee, keys$1);
18366 * Creates a `baseEach` or `baseEachRight` function.
18369 * @param {Function} eachFunc The function to iterate over a collection.
18370 * @param {boolean} [fromRight] Specify iterating from right to left.
18371 * @returns {Function} Returns the new base function.
18373 function createBaseEach(eachFunc, fromRight) {
18374 return function(collection, iteratee) {
18375 if (collection == null) {
18378 if (!isArrayLike(collection)) {
18379 return eachFunc(collection, iteratee);
18381 var length = collection.length,
18382 index = fromRight ? length : -1,
18383 iterable = Object(collection);
18385 while ((fromRight ? index-- : ++index < length)) {
18386 if (iteratee(iterable[index], index, iterable) === false) {
18395 * The base implementation of `_.forEach` without support for iteratee shorthands.
18398 * @param {Array|Object} collection The collection to iterate over.
18399 * @param {Function} iteratee The function invoked per iteration.
18400 * @returns {Array|Object} Returns `collection`.
18402 var baseEach = createBaseEach(baseForOwn);
18405 * The base implementation of `_.filter` without support for iteratee shorthands.
18408 * @param {Array|Object} collection The collection to iterate over.
18409 * @param {Function} predicate The function invoked per iteration.
18410 * @returns {Array} Returns the new filtered array.
18412 function baseFilter(collection, predicate) {
18414 baseEach(collection, function(value, index, collection) {
18415 if (predicate(value, index, collection)) {
18416 result.push(value);
18423 * Removes all key-value entries from the list cache.
18427 * @memberOf ListCache
18429 function listCacheClear() {
18430 this.__data__ = [];
18435 * Gets the index at which the `key` is found in `array` of key-value pairs.
18438 * @param {Array} array The array to inspect.
18439 * @param {*} key The key to search for.
18440 * @returns {number} Returns the index of the matched value, else `-1`.
18442 function assocIndexOf(array, key) {
18443 var length = array.length;
18445 if (eq(array[length][0], key)) {
18452 /** Used for built-in method references. */
18453 var arrayProto = Array.prototype;
18455 /** Built-in value references. */
18456 var splice = arrayProto.splice;
18459 * Removes `key` and its value from the list cache.
18463 * @memberOf ListCache
18464 * @param {string} key The key of the value to remove.
18465 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18467 function listCacheDelete(key) {
18468 var data = this.__data__,
18469 index = assocIndexOf(data, key);
18474 var lastIndex = data.length - 1;
18475 if (index == lastIndex) {
18478 splice.call(data, index, 1);
18485 * Gets the list cache value for `key`.
18489 * @memberOf ListCache
18490 * @param {string} key The key of the value to get.
18491 * @returns {*} Returns the entry value.
18493 function listCacheGet(key) {
18494 var data = this.__data__,
18495 index = assocIndexOf(data, key);
18497 return index < 0 ? undefined : data[index][1];
18501 * Checks if a list cache value for `key` exists.
18505 * @memberOf ListCache
18506 * @param {string} key The key of the entry to check.
18507 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18509 function listCacheHas(key) {
18510 return assocIndexOf(this.__data__, key) > -1;
18514 * Sets the list cache `key` to `value`.
18518 * @memberOf ListCache
18519 * @param {string} key The key of the value to set.
18520 * @param {*} value The value to set.
18521 * @returns {Object} Returns the list cache instance.
18523 function listCacheSet(key, value) {
18524 var data = this.__data__,
18525 index = assocIndexOf(data, key);
18529 data.push([key, value]);
18531 data[index][1] = value;
18537 * Creates an list cache object.
18541 * @param {Array} [entries] The key-value pairs to cache.
18543 function ListCache(entries) {
18545 length = entries == null ? 0 : entries.length;
18548 while (++index < length) {
18549 var entry = entries[index];
18550 this.set(entry[0], entry[1]);
18554 // Add methods to `ListCache`.
18555 ListCache.prototype.clear = listCacheClear;
18556 ListCache.prototype['delete'] = listCacheDelete;
18557 ListCache.prototype.get = listCacheGet;
18558 ListCache.prototype.has = listCacheHas;
18559 ListCache.prototype.set = listCacheSet;
18562 * Removes all key-value entries from the stack.
18568 function stackClear() {
18569 this.__data__ = new ListCache;
18574 * Removes `key` and its value from the stack.
18579 * @param {string} key The key of the value to remove.
18580 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18582 function stackDelete(key) {
18583 var data = this.__data__,
18584 result = data['delete'](key);
18586 this.size = data.size;
18591 * Gets the stack value for `key`.
18596 * @param {string} key The key of the value to get.
18597 * @returns {*} Returns the entry value.
18599 function stackGet(key) {
18600 return this.__data__.get(key);
18604 * Checks if a stack value for `key` exists.
18609 * @param {string} key The key of the entry to check.
18610 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18612 function stackHas(key) {
18613 return this.__data__.has(key);
18616 /* Built-in method references that are verified to be native. */
18617 var Map$1 = getNative(root$2, 'Map');
18619 /* Built-in method references that are verified to be native. */
18620 var nativeCreate = getNative(Object, 'create');
18623 * Removes all key-value entries from the hash.
18629 function hashClear() {
18630 this.__data__ = nativeCreate ? nativeCreate(null) : {};
18635 * Removes `key` and its value from the hash.
18640 * @param {Object} hash The hash to modify.
18641 * @param {string} key The key of the value to remove.
18642 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18644 function hashDelete(key) {
18645 var result = this.has(key) && delete this.__data__[key];
18646 this.size -= result ? 1 : 0;
18650 /** Used to stand-in for `undefined` hash values. */
18651 var HASH_UNDEFINED = '__lodash_hash_undefined__';
18653 /** Used for built-in method references. */
18654 var objectProto$9 = Object.prototype;
18656 /** Used to check objects for own properties. */
18657 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18660 * Gets the hash value for `key`.
18665 * @param {string} key The key of the value to get.
18666 * @returns {*} Returns the entry value.
18668 function hashGet(key) {
18669 var data = this.__data__;
18670 if (nativeCreate) {
18671 var result = data[key];
18672 return result === HASH_UNDEFINED ? undefined : result;
18674 return hasOwnProperty$7.call(data, key) ? data[key] : undefined;
18677 /** Used for built-in method references. */
18678 var objectProto$10 = Object.prototype;
18680 /** Used to check objects for own properties. */
18681 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18684 * Checks if a hash value for `key` exists.
18689 * @param {string} key The key of the entry to check.
18690 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18692 function hashHas(key) {
18693 var data = this.__data__;
18694 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key);
18697 /** Used to stand-in for `undefined` hash values. */
18698 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
18701 * Sets the hash `key` to `value`.
18706 * @param {string} key The key of the value to set.
18707 * @param {*} value The value to set.
18708 * @returns {Object} Returns the hash instance.
18710 function hashSet(key, value) {
18711 var data = this.__data__;
18712 this.size += this.has(key) ? 0 : 1;
18713 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
18718 * Creates a hash object.
18722 * @param {Array} [entries] The key-value pairs to cache.
18724 function Hash(entries) {
18726 length = entries == null ? 0 : entries.length;
18729 while (++index < length) {
18730 var entry = entries[index];
18731 this.set(entry[0], entry[1]);
18735 // Add methods to `Hash`.
18736 Hash.prototype.clear = hashClear;
18737 Hash.prototype['delete'] = hashDelete;
18738 Hash.prototype.get = hashGet;
18739 Hash.prototype.has = hashHas;
18740 Hash.prototype.set = hashSet;
18743 * Removes all key-value entries from the map.
18747 * @memberOf MapCache
18749 function mapCacheClear() {
18753 'map': new (Map$1 || ListCache),
18759 * Checks if `value` is suitable for use as unique object key.
18762 * @param {*} value The value to check.
18763 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
18765 function isKeyable(value) {
18766 var type = typeof value;
18767 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
18768 ? (value !== '__proto__')
18769 : (value === null);
18773 * Gets the data for `map`.
18776 * @param {Object} map The map to query.
18777 * @param {string} key The reference key.
18778 * @returns {*} Returns the map data.
18780 function getMapData(map, key) {
18781 var data = map.__data__;
18782 return isKeyable(key)
18783 ? data[typeof key == 'string' ? 'string' : 'hash']
18788 * Removes `key` and its value from the map.
18792 * @memberOf MapCache
18793 * @param {string} key The key of the value to remove.
18794 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18796 function mapCacheDelete(key) {
18797 var result = getMapData(this, key)['delete'](key);
18798 this.size -= result ? 1 : 0;
18803 * Gets the map value for `key`.
18807 * @memberOf MapCache
18808 * @param {string} key The key of the value to get.
18809 * @returns {*} Returns the entry value.
18811 function mapCacheGet(key) {
18812 return getMapData(this, key).get(key);
18816 * Checks if a map value for `key` exists.
18820 * @memberOf MapCache
18821 * @param {string} key The key of the entry to check.
18822 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18824 function mapCacheHas(key) {
18825 return getMapData(this, key).has(key);
18829 * Sets the map `key` to `value`.
18833 * @memberOf MapCache
18834 * @param {string} key The key of the value to set.
18835 * @param {*} value The value to set.
18836 * @returns {Object} Returns the map cache instance.
18838 function mapCacheSet(key, value) {
18839 var data = getMapData(this, key),
18842 data.set(key, value);
18843 this.size += data.size == size ? 0 : 1;
18848 * Creates a map cache object to store key-value pairs.
18852 * @param {Array} [entries] The key-value pairs to cache.
18854 function MapCache(entries) {
18856 length = entries == null ? 0 : entries.length;
18859 while (++index < length) {
18860 var entry = entries[index];
18861 this.set(entry[0], entry[1]);
18865 // Add methods to `MapCache`.
18866 MapCache.prototype.clear = mapCacheClear;
18867 MapCache.prototype['delete'] = mapCacheDelete;
18868 MapCache.prototype.get = mapCacheGet;
18869 MapCache.prototype.has = mapCacheHas;
18870 MapCache.prototype.set = mapCacheSet;
18872 /** Used as the size to enable large array optimizations. */
18873 var LARGE_ARRAY_SIZE = 200;
18876 * Sets the stack `key` to `value`.
18881 * @param {string} key The key of the value to set.
18882 * @param {*} value The value to set.
18883 * @returns {Object} Returns the stack cache instance.
18885 function stackSet(key, value) {
18886 var data = this.__data__;
18887 if (data instanceof ListCache) {
18888 var pairs = data.__data__;
18889 if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
18890 pairs.push([key, value]);
18891 this.size = ++data.size;
18894 data = this.__data__ = new MapCache(pairs);
18896 data.set(key, value);
18897 this.size = data.size;
18902 * Creates a stack cache object to store key-value pairs.
18906 * @param {Array} [entries] The key-value pairs to cache.
18908 function Stack(entries) {
18909 var data = this.__data__ = new ListCache(entries);
18910 this.size = data.size;
18913 // Add methods to `Stack`.
18914 Stack.prototype.clear = stackClear;
18915 Stack.prototype['delete'] = stackDelete;
18916 Stack.prototype.get = stackGet;
18917 Stack.prototype.has = stackHas;
18918 Stack.prototype.set = stackSet;
18920 /** Used to stand-in for `undefined` hash values. */
18921 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
18924 * Adds `value` to the array cache.
18928 * @memberOf SetCache
18930 * @param {*} value The value to cache.
18931 * @returns {Object} Returns the cache instance.
18933 function setCacheAdd(value) {
18934 this.__data__.set(value, HASH_UNDEFINED$2);
18939 * Checks if `value` is in the array cache.
18943 * @memberOf SetCache
18944 * @param {*} value The value to search for.
18945 * @returns {number} Returns `true` if `value` is found, else `false`.
18947 function setCacheHas(value) {
18948 return this.__data__.has(value);
18953 * Creates an array cache object to store unique values.
18957 * @param {Array} [values] The values to cache.
18959 function SetCache(values) {
18961 length = values == null ? 0 : values.length;
18963 this.__data__ = new MapCache;
18964 while (++index < length) {
18965 this.add(values[index]);
18969 // Add methods to `SetCache`.
18970 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
18971 SetCache.prototype.has = setCacheHas;
18974 * A specialized version of `_.some` for arrays without support for iteratee
18978 * @param {Array} [array] The array to iterate over.
18979 * @param {Function} predicate The function invoked per iteration.
18980 * @returns {boolean} Returns `true` if any element passes the predicate check,
18983 function arraySome(array, predicate) {
18985 length = array == null ? 0 : array.length;
18987 while (++index < length) {
18988 if (predicate(array[index], index, array)) {
18996 * Checks if a `cache` value for `key` exists.
18999 * @param {Object} cache The cache to query.
19000 * @param {string} key The key of the entry to check.
19001 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19003 function cacheHas(cache, key) {
19004 return cache.has(key);
19007 /** Used to compose bitmasks for value comparisons. */
19008 var COMPARE_PARTIAL_FLAG$2 = 1;
19009 var COMPARE_UNORDERED_FLAG$1 = 2;
19012 * A specialized version of `baseIsEqualDeep` for arrays with support for
19013 * partial deep comparisons.
19016 * @param {Array} array The array to compare.
19017 * @param {Array} other The other array to compare.
19018 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19019 * @param {Function} customizer The function to customize comparisons.
19020 * @param {Function} equalFunc The function to determine equivalents of values.
19021 * @param {Object} stack Tracks traversed `array` and `other` objects.
19022 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19024 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19025 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19026 arrLength = array.length,
19027 othLength = other.length;
19029 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19032 // Assume cyclic values are equal.
19033 var stacked = stack.get(array);
19034 if (stacked && stack.get(other)) {
19035 return stacked == other;
19039 seen = (bitmask & COMPARE_UNORDERED_FLAG$1) ? new SetCache : undefined;
19041 stack.set(array, other);
19042 stack.set(other, array);
19044 // Ignore non-index properties.
19045 while (++index < arrLength) {
19046 var arrValue = array[index],
19047 othValue = other[index];
19050 var compared = isPartial
19051 ? customizer(othValue, arrValue, index, other, array, stack)
19052 : customizer(arrValue, othValue, index, array, other, stack);
19054 if (compared !== undefined) {
19061 // Recursively compare arrays (susceptible to call stack limits).
19063 if (!arraySome(other, function(othValue, othIndex) {
19064 if (!cacheHas(seen, othIndex) &&
19065 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19066 return seen.push(othIndex);
19073 arrValue === othValue ||
19074 equalFunc(arrValue, othValue, bitmask, customizer, stack)
19080 stack['delete'](array);
19081 stack['delete'](other);
19085 /** Built-in value references. */
19086 var Uint8Array = root$2.Uint8Array;
19089 * Converts `map` to its key-value pairs.
19092 * @param {Object} map The map to convert.
19093 * @returns {Array} Returns the key-value pairs.
19095 function mapToArray(map) {
19097 result = Array(map.size);
19099 map.forEach(function(value, key) {
19100 result[++index] = [key, value];
19106 * Converts `set` to an array of its values.
19109 * @param {Object} set The set to convert.
19110 * @returns {Array} Returns the values.
19112 function setToArray(set) {
19114 result = Array(set.size);
19116 set.forEach(function(value) {
19117 result[++index] = value;
19122 /** Used to compose bitmasks for value comparisons. */
19123 var COMPARE_PARTIAL_FLAG$3 = 1;
19124 var COMPARE_UNORDERED_FLAG$2 = 2;
19126 /** `Object#toString` result references. */
19127 var boolTag$1 = '[object Boolean]';
19128 var dateTag$1 = '[object Date]';
19129 var errorTag$1 = '[object Error]';
19130 var mapTag$1 = '[object Map]';
19131 var numberTag$1 = '[object Number]';
19132 var regexpTag$1 = '[object RegExp]';
19133 var setTag$1 = '[object Set]';
19134 var stringTag$1 = '[object String]';
19135 var symbolTag = '[object Symbol]';
19137 var arrayBufferTag$1 = '[object ArrayBuffer]';
19138 var dataViewTag$1 = '[object DataView]';
19140 /** Used to convert symbols to primitives and strings. */
19141 var symbolProto = Symbol ? Symbol.prototype : undefined;
19142 var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19145 * A specialized version of `baseIsEqualDeep` for comparing objects of
19146 * the same `toStringTag`.
19148 * **Note:** This function only supports comparing values with tags of
19149 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19152 * @param {Object} object The object to compare.
19153 * @param {Object} other The other object to compare.
19154 * @param {string} tag The `toStringTag` of the objects to compare.
19155 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19156 * @param {Function} customizer The function to customize comparisons.
19157 * @param {Function} equalFunc The function to determine equivalents of values.
19158 * @param {Object} stack Tracks traversed `object` and `other` objects.
19159 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19161 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19163 case dataViewTag$1:
19164 if ((object.byteLength != other.byteLength) ||
19165 (object.byteOffset != other.byteOffset)) {
19168 object = object.buffer;
19169 other = other.buffer;
19171 case arrayBufferTag$1:
19172 if ((object.byteLength != other.byteLength) ||
19173 !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19181 // Coerce booleans to `1` or `0` and dates to milliseconds.
19182 // Invalid dates are coerced to `NaN`.
19183 return eq(+object, +other);
19186 return object.name == other.name && object.message == other.message;
19190 // Coerce regexes to strings and treat strings, primitives and objects,
19191 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19192 // for more details.
19193 return object == (other + '');
19196 var convert = mapToArray;
19199 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3;
19200 convert || (convert = setToArray);
19202 if (object.size != other.size && !isPartial) {
19205 // Assume cyclic values are equal.
19206 var stacked = stack.get(object);
19208 return stacked == other;
19210 bitmask |= COMPARE_UNORDERED_FLAG$2;
19212 // Recursively compare objects (susceptible to call stack limits).
19213 stack.set(object, other);
19214 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19215 stack['delete'](object);
19219 if (symbolValueOf) {
19220 return symbolValueOf.call(object) == symbolValueOf.call(other);
19227 * Appends the elements of `values` to `array`.
19230 * @param {Array} array The array to modify.
19231 * @param {Array} values The values to append.
19232 * @returns {Array} Returns `array`.
19234 function arrayPush(array, values) {
19236 length = values.length,
19237 offset = array.length;
19239 while (++index < length) {
19240 array[offset + index] = values[index];
19246 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
19247 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
19248 * symbols of `object`.
19251 * @param {Object} object The object to query.
19252 * @param {Function} keysFunc The function to get the keys of `object`.
19253 * @param {Function} symbolsFunc The function to get the symbols of `object`.
19254 * @returns {Array} Returns the array of property names and symbols.
19256 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
19257 var result = keysFunc(object);
19258 return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
19262 * This method returns a new empty array.
19268 * @returns {Array} Returns the new empty array.
19271 * var arrays = _.times(2, _.stubArray);
19273 * console.log(arrays);
19276 * console.log(arrays[0] === arrays[1]);
19279 function stubArray() {
19283 /** Used for built-in method references. */
19284 var objectProto$13 = Object.prototype;
19286 /** Built-in value references. */
19287 var propertyIsEnumerable$1 = objectProto$13.propertyIsEnumerable;
19289 /* Built-in method references for those with the same name as other `lodash` methods. */
19290 var nativeGetSymbols = Object.getOwnPropertySymbols;
19293 * Creates an array of the own enumerable symbols of `object`.
19296 * @param {Object} object The object to query.
19297 * @returns {Array} Returns the array of symbols.
19299 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
19300 if (object == null) {
19303 object = Object(object);
19304 return arrayFilter(nativeGetSymbols(object), function(symbol) {
19305 return propertyIsEnumerable$1.call(object, symbol);
19310 * Creates an array of own enumerable property names and symbols of `object`.
19313 * @param {Object} object The object to query.
19314 * @returns {Array} Returns the array of property names and symbols.
19316 function getAllKeys(object) {
19317 return baseGetAllKeys(object, keys$1, getSymbols);
19320 /** Used to compose bitmasks for value comparisons. */
19321 var COMPARE_PARTIAL_FLAG$4 = 1;
19323 /** Used for built-in method references. */
19324 var objectProto$12 = Object.prototype;
19326 /** Used to check objects for own properties. */
19327 var hasOwnProperty$10 = objectProto$12.hasOwnProperty;
19330 * A specialized version of `baseIsEqualDeep` for objects with support for
19331 * partial deep comparisons.
19334 * @param {Object} object The object to compare.
19335 * @param {Object} other The other object to compare.
19336 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19337 * @param {Function} customizer The function to customize comparisons.
19338 * @param {Function} equalFunc The function to determine equivalents of values.
19339 * @param {Object} stack Tracks traversed `object` and `other` objects.
19340 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19342 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19343 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4,
19344 objProps = getAllKeys(object),
19345 objLength = objProps.length,
19346 othProps = getAllKeys(other),
19347 othLength = othProps.length;
19349 if (objLength != othLength && !isPartial) {
19352 var index = objLength;
19354 var key = objProps[index];
19355 if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19359 // Assume cyclic values are equal.
19360 var stacked = stack.get(object);
19361 if (stacked && stack.get(other)) {
19362 return stacked == other;
19365 stack.set(object, other);
19366 stack.set(other, object);
19368 var skipCtor = isPartial;
19369 while (++index < objLength) {
19370 key = objProps[index];
19371 var objValue = object[key],
19372 othValue = other[key];
19375 var compared = isPartial
19376 ? customizer(othValue, objValue, key, other, object, stack)
19377 : customizer(objValue, othValue, key, object, other, stack);
19379 // Recursively compare objects (susceptible to call stack limits).
19380 if (!(compared === undefined
19381 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19387 skipCtor || (skipCtor = key == 'constructor');
19389 if (result && !skipCtor) {
19390 var objCtor = object.constructor,
19391 othCtor = other.constructor;
19393 // Non `Object` object instances with different constructors are not equal.
19394 if (objCtor != othCtor &&
19395 ('constructor' in object && 'constructor' in other) &&
19396 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19397 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19401 stack['delete'](object);
19402 stack['delete'](other);
19406 /* Built-in method references that are verified to be native. */
19407 var DataView = getNative(root$2, 'DataView');
19409 /* Built-in method references that are verified to be native. */
19410 var Promise = getNative(root$2, 'Promise');
19412 /* Built-in method references that are verified to be native. */
19413 var Set$1 = getNative(root$2, 'Set');
19415 /* Built-in method references that are verified to be native. */
19416 var WeakMap = getNative(root$2, 'WeakMap');
19418 /** `Object#toString` result references. */
19419 var mapTag$2 = '[object Map]';
19420 var objectTag$2 = '[object Object]';
19421 var promiseTag = '[object Promise]';
19422 var setTag$2 = '[object Set]';
19423 var weakMapTag$1 = '[object WeakMap]';
19425 var dataViewTag$2 = '[object DataView]';
19427 /** Used to detect maps, sets, and weakmaps. */
19428 var dataViewCtorString = toSource(DataView);
19429 var mapCtorString = toSource(Map$1);
19430 var promiseCtorString = toSource(Promise);
19431 var setCtorString = toSource(Set$1);
19432 var weakMapCtorString = toSource(WeakMap);
19435 * Gets the `toStringTag` of `value`.
19438 * @param {*} value The value to query.
19439 * @returns {string} Returns the `toStringTag`.
19441 var getTag = baseGetTag;
19443 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
19444 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$2) ||
19445 (Map$1 && getTag(new Map$1) != mapTag$2) ||
19446 (Promise && getTag(Promise.resolve()) != promiseTag) ||
19447 (Set$1 && getTag(new Set$1) != setTag$2) ||
19448 (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
19449 getTag = function(value) {
19450 var result = baseGetTag(value),
19451 Ctor = result == objectTag$2 ? value.constructor : undefined,
19452 ctorString = Ctor ? toSource(Ctor) : '';
19455 switch (ctorString) {
19456 case dataViewCtorString: return dataViewTag$2;
19457 case mapCtorString: return mapTag$2;
19458 case promiseCtorString: return promiseTag;
19459 case setCtorString: return setTag$2;
19460 case weakMapCtorString: return weakMapTag$1;
19467 var getTag$1 = getTag;
19469 /** Used to compose bitmasks for value comparisons. */
19470 var COMPARE_PARTIAL_FLAG$1 = 1;
19472 /** `Object#toString` result references. */
19473 var argsTag$2 = '[object Arguments]';
19474 var arrayTag$1 = '[object Array]';
19475 var objectTag$1 = '[object Object]';
19477 /** Used for built-in method references. */
19478 var objectProto$11 = Object.prototype;
19480 /** Used to check objects for own properties. */
19481 var hasOwnProperty$9 = objectProto$11.hasOwnProperty;
19484 * A specialized version of `baseIsEqual` for arrays and objects which performs
19485 * deep comparisons and tracks traversed objects enabling objects with circular
19486 * references to be compared.
19489 * @param {Object} object The object to compare.
19490 * @param {Object} other The other object to compare.
19491 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19492 * @param {Function} customizer The function to customize comparisons.
19493 * @param {Function} equalFunc The function to determine equivalents of values.
19494 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19495 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19497 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19498 var objIsArr = isArray(object),
19499 othIsArr = isArray(other),
19500 objTag = objIsArr ? arrayTag$1 : getTag$1(object),
19501 othTag = othIsArr ? arrayTag$1 : getTag$1(other);
19503 objTag = objTag == argsTag$2 ? objectTag$1 : objTag;
19504 othTag = othTag == argsTag$2 ? objectTag$1 : othTag;
19506 var objIsObj = objTag == objectTag$1,
19507 othIsObj = othTag == objectTag$1,
19508 isSameTag = objTag == othTag;
19510 if (isSameTag && isBuffer(object)) {
19511 if (!isBuffer(other)) {
19517 if (isSameTag && !objIsObj) {
19518 stack || (stack = new Stack);
19519 return (objIsArr || isTypedArray(object))
19520 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19521 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19523 if (!(bitmask & COMPARE_PARTIAL_FLAG$1)) {
19524 var objIsWrapped = objIsObj && hasOwnProperty$9.call(object, '__wrapped__'),
19525 othIsWrapped = othIsObj && hasOwnProperty$9.call(other, '__wrapped__');
19527 if (objIsWrapped || othIsWrapped) {
19528 var objUnwrapped = objIsWrapped ? object.value() : object,
19529 othUnwrapped = othIsWrapped ? other.value() : other;
19531 stack || (stack = new Stack);
19532 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
19538 stack || (stack = new Stack);
19539 return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
19543 * The base implementation of `_.isEqual` which supports partial comparisons
19544 * and tracks traversed objects.
19547 * @param {*} value The value to compare.
19548 * @param {*} other The other value to compare.
19549 * @param {boolean} bitmask The bitmask flags.
19550 * 1 - Unordered comparison
19551 * 2 - Partial comparison
19552 * @param {Function} [customizer] The function to customize comparisons.
19553 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
19554 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
19556 function baseIsEqual(value, other, bitmask, customizer, stack) {
19557 if (value === other) {
19560 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
19561 return value !== value && other !== other;
19563 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
19566 /** Used to compose bitmasks for value comparisons. */
19567 var COMPARE_PARTIAL_FLAG = 1;
19568 var COMPARE_UNORDERED_FLAG = 2;
19571 * The base implementation of `_.isMatch` without support for iteratee shorthands.
19574 * @param {Object} object The object to inspect.
19575 * @param {Object} source The object of property values to match.
19576 * @param {Array} matchData The property names, values, and compare flags to match.
19577 * @param {Function} [customizer] The function to customize comparisons.
19578 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
19580 function baseIsMatch(object, source, matchData, customizer) {
19581 var index = matchData.length,
19583 noCustomizer = !customizer;
19585 if (object == null) {
19588 object = Object(object);
19590 var data = matchData[index];
19591 if ((noCustomizer && data[2])
19592 ? data[1] !== object[data[0]]
19593 : !(data[0] in object)
19598 while (++index < length) {
19599 data = matchData[index];
19601 objValue = object[key],
19602 srcValue = data[1];
19604 if (noCustomizer && data[2]) {
19605 if (objValue === undefined && !(key in object)) {
19609 var stack = new Stack;
19611 var result = customizer(objValue, srcValue, key, object, source, stack);
19613 if (!(result === undefined
19614 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
19625 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
19628 * @param {*} value The value to check.
19629 * @returns {boolean} Returns `true` if `value` if suitable for strict
19630 * equality comparisons, else `false`.
19632 function isStrictComparable(value) {
19633 return value === value && !isObject(value);
19637 * Gets the property names, values, and compare flags of `object`.
19640 * @param {Object} object The object to query.
19641 * @returns {Array} Returns the match data of `object`.
19643 function getMatchData(object) {
19644 var result = keys$1(object),
19645 length = result.length;
19648 var key = result[length],
19649 value = object[key];
19651 result[length] = [key, value, isStrictComparable(value)];
19657 * A specialized version of `matchesProperty` for source values suitable
19658 * for strict equality comparisons, i.e. `===`.
19661 * @param {string} key The key of the property to get.
19662 * @param {*} srcValue The value to match.
19663 * @returns {Function} Returns the new spec function.
19665 function matchesStrictComparable(key, srcValue) {
19666 return function(object) {
19667 if (object == null) {
19670 return object[key] === srcValue &&
19671 (srcValue !== undefined || (key in Object(object)));
19676 * The base implementation of `_.matches` which doesn't clone `source`.
19679 * @param {Object} source The object of property values to match.
19680 * @returns {Function} Returns the new spec function.
19682 function baseMatches(source) {
19683 var matchData = getMatchData(source);
19684 if (matchData.length == 1 && matchData[0][2]) {
19685 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
19687 return function(object) {
19688 return object === source || baseIsMatch(object, source, matchData);
19692 /** `Object#toString` result references. */
19693 var symbolTag$1 = '[object Symbol]';
19696 * Checks if `value` is classified as a `Symbol` primitive or object.
19702 * @param {*} value The value to check.
19703 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
19706 * _.isSymbol(Symbol.iterator);
19709 * _.isSymbol('abc');
19712 function isSymbol(value) {
19713 return typeof value == 'symbol' ||
19714 (isObjectLike(value) && baseGetTag(value) == symbolTag$1);
19717 /** Used to match property names within property paths. */
19718 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
19719 var reIsPlainProp = /^\w*$/;
19722 * Checks if `value` is a property name and not a property path.
19725 * @param {*} value The value to check.
19726 * @param {Object} [object] The object to query keys on.
19727 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
19729 function isKey(value, object) {
19730 if (isArray(value)) {
19733 var type = typeof value;
19734 if (type == 'number' || type == 'symbol' || type == 'boolean' ||
19735 value == null || isSymbol(value)) {
19738 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
19739 (object != null && value in Object(object));
19742 /** Error message constants. */
19743 var FUNC_ERROR_TEXT = 'Expected a function';
19746 * Creates a function that memoizes the result of `func`. If `resolver` is
19747 * provided, it determines the cache key for storing the result based on the
19748 * arguments provided to the memoized function. By default, the first argument
19749 * provided to the memoized function is used as the map cache key. The `func`
19750 * is invoked with the `this` binding of the memoized function.
19752 * **Note:** The cache is exposed as the `cache` property on the memoized
19753 * function. Its creation may be customized by replacing the `_.memoize.Cache`
19754 * constructor with one whose instances implement the
19755 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
19756 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
19761 * @category Function
19762 * @param {Function} func The function to have its output memoized.
19763 * @param {Function} [resolver] The function to resolve the cache key.
19764 * @returns {Function} Returns the new memoized function.
19767 * var object = { 'a': 1, 'b': 2 };
19768 * var other = { 'c': 3, 'd': 4 };
19770 * var values = _.memoize(_.values);
19781 * // Modify the result cache.
19782 * values.cache.set(object, ['a', 'b']);
19786 * // Replace `_.memoize.Cache`.
19787 * _.memoize.Cache = WeakMap;
19789 function memoize(func, resolver) {
19790 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
19791 throw new TypeError(FUNC_ERROR_TEXT);
19793 var memoized = function() {
19794 var args = arguments,
19795 key = resolver ? resolver.apply(this, args) : args[0],
19796 cache = memoized.cache;
19798 if (cache.has(key)) {
19799 return cache.get(key);
19801 var result = func.apply(this, args);
19802 memoized.cache = cache.set(key, result) || cache;
19805 memoized.cache = new (memoize.Cache || MapCache);
19809 // Expose `MapCache`.
19810 memoize.Cache = MapCache;
19812 /** Used as the maximum memoize cache size. */
19813 var MAX_MEMOIZE_SIZE = 500;
19816 * A specialized version of `_.memoize` which clears the memoized function's
19817 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
19820 * @param {Function} func The function to have its output memoized.
19821 * @returns {Function} Returns the new memoized function.
19823 function memoizeCapped(func) {
19824 var result = memoize(func, function(key) {
19825 if (cache.size === MAX_MEMOIZE_SIZE) {
19831 var cache = result.cache;
19835 /** Used to match property names within property paths. */
19836 var reLeadingDot = /^\./;
19837 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
19839 /** Used to match backslashes in property paths. */
19840 var reEscapeChar = /\\(\\)?/g;
19843 * Converts `string` to a property path array.
19846 * @param {string} string The string to convert.
19847 * @returns {Array} Returns the property path array.
19849 var stringToPath = memoizeCapped(function(string) {
19851 if (reLeadingDot.test(string)) {
19854 string.replace(rePropName, function(match, number, quote, string) {
19855 result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
19861 * A specialized version of `_.map` for arrays without support for iteratee
19865 * @param {Array} [array] The array to iterate over.
19866 * @param {Function} iteratee The function invoked per iteration.
19867 * @returns {Array} Returns the new mapped array.
19869 function arrayMap(array, iteratee) {
19871 length = array == null ? 0 : array.length,
19872 result = Array(length);
19874 while (++index < length) {
19875 result[index] = iteratee(array[index], index, array);
19880 /** Used as references for various `Number` constants. */
19881 var INFINITY = 1 / 0;
19883 /** Used to convert symbols to primitives and strings. */
19884 var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
19885 var symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;
19888 * The base implementation of `_.toString` which doesn't convert nullish
19889 * values to empty strings.
19892 * @param {*} value The value to process.
19893 * @returns {string} Returns the string.
19895 function baseToString(value) {
19896 // Exit early for strings to avoid a performance hit in some environments.
19897 if (typeof value == 'string') {
19900 if (isArray(value)) {
19901 // Recursively convert values (susceptible to call stack limits).
19902 return arrayMap(value, baseToString) + '';
19904 if (isSymbol(value)) {
19905 return symbolToString ? symbolToString.call(value) : '';
19907 var result = (value + '');
19908 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
19912 * Converts `value` to a string. An empty string is returned for `null`
19913 * and `undefined` values. The sign of `-0` is preserved.
19919 * @param {*} value The value to convert.
19920 * @returns {string} Returns the converted string.
19923 * _.toString(null);
19929 * _.toString([1, 2, 3]);
19932 function toString(value) {
19933 return value == null ? '' : baseToString(value);
19937 * Casts `value` to a path array if it's not one.
19940 * @param {*} value The value to inspect.
19941 * @param {Object} [object] The object to query keys on.
19942 * @returns {Array} Returns the cast property path array.
19944 function castPath(value, object) {
19945 if (isArray(value)) {
19948 return isKey(value, object) ? [value] : stringToPath(toString(value));
19951 /** Used as references for various `Number` constants. */
19952 var INFINITY$1 = 1 / 0;
19955 * Converts `value` to a string key if it's not a string or symbol.
19958 * @param {*} value The value to inspect.
19959 * @returns {string|symbol} Returns the key.
19961 function toKey(value) {
19962 if (typeof value == 'string' || isSymbol(value)) {
19965 var result = (value + '');
19966 return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
19970 * The base implementation of `_.get` without support for default values.
19973 * @param {Object} object The object to query.
19974 * @param {Array|string} path The path of the property to get.
19975 * @returns {*} Returns the resolved value.
19977 function baseGet(object, path) {
19978 path = castPath(path, object);
19981 length = path.length;
19983 while (object != null && index < length) {
19984 object = object[toKey(path[index++])];
19986 return (index && index == length) ? object : undefined;
19990 * Gets the value at `path` of `object`. If the resolved value is
19991 * `undefined`, the `defaultValue` is returned in its place.
19997 * @param {Object} object The object to query.
19998 * @param {Array|string} path The path of the property to get.
19999 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20000 * @returns {*} Returns the resolved value.
20003 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20005 * _.get(object, 'a[0].b.c');
20008 * _.get(object, ['a', '0', 'b', 'c']);
20011 * _.get(object, 'a.b.c', 'default');
20014 function get$2(object, path, defaultValue) {
20015 var result = object == null ? undefined : baseGet(object, path);
20016 return result === undefined ? defaultValue : result;
20020 * The base implementation of `_.hasIn` without support for deep paths.
20023 * @param {Object} [object] The object to query.
20024 * @param {Array|string} key The key to check.
20025 * @returns {boolean} Returns `true` if `key` exists, else `false`.
20027 function baseHasIn(object, key) {
20028 return object != null && key in Object(object);
20032 * Checks if `path` exists on `object`.
20035 * @param {Object} object The object to query.
20036 * @param {Array|string} path The path to check.
20037 * @param {Function} hasFunc The function to check properties.
20038 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20040 function hasPath(object, path, hasFunc) {
20041 path = castPath(path, object);
20044 length = path.length,
20047 while (++index < length) {
20048 var key = toKey(path[index]);
20049 if (!(result = object != null && hasFunc(object, key))) {
20052 object = object[key];
20054 if (result || ++index != length) {
20057 length = object == null ? 0 : object.length;
20058 return !!length && isLength(length) && isIndex(key, length) &&
20059 (isArray(object) || isArguments(object));
20063 * Checks if `path` is a direct or inherited property of `object`.
20069 * @param {Object} object The object to query.
20070 * @param {Array|string} path The path to check.
20071 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20074 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20076 * _.hasIn(object, 'a');
20079 * _.hasIn(object, 'a.b');
20082 * _.hasIn(object, ['a', 'b']);
20085 * _.hasIn(object, 'b');
20088 function hasIn(object, path) {
20089 return object != null && hasPath(object, path, baseHasIn);
20092 /** Used to compose bitmasks for value comparisons. */
20093 var COMPARE_PARTIAL_FLAG$5 = 1;
20094 var COMPARE_UNORDERED_FLAG$3 = 2;
20097 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20100 * @param {string} path The path of the property to get.
20101 * @param {*} srcValue The value to match.
20102 * @returns {Function} Returns the new spec function.
20104 function baseMatchesProperty(path, srcValue) {
20105 if (isKey(path) && isStrictComparable(srcValue)) {
20106 return matchesStrictComparable(toKey(path), srcValue);
20108 return function(object) {
20109 var objValue = get$2(object, path);
20110 return (objValue === undefined && objValue === srcValue)
20111 ? hasIn(object, path)
20112 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20117 * The base implementation of `_.property` without support for deep paths.
20120 * @param {string} key The key of the property to get.
20121 * @returns {Function} Returns the new accessor function.
20123 function baseProperty(key) {
20124 return function(object) {
20125 return object == null ? undefined : object[key];
20130 * A specialized version of `baseProperty` which supports deep paths.
20133 * @param {Array|string} path The path of the property to get.
20134 * @returns {Function} Returns the new accessor function.
20136 function basePropertyDeep(path) {
20137 return function(object) {
20138 return baseGet(object, path);
20143 * Creates a function that returns the value at `path` of a given object.
20149 * @param {Array|string} path The path of the property to get.
20150 * @returns {Function} Returns the new accessor function.
20154 * { 'a': { 'b': 2 } },
20155 * { 'a': { 'b': 1 } }
20158 * _.map(objects, _.property('a.b'));
20161 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20164 function property(path) {
20165 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20169 * The base implementation of `_.iteratee`.
20172 * @param {*} [value=_.identity] The value to convert to an iteratee.
20173 * @returns {Function} Returns the iteratee.
20175 function baseIteratee(value) {
20176 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20177 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20178 if (typeof value == 'function') {
20181 if (value == null) {
20184 if (typeof value == 'object') {
20185 return isArray(value)
20186 ? baseMatchesProperty(value[0], value[1])
20187 : baseMatches(value);
20189 return property(value);
20193 * Iterates over elements of `collection`, returning an array of all elements
20194 * `predicate` returns truthy for. The predicate is invoked with three
20195 * arguments: (value, index|key, collection).
20197 * **Note:** Unlike `_.remove`, this method returns a new array.
20202 * @category Collection
20203 * @param {Array|Object} collection The collection to iterate over.
20204 * @param {Function} [predicate=_.identity] The function invoked per iteration.
20205 * @returns {Array} Returns the new filtered array.
20210 * { 'user': 'barney', 'age': 36, 'active': true },
20211 * { 'user': 'fred', 'age': 40, 'active': false }
20214 * _.filter(users, function(o) { return !o.active; });
20215 * // => objects for ['fred']
20217 * // The `_.matches` iteratee shorthand.
20218 * _.filter(users, { 'age': 36, 'active': true });
20219 * // => objects for ['barney']
20221 * // The `_.matchesProperty` iteratee shorthand.
20222 * _.filter(users, ['active', false]);
20223 * // => objects for ['fred']
20225 * // The `_.property` iteratee shorthand.
20226 * _.filter(users, 'active');
20227 * // => objects for ['barney']
20229 function filter(collection, predicate) {
20230 var func = isArray(collection) ? arrayFilter : baseFilter;
20231 return func(collection, baseIteratee(predicate, 3));
20235 * Creates a `_.find` or `_.findLast` function.
20238 * @param {Function} findIndexFunc The function to find the collection index.
20239 * @returns {Function} Returns the new find function.
20241 function createFind(findIndexFunc) {
20242 return function(collection, predicate, fromIndex) {
20243 var iterable = Object(collection);
20244 if (!isArrayLike(collection)) {
20245 var iteratee = baseIteratee(predicate, 3);
20246 collection = keys$1(collection);
20247 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
20249 var index = findIndexFunc(collection, predicate, fromIndex);
20250 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
20255 * The base implementation of `_.findIndex` and `_.findLastIndex` without
20256 * support for iteratee shorthands.
20259 * @param {Array} array The array to inspect.
20260 * @param {Function} predicate The function invoked per iteration.
20261 * @param {number} fromIndex The index to search from.
20262 * @param {boolean} [fromRight] Specify iterating from right to left.
20263 * @returns {number} Returns the index of the matched value, else `-1`.
20265 function baseFindIndex(array, predicate, fromIndex, fromRight) {
20266 var length = array.length,
20267 index = fromIndex + (fromRight ? 1 : -1);
20269 while ((fromRight ? index-- : ++index < length)) {
20270 if (predicate(array[index], index, array)) {
20277 /** Used as references for various `Number` constants. */
20280 /** Used to match leading and trailing whitespace. */
20281 var reTrim = /^\s+|\s+$/g;
20283 /** Used to detect bad signed hexadecimal string values. */
20284 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
20286 /** Used to detect binary string values. */
20287 var reIsBinary = /^0b[01]+$/i;
20289 /** Used to detect octal string values. */
20290 var reIsOctal = /^0o[0-7]+$/i;
20292 /** Built-in method references without a dependency on `root`. */
20293 var freeParseInt = parseInt;
20296 * Converts `value` to a number.
20302 * @param {*} value The value to process.
20303 * @returns {number} Returns the number.
20309 * _.toNumber(Number.MIN_VALUE);
20312 * _.toNumber(Infinity);
20315 * _.toNumber('3.2');
20318 function toNumber(value) {
20319 if (typeof value == 'number') {
20322 if (isSymbol(value)) {
20325 if (isObject(value)) {
20326 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
20327 value = isObject(other) ? (other + '') : other;
20329 if (typeof value != 'string') {
20330 return value === 0 ? value : +value;
20332 value = value.replace(reTrim, '');
20333 var isBinary = reIsBinary.test(value);
20334 return (isBinary || reIsOctal.test(value))
20335 ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
20336 : (reIsBadHex.test(value) ? NAN : +value);
20339 /** Used as references for various `Number` constants. */
20340 var INFINITY$2 = 1 / 0;
20341 var MAX_INTEGER = 1.7976931348623157e+308;
20344 * Converts `value` to a finite number.
20350 * @param {*} value The value to convert.
20351 * @returns {number} Returns the converted number.
20357 * _.toFinite(Number.MIN_VALUE);
20360 * _.toFinite(Infinity);
20361 * // => 1.7976931348623157e+308
20363 * _.toFinite('3.2');
20366 function toFinite(value) {
20368 return value === 0 ? value : 0;
20370 value = toNumber(value);
20371 if (value === INFINITY$2 || value === -INFINITY$2) {
20372 var sign = (value < 0 ? -1 : 1);
20373 return sign * MAX_INTEGER;
20375 return value === value ? value : 0;
20379 * Converts `value` to an integer.
20381 * **Note:** This method is loosely based on
20382 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
20388 * @param {*} value The value to convert.
20389 * @returns {number} Returns the converted integer.
20392 * _.toInteger(3.2);
20395 * _.toInteger(Number.MIN_VALUE);
20398 * _.toInteger(Infinity);
20399 * // => 1.7976931348623157e+308
20401 * _.toInteger('3.2');
20404 function toInteger(value) {
20405 var result = toFinite(value),
20406 remainder = result % 1;
20408 return result === result ? (remainder ? result - remainder : result) : 0;
20411 /* Built-in method references for those with the same name as other `lodash` methods. */
20412 var nativeMax$1 = Math.max;
20415 * This method is like `_.find` except that it returns the index of the first
20416 * element `predicate` returns truthy for instead of the element itself.
20422 * @param {Array} array The array to inspect.
20423 * @param {Function} [predicate=_.identity] The function invoked per iteration.
20424 * @param {number} [fromIndex=0] The index to search from.
20425 * @returns {number} Returns the index of the found element, else `-1`.
20429 * { 'user': 'barney', 'active': false },
20430 * { 'user': 'fred', 'active': false },
20431 * { 'user': 'pebbles', 'active': true }
20434 * _.findIndex(users, function(o) { return o.user == 'barney'; });
20437 * // The `_.matches` iteratee shorthand.
20438 * _.findIndex(users, { 'user': 'fred', 'active': false });
20441 * // The `_.matchesProperty` iteratee shorthand.
20442 * _.findIndex(users, ['active', false]);
20445 * // The `_.property` iteratee shorthand.
20446 * _.findIndex(users, 'active');
20449 function findIndex(array, predicate, fromIndex) {
20450 var length = array == null ? 0 : array.length;
20454 var index = fromIndex == null ? 0 : toInteger(fromIndex);
20456 index = nativeMax$1(length + index, 0);
20458 return baseFindIndex(array, baseIteratee(predicate, 3), index);
20462 * Iterates over elements of `collection`, returning the first element
20463 * `predicate` returns truthy for. The predicate is invoked with three
20464 * arguments: (value, index|key, collection).
20469 * @category Collection
20470 * @param {Array|Object} collection The collection to inspect.
20471 * @param {Function} [predicate=_.identity] The function invoked per iteration.
20472 * @param {number} [fromIndex=0] The index to search from.
20473 * @returns {*} Returns the matched element, else `undefined`.
20477 * { 'user': 'barney', 'age': 36, 'active': true },
20478 * { 'user': 'fred', 'age': 40, 'active': false },
20479 * { 'user': 'pebbles', 'age': 1, 'active': true }
20482 * _.find(users, function(o) { return o.age < 40; });
20483 * // => object for 'barney'
20485 * // The `_.matches` iteratee shorthand.
20486 * _.find(users, { 'age': 1, 'active': true });
20487 * // => object for 'pebbles'
20489 * // The `_.matchesProperty` iteratee shorthand.
20490 * _.find(users, ['active', false]);
20491 * // => object for 'fred'
20493 * // The `_.property` iteratee shorthand.
20494 * _.find(users, 'active');
20495 * // => object for 'barney'
20497 var find$1 = createFind(findIndex);
20500 * The base implementation of `_.map` without support for iteratee shorthands.
20503 * @param {Array|Object} collection The collection to iterate over.
20504 * @param {Function} iteratee The function invoked per iteration.
20505 * @returns {Array} Returns the new mapped array.
20507 function baseMap(collection, iteratee) {
20509 result = isArrayLike(collection) ? Array(collection.length) : [];
20511 baseEach(collection, function(value, key, collection) {
20512 result[++index] = iteratee(value, key, collection);
20518 * Creates an array of values by running each element in `collection` thru
20519 * `iteratee`. The iteratee is invoked with three arguments:
20520 * (value, index|key, collection).
20522 * Many lodash methods are guarded to work as iteratees for methods like
20523 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
20525 * The guarded methods are:
20526 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
20527 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
20528 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
20529 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
20534 * @category Collection
20535 * @param {Array|Object} collection The collection to iterate over.
20536 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
20537 * @returns {Array} Returns the new mapped array.
20540 * function square(n) {
20544 * _.map([4, 8], square);
20547 * _.map({ 'a': 4, 'b': 8 }, square);
20548 * // => [16, 64] (iteration order is not guaranteed)
20551 * { 'user': 'barney' },
20552 * { 'user': 'fred' }
20555 * // The `_.property` iteratee shorthand.
20556 * _.map(users, 'user');
20557 * // => ['barney', 'fred']
20559 function map$4(collection, iteratee) {
20560 var func = isArray(collection) ? arrayMap : baseMap;
20561 return func(collection, baseIteratee(iteratee, 3));
20565 * The base implementation of `_.values` and `_.valuesIn` which creates an
20566 * array of `object` property values corresponding to the property names
20570 * @param {Object} object The object to query.
20571 * @param {Array} props The property names to get values for.
20572 * @returns {Object} Returns the array of property values.
20574 function baseValues(object, props) {
20575 return arrayMap(props, function(key) {
20576 return object[key];
20581 * Creates an array of the own enumerable string keyed property values of `object`.
20583 * **Note:** Non-object values are coerced to objects.
20589 * @param {Object} object The object to query.
20590 * @returns {Array} Returns the array of property values.
20598 * Foo.prototype.c = 3;
20600 * _.values(new Foo);
20601 * // => [1, 2] (iteration order is not guaranteed)
20606 function values$1(object) {
20607 return object == null ? [] : baseValues(object, keys$1(object));
20611 * A specialized version of `_.forEach` for arrays without support for
20612 * iteratee shorthands.
20615 * @param {Array} [array] The array to iterate over.
20616 * @param {Function} iteratee The function invoked per iteration.
20617 * @returns {Array} Returns `array`.
20619 function arrayEach(array, iteratee) {
20621 length = array == null ? 0 : array.length;
20623 while (++index < length) {
20624 if (iteratee(array[index], index, array) === false) {
20632 * The base implementation of `_.assign` without support for multiple sources
20633 * or `customizer` functions.
20636 * @param {Object} object The destination object.
20637 * @param {Object} source The source object.
20638 * @returns {Object} Returns `object`.
20640 function baseAssign(object, source) {
20641 return object && copyObject(source, keys$1(source), object);
20645 * The base implementation of `_.assignIn` without support for multiple sources
20646 * or `customizer` functions.
20649 * @param {Object} object The destination object.
20650 * @param {Object} source The source object.
20651 * @returns {Object} Returns `object`.
20653 function baseAssignIn(object, source) {
20654 return object && copyObject(source, keysIn$1(source), object);
20657 /** Detect free variable `exports`. */
20658 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
20660 /** Detect free variable `module`. */
20661 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
20663 /** Detect the popular CommonJS extension `module.exports`. */
20664 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
20666 /** Built-in value references. */
20667 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined;
20668 var allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
20671 * Creates a clone of `buffer`.
20674 * @param {Buffer} buffer The buffer to clone.
20675 * @param {boolean} [isDeep] Specify a deep clone.
20676 * @returns {Buffer} Returns the cloned buffer.
20678 function cloneBuffer(buffer, isDeep) {
20680 return buffer.slice();
20682 var length = buffer.length,
20683 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
20685 buffer.copy(result);
20690 * Copies the values of `source` to `array`.
20693 * @param {Array} source The array to copy values from.
20694 * @param {Array} [array=[]] The array to copy values to.
20695 * @returns {Array} Returns `array`.
20697 function copyArray(source, array) {
20699 length = source.length;
20701 array || (array = Array(length));
20702 while (++index < length) {
20703 array[index] = source[index];
20709 * Copies own symbols of `source` to `object`.
20712 * @param {Object} source The object to copy symbols from.
20713 * @param {Object} [object={}] The object to copy symbols to.
20714 * @returns {Object} Returns `object`.
20716 function copySymbols(source, object) {
20717 return copyObject(source, getSymbols(source), object);
20720 /** Built-in value references. */
20721 var getPrototype = overArg(Object.getPrototypeOf, Object);
20723 /* Built-in method references for those with the same name as other `lodash` methods. */
20724 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
20727 * Creates an array of the own and inherited enumerable symbols of `object`.
20730 * @param {Object} object The object to query.
20731 * @returns {Array} Returns the array of symbols.
20733 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
20736 arrayPush(result, getSymbols(object));
20737 object = getPrototype(object);
20743 * Copies own and inherited symbols of `source` to `object`.
20746 * @param {Object} source The object to copy symbols from.
20747 * @param {Object} [object={}] The object to copy symbols to.
20748 * @returns {Object} Returns `object`.
20750 function copySymbolsIn(source, object) {
20751 return copyObject(source, getSymbolsIn(source), object);
20755 * Creates an array of own and inherited enumerable property names and
20756 * symbols of `object`.
20759 * @param {Object} object The object to query.
20760 * @returns {Array} Returns the array of property names and symbols.
20762 function getAllKeysIn(object) {
20763 return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
20766 /** Used for built-in method references. */
20767 var objectProto$14 = Object.prototype;
20769 /** Used to check objects for own properties. */
20770 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
20773 * Initializes an array clone.
20776 * @param {Array} array The array to clone.
20777 * @returns {Array} Returns the initialized clone.
20779 function initCloneArray(array) {
20780 var length = array.length,
20781 result = array.constructor(length);
20783 // Add properties assigned by `RegExp#exec`.
20784 if (length && typeof array[0] == 'string' && hasOwnProperty$11.call(array, 'index')) {
20785 result.index = array.index;
20786 result.input = array.input;
20792 * Creates a clone of `arrayBuffer`.
20795 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
20796 * @returns {ArrayBuffer} Returns the cloned array buffer.
20798 function cloneArrayBuffer(arrayBuffer) {
20799 var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
20800 new Uint8Array(result).set(new Uint8Array(arrayBuffer));
20805 * Creates a clone of `dataView`.
20808 * @param {Object} dataView The data view to clone.
20809 * @param {boolean} [isDeep] Specify a deep clone.
20810 * @returns {Object} Returns the cloned data view.
20812 function cloneDataView(dataView, isDeep) {
20813 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
20814 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
20818 * Adds the key-value `pair` to `map`.
20821 * @param {Object} map The map to modify.
20822 * @param {Array} pair The key-value pair to add.
20823 * @returns {Object} Returns `map`.
20825 function addMapEntry(map, pair) {
20826 // Don't return `map.set` because it's not chainable in IE 11.
20827 map.set(pair[0], pair[1]);
20832 * A specialized version of `_.reduce` for arrays without support for
20833 * iteratee shorthands.
20836 * @param {Array} [array] The array to iterate over.
20837 * @param {Function} iteratee The function invoked per iteration.
20838 * @param {*} [accumulator] The initial value.
20839 * @param {boolean} [initAccum] Specify using the first element of `array` as
20840 * the initial value.
20841 * @returns {*} Returns the accumulated value.
20843 function arrayReduce(array, iteratee, accumulator, initAccum) {
20845 length = array == null ? 0 : array.length;
20847 if (initAccum && length) {
20848 accumulator = array[++index];
20850 while (++index < length) {
20851 accumulator = iteratee(accumulator, array[index], index, array);
20853 return accumulator;
20856 /** Used to compose bitmasks for cloning. */
20857 var CLONE_DEEP_FLAG$1 = 1;
20860 * Creates a clone of `map`.
20863 * @param {Object} map The map to clone.
20864 * @param {Function} cloneFunc The function to clone values.
20865 * @param {boolean} [isDeep] Specify a deep clone.
20866 * @returns {Object} Returns the cloned map.
20868 function cloneMap(map, isDeep, cloneFunc) {
20869 var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG$1) : mapToArray(map);
20870 return arrayReduce(array, addMapEntry, new map.constructor);
20873 /** Used to match `RegExp` flags from their coerced string values. */
20874 var reFlags = /\w*$/;
20877 * Creates a clone of `regexp`.
20880 * @param {Object} regexp The regexp to clone.
20881 * @returns {Object} Returns the cloned regexp.
20883 function cloneRegExp(regexp) {
20884 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
20885 result.lastIndex = regexp.lastIndex;
20890 * Adds `value` to `set`.
20893 * @param {Object} set The set to modify.
20894 * @param {*} value The value to add.
20895 * @returns {Object} Returns `set`.
20897 function addSetEntry(set, value) {
20898 // Don't return `set.add` because it's not chainable in IE 11.
20903 /** Used to compose bitmasks for cloning. */
20904 var CLONE_DEEP_FLAG$2 = 1;
20907 * Creates a clone of `set`.
20910 * @param {Object} set The set to clone.
20911 * @param {Function} cloneFunc The function to clone values.
20912 * @param {boolean} [isDeep] Specify a deep clone.
20913 * @returns {Object} Returns the cloned set.
20915 function cloneSet(set, isDeep, cloneFunc) {
20916 var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG$2) : setToArray(set);
20917 return arrayReduce(array, addSetEntry, new set.constructor);
20920 /** Used to convert symbols to primitives and strings. */
20921 var symbolProto$2 = Symbol ? Symbol.prototype : undefined;
20922 var symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;
20925 * Creates a clone of the `symbol` object.
20928 * @param {Object} symbol The symbol object to clone.
20929 * @returns {Object} Returns the cloned symbol object.
20931 function cloneSymbol(symbol) {
20932 return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};
20936 * Creates a clone of `typedArray`.
20939 * @param {Object} typedArray The typed array to clone.
20940 * @param {boolean} [isDeep] Specify a deep clone.
20941 * @returns {Object} Returns the cloned typed array.
20943 function cloneTypedArray(typedArray, isDeep) {
20944 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
20945 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
20948 /** `Object#toString` result references. */
20949 var boolTag$3 = '[object Boolean]';
20950 var dateTag$3 = '[object Date]';
20951 var mapTag$4 = '[object Map]';
20952 var numberTag$3 = '[object Number]';
20953 var regexpTag$3 = '[object RegExp]';
20954 var setTag$4 = '[object Set]';
20955 var stringTag$3 = '[object String]';
20956 var symbolTag$3 = '[object Symbol]';
20958 var arrayBufferTag$3 = '[object ArrayBuffer]';
20959 var dataViewTag$4 = '[object DataView]';
20960 var float32Tag$2 = '[object Float32Array]';
20961 var float64Tag$2 = '[object Float64Array]';
20962 var int8Tag$2 = '[object Int8Array]';
20963 var int16Tag$2 = '[object Int16Array]';
20964 var int32Tag$2 = '[object Int32Array]';
20965 var uint8Tag$2 = '[object Uint8Array]';
20966 var uint8ClampedTag$2 = '[object Uint8ClampedArray]';
20967 var uint16Tag$2 = '[object Uint16Array]';
20968 var uint32Tag$2 = '[object Uint32Array]';
20971 * Initializes an object clone based on its `toStringTag`.
20973 * **Note:** This function only supports cloning values with tags of
20974 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
20977 * @param {Object} object The object to clone.
20978 * @param {string} tag The `toStringTag` of the object to clone.
20979 * @param {Function} cloneFunc The function to clone values.
20980 * @param {boolean} [isDeep] Specify a deep clone.
20981 * @returns {Object} Returns the initialized clone.
20983 function initCloneByTag(object, tag, cloneFunc, isDeep) {
20984 var Ctor = object.constructor;
20986 case arrayBufferTag$3:
20987 return cloneArrayBuffer(object);
20991 return new Ctor(+object);
20993 case dataViewTag$4:
20994 return cloneDataView(object, isDeep);
20996 case float32Tag$2: case float64Tag$2:
20997 case int8Tag$2: case int16Tag$2: case int32Tag$2:
20998 case uint8Tag$2: case uint8ClampedTag$2: case uint16Tag$2: case uint32Tag$2:
20999 return cloneTypedArray(object, isDeep);
21002 return cloneMap(object, isDeep, cloneFunc);
21006 return new Ctor(object);
21009 return cloneRegExp(object);
21012 return cloneSet(object, isDeep, cloneFunc);
21015 return cloneSymbol(object);
21019 /** Built-in value references. */
21020 var objectCreate = Object.create;
21023 * The base implementation of `_.create` without support for assigning
21024 * properties to the created object.
21027 * @param {Object} proto The object to inherit from.
21028 * @returns {Object} Returns the new object.
21030 var baseCreate = (function() {
21031 function object() {}
21032 return function(proto) {
21033 if (!isObject(proto)) {
21036 if (objectCreate) {
21037 return objectCreate(proto);
21039 object.prototype = proto;
21040 var result = new object;
21041 object.prototype = undefined;
21047 * Initializes an object clone.
21050 * @param {Object} object The object to clone.
21051 * @returns {Object} Returns the initialized clone.
21053 function initCloneObject(object) {
21054 return (typeof object.constructor == 'function' && !isPrototype(object))
21055 ? baseCreate(getPrototype(object))
21059 /** Used to compose bitmasks for cloning. */
21060 var CLONE_DEEP_FLAG = 1;
21061 var CLONE_FLAT_FLAG = 2;
21062 var CLONE_SYMBOLS_FLAG$1 = 4;
21064 /** `Object#toString` result references. */
21065 var argsTag$3 = '[object Arguments]';
21066 var arrayTag$2 = '[object Array]';
21067 var boolTag$2 = '[object Boolean]';
21068 var dateTag$2 = '[object Date]';
21069 var errorTag$2 = '[object Error]';
21070 var funcTag$2 = '[object Function]';
21071 var genTag$1 = '[object GeneratorFunction]';
21072 var mapTag$3 = '[object Map]';
21073 var numberTag$2 = '[object Number]';
21074 var objectTag$3 = '[object Object]';
21075 var regexpTag$2 = '[object RegExp]';
21076 var setTag$3 = '[object Set]';
21077 var stringTag$2 = '[object String]';
21078 var symbolTag$2 = '[object Symbol]';
21079 var weakMapTag$2 = '[object WeakMap]';
21081 var arrayBufferTag$2 = '[object ArrayBuffer]';
21082 var dataViewTag$3 = '[object DataView]';
21083 var float32Tag$1 = '[object Float32Array]';
21084 var float64Tag$1 = '[object Float64Array]';
21085 var int8Tag$1 = '[object Int8Array]';
21086 var int16Tag$1 = '[object Int16Array]';
21087 var int32Tag$1 = '[object Int32Array]';
21088 var uint8Tag$1 = '[object Uint8Array]';
21089 var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
21090 var uint16Tag$1 = '[object Uint16Array]';
21091 var uint32Tag$1 = '[object Uint32Array]';
21093 /** Used to identify `toStringTag` values supported by `_.clone`. */
21094 var cloneableTags = {};
21095 cloneableTags[argsTag$3] = cloneableTags[arrayTag$2] =
21096 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
21097 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
21098 cloneableTags[float32Tag$1] = cloneableTags[float64Tag$1] =
21099 cloneableTags[int8Tag$1] = cloneableTags[int16Tag$1] =
21100 cloneableTags[int32Tag$1] = cloneableTags[mapTag$3] =
21101 cloneableTags[numberTag$2] = cloneableTags[objectTag$3] =
21102 cloneableTags[regexpTag$2] = cloneableTags[setTag$3] =
21103 cloneableTags[stringTag$2] = cloneableTags[symbolTag$2] =
21104 cloneableTags[uint8Tag$1] = cloneableTags[uint8ClampedTag$1] =
21105 cloneableTags[uint16Tag$1] = cloneableTags[uint32Tag$1] = true;
21106 cloneableTags[errorTag$2] = cloneableTags[funcTag$2] =
21107 cloneableTags[weakMapTag$2] = false;
21110 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
21111 * traversed objects.
21114 * @param {*} value The value to clone.
21115 * @param {boolean} bitmask The bitmask flags.
21117 * 2 - Flatten inherited properties
21118 * 4 - Clone symbols
21119 * @param {Function} [customizer] The function to customize cloning.
21120 * @param {string} [key] The key of `value`.
21121 * @param {Object} [object] The parent object of `value`.
21122 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
21123 * @returns {*} Returns the cloned value.
21125 function baseClone(value, bitmask, customizer, key, object, stack) {
21127 isDeep = bitmask & CLONE_DEEP_FLAG,
21128 isFlat = bitmask & CLONE_FLAT_FLAG,
21129 isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
21132 result = object ? customizer(value, key, object, stack) : customizer(value);
21134 if (result !== undefined) {
21137 if (!isObject(value)) {
21140 var isArr = isArray(value);
21142 result = initCloneArray(value);
21144 return copyArray(value, result);
21147 var tag = getTag$1(value),
21148 isFunc = tag == funcTag$2 || tag == genTag$1;
21150 if (isBuffer(value)) {
21151 return cloneBuffer(value, isDeep);
21153 if (tag == objectTag$3 || tag == argsTag$3 || (isFunc && !object)) {
21154 result = (isFlat || isFunc) ? {} : initCloneObject(value);
21157 ? copySymbolsIn(value, baseAssignIn(result, value))
21158 : copySymbols(value, baseAssign(result, value));
21161 if (!cloneableTags[tag]) {
21162 return object ? value : {};
21164 result = initCloneByTag(value, tag, baseClone, isDeep);
21167 // Check for circular references and return its corresponding clone.
21168 stack || (stack = new Stack);
21169 var stacked = stack.get(value);
21173 stack.set(value, result);
21175 var keysFunc = isFull
21176 ? (isFlat ? getAllKeysIn : getAllKeys)
21177 : (isFlat ? keysIn : keys$1);
21179 var props = isArr ? undefined : keysFunc(value);
21180 arrayEach(props || value, function(subValue, key) {
21183 subValue = value[key];
21185 // Recursively populate clone (susceptible to call stack limits).
21186 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
21191 /** Used to compose bitmasks for cloning. */
21192 var CLONE_SYMBOLS_FLAG = 4;
21195 * Creates a shallow clone of `value`.
21197 * **Note:** This method is loosely based on the
21198 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
21199 * and supports cloning arrays, array buffers, booleans, date objects, maps,
21200 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
21201 * arrays. The own enumerable properties of `arguments` objects are cloned
21202 * as plain objects. An empty object is returned for uncloneable values such
21203 * as error objects, functions, DOM nodes, and WeakMaps.
21209 * @param {*} value The value to clone.
21210 * @returns {*} Returns the cloned value.
21214 * var objects = [{ 'a': 1 }, { 'b': 2 }];
21216 * var shallow = _.clone(objects);
21217 * console.log(shallow[0] === objects[0]);
21220 function clone(value) {
21221 return baseClone(value, CLONE_SYMBOLS_FLAG);
21225 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21226 * of key-value pairs for `object` corresponding to the property names of `props`.
21229 * @param {Object} object The object to query.
21230 * @param {Array} props The property names to get values for.
21231 * @returns {Object} Returns the key-value pairs.
21233 function baseToPairs(object, props) {
21234 return arrayMap(props, function(key) {
21235 return [key, object[key]];
21240 * Converts `set` to its value-value pairs.
21243 * @param {Object} set The set to convert.
21244 * @returns {Array} Returns the value-value pairs.
21246 function setToPairs(set) {
21248 result = Array(set.size);
21250 set.forEach(function(value) {
21251 result[++index] = [value, value];
21256 /** `Object#toString` result references. */
21257 var mapTag$5 = '[object Map]';
21258 var setTag$5 = '[object Set]';
21261 * Creates a `_.toPairs` or `_.toPairsIn` function.
21264 * @param {Function} keysFunc The function to get the keys of a given object.
21265 * @returns {Function} Returns the new pairs function.
21267 function createToPairs(keysFunc) {
21268 return function(object) {
21269 var tag = getTag$1(object);
21270 if (tag == mapTag$5) {
21271 return mapToArray(object);
21273 if (tag == setTag$5) {
21274 return setToPairs(object);
21276 return baseToPairs(object, keysFunc(object));
21281 * Creates an array of own enumerable string keyed-value pairs for `object`
21282 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21283 * entries are returned.
21290 * @param {Object} object The object to query.
21291 * @returns {Array} Returns the key-value pairs.
21299 * Foo.prototype.c = 3;
21301 * _.toPairs(new Foo);
21302 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21304 var toPairs = createToPairs(keys$1);
21306 /** Built-in value references. */
21307 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
21310 * Checks if `value` is a flattenable `arguments` object or array.
21313 * @param {*} value The value to check.
21314 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
21316 function isFlattenable(value) {
21317 return isArray(value) || isArguments(value) ||
21318 !!(spreadableSymbol && value && value[spreadableSymbol]);
21322 * The base implementation of `_.flatten` with support for restricting flattening.
21325 * @param {Array} array The array to flatten.
21326 * @param {number} depth The maximum recursion depth.
21327 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
21328 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
21329 * @param {Array} [result=[]] The initial result value.
21330 * @returns {Array} Returns the new flattened array.
21332 function baseFlatten(array, depth, predicate, isStrict, result) {
21334 length = array.length;
21336 predicate || (predicate = isFlattenable);
21337 result || (result = []);
21339 while (++index < length) {
21340 var value = array[index];
21341 if (depth > 0 && predicate(value)) {
21343 // Recursively flatten arrays (susceptible to call stack limits).
21344 baseFlatten(value, depth - 1, predicate, isStrict, result);
21346 arrayPush(result, value);
21348 } else if (!isStrict) {
21349 result[result.length] = value;
21356 * The base implementation of `_.isNaN` without support for number objects.
21359 * @param {*} value The value to check.
21360 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21362 function baseIsNaN(value) {
21363 return value !== value;
21367 * A specialized version of `_.indexOf` which performs strict equality
21368 * comparisons of values, i.e. `===`.
21371 * @param {Array} array The array to inspect.
21372 * @param {*} value The value to search for.
21373 * @param {number} fromIndex The index to search from.
21374 * @returns {number} Returns the index of the matched value, else `-1`.
21376 function strictIndexOf(array, value, fromIndex) {
21377 var index = fromIndex - 1,
21378 length = array.length;
21380 while (++index < length) {
21381 if (array[index] === value) {
21389 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21392 * @param {Array} array The array to inspect.
21393 * @param {*} value The value to search for.
21394 * @param {number} fromIndex The index to search from.
21395 * @returns {number} Returns the index of the matched value, else `-1`.
21397 function baseIndexOf(array, value, fromIndex) {
21398 return value === value
21399 ? strictIndexOf(array, value, fromIndex)
21400 : baseFindIndex(array, baseIsNaN, fromIndex);
21404 * A specialized version of `_.includes` for arrays without support for
21405 * specifying an index to search from.
21408 * @param {Array} [array] The array to inspect.
21409 * @param {*} target The value to search for.
21410 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21412 function arrayIncludes(array, value) {
21413 var length = array == null ? 0 : array.length;
21414 return !!length && baseIndexOf(array, value, 0) > -1;
21418 * This function is like `arrayIncludes` except that it accepts a comparator.
21421 * @param {Array} [array] The array to inspect.
21422 * @param {*} target The value to search for.
21423 * @param {Function} comparator The comparator invoked per element.
21424 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21426 function arrayIncludesWith(array, value, comparator) {
21428 length = array == null ? 0 : array.length;
21430 while (++index < length) {
21431 if (comparator(value, array[index])) {
21439 * This method returns `undefined`.
21447 * _.times(2, _.noop);
21448 * // => [undefined, undefined]
21450 function noop$3() {
21451 // No operation performed.
21454 /** Used as references for various `Number` constants. */
21455 var INFINITY$3 = 1 / 0;
21458 * Creates a set object of `values`.
21461 * @param {Array} values The values to add to the set.
21462 * @returns {Object} Returns the new set.
21464 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21465 return new Set$1(values);
21468 /** Used as the size to enable large array optimizations. */
21469 var LARGE_ARRAY_SIZE$1 = 200;
21472 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21475 * @param {Array} array The array to inspect.
21476 * @param {Function} [iteratee] The iteratee invoked per element.
21477 * @param {Function} [comparator] The comparator invoked per element.
21478 * @returns {Array} Returns the new duplicate free array.
21480 function baseUniq(array, iteratee, comparator) {
21482 includes = arrayIncludes,
21483 length = array.length,
21490 includes = arrayIncludesWith;
21492 else if (length >= LARGE_ARRAY_SIZE$1) {
21493 var set = iteratee ? null : createSet(array);
21495 return setToArray(set);
21498 includes = cacheHas;
21499 seen = new SetCache;
21502 seen = iteratee ? [] : result;
21505 while (++index < length) {
21506 var value = array[index],
21507 computed = iteratee ? iteratee(value) : value;
21509 value = (comparator || value !== 0) ? value : 0;
21510 if (isCommon && computed === computed) {
21511 var seenIndex = seen.length;
21512 while (seenIndex--) {
21513 if (seen[seenIndex] === computed) {
21518 seen.push(computed);
21520 result.push(value);
21522 else if (!includes(seen, computed, comparator)) {
21523 if (seen !== result) {
21524 seen.push(computed);
21526 result.push(value);
21533 * This method is like `_.isArrayLike` except that it also checks if `value`
21540 * @param {*} value The value to check.
21541 * @returns {boolean} Returns `true` if `value` is an array-like object,
21545 * _.isArrayLikeObject([1, 2, 3]);
21548 * _.isArrayLikeObject(document.body.children);
21551 * _.isArrayLikeObject('abc');
21554 * _.isArrayLikeObject(_.noop);
21557 function isArrayLikeObject(value) {
21558 return isObjectLike(value) && isArrayLike(value);
21562 * Creates an array of unique values, in order, from all given arrays using
21563 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21564 * for equality comparisons.
21570 * @param {...Array} [arrays] The arrays to inspect.
21571 * @returns {Array} Returns the new array of combined values.
21574 * _.union([2], [1, 2]);
21577 var union = baseRest(function(arrays) {
21578 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
21581 /** Used as the size to enable large array optimizations. */
21582 var LARGE_ARRAY_SIZE$2 = 200;
21585 * The base implementation of methods like `_.difference` without support
21586 * for excluding multiple arrays or iteratee shorthands.
21589 * @param {Array} array The array to inspect.
21590 * @param {Array} values The values to exclude.
21591 * @param {Function} [iteratee] The iteratee invoked per element.
21592 * @param {Function} [comparator] The comparator invoked per element.
21593 * @returns {Array} Returns the new array of filtered values.
21595 function baseDifference(array, values, iteratee, comparator) {
21597 includes = arrayIncludes,
21599 length = array.length,
21601 valuesLength = values.length;
21607 values = arrayMap(values, baseUnary(iteratee));
21610 includes = arrayIncludesWith;
21613 else if (values.length >= LARGE_ARRAY_SIZE$2) {
21614 includes = cacheHas;
21616 values = new SetCache(values);
21619 while (++index < length) {
21620 var value = array[index],
21621 computed = iteratee == null ? value : iteratee(value);
21623 value = (comparator || value !== 0) ? value : 0;
21624 if (isCommon && computed === computed) {
21625 var valuesIndex = valuesLength;
21626 while (valuesIndex--) {
21627 if (values[valuesIndex] === computed) {
21631 result.push(value);
21633 else if (!includes(values, computed, comparator)) {
21634 result.push(value);
21641 * Creates an array excluding all given values using
21642 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21643 * for equality comparisons.
21645 * **Note:** Unlike `_.pull`, this method returns a new array.
21651 * @param {Array} array The array to inspect.
21652 * @param {...*} [values] The values to exclude.
21653 * @returns {Array} Returns the new array of filtered values.
21654 * @see _.difference, _.xor
21657 * _.without([2, 1, 2, 3], 1, 2);
21660 var without = baseRest(function(array, values) {
21661 return isArrayLikeObject(array)
21662 ? baseDifference(array, values)
21666 function osmIsInterestingTag(key) {
21667 return key !== 'attribution' &&
21668 key !== 'created_by' &&
21669 key !== 'source' &&
21671 key.indexOf('tiger:') !== 0;
21676 var osmOneWayTags = {
21678 'chair_lift': true,
21679 'mixed_lift': true,
21684 'magic_carpet': true,
21689 'motorway_link': true
21695 'piste:halfpipe': true
21712 var osmPavedTags = {
21717 'concrete:lanes': true,
21718 'concrete:plates': true
21725 var dataWikipedia = [
21842 "беларуская (тарашкевіца)",
21843 "беларуская (тарашкевіца)",
21883 "বিষ্ণুপ্রিয়া মণিপুরী",
21912 "Chavacano de Zamboanga",
21913 "Chavacano de Zamboanga",
21917 "Min Dong Chinese",
21958 "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
21978 "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22032 "Emiliano-Romagnolo",
22033 "emiliàn e rumagnòl",
22088 "Na Vosa Vakaviti",
22107 "Northern Frisian",
22158 "गोंयची कोंकणी / Gõychi Konknni",
22238 "Bahasa Indonesia",
22278 "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22287 "Jamaican Creole English",
22363 "къарачай-малкъар",
22503 "Baso Minangkabau",
22602 "Norwegian Nynorsk",
22623 "Sesotho sa Leboa",
22687 "Pennsylvania German",
22702 "Norfuk / Pitkern",
22703 "Norfuk / Pitkern",
22828 "srpskohrvatski / српскохрватски",
22892 "Saterland Frisian",
23018 "ئۇيغۇرچە / Uyghurche",
23033 "oʻzbekcha/ўзбекча",
23127 "Classical Chinese",
23132 "Chinese (Min Nan)",
23148 var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Shop":{"count":180},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Consultorio Dental":{"count":187},"Dentista":{"count":109},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Food Court":{"count":72},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco":{"count":82},"Costco Gas":{"count":62},"Costco Gasoline":{"count":59},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"GNV":{"count":58},"Gas":{"count":66},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jardin Infantil":{"count":85},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca Municipal":{"count":451},"Biblioteca Pública":{"count":66},"Biblioteca Pública Municipal":{"count":85},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Farmácia":{"count":85},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Belvedere":{"count":55},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Food Court":{"count":52},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Steak House":{"count":58},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Escola Estadual":{"count":73},"Escola Municipal":{"count":211},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Anfiteatro":{"count":94},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56},"Teatro Municipal":{"count":94}},"veterinary":{"Clinica Veterinaria":{"count":75},"Veterinaria":{"count":153}}};
23149 var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Polideportivo":{"count":248},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
23150 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23151 var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Panaderia":{"count":615},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Coffee Shop":{"count":71},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino":{"count":91},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kiosco":{"count":74},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimarket":{"count":255},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"Funeraria":{"count":51},"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Barbershop":{"count":51},"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon":{"count":57},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"ice_cream":{"Мороженое":{"count":51}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosco":{"count":203},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Мороженое":{"count":56},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65},"Kitchen":{"count":202},"kitchen":{"count":101}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket":{"count":122},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optica":{"count":159},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Stadium":{"count":53},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Casino":{"count":337},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado":{"count":63},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minimarket":{"count":69},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"tattoo":{"Tattoo":{"count":73}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Vulcanizing Shop":{"count":54},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
23152 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Lavoir":{"count":109},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path continues":{"count":71},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80},"Campsite":{"count":70}},"guest_house":{"Casa":{"count":61},"Guest House":{"count":64},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel":{"count":105},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Museum":{"count":51},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23153 var dataSuggestions = {
23156 man_made: man_made,
23161 var dataAddressFormats = [{"format":[["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street","unit"],["city"],["postcode"]]},{"countryCodes":["at","ch","de"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","si","sk","sm","va"],"format":[["unit","street","housenumber"],["postcode","city"]]},{"countryCodes":["pl"],"format":[["street","housenumber"],["postcode"],["place","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["unit","housenumber","street"],["postcode","city"]]},{"countryCodes":["br"],"format":[["street"],["housenumber","suburb"],["city","postcode"]]},{"countryCodes":["vn"],"format":[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{"countryCodes":["au","ca"],"format":[["housenumber","street","unit"],["city","province","postcode"]]},{"countryCodes":["us"],"format":[["housenumber","street","unit"],["city","state","postcode"]]},{"countryCodes":["tw"],"format":[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{"countryCodes":["jp"],"format":[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],"dropdowns":["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],"widths":{"postcode":0.3,"province":0.35,"county":0.35,"city":0.65,"suburb":0.35,"quarter":0.5,"neighbourhood":0.5,"block_number":0.5,"housenumber":0.5}},{"countryCodes":["tr"],"format":[["neighbourhood"],["street","housenumber","unit"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street","unit"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
23163 var dataDeprecated = [{"old":{"amenity":"firepit"},"replace":{"leisure":"firepit"}},{"old":{"barrier":"wire_fence"},"replace":{"barrier":"fence","fence_type":"chain"}},{"old":{"barrier":"wood_fence"},"replace":{"barrier":"fence","fence_type":"wood"}},{"old":{"highway":"ford"},"replace":{"ford":"yes"}},{"old":{"highway":"stile"},"replace":{"barrier":"stile"}},{"old":{"highway":"incline"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"incline_steep"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"unsurfaced"},"replace":{"highway":"road","incline":"unpaved"}},{"old":{"landuse":"wood"},"replace":{"landuse":"forest","natural":"wood"}},{"old":{"natural":"marsh"},"replace":{"natural":"wetland","wetland":"marsh"}},{"old":{"power_source":"*"},"replace":{"generator:source":"$1"}},{"old":{"power_rating":"*"},"replace":{"generator:output":"$1"}},{"old":{"shop":"organic"},"replace":{"shop":"supermarket","organic":"only"}}];
23165 var dataDiscarded = ["created_by","odbl","odbl:note","tiger:upload_uuid","tiger:tlid","tiger:source","tiger:separated","geobase:datasetName","geobase:uuid","sub_sea:type","KSJ2:ADS","KSJ2:ARE","KSJ2:AdminArea","KSJ2:COP_label","KSJ2:DFD","KSJ2:INT","KSJ2:INT_label","KSJ2:LOC","KSJ2:LPN","KSJ2:OPC","KSJ2:PubFacAdmin","KSJ2:RAC","KSJ2:RAC_label","KSJ2:RIC","KSJ2:RIN","KSJ2:WSC","KSJ2:coordinate","KSJ2:curve_id","KSJ2:curve_type","KSJ2:filename","KSJ2:lake_id","KSJ2:lat","KSJ2:long","KSJ2:river_id","yh:LINE_NAME","yh:LINE_NUM","yh:STRUCTURE","yh:TOTYUMONO","yh:TYPE","yh:WIDTH","yh:WIDTH_RANK","SK53_bulk:load"];
23167 var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"eu":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":true},"lij":{"rtl":false},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
23169 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567","at":"+43 1 123 45 67","ci":"+225 20 12 34 56","bj":"+229 20 12 34 56"};
23171 var dataShortcuts = [{"tab":"browsing","text":"shortcuts.browsing.title","columns":[{"rows":[{"section":"navigation","text":"shortcuts.browsing.navigation.title"},{"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan","separator":","},{"modifiers":["⌘"],"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan_more","separator":","},{"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom","separator":","},{"modifiers":["⌘"],"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom_more","separator":","},{"section":"help","text":"shortcuts.browsing.help.title"},{"shortcuts":["help.key"],"text":"shortcuts.browsing.help.help"},{"shortcuts":["shortcuts.toggle.key"],"text":"shortcuts.browsing.help.keyboard"},{"section":"display_options","text":"shortcuts.browsing.display_options.title"},{"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background"},{"modifiers":["⌘"],"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background_switch"},{"shortcuts":["map_data.key"],"text":"shortcuts.browsing.display_options.map_data"},{"modifiers":["⌃","⌘"],"shortcuts":["F","F11"],"text":"shortcuts.browsing.display_options.fullscreen"},{"shortcuts":["area_fill.wireframe.key"],"text":"shortcuts.browsing.display_options.wireframe"},{"shortcuts":["background.minimap.key"],"text":"shortcuts.browsing.display_options.minimap"}]},{"rows":[{"section":"selecting","text":"shortcuts.browsing.selecting.title"},{"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_one"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_multi"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"gesture":"shortcuts.gesture.drag","text":"shortcuts.browsing.selecting.lasso"},{"shortcuts":[],"text":""},{"section":"with_selected","text":"shortcuts.browsing.with_selected.title"},{"shortcuts":["Right-click","shortcuts.key.space"],"text":"shortcuts.browsing.with_selected.edit_menu"},{"shortcuts":[],"text":""},{"section":"vertex_selected","text":"shortcuts.browsing.vertex_selected.title"},{"shortcuts":["[","↖"],"text":"shortcuts.browsing.vertex_selected.previous"},{"shortcuts":["]","↘"],"text":"shortcuts.browsing.vertex_selected.next"},{"shortcuts":["{","⇞"],"text":"shortcuts.browsing.vertex_selected.first"},{"shortcuts":["}","⇟"],"text":"shortcuts.browsing.vertex_selected.last"},{"shortcuts":["\\","shortcuts.key.pause"],"text":"shortcuts.browsing.vertex_selected.change_parent"}]}]},{"tab":"editing","text":"shortcuts.editing.title","columns":[{"rows":[{"section":"drawing","text":"shortcuts.editing.drawing.title"},{"shortcuts":["1"],"text":"shortcuts.editing.drawing.add_point"},{"shortcuts":["2"],"text":"shortcuts.editing.drawing.add_line"},{"shortcuts":["3"],"text":"shortcuts.editing.drawing.add_area"},{"shortcuts":["Left-click","shortcuts.key.space"],"text":"shortcuts.editing.drawing.place_point"},{"shortcuts":["⌥"],"text":"shortcuts.editing.drawing.disable_snap"},{"shortcuts":["↵","⎋"],"text":"shortcuts.editing.drawing.stop_line"},{"section":"commands","text":"shortcuts.editing.commands.title"},{"modifiers":["⌘"],"shortcuts":["C"],"text":"shortcuts.editing.commands.copy"},{"modifiers":["⌘"],"shortcuts":["V"],"text":"shortcuts.editing.commands.paste"},{"modifiers":["⌘"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.undo"},{"modifiers":["⌘","⇧"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.redo"},{"modifiers":["⌘"],"shortcuts":["S"],"text":"shortcuts.editing.commands.save"}]},{"rows":[{"section":"operations","text":"shortcuts.editing.operations.title"},{"shortcuts":["operations.continue.key"],"text":"shortcuts.editing.operations.continue_line"},{"shortcuts":["operations.merge.key"],"text":"shortcuts.editing.operations.merge"},{"shortcuts":["operations.disconnect.key"],"text":"shortcuts.editing.operations.disconnect"},{"shortcuts":["operations.split.key"],"text":"shortcuts.editing.operations.split"},{"shortcuts":["operations.reverse.key"],"text":"shortcuts.editing.operations.reverse"},{"shortcuts":["operations.move.key"],"text":"shortcuts.editing.operations.move"},{"shortcuts":["operations.rotate.key"],"text":"shortcuts.editing.operations.rotate"},{"shortcuts":["operations.orthogonalize.key"],"text":"shortcuts.editing.operations.orthogonalize"},{"shortcuts":["operations.circularize.key"],"text":"shortcuts.editing.operations.circularize"},{"shortcuts":["operations.reflect.key.long"],"text":"shortcuts.editing.operations.reflect_long"},{"shortcuts":["operations.reflect.key.short"],"text":"shortcuts.editing.operations.reflect_short"},{"modifiers":["⌘"],"shortcuts":["⌫"],"text":"shortcuts.editing.operations.delete"}]}]},{"tab":"tools","text":"shortcuts.tools.title","columns":[{"rows":[{"section":"info","text":"shortcuts.tools.info.title"},{"modifiers":["⌘"],"shortcuts":["info_panels.key"],"text":"shortcuts.tools.info.all"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.background.key"],"text":"shortcuts.tools.info.background"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.history.key"],"text":"shortcuts.tools.info.history"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.location.key"],"text":"shortcuts.tools.info.location"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.measurement.key"],"text":"shortcuts.tools.info.measurement"}]}]}];
23173 var type$2 = "FeatureCollection";
23174 var features = [{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[180,55],[170,53],[180,49],[180,55]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
23175 var dataImperial = {
23180 var type$3 = "FeatureCollection";
23181 var features$1 = [{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
23182 var dataDriveLeft = {
23184 features: features$1
23187 var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to Edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections. You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","request_review":"I would like someone to review my edits.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","download_changes":"Download osmChange file","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"http://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","source":"Source","description":"Description","resolution":"Resolution","accuracy":"Accuracy","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed":"closed","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","percent_brightness":"{opacity}% brightness","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n - {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}","fix_misalignment":"Adjust imagery offset","imagery_source_faq":"Where does this imagery come from?","reset":"reset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.","minimap":{"description":"Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"}},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","layers":{"osm":{"tooltip":"Map data from OpenStreetMap","title":"OpenStreetMap data"}},"fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen. You can zoom in to edit them.","osmhidden":"These features have been automatically hidden because the OpenStreetMap layer is hidden."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"restore":{"heading":"You have unsaved changes","description":"Do you wish to restore unsaved changes from a previous editing session?","restore":"Restore my changes","reset":"Discard my changes"},"save":{"title":"Save","help":"Review your changes and upload them to OpenStreetMap, making them visible to other users.","no_changes":"No changes to save.","error":"Errors occurred while trying to save","status_code":"Server returned status code {code}","unknown_error_details":"Please ensure you are connected to the internet.","uploading":"Uploading changes to OpenStreetMap...","unsaved_changes":"You have unsaved changes","conflict":{"header":"Resolve conflicting edits","count":"Conflict {num} of {total}","previous":"< Previous","next":"Next >","keep_local":"Keep mine","keep_remote":"Use theirs","restore":"Restore","delete":"Leave Deleted","download_changes":"Or download osmChange file","done":"All conflicts resolved!","help":"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},"merge_remote_changes":{"conflict":{"deleted":"This feature has been deleted by {user}.","location":"This feature was moved by both you and {user}.","nodelist":"Nodes were changed by both you and {user}.","memberlist":"Relation members were changed by both you and {user}.","tags":"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},"success":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","help_link_text":"Details","help_link_url":"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit Now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom In","out":"Zoom Out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"mapillary_images":{"tooltip":"Street-level photos from Mapillary","title":"Photo Overlay (Mapillary)"},"mapillary_signs":{"tooltip":"Traffic signs from Mapillary (must enable Photo Overlay)","title":"Traffic Sign Overlay (Mapillary)"},"mapillary":{"view_on_mapillary":"View this image on Mapillary"},"help":{"title":"Help","key":"H","help":"# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n","editing_saving":"# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n","roads":"# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n","gps":"# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n","imagery":"# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n","addresses":"# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n","inspector":"# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n","buildings":"# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n","relations":"# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"},"intro":{"done":"done","ok":"OK","graph":{"block_number":"<value for addr:block_number>","city":"Three Rivers","county":"<value for addr:county>","district":"<value for addr:district>","hamlet":"<value for addr:hamlet>","neighbourhood":"<value for addr:neighbourhood>","postcode":"49093","province":"<value for addr:province>","quarter":"<value for addr:quarter>","state":"MI","subdistrict":"<value for addr:subdistrict>","suburb":"<value for addr:suburb>","countrycode":"us","name":{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},"welcome":{"title":"Welcome","welcome":"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.","practice":"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.","words":"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.","mouse":"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**","leftclick":"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**","rightclick":"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**","chapters":"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},"navigation":{"title":"Navigation","drag":"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**","zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**","features":"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.","points_lines_areas":"Map features are represented using *points, lines, or areas.*","nodes_ways":"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.","click_townhall":"All features on the map can be selected by clicking on them. **Click on the point to select it.**","selected_townhall":"Great! The point is now selected. Selected features are drawn with a pulsing glow.","editor_townhall":"When a feature is selected, the *feature editor* is displayed alongside the map.","preset_townhall":"The top part of the feature editor shows the feature's type. This point is a {preset}.","fields_townhall":"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.","close_townhall":"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**","search_street":"You can also search for features in the current view, or worldwide. **Search for '{name}'.**","choose_street":"**Choose {name} from the list to select it.**","selected_street":"Great! {name} is now selected.","editor_street":"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**","play":"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"points":{"title":"Points","add_point":"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**","place_point":"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**","search_cafe":"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**","choose_cafe":"**Choose {preset} from the list.**","feature_editor":"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.","add_name":"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**","add_close":"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**","reselect":"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**","update":"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**","update_close":"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**","rightclick":"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**","undo":"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**","play":"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},"areas":{"title":"Areas","add_playground":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","disable_snap":"Hold to disable point snapping","stop_line":"Finish drawing a line or area"},"operations":{"title":"Operations","continue_line":"Continue a line at the selected node","merge":"Combine (merge) selected features","disconnect":"Disconnect features at the selected node","split":"Split a line into two at the selected node","reverse":"Reverse a line","move":"Move selected features","rotate":"Rotate selected features","orthogonalize":"Straighten line / Square area corners","circularize":"Circularize a closed line or area","reflect_long":"Reflect features across the longer axis","reflect_short":"Reflect features across the shorter axis","delete":"Delete selected features"},"commands":{"title":"Commands","copy":"Copy selected features","paste":"Paste copied features","undo":"Undo last action","redo":"Redo last action","save":"Save changes"}},"tools":{"title":"Tools","info":{"title":"Information","all":"Toggle all information panels","background":"Toggle background panel","history":"Toggle history panel","location":"Toggle location panel","measurement":"Toggle measurement panel"}}},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"address":{"label":"Address","placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}},"admin_level":{"label":"Admin Level"},"aerialway":{"label":"Type"},"aerialway/access":{"label":"Access","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aerialway/bubble":{"label":"Bubble"},"aerialway/capacity":{"label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"label":"Heated"},"aerialway/occupancy":{"label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"label":"Access (summer)","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aeroway":{"label":"Type"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"camera/direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"label":"Camera Mount"},"camera/type":{"label":"Camera Type","options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}},"capacity":{"label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"label":"Direction","options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}},"castle_type":{"label":"Type"},"clock_direction":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"comment":{"label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Content"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crane/type":{"label":"Crane Type","options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cutting":{"label":"Type","placeholder":"Default"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"diaper":{"label":"Diaper Changing Available"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"duration":{"label":"Duration","placeholder":"00:00"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"embankment":{"label":"Type","placeholder":"Default"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"fuel_multi":{"label":"Fuel Types"},"fuel":{"label":"Fuel"},"gauge":{"label":"Gauge"},"gender":{"label":"Gender","placeholder":"Unknown","options":{"male":"Male","female":"Female","unisex":"Unisex"}},"generator/method":{"label":"Method"},"generator/output/electricity":{"label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"label":"Source"},"generator/type":{"label":"Type"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"hashtags":{"label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"label":"Type"},"healthcare/speciality":{"label":"Specialties"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"intermittent":{"label":"Intermittent"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"memorial":{"label":"Type"},"milestone_position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"mtb/scale":{"label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{"label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{"label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},"name":{"label":"Name","placeholder":"Common name (if any)"},"natural":{"label":"Natural"},"network_bicycle":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}},"network_foot":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}},"network_horse":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}},"network_road":{"label":"Network"},"network":{"label":"Network"},"note":{"label":"Note"},"office":{"label":"Type"},"oneway_yes":{"label":"One Way","options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward"}},"park_ride":{"label":"Park and Ride"},"parking":{"label":"Type","options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}},"payment_multi":{"label":"Payment Types"},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"plant/output/electricity":{"label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"label":"Baby Seat"},"playground/max_age":{"label":"Maximum Age"},"playground/min_age":{"label":"Minimum Age"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"recycling_accepts":{"label":"Accepts"},"recycling_type":{"label":"Recycling Type","options":{"container":"Container","centre":"Recycling Center"}},"ref_aeroway_gate":{"label":"Gate Number"},"ref_golf_hole":{"label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"label":"Junction Number"},"ref_platform":{"label":"Platform Number"},"ref_road_number":{"label":"Road Number"},"ref_route":{"label":"Route Number"},"ref_runway":{"label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"label":"Stop Number"},"ref_taxiway":{"label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"label":"Reference Code"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"site":{"label":"Type"},"smoking":{"label":"Smoking","placeholder":"No, Separated, Yes...","options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}},"smoothness":{"label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}},"social_facility_for":{"label":"People Served"},"social_facility":{"label":"Type"},"source":{"label":"Sources"},"sport_ice":{"label":"Sports"},"sport_racing_motor":{"label":"Sports"},"sport_racing_nonmotor":{"label":"Sports"},"sport":{"label":"Sports"},"stars":{"label":"Stars"},"start_date":{"label":"Start Date"},"step_count":{"label":"Number of Steps"},"stop":{"label":"Stop Type","options":{"all":"All Ways","minor":"Minor Road"}},"structure_waterway":{"label":"Structure","placeholder":"Unknown","options":{"tunnel":"Tunnel"}},"structure":{"label":"Structure","placeholder":"Unknown","options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}},"studio":{"label":"Type"},"substation":{"label":"Type"},"supervised":{"label":"Supervised"},"support":{"label":"Support"},"surface":{"label":"Surface"},"surveillance":{"label":"Surveillance Kind"},"surveillance/type":{"label":"Surveillance Type","options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}},"surveillance/zone":{"label":"Surveillance Zone"},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism_attraction":{"label":"Tourism"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"trade":{"label":"Type"},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"trail_visibility":{"label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}},"trees":{"label":"Trees"},"tunnel":{"label":"Type","placeholder":"Default"},"vending":{"label":"Type of Goods"},"visibility":{"label":"Visibility","options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}},"volcano/status":{"label":"Volcano Status","options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}},"volcano/type":{"label":"Volcano Type","options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"aerialway/cable_car":{"name":"Cable Car","terms":"tramway,ropeway"},"aerialway/chair_lift":{"name":"Chair Lift","terms":""},"aerialway/drag_lift":{"name":"Drag Lift","terms":""},"aerialway/gondola":{"name":"Gondola","terms":""},"aerialway/goods":{"name":"Goods Aerialway","terms":""},"aerialway/magic_carpet":{"name":"Magic Carpet Lift","terms":""},"aerialway/mixed_lift":{"name":"Mixed Lift","terms":""},"aerialway/platter":{"name":"Platter Lift","terms":"button lift,poma lift"},"aerialway/pylon":{"name":"Aerialway Pylon","terms":""},"aerialway/rope_tow":{"name":"Rope Tow Lift","terms":"handle tow,bugel lift"},"aerialway/station":{"name":"Aerialway Station","terms":""},"aerialway/t-bar":{"name":"T-bar Lift","terms":"tbar"},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"aeroway/apron":{"name":"Apron","terms":"ramp"},"aeroway/gate":{"name":"Airport Gate","terms":""},"aeroway/hangar":{"name":"Hangar","terms":""},"aeroway/helipad":{"name":"Helipad","terms":"helicopter,helipad,heliport"},"aeroway/runway":{"name":"Runway","terms":"landing strip"},"aeroway/taxiway":{"name":"Taxiway","terms":""},"aeroway/terminal":{"name":"Airport Terminal","terms":"airport,aerodrome"},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,dog,horse,kitten,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{"name":"Animal Breeding Facility","terms":"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{"name":"Animal Shelter","terms":"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{"name":"Arts Center","terms":""},"amenity/atm":{"name":"ATM","terms":"money,cash,machine"},"amenity/bank":{"name":"Bank","terms":"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{"name":"Bar","terms":"dive,beer,bier,booze"},"amenity/bbq":{"name":"Barbecue/Grill","terms":"bbq,grill"},"amenity/bench":{"name":"Bench","terms":"seat"},"amenity/bicycle_parking":{"name":"Bicycle Parking","terms":"bike"},"amenity/bicycle_rental":{"name":"Bicycle Rental","terms":"bike"},"amenity/bicycle_repair_station":{"name":"Bicycle Repair Tool Stand","terms":"bike,repair,chain,pump"},"amenity/biergarten":{"name":"Beer Garden","terms":"beer,bier,booze"},"amenity/boat_rental":{"name":"Boat Rental","terms":""},"amenity/bureau_de_change":{"name":"Currency Exchange","terms":"bureau de change,money changer"},"amenity/bus_station":{"name":"Bus Station","terms":""},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clinic/abortion":{"name":"Abortion Clinic","terms":""},"amenity/clinic/fertility":{"name":"Fertility Clinic","terms":"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*,physician"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/ferry_terminal":{"name":"Ferry Terminal","terms":""},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{"name":"Hindu Temple","terms":"garbhargriha,mandu,puja,shrine,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/place_of_worship/shinto":{"name":"Shinto Shrine","terms":"kami,torii"},"amenity/place_of_worship/sikh":{"name":"Sikh Temple","terms":"gurudwara,temple"},"amenity/place_of_worship/taoist":{"name":"Taoist Temple","terms":"daoist,monastery,temple"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/scrapyard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"amenity/vending_machine/excrement_bags":{"name":"Excrement Bag Vending Machine","terms":"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{"name":"Feminine Hygiene Vending Machine","terms":"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/sweets":{"name":"Snack Vending Machine","terms":"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{"name":"Veterinary","terms":"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{"name":"Waste Basket","terms":"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{"name":"Garbage Dumpster","terms":"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{"name":"Waste Transfer Station","terms":"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{"name":"Dog Excrement Bin","terms":"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{"name":"RV Drinking Water","terms":""},"amenity/watering_place":{"name":"Animal Watering Place","terms":""},"area":{"name":"Area","terms":""},"area/highway":{"name":"Road Surface","terms":""},"attraction/amusement_ride":{"name":"Amusement Ride","terms":"theme park,carnival ride"},"attraction/animal":{"name":"Animal","terms":"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{"name":"Big Wheel","terms":"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{"name":"Bumper Car","terms":"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{"name":"Bungee Jumping","terms":"theme park,bungy jumping,jumping platform"},"attraction/carousel":{"name":"Carousel","terms":"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{"name":"Dark Ride","terms":"theme park,ghost train"},"attraction/drop_tower":{"name":"Drop Tower","terms":"theme park,amusement ride,gondola,tower,big drop"},"attraction/pirate_ship":{"name":"Pirate Ship","terms":"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{"name":"River Rafting","terms":"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{"name":"Roller Coaster","terms":"theme park,amusement ride"},"attraction/train":{"name":"Tourist Train","terms":"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{"name":"Water Slide","terms":"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/college":{"name":"College Building","terms":"university"},"building/commercial":{"name":"Commercial Building","terms":""},"building/construction":{"name":"Building Under Construction","terms":""},"building/detached":{"name":"Detached House","terms":"home,single,family,residence,dwelling"},"building/dormitory":{"name":"Dormitory","terms":""},"building/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"building/greenhouse":{"name":"Greenhouse","terms":""},"building/hospital":{"name":"Hospital Building","terms":""},"building/hotel":{"name":"Hotel Building","terms":""},"building/house":{"name":"House","terms":"home,family,residence,dwelling"},"building/hut":{"name":"Hut","terms":""},"building/industrial":{"name":"Industrial Building","terms":""},"building/kindergarten":{"name":"Preschool/Kindergarten Building","terms":"kindergarden,pre-school"},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/school":{"name":"School Building","terms":"academy,elementary school,middle school,high school"},"building/semidetached_house":{"name":"Semi-Detached House","terms":"home,double,duplex,twin,family,residence,dwelling"},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/clockmaker":{"name":"Clockmaker","terms":""},"craft/confectionery":{"name":"Candy Maker","terms":"sweet,candy"},"craft/distillery":{"name":"Distillery","terms":"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{"name":"Dressmaker","terms":"seamstress"},"craft/electrician":{"name":"Electrician","terms":"power,wire"},"craft/electronics_repair":{"name":"Electronics Repair Shop","terms":""},"craft/gardener":{"name":"Gardener","terms":"landscaper,grounds keeper"},"craft/glaziery":{"name":"Glaziery","terms":"glass,stained-glass,window"},"craft/handicraft":{"name":"Handicraft","terms":""},"craft/hvac":{"name":"HVAC","terms":"heat*,vent*,air conditioning"},"craft/insulator":{"name":"Insulator","terms":""},"craft/key_cutter":{"name":"Key Cutter","terms":""},"craft/metal_construction":{"name":"Metal Construction","terms":""},"craft/painter":{"name":"Painter","terms":""},"craft/photographer":{"name":"Photographer","terms":""},"craft/photographic_laboratory":{"name":"Photographic Laboratory","terms":"film"},"craft/plasterer":{"name":"Plasterer","terms":""},"craft/plumber":{"name":"Plumber","terms":"pipe"},"craft/pottery":{"name":"Pottery","terms":"ceramic"},"craft/rigger":{"name":"Rigger","terms":""},"craft/roofer":{"name":"Roofer","terms":""},"craft/saddler":{"name":"Saddler","terms":""},"craft/sailmaker":{"name":"Sailmaker","terms":""},"craft/sawmill":{"name":"Sawmill","terms":"lumber"},"craft/scaffolder":{"name":"Scaffolder","terms":""},"craft/sculpter":{"name":"Sculpter","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/sweep":{"name":"Chimney Sweep","terms":""},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare":{"name":"Healthcare Facility","terms":"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{"name":"Alternative Medicine","terms":"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{"name":"Chiropractor","terms":"back,pain,spine"},"healthcare/audiologist":{"name":"Audiologist","terms":"ear,hearing,sound"},"healthcare/birthing_center":{"name":"Birthing Center","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{"name":"Hospice","terms":"terminal,illness"},"healthcare/midwife":{"name":"Midwife","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{"name":"Occupational Therapist","terms":"therapist,therapy"},"healthcare/optometrist":{"name":"Optometrist","terms":"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{"name":"Physiotherapist","terms":"physical,therapist,therapy"},"healthcare/podiatrist":{"name":"Podiatrist","terms":"foot,feet,nails"},"healthcare/psychotherapist":{"name":"Psychotherapist","terms":"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{"name":"Rehabilitation Facility","terms":"rehab,therapist,therapy"},"healthcare/speech_therapist":{"name":"Speech Therapist","terms":"speech,therapist,therapy,voice"},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_stop":{"name":"Bus Stop","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian":{"name":"Pedestrian Street","terms":""},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"highway/track":{"name":"Unmaintained Track Road","terms":"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{"name":"Traffic Mirror","terms":"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{"name":"Traffic Signals","terms":"light,stoplight,traffic light"},"highway/trunk_link":{"name":"Trunk Link","terms":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"highway/turning_circle":{"name":"Turning Circle","terms":"cul-de-sac"},"highway/turning_loop":{"name":"Turning Loop (Island)","terms":"cul-de-sac"},"highway/unclassified":{"name":"Minor/Unclassified Road","terms":""},"historic":{"name":"Historic Site","terms":""},"historic/archaeological_site":{"name":"Archaeological Site","terms":""},"historic/boundary_stone":{"name":"Boundary Stone","terms":""},"historic/castle":{"name":"Castle","terms":""},"historic/memorial":{"name":"Memorial","terms":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garages","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{"name":"Barracks","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{"name":"Military Bunker","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{"name":"Checkpoint","terms":"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{"name":"Danger Area","terms":"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{"name":"Naval Base","terms":"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{"name":"Nuclear Explosion Site","terms":"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{"name":"Obstacle Course","terms":"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{"name":"Military Office","terms":"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{"name":"Military Range","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{"name":"Training Area","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{"name":"Orchard","terms":"fruit"},"landuse/plant_nursery":{"name":"Plant Nursery","terms":"flower,garden,grow,vivero"},"landuse/quarry":{"name":"Quarry","terms":""},"landuse/railway":{"name":"Railway Corridor","terms":"rail,train,track"},"landuse/recreation_ground":{"name":"Recreation Ground","terms":"playing fields"},"landuse/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"leisure/bowling_alley":{"name":"Bowling Alley","terms":"bowling center"},"leisure/common":{"name":"Common","terms":"open space"},"leisure/dance":{"name":"Dance Hall","terms":"ballroom,jive,swing,tango,waltz"},"leisure/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"fitness,gym,trim trail"},"leisure/garden":{"name":"Garden","terms":""},"leisure/golf_course":{"name":"Golf Course","terms":"links"},"leisure/hackerspace":{"name":"Hackerspace","terms":"makerspace,hackspace,hacklab"},"leisure/horse_riding":{"name":"Horseback Riding Facility","terms":"equestrian,stable"},"leisure/ice_rink":{"name":"Ice Rink","terms":"hockey,skating,curling"},"leisure/marina":{"name":"Marina","terms":"boat"},"leisure/miniature_golf":{"name":"Miniature Golf","terms":"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{"name":"Nature Reserve","terms":"protected,wildlife"},"leisure/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock,jetty"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/watermill":{"name":"Watermill","terms":"water,wheel,mill"},"man_made/windmill":{"name":"Windmill","terms":"wind,wheel,mill"},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{"name":"Telecom Manhole","terms":"cover,phone,hole,telecom,telephone,bt"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"natural/coastline":{"name":"Coastline","terms":"shore"},"natural/fell":{"name":"Fell","terms":""},"natural/glacier":{"name":"Glacier","terms":""},"natural/grassland":{"name":"Grassland","terms":"prairie,savanna"},"natural/heath":{"name":"Heath","terms":""},"natural/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/architect":{"name":"Architect","terms":""},"office/company":{"name":"Company Office","terms":""},"office/coworking":{"name":"Coworking Space","terms":"coworking,office"},"office/educational_institution":{"name":"Educational Institution","terms":""},"office/employment_agency":{"name":"Employment Agency","terms":"job"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"IT Office","terms":""},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":"clerk,signature,wills,deeds,estate"},"office/newspaper":{"name":"Newspaper","terms":""},"office/ngo":{"name":"NGO Office","terms":""},"office/political_party":{"name":"Political Party","terms":""},"office/research":{"name":"Research Office","terms":""},"office/telecommunication":{"name":"Telecom Office","terms":""},"office/therapist":{"name":"Therapist","terms":""},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"place/quarter":{"name":"Sub-Borough / Quarter","terms":"boro,borough,quarter"},"place/square":{"name":"Square","terms":""},"place/suburb":{"name":"Borough / Suburb","terms":"boro,borough,quarter"},"place/town":{"name":"Town","terms":""},"place/village":{"name":"Village","terms":""},"playground/balance_beam":{"name":"Balance Beam","terms":""},"playground/basket_spinner":{"name":"Basket Spinner","terms":"basket rotator"},"playground/basket_swing":{"name":"Basket Swing","terms":""},"playground/climbing_frame":{"name":"Climbing Frame","terms":""},"playground/cushion":{"name":"Bouncy Cushion","terms":""},"playground/horizontal_bar":{"name":"Horizontal Bar","terms":"high bar"},"playground/rocker":{"name":"Spring Rider","terms":"spring rocker,springy rocker"},"playground/roundabout":{"name":"Play Roundabout","terms":"merry-go-round"},"playground/sandpit":{"name":"Sandpit","terms":""},"playground/seesaw":{"name":"Seesaw","terms":""},"playground/slide":{"name":"Slide","terms":""},"playground/structure":{"name":"Play Structure","terms":""},"playground/swing":{"name":"Swing","terms":""},"playground/zipwire":{"name":"Zip Wire","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{"name":"Nuclear Reactor","terms":"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{"name":"Wind Turbine","terms":"generator,turbine,windmill,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/platform":{"name":"Platform","terms":""},"public_transport/stop_position":{"name":"Stop Position","terms":""},"railway/abandoned":{"name":"Abandoned Railway","terms":""},"railway/buffer_stop":{"name":"Buffer Stop","terms":"stop,halt,buffer"},"railway/crossing":{"name":"Railway Crossing (Path)","terms":"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{"name":"Railway Derailer","terms":"derailer"},"railway/disused":{"name":"Disused Railway","terms":""},"railway/funicular":{"name":"Funicular","terms":"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/halt":{"name":"Railway Halt","terms":"break,interrupt,rest,wait,interruption"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/platform":{"name":"Railway Platform","terms":""},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/station":{"name":"Railway Station","terms":"train station,station"},"railway/subway_entrance":{"name":"Subway Entrance","terms":"metro,transit"},"railway/subway":{"name":"Subway","terms":"metro,transit"},"railway/switch":{"name":"Railway Switch","terms":"switch,points"},"railway/train_wash":{"name":"Train Wash","terms":"wash,clean"},"railway/tram_stop":{"name":"Tram Stop","terms":"light rail,streetcar,tram,trolley"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":"sweet"},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"News Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tiles":{"name":"Tile Shop","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/trade":{"name":"Trade Shop","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":""},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Chalet","terms":""},"tourism/gallery":{"name":"Art Gallery","terms":"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{"name":"Guest House","terms":"B&B,Bed and Breakfast"},"tourism/hostel":{"name":"Hostel","terms":""},"tourism/hotel":{"name":"Hotel","terms":""},"tourism/information":{"name":"Information","terms":""},"tourism/information/board":{"name":"Information Board","terms":""},"tourism/information/guidepost":{"name":"Guidepost","terms":"signpost"},"tourism/information/map":{"name":"Map","terms":""},"tourism/information/office":{"name":"Tourist Information Office","terms":""},"tourism/motel":{"name":"Motel","terms":""},"tourism/museum":{"name":"Museum","terms":"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{"name":"Picnic Site","terms":"camp"},"tourism/theme_park":{"name":"Theme Park","terms":""},"tourism/viewpoint":{"name":"Viewpoint","terms":""},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Speed Table","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","terms":""},"type/route_master":{"name":"Route Master","terms":""},"type/route":{"name":"Route","terms":""},"type/route/bicycle":{"name":"Cycle Route","terms":""},"type/route/bus":{"name":"Bus Route","terms":""},"type/route/detour":{"name":"Detour Route","terms":""},"type/route/ferry":{"name":"Ferry Route","terms":""},"type/route/foot":{"name":"Foot Route","terms":""},"type/route/hiking":{"name":"Hiking Route","terms":""},"type/route/horse":{"name":"Riding Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"type/waterway":{"name":"Waterway","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{"name":"Intermittent Stream","terms":"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"MAPNIK":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"description":"The default OpenStreetMap layer.","name":"OpenStreetMap (Standard)"},"Mapbox":{"attribution":{"text":"Terms & Feedback"},"description":"Satellite and aerial imagery.","name":"Mapbox Satellite"},"OSM_Inspector-Addresses":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Area"},"OSM_Inspector-Places":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Places"},"OSM_Inspector-Routing":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Tagging"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"US-TIGER-Roads-2014":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"TIGER Roads 2014"},"US-TIGER-Roads-2017":{"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","name":"TIGER Roads 2017"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"mapbox_locator_overlay":{"attribution":{"text":"Terms & Feedback"},"description":"Shows major features to help orient you.","name":"Locator Overlay"},"openpt_map":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenPT Map (overlay)"},"osm-gps":{"attribution":{"text":"© OpenStreetMap contributors"},"description":"Public GPS traces uploaded to OpenStreetMap.","name":"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (German Style)"},"qa_no_address":{"attribution":{"text":"Simon Poole, Data ©OpenStreetMap contributors"},"name":"QA No Address"},"skobbler":{"attribution":{"text":"© Tiles: skobbler Map data: OpenStreetMap contributors"},"name":"skobbler"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
23189 var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2013-06-01T00:00:00.000Z","startDate":"2013-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"description":"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{"id":"sjcgis.org-Aerials_2016_WM","name":"2016 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2016-07-01T00:00:00.000Z","startDate":"2016-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"best":true,"description":"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{"id":"OS7","name":"7th Series (OS7)","type":"tms","template":"http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"http://agri.openstreetmap.org/{zoom}/{x}/{y}.png","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"id":"lu.geoportail.opendata.basemap","name":"Basemap geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"basemap.at","name":"basemap.at","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"basemap.at-orthofoto","name":"basemap.at Orthofoto","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","best":true,"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"bavaria-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]]},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"British_Columbia_Mosaic","name":"British Columbia Mosaic","type":"tms","template":"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png","endDate":"2013-06-01T00:00:00.000Z","startDate":"2009-01-01T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"terms_url":"http://imagery.paulnorman.ca/tiles/about.html","terms_text":"Copyright Province of British Columbia, City of Surrey"},{"id":"lu.geoportail.opendata.cadastre","name":"Cadastre geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm_then/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"terms_url":"http://www.osm-tools.org/","terms_text":"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"http://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{"id":"South_Africa-CapeTown-Aerial","name":"City of Cape Town 2015 Aerial","type":"tms","template":"http://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","best":true,"description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{"id":"CRAIG-Auvergne-2013","name":"CRAIG - Auvergne 2013 - 25 cm","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"terms_url":"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer","terms_text":"Digital Aerial Solutions, LLC","description":"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{"id":"DigitalGlobe-Premium","name":"DigitalGlobe Premium Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNXltOTBucm0yd3BtY3E5czl6NmYifQ.qJJsPgCjyzMCm3YG3YWQBQ","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Standard","name":"DigitalGlobe Standard Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNW9qZjBudmgzMnA1a294OGRtNm8ifQ.06mo-nDisy4KmqjYxEVwQw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"EsriWorldImagery","name":"Esri World Imagery","type":"tms","template":"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,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"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://kaart.maakaart.ee/orto/{zoom}/{x}/{y}.jpeg","scaleExtent":[14,20],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"id":"FOMI_2000","name":"FÖMI orthophoto 2000","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FOMI_2005","name":"FÖMI orthophoto 2005","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg","endDate":"2005-01-01T00:00:00.000Z","startDate":"2005-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FR-BAN","name":"FR-BAN","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","terms_text":"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL","description":"French address registry or Base Adresses Nationale"},{"id":"FR-Cadastre","name":"FR-Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation","terms_text":"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{"id":"Freemap.sk-Car","name":"Freemap.sk Car","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"IBGE_DF_Addresses","name":"IBGE Distrito Federal","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"description":"Addresses data from IBGE","overlay":true},{"id":"IBGE_Setores_Rurais","name":"IBGE Mapa de Setores Rurais","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_Setores_Urbanos","name":"IBGE Mapa de Setores Urbanos","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"id":"osmim-imagicode-S2A_R119_N09_20160327T050917","name":"imagico.de OSM images for mapping: Adams Bridge","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}","endDate":"2016-03-27T00:00:00.000Z","startDate":"2016-03-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Supplementing incomplete coverage in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80700162014211LGN00","name":"imagico.de OSM images for mapping: Alaska Range","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-07-31T00:00:00.000Z","startDate":"2014-07-31T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent summer image of the Alaska Range for mapping natural features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral2","name":"imagico.de OSM images for mapping: Aral Sea (high water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}","endDate":"2016-03-03T00:00:00.000Z","startDate":"2016-03-03T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral1","name":"imagico.de OSM images for mapping: Aral Sea (low water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}","endDate":"2016-09-09T00:00:00.000Z","startDate":"2016-09-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170417T140051","name":"imagico.de OSM images for mapping: Bahía Blanca (high tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-04-17T00:00:00.000Z","startDate":"2017-04-17T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170127T140051","name":"imagico.de OSM images for mapping: Bahía Blanca (low tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-01-27T00:00:00.000Z","startDate":"2017-01-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81190582014075LGN00","name":"imagico.de OSM images for mapping: Bakun Reservoir","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-03-16T00:00:00.000Z","startDate":"2014-03-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in older pre-2011 images (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81250592016107LGN00","name":"imagico.de OSM images for mapping: Batam","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80770232017156LGN00","name":"imagico.de OSM images for mapping: Bogoslof Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}","endDate":"2017-06-05T00:00:00.000Z","startDate":"2017-06-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image from after the eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81800982013291LGN00","name":"imagico.de OSM images for mapping: Bouvet Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-18T00:00:00.000Z","startDate":"2013-10-18T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","best":true,"description":"For more accurate coastline and glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R065_N47_20160929T102022","name":"imagico.de OSM images for mapping: Cental Alps in late September 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}","endDate":"2016-09-29T00:00:00.000Z","startDate":"2016-09-29T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82050982015344LGN00","name":"imagico.de OSM images for mapping: Clerke Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-10T00:00:00.000Z","startDate":"2015-12-10T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R086_N60_20160831T213532","name":"imagico.de OSM images for mapping: Cook Inlet","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}","endDate":"2016-08-31T00:00:00.000Z","startDate":"2016-08-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and glaciers in surrounding mountains (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0040712016264110KF","name":"imagico.de OSM images for mapping: Coropuna","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-09-21T00:00:00.000Z","startDate":"2016-09-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R022_N06_20151221T103009","name":"imagico.de OSM images for mapping: Cotonou","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}","endDate":"2015-12-21T00:00:00.000Z","startDate":"2015-12-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Patchy and partly cloudy coverage in usual sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R040_N01_20160311T164128","name":"imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}","endDate":"2016-03-11T00:00:00.000Z","startDate":"2016-03-11T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image, only old and poor images in other sources currently (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80360072014245LGN00","name":"imagico.de OSM images for mapping: Eastern Devon Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-09-02T00:00:00.000Z","startDate":"2014-09-02T00:00:00.000Z","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82160152013239LGN00","name":"imagico.de OSM images for mapping: Eastern Iceland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-08-27T00:00:00.000Z","startDate":"2013-08-27T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492","name":"imagico.de OSM images for mapping: El Altar","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}","endDate":"2012-02-05T00:00:00.000Z","startDate":"2012-02-05T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R009_S61_20160109","name":"imagico.de OSM images for mapping: Elephant Island/Clarence Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}","endDate":"2016-01-09T00:00:00.000Z","startDate":"2016-01-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Fairly clear up-to-date image for updating glacier edges (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-enderby","name":"imagico.de OSM images for mapping: Enderby Land and Kemp Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}","endDate":"2017-03-27T00:00:00.000Z","startDate":"2017-01-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 images of Enderby Land and Kemp Coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100502015347LGN00","name":"imagico.de OSM images for mapping: Fogo, Cape Verde","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2014/2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-greenland","name":"imagico.de OSM images for mapping: Greenland mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Landsat mosaic of Greenland (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R047_S54_20160411T044330","name":"imagico.de OSM images for mapping: Heard Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}","endDate":"2016-04-12T00:00:00.000Z","startDate":"2016-04-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82280982013259LGN00","name":"imagico.de OSM images for mapping: Isla Londonderry","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-16T00:00:00.000Z","startDate":"2013-09-16T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20151008","name":"imagico.de OSM images for mapping: Kangerlussuaq Autumn","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}","endDate":"2015-10-08T00:00:00.000Z","startDate":"2015-10-08T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20160518","name":"imagico.de OSM images for mapping: Kangerlussuaq Spring","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}","endDate":"2016-05-18T00:00:00.000Z","startDate":"2016-05-18T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and roads - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R021_N44_20160807T083013","name":"imagico.de OSM images for mapping: Kerch Strait","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}","endDate":"2016-08-07T00:00:00.000Z","startDate":"2016-08-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"State of bridge construction in August 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar2","name":"imagico.de OSM images for mapping: Landsat off-nadir July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}","endDate":"2016-07-17T00:00:00.000Z","startDate":"2016-07-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Latest images north of the regular Landsat limit (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de OSM images for mapping: Leskov Island ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}","endDate":"2013-11-16T00:00:00.000Z","startDate":"2013-11-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81991002015286LGN00","name":"imagico.de OSM images for mapping: Leskov Island Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar","name":"imagico.de OSM images for mapping: May 2013 off-nadir Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}","endDate":"2013-05-17T00:00:00.000Z","startDate":"2013-05-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S02_20160613T075613","name":"imagico.de OSM images for mapping: Mount Kenya 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}","endDate":"2016-06-13T00:00:00.000Z","startDate":"2016-06-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S05_20160802T075556","name":"imagico.de OSM images for mapping: Mount Kilimanjaro 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}","endDate":"2016-08-02T00:00:00.000Z","startDate":"2016-08-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80940622015159LGN00","name":"imagico.de OSM images for mapping: New Ireland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-06-08T00:00:00.000Z","startDate":"2015-06-08T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Many missing islands in OSM (mostly mapped meanwhile) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2016","name":"imagico.de OSM images for mapping: North Sea Coast 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-09-25T00:00:00.000Z","startDate":"2016-09-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2017","name":"imagico.de OSM images for mapping: North Sea Coast 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-06-02T00:00:00.000Z","startDate":"2017-06-02T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ural_s2_2016","name":"imagico.de OSM images for mapping: Northern and Polar Ural mountains August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ndvina","name":"imagico.de OSM images for mapping: Northern Dvina delta at low tide","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}","endDate":"2015-09-13T00:00:00.000Z","startDate":"2015-09-13T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Beaches, tidal flats and other costal forms (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast","name":"imagico.de OSM images for mapping: Northern Ellesmere Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-07-09T00:00:00.000Z","startDate":"2012-07-09T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2012 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast_2016","name":"imagico.de OSM images for mapping: Northern Ellesmere Island July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}","endDate":"2012-07-15T00:00:00.000Z","startDate":"2012-07-08T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2016 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00vis","name":"imagico.de OSM images for mapping: Northern German west coast tidalflats","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00ir","name":"imagico.de OSM images for mapping: Northern German west coast tidalflats (infrared)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ngreenland_ast","name":"imagico.de OSM images for mapping: Northern Greenland ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-08-13T00:00:00.000Z","startDate":"2005-06-21T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A1350972013086110KF","name":"imagico.de OSM images for mapping: Northwest Heard Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}","endDate":"2013-03-13T00:00:00.000Z","startDate":"2013-03-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R111_N09_20160604T154554","name":"imagico.de OSM images for mapping: Panama Canal","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}","endDate":"2016-06-07T00:00:00.000Z","startDate":"2016-06-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Images of the new locks (but partly cloudy) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0120532016364110KF","name":"imagico.de OSM images for mapping: Panama Canal - Pacific side","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-12-30T00:00:00.000Z","startDate":"2016-12-30T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N68_20160930T081002","name":"imagico.de OSM images for mapping: Pechora Sea Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}","endDate":"2016-09-30T00:00:00.000Z","startDate":"2016-09-30T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81511242016033LGN00","name":"imagico.de OSM images for mapping: Pensacola Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-02T00:00:00.000Z","startDate":"2016-02-02T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R136_N41_20150831T093006","name":"imagico.de OSM images for mapping: Prokletije Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}","endDate":"2015-08-31T00:00:00.000Z","startDate":"2015-08-31T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142622_03746_20110415_17533956","name":"imagico.de OSM images for mapping: Qasigiannguit","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}","endDate":"2011-04-15T00:00:00.000Z","startDate":"2011-04-15T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81510432015030LGN00","name":"imagico.de OSM images for mapping: Rann of Kutch","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R093_N41_20150828T092005","name":"imagico.de OSM images for mapping: Rila and Pirin Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}","endDate":"2015-08-28T00:00:00.000Z","startDate":"2015-08-28T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81730602015040LGN00","name":"imagico.de OSM images for mapping: Rwenzori Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-02-09T00:00:00.000Z","startDate":"2015-02-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N01_20160702T082522","name":"imagico.de OSM images for mapping: Rwenzori Mountains 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}","endDate":"2016-07-02T00:00:00.000Z","startDate":"2016-07-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80611072014036LGN00","name":"imagico.de OSM images for mapping: Scott Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-02-05T00:00:00.000Z","startDate":"2014-02-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100972015347LGN00","name":"imagico.de OSM images for mapping: Shag Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81130622013270LGN00","name":"imagico.de OSM images for mapping: Southeastern Sulawesi","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-27T00:00:00.000Z","startDate":"2013-09-27T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80281222016035LGN00","name":"imagico.de OSM images for mapping: Southern Transantarctic Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-04T00:00:00.000Z","startDate":"2016-02-04T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81030632015286LGN00","name":"imagico.de OSM images for mapping: Sudirman Range 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R088_S05_20160812T011732","name":"imagico.de OSM images for mapping: Sudirman Range 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Cloud free image of the Sudirman Range but with fresh snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-s2sval","name":"imagico.de OSM images for mapping: Svalbard mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 mosaic of Svalbard (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx","name":"imagico.de OSM images for mapping: Thule Air Base","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}","endDate":"2011-05-07T00:00:00.000Z","startDate":"2011-05-07T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule2_2015.09.25","name":"imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.10.06","name":"imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}","endDate":"2015-10-06T00:00:00.000Z","startDate":"2015-10-06T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.09.25","name":"imagico.de OSM images for mapping: Thule Airbase DMS overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R094_N79_20160812T105622","name":"imagico.de OSM images for mapping: Ushakov Island August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80910682014358LGN00","name":"imagico.de OSM images for mapping: Vanatinai","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-12-24T00:00:00.000Z","startDate":"2014-12-24T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coarse coastline due to cloud cover in Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82330892016031LGN00","name":"imagico.de OSM images for mapping: Volcán Calbuco","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-31T00:00:00.000Z","startDate":"2016-01-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R089_N52_20160623T024048","name":"imagico.de OSM images for mapping: Vostochny Cosmodrome","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}","endDate":"2016-06-23T00:00:00.000Z","startDate":"2016-06-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81490352013282LGN00","name":"imagico.de OSM images for mapping: Western Karakoram","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-09T00:00:00.000Z","startDate":"2013-10-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R039_S15_20160510T145731","name":"imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}","endDate":"2016-05-10T00:00:00.000Z","startDate":"2016-05-10T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Poor and outdated imagery in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"bartholomew_qi1940","name":"Ireland Bartholomew Quarter-Inch 1940","type":"tms","template":"http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png","scaleExtent":[5,13],"polygon":[[[-8.8312773,55.3963337],[-7.3221271,55.398605],[-7.2891331,55.4333162],[-7.2368042,55.4530757],[-7.18881,55.4497995],[-7.1528144,55.3968384],[-6.90561,55.394903],[-6.9047153,55.3842114],[-5.8485282,55.3922956],[-5.8378629,55.248676],[-5.3614762,55.2507024],[-5.3899172,53.8466464],[-5.8734141,53.8487436],[-5.8983,52.8256258],[-6.0191742,52.8256258],[-6.0262844,51.7712367],[-8.1131422,51.7712367],[-8.1273627,51.3268839],[-10.6052842,51.3091083],[-10.6271879,52.0328254],[-10.6469845,52.0322454],[-10.6469845,52.0440365],[-10.6271879,52.0448095],[-10.6290733,52.0745627],[-10.6699234,52.0743695],[-10.6702376,52.0876941],[-10.6312729,52.0898179],[-10.6393128,52.4147202],[-10.3137689,52.4185533],[-10.3166401,53.3341342],[-10.3699669,53.3330727],[-10.385965,54.3534472],[-8.8163777,54.3586265],[-8.8173427,54.6595721],[-8.8413398,54.6616284],[-8.8422286,54.6929749],[-8.8315632,54.7145436],[-8.8151208,54.7145436],[-8.8312773,55.3963337]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"GSGS4136","name":"Ireland British War Office One-Inch 1941-43 GSGS 4136","type":"tms","template":"http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png","scaleExtent":[5,15],"polygon":[[[-10.0847426,51.4147902],[-10.0906535,51.5064103],[-10.4564222,51.5003961],[-10.5005905,52.3043019],[-10.0837522,52.312741],[-10.0840973,52.3404698],[-10.055802,52.3408915],[-10.0768509,52.7628238],[-9.7780248,52.7684611],[-9.7818205,52.8577261],[-9.6337877,52.8596012],[-9.6449626,53.1294502],[-10.0919663,53.1227152],[-10.1051422,53.3912913],[-10.4052593,53.3866349],[-10.4530828,54.193502],[-10.2998523,54.1974988],[-10.3149801,54.4669592],[-8.9276095,54.4853897],[-8.9339534,54.7546562],[-8.7773069,54.755501],[-8.7826749,55.0252208],[-8.9402974,55.0238221],[-8.9451773,55.2934155],[-7.528039,55.2970274],[-7.525599,55.3874955],[-7.0541955,55.3841691],[-7.0556595,55.2939712],[-6.3241545,55.2859128],[-6.3217146,55.3253556],[-6.1035807,55.3223016],[-6.1045566,55.2828557],[-5.7985836,55.2772968],[-5.8117595,55.0087135],[-5.656577,55.0056351],[-5.6721928,54.7355021],[-5.3618278,54.729585],[-5.3964755,54.1917889],[-5.855679,54.2017807],[-5.9220464,52.8524504],[-6.070885,52.8551025],[-6.1030927,52.1373337],[-6.8331336,52.1463183],[-6.8355736,52.0578908],[-7.5641506,52.0617913],[-7.5661026,51.7921593],[-8.147305,51.792763],[-8.146329,51.7033331],[-8.2912636,51.7027283],[-8.2897996,51.5227274],[-9.1174397,51.516958],[-9.1179277,51.4625685],[-9.3692452,51.4616564],[-9.3672933,51.4254613],[-10.0847426,51.4147902]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"http://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[12,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]]},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],"terms_text":"Kanton Basel-Stadt OF 2015"},{"id":"KTBASELSTADT2017","name":"Kanton Basel-Stadt 2017","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.5546583,47.5643681],[7.5557966,47.5637596],[7.5579279,47.5626202],[7.5587206,47.5619588],[7.5598704,47.5605319],[7.5615849,47.5591798],[7.5645616,47.5572174],[7.5645784,47.557036],[7.5630528,47.5549292],[7.5620633,47.5531755],[7.562027,47.5531111],[7.5612437,47.5517228],[7.5609044,47.5518141],[7.5587527,47.5523533],[7.5560208,47.5447226],[7.5558907,47.5443591],[7.5558822,47.5443356],[7.5565398,47.5443319],[7.557539,47.5443996],[7.5600937,47.5447993],[7.5617072,47.5451327],[7.563015,47.5453056],[7.5645168,47.5456579],[7.5647854,47.5456863],[7.5711158,47.5447363],[7.5754994,47.5439857],[7.5756961,47.543952],[7.5780942,47.5437915],[7.5784687,47.5437284],[7.5786289,47.5437885],[7.5791491,47.5438323],[7.5800676,47.5438339],[7.5805324,47.5437879],[7.5809651,47.5436877],[7.5814732,47.5438236],[7.5872631,47.5419007],[7.5868378,47.5412398],[7.5865165,47.5405078],[7.5857211,47.5391295],[7.5854825,47.5385844],[7.5854664,47.5383935],[7.5855306,47.5382072],[7.5859696,47.5377431],[7.5859195,47.5374037],[7.5834651,47.5334598],[7.5829999,47.5329428],[7.5826885,47.5324682],[7.5827807,47.531979],[7.583173,47.5314823],[7.5838511,47.5309137],[7.5846792,47.5312277],[7.5856831,47.5313229],[7.5859049,47.5299585],[7.5858669,47.5292755],[7.588466,47.5290556],[7.588387,47.5285066],[7.588485,47.5282758],[7.5889124,47.5280286],[7.5894826,47.5279231],[7.5898333,47.5270746],[7.5899235,47.5266745],[7.5899641,47.5257376],[7.5896412,47.5251572],[7.5896095,47.5244274],[7.5893954,47.5237135],[7.5893183,47.5229554],[7.5894367,47.5222932],[7.5896678,47.5218266],[7.5899931,47.5205282],[7.5900357,47.5204109],[7.5902485,47.5197897],[7.5907391,47.5196504],[7.5927813,47.5194647],[7.5947814,47.519294],[7.601768,47.5253475],[7.6047028,47.5292911],[7.6046151,47.5297979],[7.6055404,47.5297828],[7.605482,47.5303019],[7.6056805,47.5305547],[7.6056425,47.530742],[7.6060331,47.5307783],[7.6060088,47.5309725],[7.6091826,47.5350166],[7.6102214,47.5356318],[7.6104849,47.5352145],[7.611379,47.5354467],[7.6110278,47.5359604],[7.6118152,47.5364265],[7.6118411,47.5365771],[7.6123623,47.5367419],[7.6127143,47.5370225],[7.6128464,47.5373008],[7.6130129,47.5384451],[7.6131744,47.5387477],[7.6134307,47.5390187],[7.6137808,47.539251],[7.6141998,47.5394231],[7.6165067,47.5399666],[7.6169975,47.5401189],[7.6175901,47.5404022],[7.6181485,47.5408004],[7.6190301,47.5404729],[7.6197653,47.5402824],[7.6223033,47.5397743],[7.6224898,47.5424261],[7.6229623,47.5492907],[7.6228545,47.5500403],[7.6226655,47.5505183],[7.6223987,47.550975],[7.6220535,47.551407],[7.6216349,47.5518082],[7.6207617,47.5524006],[7.6185071,47.5535681],[7.6180597,47.5539379],[7.617741,47.5543666],[7.6176167,47.5546487],[7.6175802,47.5549522],[7.6177985,47.5562634],[7.6178338,47.5570769],[7.6177686,47.5578613],[7.6176173,47.5586485],[7.6192664,47.5591127],[7.6243822,47.5607532],[7.6273612,47.5615165],[7.6287755,47.5616815],[7.6302053,47.5617061],[7.6315166,47.5616482],[7.6325943,47.5615064],[7.6327278,47.5614888],[7.6339558,47.5612235],[7.6348135,47.5622913],[7.6348945,47.5623925],[7.6350685,47.5626091],[7.6361189,47.5639171],[7.6383303,47.563226],[7.6400932,47.5619987],[7.6406107,47.5616726],[7.6412591,47.5612641],[7.6440496,47.5612843],[7.6460646,47.5607169],[7.6465041,47.5604966],[7.6482757,47.559931],[7.6503486,47.5608971],[7.6517514,47.561435],[7.6526422,47.5617771],[7.654536,47.5623665],[7.6561556,47.562278],[7.6567566,47.5631288],[7.6587522,47.5644771],[7.6642272,47.5653987],[7.6655502,47.56506],[7.6674872,47.5653049],[7.6702191,47.5658319],[7.6706995,47.5658147],[7.6723599,47.5654399],[7.6723096,47.5650023],[7.6724486,47.5637255],[7.6744535,47.563456],[7.6756147,47.5634809],[7.6773158,47.563745],[7.6772795,47.5649333],[7.6751444,47.5654226],[7.6767437,47.5669837],[7.6776819,47.5678061],[7.678441,47.5689615],[7.6791014,47.5695],[7.6810223,47.5704327],[7.6834998,47.571254],[7.6837139,47.5705354],[7.6834203,47.5684215],[7.6837542,47.5683517],[7.6859194,47.5656103],[7.6870989,47.5683843],[7.6888902,47.5702869],[7.6896532,47.571398],[7.6889131,47.572425],[7.6855034,47.5730872],[7.6843054,47.5737956],[7.6836701,47.5739056],[7.6838528,47.5766573],[7.6825486,47.5772314],[7.6818996,47.5774562],[7.6819239,47.5777083],[7.6816135,47.5794616],[7.6815318,47.5799229],[7.681473,47.5802552],[7.681326,47.5809796],[7.6808517,47.582684],[7.6789268,47.5832644],[7.6749356,47.5842336],[7.672069,47.5852391],[7.6717419,47.58727],[7.6730805,47.5881644],[7.6773805,47.5913618],[7.6795811,47.5922467],[7.681979,47.5942611],[7.6836452,47.5960217],[7.6847161,47.5966362],[7.6901533,47.5975697],[7.6919739,47.5986748],[7.6930358,47.5994863],[7.6937903,47.6007716],[7.6933251,47.6009125],[7.6916366,47.5995856],[7.6893134,47.5988418],[7.6879834,47.5986068],[7.6870219,47.5986977],[7.6848189,47.5987669],[7.6830086,47.5984931],[7.681551,47.5973332],[7.680658,47.5971921],[7.6797172,47.5963587],[7.6780641,47.5953554],[7.6767831,47.594313],[7.6754987,47.5930445],[7.6751713,47.5919819],[7.6721918,47.5918984],[7.6673301,47.5919456],[7.6646206,47.5926653],[7.6616899,47.5937021],[7.6559609,47.5951739],[7.6556715,47.5952499],[7.655565,47.5952749],[7.6555191,47.5952856],[7.6553766,47.5953199],[7.6552629,47.5953482],[7.6550649,47.5953952],[7.6510568,47.5957162],[7.6493128,47.5961511],[7.6490366,47.5962165],[7.6466315,47.5967457],[7.6456696,47.5969552],[7.644405,47.5957399],[7.6430459,47.5950447],[7.6417835,47.5941917],[7.6418572,47.592907],[7.64324,47.5913407],[7.6406364,47.5907759],[7.6396302,47.5903641],[7.638336,47.5895565],[7.6364368,47.5883715],[7.635398,47.587305],[7.6348633,47.5867669],[7.6341024,47.5858576],[7.6280205,47.581365],[7.6264356,47.5804007],[7.625006,47.5796143],[7.6245449,47.5794159],[7.62395,47.5791597],[7.6223873,47.5783561],[7.6191343,47.5768697],[7.6167075,47.5776795],[7.6149736,47.5779929],[7.613204,47.5781561],[7.6094106,47.5781807],[7.604882,47.5778737],[7.6048883,47.5779017],[7.6052433,47.5794848],[7.6053326,47.5798829],[7.604762,47.5804041],[7.6047115,47.5811768],[7.6046639,47.581201],[7.6046233,47.5812217],[7.6045335,47.5812704],[7.6045173,47.5812792],[7.6044627,47.581294],[7.6044323,47.581297],[7.6043491,47.581305],[7.604305,47.5813093],[7.6041536,47.581324],[7.6040542,47.5813337],[7.6045798,47.5828096],[7.6048159,47.5849295],[7.6025062,47.5859143],[7.6022084,47.5860479],[7.6020621,47.5861063],[7.6020111,47.5861254],[7.5984622,47.5876386],[7.5939634,47.5887732],[7.5932464,47.5889545],[7.5931946,47.5889673],[7.5931649,47.5889746],[7.5931203,47.5889846],[7.5890388,47.5898969],[7.5882481,47.5885161],[7.586964,47.5865465],[7.5857191,47.5840853],[7.5847329,47.5808519],[7.5843906,47.5785769],[7.5846534,47.5755163],[7.578852,47.5766638],[7.577513,47.5765468],[7.5763967,47.5764492],[7.5752663,47.5761289],[7.5731353,47.5766938],[7.5721192,47.5769631],[7.5719434,47.5770082],[7.5716273,47.5771012],[7.5691231,47.5774024],[7.5685402,47.5774607],[7.5665034,47.5776581],[7.5654501,47.576209],[7.556895,47.5724666],[7.5564665,47.5713866],[7.5593479,47.5693783],[7.5582775,47.567236],[7.5573303,47.5651011],[7.5573002,47.5650334],[7.5560222,47.5647134],[7.5546583,47.5643681]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn 25cm (SOGIS 2014-2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[15,19],"polygon":[[[7.3404127,47.2175697],[7.4154818,47.2402115],[7.4173645,47.2537956],[7.4658424,47.2646513],[7.4946766,47.2882287],[7.5328638,47.294534],[7.5483333,47.3163566],[7.5709479,47.3263111],[7.5604584,47.342492],[7.5388991,47.3476266],[7.5396485,47.3601134],[7.5217459,47.3651488],[7.5237238,47.3720704],[7.4634937,47.3702566],[7.4361035,47.3781317],[7.4434011,47.4023143],[7.4774682,47.4012772],[7.4792364,47.3897076],[7.5022557,47.384807],[7.5213659,47.3912021],[7.5311724,47.4035251],[7.5252352,47.4116329],[7.5807413,47.414704],[7.5682954,47.4223349],[7.5689044,47.436897],[7.5812069,47.4287807],[7.6157989,47.4327479],[7.6260723,47.4629139],[7.6044949,47.4704455],[7.6072998,47.4893984],[7.640966,47.4827341],[7.6559259,47.4873946],[7.6521711,47.4958144],[7.6661209,47.4968682],[7.6683266,47.4863467],[7.699761,47.4806325],[7.709878,47.4693848],[7.6848538,47.4478436],[7.6798021,47.417514],[7.6327228,47.4100311],[7.633317,47.382914],[7.6417611,47.3804694],[7.6442033,47.3672084],[7.7279138,47.3688589],[7.751519,47.3443275],[7.7935609,47.3390523],[7.8021665,47.3610959],[7.8788122,47.3835105],[7.8691367,47.3955143],[7.883332,47.4060973],[7.9097377,47.398521],[7.9550377,47.4156057],[7.9618317,47.4218343],[7.9467846,47.4431934],[7.9682836,47.4628082],[7.9872707,47.4287435],[7.9854653,47.4227641],[7.9827035,47.4283325],[7.9631993,47.4223547],[8.0072617,47.4065858],[8.0100022,47.395418],[8.0265612,47.3956224],[8.0313669,47.3836856],[8.0038366,47.3453146],[8.0051906,47.3367516],[7.9479701,47.3171432],[7.9478307,47.3325169],[7.9192088,47.3339507],[7.9078055,47.341719],[7.889098,47.3114878],[7.8611018,47.3061239],[7.8418057,47.2744707],[7.8166423,47.2616706],[7.8028241,47.2684079],[7.7861469,47.256098],[7.7746009,47.267869],[7.7568187,47.258095],[7.7326672,47.2591133],[7.684769,47.2939919],[7.6482742,47.2819898],[7.5801066,47.2763483],[7.5936981,47.2662199],[7.5959384,47.245569],[7.6261802,47.2263143],[7.6405558,47.2297944],[7.6484666,47.2189525],[7.6472258,47.2017823],[7.6715278,47.1949714],[7.6711002,47.1845216],[7.6779881,47.1819259],[7.6728612,47.1683945],[7.6600808,47.1684026],[7.6451021,47.1489207],[7.6155322,47.1565739],[7.5861404,47.1475453],[7.5810534,47.16013],[7.5634674,47.1683541],[7.5257686,47.162205],[7.5203336,47.1588879],[7.5297508,47.1487369],[7.5097234,47.1255457],[7.4613252,47.1082327],[7.4750945,47.0867101],[7.454461,47.074927],[7.4354156,47.0801664],[7.4340002,47.1005003],[7.3820271,47.0957398],[7.3704914,47.1209312],[7.4401788,47.1237276],[7.4217922,47.1358605],[7.447783,47.1550805],[7.4728074,47.1525609],[7.4970383,47.1700873],[7.4804964,47.171738],[7.4708545,47.181324],[7.4757226,47.1906485],[7.4497638,47.1895691],[7.4476258,47.1810839],[7.4332849,47.1847269],[7.4118135,47.1624212],[7.3842442,47.1601249],[7.3821749,47.1651186],[7.391911,47.1662739],[7.3835137,47.1803011],[7.3654609,47.1944525],[7.3544799,47.1915316],[7.3404127,47.2175697]],[[7.420816,47.4803666],[7.4349836,47.4981011],[7.4707584,47.480734],[7.487277,47.4820136],[7.5116652,47.5026958],[7.5317892,47.4973989],[7.5366964,47.4850517],[7.5274454,47.4739062],[7.5306791,47.4611886],[7.4565122,47.4492558],[7.445214,47.4623781],[7.4557367,47.4733767],[7.420816,47.4803666]],[[7.3759458,47.4140995],[7.3821514,47.4330266],[7.4209041,47.4459442],[7.4378427,47.4463232],[7.4555765,47.4279232],[7.4437574,47.413444],[7.3759458,47.4140995]],[[7.6744234,47.1539707],[7.6853662,47.1662986],[7.7007985,47.1617746],[7.6901531,47.1525567],[7.6744234,47.1539707]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015 10cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"id":"kelowna_2012","name":"Kelowna 2012","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png","endDate":"2012-05-14T00:00:00.000Z","startDate":"2012-05-13T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"description":"High quality aerial imagery taken for the City of Kelowna"},{"id":"kelowna_roads","name":"Kelowna Roads overlay","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"overlay":true},{"id":"landsat_233055","name":"Landsat 233055","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png","endDate":"2013-09-03T00:00:00.000Z","startDate":"2013-09-03T00:00:00.000Z","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"id":"landsat_047026","name":"Latest southwest British Columbia Landsat","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png","endDate":"2013-09-12T00:00:00.000Z","startDate":"2013-09-12T00:00:00.000Z","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"id":"LINZ_NZ_Aerial_Imagery","name":"LINZ NZ Aerial Imagery","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.0","best":true},{"id":"LINZ_NZ_Topo50_Gridless_Maps","name":"LINZ NZ Topo50 Gridless Maps","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://www.geoportal.lt","terms_text":"NŽT ORT10LT","best":true},{"id":"mapbox_locator_overlay","name":"Locator Overlay","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"id":"londrina2011","name":"Londrina Ortofoto 2011","type":"tms","template":"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"terms_url":"http://siglon.londrina.pr.gov.br/","terms_text":"Prefeitura do Londrinas, PR"},{"id":"NSW_LPI_BaseMap","name":"LPI NSW Base Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"NSW_LPI_Imagery","name":"LPI NSW Imagery","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","best":true},{"id":"NSW_LPI_TopographicMap","name":"LPI NSW Topographic Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgODAuNDcgMjAuMDIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDgwLjQ3IDIwLjAyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe29wYWNpdHk6MC42O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30uc3Qxe29wYWNpdHk6MC42O2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fTwvc3R5bGU+PGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTc5LjI5LDEzLjYxYzAsMC4xMS0wLjA5LDAuMi0wLjIsMC4yaC0xLjUzYy0wLjEyLDAtMC4yMy0wLjA2LTAuMjktMC4xNmwtMS4zNy0yLjI4bC0xLjM3LDIuMjhjLTAuMDYsMC4xLTAuMTcsMC4xNi0wLjI5LDAuMTZoLTEuNTNjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMS0wLjAzYy0wLjA5LTAuMDYtMC4xMi0wLjE4LTAuMDYtMC4yN2MwLDAsMCwwLDAsMGwyLjMxLTMuNWwtMi4yOC0zLjQ3Yy0wLjAyLTAuMDMtMC4wMy0wLjA3LTAuMDMtMC4xMWMwLTAuMTEsMC4wOS0wLjIsMC4yLTAuMmgxLjUzYzAuMTIsMCwwLjIzLDAuMDYsMC4yOSwwLjE2bDEuMzQsMi4yNWwxLjMzLTIuMjRjMC4wNi0wLjEsMC4xNy0wLjE2LDAuMjktMC4xNmgxLjUzYzAuMDQsMCwwLjA4LDAuMDEsMC4xMSwwLjAzYzAuMDksMC4wNiwwLjEyLDAuMTgsMC4wNiwwLjI3YzAsMCwwLDAsMCwwTDc2Ljk2LDEwbDIuMzEsMy41Qzc5LjI4LDEzLjUzLDc5LjI5LDEzLjU3LDc5LjI5LDEzLjYxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02My4wOSw5LjE2Yy0wLjM3LTEuNzktMS44Ny0zLjEyLTMuNjYtMy4xMmMtMC45OCwwLTEuOTMsMC40LTIuNiwxLjEyVjMuMzdjMC0wLjEyLTAuMS0wLjIyLTAuMjItMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjIsMC4xLTAuMjIsMC4yMnYxMC4yMWMwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMnYtMC43YzAuNjgsMC43MSwxLjYyLDEuMTIsMi42LDEuMTJjMS43OSwwLDMuMjktMS4zNCwzLjY2LTMuMTNDNjMuMjEsMTAuMyw2My4yMSw5LjcyLDYzLjA5LDkuMTZMNjMuMDksOS4xNnogTTU5LjEyLDEyLjQxYy0xLjI2LDAtMi4yOC0xLjA2LTIuMy0yLjM2VjkuOTljMC4wMi0xLjMxLDEuMDQtMi4zNiwyLjMtMi4zNnMyLjMsMS4wNywyLjMsMi4zOVM2MC4zOSwxMi40MSw1OS4xMiwxMi40MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNjguMjYsNi4wNGMtMS44OS0wLjAxLTMuNTQsMS4yOS0zLjk2LDMuMTNjLTAuMTIsMC41Ni0wLjEyLDEuMTMsMCwxLjY5YzAuNDIsMS44NSwyLjA3LDMuMTYsMy45NywzLjE0YzIuMjQsMCw0LjA2LTEuNzgsNC4wNi0zLjk5UzcwLjUxLDYuMDQsNjguMjYsNi4wNHogTTY4LjI0LDEyLjQyYy0xLjI3LDAtMi4zLTEuMDctMi4zLTIuMzlzMS4wMy0yLjQsMi4zLTIuNHMyLjMsMS4wNywyLjMsMi4zOVM2OS41MSwxMi40MSw2OC4yNCwxMi40Mkw2OC4yNCwxMi40MnoiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTkuMTIsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNjAuMzksNy42Myw1OS4xMiw3LjYzeiBNNTkuMTIsMTEuMjNjLTAuNiwwLTEuMDktMC41My0xLjExLTEuMTlWMTBjMC4wMS0wLjY2LDAuNTEtMS4xOSwxLjExLTEuMTlzMS4xMSwwLjU0LDEuMTEsMS4yMVM1OS43NCwxMS4yMyw1OS4xMiwxMS4yM3oiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjguMjQsNy42M2MtMS4yNywwLTIuMywxLjA3LTIuMywyLjM5czEuMDMsMi4zOSwyLjMsMi4zOXMyLjMtMS4wNywyLjMtMi4zOVM2OS41MSw3LjYzLDY4LjI0LDcuNjN6IE02OC4yNCwxMS4yM2MtMC42MSwwLTEuMTEtMC41NC0xLjExLTEuMjFzMC41LTEuMiwxLjExLTEuMnMxLjExLDAuNTQsMS4xMSwxLjIxUzY4Ljg1LDExLjIzLDY4LjI0LDExLjIzeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00My41Niw2LjI0aC0xLjMzYy0wLjEyLDAtMC4yMiwwLjEtMC4yMiwwLjIydjAuN2MtMC42OC0wLjcxLTEuNjItMS4xMi0yLjYtMS4xMmMtMi4wNywwLTMuNzUsMS43OC0zLjc1LDMuOTlzMS42OSwzLjk5LDMuNzUsMy45OWMwLjk5LDAsMS45My0wLjQxLDIuNi0xLjEzdjAuN2MwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMlY2LjQ0YzAtMC4xMS0wLjA5LTAuMjEtMC4yMS0wLjIxQzQzLjU3LDYuMjQsNDMuNTcsNi4yNCw0My41Niw2LjI0eiBNNDIuMDIsMTAuMDVjLTAuMDEsMS4zMS0xLjA0LDIuMzYtMi4zLDIuMzZzLTIuMy0xLjA3LTIuMy0yLjM5czEuMDMtMi40LDIuMjktMi40YzEuMjcsMCwyLjI4LDEuMDYsMi4zLDIuMzZMNDIuMDIsMTAuMDV6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTM5LjcyLDcuNjNjLTEuMjcsMC0yLjMsMS4wNy0yLjMsMi4zOXMxLjAzLDIuMzksMi4zLDIuMzlzMi4yOC0xLjA2LDIuMy0yLjM2VjkuOTlDNDIsOC42OCw0MC45OCw3LjYzLDM5LjcyLDcuNjN6IE0zOC42MiwxMC4wMmMwLTAuNjcsMC41LTEuMjEsMS4xMS0xLjIxYzAuNjEsMCwxLjA5LDAuNTMsMS4xMSwxLjE5djAuMDRjLTAuMDEsMC42NS0wLjUsMS4xOC0xLjExLDEuMThTMzguNjIsMTAuNjgsMzguNjIsMTAuMDJ6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTQ5LjkxLDYuMDRjLTAuOTgsMC0xLjkzLDAuNC0yLjYsMS4xMlY2LjQ1YzAtMC4xMi0wLjEtMC4yMi0wLjIyLTAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLDAuMS0wLjIyLDAuMjJ2MTAuMjFjMCwwLjEyLDAuMSwwLjIyLDAuMjIsMC4yMmgxLjMzYzAuMTIsMCwwLjIyLTAuMSwwLjIyLTAuMjJ2LTMuNzhjMC42OCwwLjcxLDEuNjIsMS4xMiwyLjYxLDEuMTJjMi4wNywwLDMuNzUtMS43OCwzLjc1LTMuOTlTNTEuOTgsNi4wNCw0OS45MSw2LjA0eiBNNDkuNiwxMi40MmMtMS4yNiwwLTIuMjgtMS4wNi0yLjMtMi4zNlY5Ljk5YzAuMDItMS4zMSwxLjA0LTIuMzcsMi4yOS0yLjM3YzEuMjYsMCwyLjMsMS4wNywyLjMsMi4zOVM1MC44NiwxMi40MSw0OS42LDEyLjQyTDQ5LjYsMTIuNDJ6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTQ5LjYsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNTAuODYsNy42Myw0OS42LDcuNjN6IE00OS42LDExLjIzYy0wLjYsMC0xLjA5LTAuNTMtMS4xMS0xLjE5VjEwQzQ4LjUsOS4zNCw0OSw4LjgxLDQ5LjYsOC44MWMwLjYsMCwxLjExLDAuNTUsMS4xMSwxLjIxUzUwLjIxLDExLjIzLDQ5LjYsMTEuMjN6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTM0LjM2LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzRjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWOS4yNGMwLTAuOTMtMC43LTEuNjMtMS41NC0xLjYzYy0wLjc2LDAtMS4zOSwwLjY3LTEuNTEsMS41NGwwLjAxLDQuNDRjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuODEsMC0xLjQ3LDAuNzUtMS41MiwxLjcxdjQuMjdjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ0YzAuMDEtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMSwwLjEsMC4yMiwwLjIxdjAuNjNjMC40OC0wLjY1LDEuMjQtMS4wNCwyLjA2LTEuMDVoMC4wM2MxLjA0LDAsMS45OSwwLjU3LDIuNDgsMS40OGMwLjQzLTAuOSwxLjMzLTEuNDgsMi4zMi0xLjQ5YzEuNTQsMCwyLjc5LDEuMTksMi43NiwyLjY1TDM0LjM2LDEzLjU5eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04MC4zMiwxMi45N2wtMC4wNy0wLjEyTDc4LjM4LDEwbDEuODUtMi44MWMwLjQyLTAuNjQsMC4yNS0xLjQ5LTAuMzktMS45MmMtMC4wMS0wLjAxLTAuMDItMC4wMS0wLjAzLTAuMDJjLTAuMjItMC4xNC0wLjQ4LTAuMjEtMC43NC0wLjIxaC0xLjUzYy0wLjUzLDAtMS4wMywwLjI4LTEuMywwLjc0bC0wLjMyLDAuNTNsLTAuMzItMC41M2MtMC4yOC0wLjQ2LTAuNzctMC43NC0xLjMxLTAuNzRoLTEuNTNjLTAuNTcsMC0xLjA4LDAuMzUtMS4yOSwwLjg4Yy0yLjA5LTEuNTgtNS4wMy0xLjQtNi45MSwwLjQzYy0wLjMzLDAuMzItMC42MiwwLjY5LTAuODUsMS4wOWMtMC44NS0xLjU1LTIuNDUtMi42LTQuMjgtMi42Yy0wLjQ4LDAtMC45NiwwLjA3LTEuNDEsMC4yMlYzLjM3YzAtMC43OC0wLjYzLTEuNDEtMS40LTEuNDFoLTEuMzNjLTAuNzcsMC0xLjQsMC42My0xLjQsMS40djMuNTdjLTAuOS0xLjMtMi4zOC0yLjA4LTMuOTctMi4wOWMtMC43LDAtMS4zOSwwLjE1LTIuMDIsMC40NWMtMC4yMy0wLjE2LTAuNTEtMC4yNS0wLjgtMC4yNWgtMS4zM2MtMC40MywwLTAuODMsMC4yLTEuMSwwLjUzYy0wLjAyLTAuMDMtMC4wNC0wLjA1LTAuMDctMC4wOGMtMC4yNy0wLjI5LTAuNjUtMC40NS0xLjA0LTAuNDVoLTEuMzJjLTAuMjksMC0wLjU3LDAuMDktMC44LDAuMjVDNDAuOCw1LDQwLjEyLDQuODUsMzkuNDIsNC44NWMtMS43NCwwLTMuMjcsMC45NS00LjE2LDIuMzhjLTAuMTktMC40NC0wLjQ2LTAuODUtMC43OS0xLjE5Yy0wLjc2LTAuNzctMS44LTEuMTktMi44OC0xLjE5aC0wLjAxYy0wLjg1LDAuMDEtMS42NywwLjMxLTIuMzQsMC44NGMtMC43LTAuNTQtMS41Ni0wLjg0LTIuNDUtMC44NGgtMC4wM2MtMC4yOCwwLTAuNTUsMC4wMy0wLjgyLDAuMWMtMC4yNywwLjA2LTAuNTMsMC4xNS0wLjc4LDAuMjdjLTAuMi0wLjExLTAuNDMtMC4xNy0wLjY3LTAuMTdoLTEuMzNjLTAuNzgsMC0xLjQsMC42My0xLjQsMS40djcuMTRjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zM2MwLjc4LDAsMS40MS0wLjYzLDEuNDEtMS40MWMwLDAsMCwwLDAsMFY5LjM1YzAuMDMtMC4zNCwwLjIyLTAuNTYsMC4zNC0wLjU2YzAuMTcsMCwwLjM2LDAuMTcsMC4zNiwwLjQ1djQuMzVjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zNGMwLjc4LDAsMS40LTAuNjMsMS40LTEuNGwtMC4wMS00LjM1YzAuMDYtMC4zLDAuMjQtMC40NSwwLjMzLTAuNDVjMC4xNywwLDAuMzYsMC4xNywwLjM2LDAuNDV2NC4zNWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjM0YzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0wLjM2YzAuOTEsMS4yMywyLjM0LDEuOTYsMy44NywxLjk2YzAuNywwLDEuMzktMC4xNSwyLjAyLTAuNDVjMC4yMywwLjE2LDAuNTEsMC4yNSwwLjgsMC4yNWgxLjMyYzAuMjksMCwwLjU3LTAuMDksMC44LTAuMjV2MS45MWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjMzYzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0xLjY5YzAuNDYsMC4xNCwwLjk0LDAuMjIsMS40MiwwLjIxYzEuNjIsMCwzLjA3LTAuODMsMy45Ny0yLjF2MC41YzAsMC43OCwwLjYzLDEuNCwxLjQsMS40aDEuMzNjMC4yOSwwLDAuNTctMC4wOSwwLjgtMC4yNWMwLjYzLDAuMywxLjMyLDAuNDUsMi4wMiwwLjQ1YzEuODMsMCwzLjQzLTEuMDUsNC4yOC0yLjZjMS40NywyLjUyLDQuNzEsMy4zNiw3LjIyLDEuODljMC4xNy0wLjEsMC4zNC0wLjIxLDAuNS0wLjM0YzAuMjEsMC41MiwwLjcyLDAuODcsMS4yOSwwLjg2aDEuNTNjMC41MywwLDEuMDMtMC4yOCwxLjMtMC43NGwwLjM1LTAuNThsMC4zNSwwLjU4YzAuMjgsMC40NiwwLjc3LDAuNzQsMS4zMSwwLjc0aDEuNTJjMC43NywwLDEuMzktMC42MywxLjM4LTEuMzlDODAuNDcsMTMuMzgsODAuNDIsMTMuMTcsODAuMzIsMTIuOTdMODAuMzIsMTIuOTd6IE0zNC4xNSwxMy44MWgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuNzYsMC0xLjM5LDAuNjctMS41MSwxLjU0bDAuMDEsNC40NGMwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjM0Yy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjkuMjRjMC0wLjkzLTAuNy0xLjYzLTEuNTQtMS42M2MtMC44MSwwLTEuNDcsMC43NS0xLjUyLDEuNzF2NC4yN2MwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjMzYy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjYuNDRjMC4wMS0wLjEyLDAuMS0wLjIxLDAuMjItMC4yMWgxLjMzYzAuMTIsMCwwLjIxLDAuMSwwLjIyLDAuMjF2MC42M2MwLjQ4LTAuNjUsMS4yNC0xLjA0LDIuMDYtMS4wNWgwLjAzYzEuMDQsMCwxLjk5LDAuNTcsMi40OCwxLjQ4YzAuNDMtMC45LDEuMzMtMS40OCwyLjMyLTEuNDljMS41NCwwLDIuNzksMS4xOSwyLjc2LDIuNjVsMC4wMSw0LjkxQzM0LjM3LDEzLjcsMzQuMjcsMTMuOCwzNC4xNSwxMy44MUMzNC4xNSwxMy44MSwzNC4xNSwxMy44MSwzNC4xNSwxMy44MXogTTQzLjc4LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJ2LTAuNzFDNDEuMzQsMTMuNiw0MC40LDE0LDM5LjQyLDE0Yy0yLjA3LDAtMy43NS0xLjc4LTMuNzUtMy45OXMxLjY5LTMuOTksMy43NS0zLjk5YzAuOTgsMCwxLjkyLDAuNDEsMi42LDEuMTJ2LTAuN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMS0wLjAxLDAuMjEsMC4wOCwwLjIyLDAuMmMwLDAuMDEsMCwwLjAxLDAsMC4wMlYxMy41OXogTTQ5LjkxLDE0Yy0wLjk4LDAtMS45Mi0wLjQxLTIuNi0xLjEydjMuNzhjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ1YzAtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMiwwLjEsMC4yMiwwLjIydjAuN2MwLjY4LTAuNzIsMS42Mi0xLjEyLDIuNi0xLjEyYzIuMDcsMCwzLjc1LDEuNzcsMy43NSwzLjk4UzUxLjk4LDE0LDQ5LjkxLDE0eiBNNjMuMDksMTAuODdDNjIuNzIsMTIuNjUsNjEuMjIsMTQsNTkuNDMsMTRjLTAuOTgsMC0xLjkyLTAuNDEtMi42LTEuMTJ2MC43YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWMy4zN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMiwwLDAuMjIsMC4xLDAuMjIsMC4yMnYzLjc4YzAuNjgtMC43MSwxLjYyLTEuMTIsMi42LTEuMTFjMS43OSwwLDMuMjksMS4zMywzLjY2LDMuMTJDNjMuMjEsOS43Myw2My4yMSwxMC4zMSw2My4wOSwxMC44N0w2My4wOSwxMC44N0w2My4wOSwxMC44N3ogTTY4LjI2LDE0LjAxYy0xLjksMC4wMS0zLjU1LTEuMjktMy45Ny0zLjE0Yy0wLjEyLTAuNTYtMC4xMi0xLjEzLDAtMS42OWMwLjQyLTEuODUsMi4wNy0zLjE1LDMuOTctMy4xNGMyLjI1LDAsNC4wNiwxLjc4LDQuMDYsMy45OVM3MC41LDE0LjAxLDY4LjI2LDE0LjAxTDY4LjI2LDE0LjAxeiBNNzkuMDksMTMuODFoLTEuNTNjLTAuMTIsMC0wLjIzLTAuMDYtMC4yOS0wLjE2bC0xLjM3LTIuMjhsLTEuMzcsMi4yOGMtMC4wNiwwLjEtMC4xNywwLjE2LTAuMjksMC4xNmgtMS41M2MtMC4wNCwwLTAuMDgtMC4wMS0wLjExLTAuMDNjLTAuMDktMC4wNi0wLjEyLTAuMTgtMC4wNi0wLjI3YzAsMCwwLDAsMCwwbDIuMzEtMy41bC0yLjI4LTMuNDdjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjExYzAtMC4xMSwwLjA5LTAuMiwwLjItMC4yaDEuNTNjMC4xMiwwLDAuMjMsMC4wNiwwLjI5LDAuMTZsMS4zNCwyLjI1bDEuMzQtMi4yNWMwLjA2LTAuMSwwLjE3LTAuMTYsMC4yOS0wLjE2aDEuNTNjMC4wNCwwLDAuMDgsMC4wMSwwLjExLDAuMDNjMC4wOSwwLjA2LDAuMTIsMC4xOCwwLjA2LDAuMjdjMCwwLDAsMCwwLDBMNzYuOTYsMTBsMi4zMSwzLjVjMC4wMiwwLjAzLDAuMDMsMC4wNywwLjAzLDAuMTFDNzkuMjksMTMuNzIsNzkuMiwxMy44MSw3OS4wOSwxMy44MUM3OS4wOSwxMy44MSw3OS4wOSwxMy44MSw3OS4wOSwxMy44MUw3OS4wOSwxMy44MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTAsMS4yMWMtNC44NywwLTguODEsMy45NS04LjgxLDguODFzMy45NSw4LjgxLDguODEsOC44MXM4LjgxLTMuOTUsOC44MS04LjgxQzE4LjgxLDUuMTUsMTQuODcsMS4yMSwxMCwxLjIxeiBNMTQuMTgsMTIuMTljLTEuODQsMS44NC00LjU1LDIuMi02LjM4LDIuMmMtMC42NywwLTEuMzQtMC4wNS0yLTAuMTVjMCwwLTAuOTctNS4zNywyLjA0LTguMzljMC43OS0wLjc5LDEuODYtMS4yMiwyLjk4LTEuMjJjMS4yMSwwLDIuMzcsMC40OSwzLjIzLDEuMzVDMTUuOCw3LjczLDE1Ljg1LDEwLjUsMTQuMTgsMTIuMTl6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTEwLDAuMDJjLTUuNTIsMC0xMCw0LjQ4LTEwLDEwczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMEMxOS45OSw0LjUsMTUuNTIsMC4wMiwxMCwwLjAyeiBNMTAsMTguODNjLTQuODcsMC04LjgxLTMuOTUtOC44MS04LjgxUzUuMTMsMS4yLDEwLDEuMnM4LjgxLDMuOTUsOC44MSw4LjgxQzE4LjgxLDE0Ljg5LDE0Ljg3LDE4LjgzLDEwLDE4LjgzeiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNC4wNCw1Ljk4Yy0xLjc1LTEuNzUtNC41My0xLjgxLTYuMi0wLjE0QzQuODMsOC44Niw1LjgsMTQuMjMsNS44LDE0LjIzczUuMzcsMC45Nyw4LjM5LTIuMDRDMTUuODUsMTAuNSwxNS44LDcuNzMsMTQuMDQsNS45OHogTTExLjg4LDkuODdsLTAuODcsMS43OGwtMC44Ni0xLjc4TDguMzgsOS4wMWwxLjc3LTAuODZsMC44Ni0xLjc4bDAuODcsMS43OGwxLjc3LDAuODZMMTEuODgsOS44N3oiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEzLjY1LDkuMDEgMTEuODgsOS44NyAxMS4wMSwxMS42NSAxMC4xNSw5Ljg3IDguMzgsOS4wMSAxMC4xNSw4LjE1IDExLjAxLDYuMzcgMTEuODgsOC4xNSAiLz48L2c+PC9zdmc+"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Six Inch resolution aerial imagery for the State of Maryland"},{"id":"geodata.md.gov-MD_ColorBasemap","name":"MD Transportation Basemap","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{"id":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{"id":"geodata.state.nj.us-Natural2015","name":"NJ 2015 Aerial Imagery (Natural Color)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{"id":"NLS-Bartholomew-hfinch-hist","name":"NLS - Bartholomew Half Inch, 1897-1907","type":"tms","template":"http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png","scaleExtent":[0,15],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-7th_Series","name":"NLS - OS 1-inch 7th Series 1955-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-1st_Series","name":"NLS - OS 1:25k 1st Series 1937-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-4.7157244,54.6796556],[-4.6850662,54.6800268],[-4.6835779,54.6623245],[-4.7148782,54.6615818],[-4.7157244,54.6796556]],[[-3.7085748,58.3371151],[-3.5405937,58.3380684],[-3.5315137,58.1608002],[-3.3608086,58.1622372],[-3.3653486,58.252173],[-3.1610473,58.2536063],[-3.1610473,58.3261509],[-3.0275704,58.3271045],[-3.0366505,58.6139001],[-3.0021463,58.614373],[-3.0030543,58.7036341],[-3.4180129,58.7003322],[-3.4171049,58.6290293],[-3.7240109,58.6266658],[-3.7231029,58.606806],[-4.2361262,58.5992374],[-4.2334022,58.5092347],[-3.88836,58.5144516],[-3.8829119,58.4261327],[-3.7158389,58.4270836],[-3.7085748,58.3371151]],[[-6.46676,49.9943621],[-6.1889102,50.004868],[-6.1789222,49.8967815],[-6.3169391,49.8915171],[-6.312399,49.8200979],[-6.4504159,49.8159968],[-6.46676,49.9943621]],[[-5.6453263,50.2029809],[-5.7801329,50.2014076],[-5.7637888,50.0197267],[-5.3479221,50.0290604],[-5.3388421,49.9414854],[-5.024672,49.9473287],[-5.0355681,50.0383923],[-5.0010639,50.0453901],[-4.9974319,50.1304478],[-4.855783,50.13394],[-4.861231,50.206057],[-4.6546085,50.2140172],[-4.6558926,50.3018616],[-4.5184924,50.3026818],[-4.51464,50.325642],[-4.2488284,50.3264618],[-4.2488284,50.3100631],[-4.10886,50.3141633],[-4.1062917,50.2411267],[-3.9648088,50.2432047],[-3.9640778,50.2254158],[-3.8522287,50.2273626],[-3.8503757,50.1552563],[-3.6921809,50.1572487],[-3.5414602,50.1602198],[-3.5465781,50.3226814],[-3.4068012,50.3241013],[-3.4165761,50.5892711],[-3.2746691,50.5962721],[-3.2749172,50.6106323],[-2.9971742,50.613972],[-2.9896008,50.688537],[-2.7120266,50.690565],[-2.710908,50.6195964],[-2.5695473,50.6157538],[-2.5651019,50.5134083],[-2.4014463,50.513379],[-2.3940583,50.6160348],[-2.2894123,50.6147436],[-2.2876184,50.6008549],[-2.1477855,50.6048506],[-2.1451013,50.5325437],[-1.9335117,50.5347477],[-1.9362139,50.6170445],[-1.8573025,50.6228094],[-1.8554865,50.709139],[-1.6066929,50.709139],[-1.6085089,50.6239615],[-1.4450678,50.6228094],[-1.4432518,50.5317039],[-1.1545059,50.5293951],[-1.1472419,50.6170485],[-1.011041,50.6205051],[-1.011041,50.7056889],[-0.704135,50.7045388],[-0.700503,50.7769401],[-0.5860943,50.7723465],[-0.5879103,50.7907181],[-0.0149586,50.7798108],[-0.0185906,50.7625836],[0.0967261,50.7620093],[0.0921861,50.6913106],[0.3046595,50.6890096],[0.3101075,50.7757917],[0.5511831,50.7726336],[0.5529991,50.8432096],[0.695556,50.8403428],[0.696464,50.8592608],[0.9852099,50.8523824],[0.9906579,50.9417226],[1.0160821,50.9411504],[1.0215301,51.0303204],[1.2812198,51.0240383],[1.2848518,51.0948044],[1.4277848,51.0948044],[1.4386809,51.2882859],[1.4713691,51.2871502],[1.4804492,51.3994534],[1.1590151,51.4073836],[1.1590151,51.3869889],[1.0191822,51.3903886],[1.0228142,51.4798247],[0.8793493,51.4843484],[0.8829813,51.5566675],[1.0264462,51.5544092],[1.0373423,51.7493319],[1.2607117,51.7482076],[1.2661598,51.8279642],[1.3351682,51.8335756],[1.3478803,51.9199021],[1.4840812,51.9199021],[1.4986093,52.0038271],[1.6438902,52.0027092],[1.6656823,52.270221],[1.7310588,52.270221],[1.7528509,52.4465637],[1.8254914,52.4476705],[1.8345714,52.624408],[1.7690346,52.6291402],[1.7741711,52.717904],[1.6996925,52.721793],[1.706113,52.8103687],[1.559724,52.8165777],[1.5648605,52.9034116],[1.4184715,52.9103818],[1.4223238,52.9281894],[1.3439928,52.9289635],[1.3491293,53.0001194],[0.4515789,53.022589],[0.4497629,52.9351139],[0.3789384,52.9351139],[0.3716744,52.846365],[0.2227614,52.8496552],[0.2336575,52.9329248],[0.3062979,52.9351139],[0.308114,53.022589],[0.3807544,53.0236813],[0.3993708,53.2933729],[0.3248922,53.2987454],[0.3274604,53.3853782],[0.2504136,53.38691],[0.2581183,53.4748924],[0.1862079,53.4779494],[0.1913443,53.6548777],[0.1502527,53.6594436],[0.1528209,53.7666003],[0.0012954,53.7734308],[0.0025796,53.8424326],[-0.0282392,53.841675],[-0.0226575,53.9311501],[-0.1406983,53.9322193],[-0.1416063,54.0219323],[-0.1706625,54.0235326],[-0.1679384,54.0949482],[-0.0126694,54.0912206],[-0.0099454,54.1811226],[-0.1615824,54.1837795],[-0.1606744,54.2029038],[-0.2405789,54.2034349],[-0.2378549,54.2936234],[-0.3894919,54.2941533],[-0.3857497,54.3837321],[-0.461638,54.3856364],[-0.4571122,54.4939066],[-0.6105651,54.4965434],[-0.6096571,54.5676704],[-0.7667421,54.569776],[-0.7640181,54.5887213],[-0.9192871,54.5908258],[-0.9148116,54.6608348],[-1.1485204,54.6634343],[-1.1472363,54.7528316],[-1.2268514,54.7532021],[-1.2265398,54.8429879],[-1.2991803,54.8435107],[-1.2991803,54.9333391],[-1.3454886,54.9354258],[-1.3436726,55.0234878],[-1.3772688,55.0255698],[-1.3754528,55.1310877],[-1.4997441,55.1315727],[-1.4969272,55.2928323],[-1.5296721,55.2942946],[-1.5258198,55.6523803],[-1.7659492,55.6545537],[-1.7620968,55.7435626],[-1.9688392,55.7435626],[-1.9698023,55.8334505],[-2.0019051,55.8336308],[-2.0015841,55.9235526],[-2.1604851,55.9240613],[-2.1613931,55.9413549],[-2.3202942,55.9408463],[-2.3212022,56.0145126],[-2.5627317,56.0124824],[-2.5645477,56.1022207],[-2.9658863,56.0991822],[-2.9667943,56.1710304],[-2.4828272,56.1755797],[-2.4882752,56.2856078],[-2.5645477,56.2835918],[-2.5681798,56.3742075],[-2.7261728,56.3732019],[-2.7316208,56.4425301],[-2.6190281,56.4425301],[-2.6153961,56.5317671],[-2.453771,56.5347715],[-2.4534686,56.6420248],[-2.4062523,56.6440218],[-2.3953562,56.7297964],[-2.2936596,56.7337811],[-2.2972916,56.807423],[-2.1629067,56.8113995],[-2.1592747,56.9958425],[-1.9922016,57.0017771],[-2.0067297,57.2737477],[-1.9195612,57.2757112],[-1.9304572,57.3482876],[-1.8106005,57.3443682],[-1.7997044,57.4402728],[-1.6616875,57.4285429],[-1.6689516,57.5398256],[-1.7452241,57.5398256],[-1.7524881,57.6313302],[-1.8287606,57.6332746],[-1.8287606,57.7187255],[-3.1768526,57.7171219],[-3.1794208,57.734264],[-3.5134082,57.7292105],[-3.5129542,57.7112683],[-3.7635638,57.7076303],[-3.7598539,57.635713],[-3.8420372,57.6343382],[-3.8458895,57.6178365],[-3.9794374,57.6157733],[-3.9794374,57.686544],[-3.8150708,57.689976],[-3.817639,57.7968899],[-3.6853753,57.7989429],[-3.6892276,57.8891567],[-3.9383458,57.8877915],[-3.9421981,57.9750592],[-3.6943641,57.9784638],[-3.6969323,58.0695865],[-4.0372226,58.0641528],[-4.0346543,57.9730163],[-4.2003051,57.9702923],[-4.1832772,57.7012869],[-4.518752,57.6951111],[-4.5122925,57.6050682],[-4.6789116,57.6016628],[-4.666022,57.4218334],[-3.6677696,57.4394729],[-3.671282,57.5295384],[-3.3384979,57.5331943],[-3.3330498,57.4438859],[-2.8336466,57.4485275],[-2.8236396,56.9992706],[-2.3305398,57.0006693],[-2.3298977,56.9113932],[-2.6579889,56.9092901],[-2.6559637,56.8198406],[-2.8216747,56.8188467],[-2.8184967,56.7295397],[-3.1449248,56.7265508],[-3.1435628,56.6362749],[-3.4679089,56.6350265],[-3.474265,56.7238108],[-3.8011471,56.7188284],[-3.785711,56.4493026],[-3.946428,56.4457896],[-3.9428873,56.2659777],[-4.423146,56.2588459],[-4.4141572,56.0815506],[-4.8944159,56.0708008],[-4.8791072,55.8896994],[-5.1994158,55.8821374],[-5.1852906,55.7023791],[-5.0273445,55.7067203],[-5.0222081,55.6879046],[-4.897649,55.6907999],[-4.8880181,55.6002822],[-4.7339244,55.6046348],[-4.7275038,55.5342082],[-4.773732,55.5334815],[-4.7685955,55.4447227],[-4.8494947,55.4418092],[-4.8405059,55.3506535],[-4.8700405,55.3513836],[-4.8649041,55.2629462],[-4.9920314,55.2592875],[-4.9907473,55.1691779],[-5.0600894,55.1655105],[-5.0575212,55.0751884],[-5.2141831,55.0722477],[-5.1991766,54.8020337],[-5.0466316,54.8062205],[-5.0502636,54.7244996],[-4.9703591,54.7203043],[-4.9776232,54.6215905],[-4.796022,54.6342056],[-4.796022,54.7307917],[-4.8977186,54.7265971],[-4.9086147,54.8145928],[-4.8069181,54.8166856],[-4.8105501,54.7915648],[-4.6943253,54.7978465],[-4.6761652,54.7244996],[-4.5744686,54.7244996],[-4.5599405,54.6426135],[-4.3093309,54.6384098],[-4.3333262,54.8229889],[-4.2626999,54.8274274],[-4.2549952,54.7348587],[-3.8338058,54.7400481],[-3.836374,54.8141105],[-3.7118149,54.8133706],[-3.7143831,54.8318654],[-3.5346072,54.8355633],[-3.5271039,54.9066228],[-3.4808758,54.9084684],[-3.4776655,54.7457328],[-3.5874573,54.744621],[-3.5836049,54.6546166],[-3.7107322,54.6531308],[-3.6991752,54.4550407],[-3.5746161,54.4572801],[-3.5759002,54.3863042],[-3.539945,54.3855564],[-3.5386609,54.297224],[-3.46033,54.2957252],[-3.4590458,54.2079507],[-3.3807149,54.2102037],[-3.381999,54.1169788],[-3.302878,54.1160656],[-3.300154,54.0276224],[-3.1013007,54.0292224],[-3.093596,53.6062158],[-3.2065981,53.6016441],[-3.2091663,53.4917753],[-3.2451215,53.4887193],[-3.2348486,53.4045934],[-3.5276266,53.3999999],[-3.5343966,53.328481],[-3.6488053,53.3252272],[-3.6527308,53.3057716],[-3.7271873,53.3046865],[-3.7315003,53.3945257],[-3.9108315,53.3912769],[-3.9071995,53.3023804],[-3.9521457,53.3015665],[-3.9566724,53.3912183],[-4.1081979,53.3889209],[-4.1081979,53.4072967],[-4.2622916,53.4065312],[-4.2635757,53.4753707],[-4.638537,53.4677274],[-4.6346847,53.3812621],[-4.7091633,53.3774321],[-4.7001745,53.1954965],[-4.5499332,53.1962658],[-4.5435126,53.1092488],[-4.3919871,53.1100196],[-4.3855666,53.0236002],[-4.6115707,53.0205105],[-4.603866,52.9284932],[-4.7566756,52.9261709],[-4.7476868,52.8370555],[-4.8208813,52.8331768],[-4.8208813,52.7446476],[-4.3701572,52.7539749],[-4.3765778,52.8401583],[-4.2314728,52.8455875],[-4.2237682,52.7586379],[-4.1056297,52.7570836],[-4.1015192,52.6714874],[-4.1487355,52.6703862],[-4.1305754,52.4008596],[-4.1995838,52.3986435],[-4.2050319,52.3110195],[-4.3466808,52.303247],[-4.3484968,52.2365693],[-4.4901457,52.2332328],[-4.4883297,52.2098702],[-4.6572188,52.2098702],[-4.6590348,52.1385939],[-4.7788916,52.13525],[-4.7807076,52.1162967],[-4.9259885,52.1140663],[-4.9187245,52.0392855],[-5.2365265,52.0314653],[-5.2347105,51.9442339],[-5.3473032,51.9408755],[-5.3473032,51.9195995],[-5.4925842,51.9162392],[-5.4853201,51.8265386],[-5.1983903,51.8321501],[-5.1893102,51.7625177],[-5.335825,51.7589528],[-5.3281204,51.6686495],[-5.1836575,51.6730296],[-5.1836575,51.6539134],[-5.0674452,51.6578966],[-5.0603825,51.5677905],[-4.5974594,51.5809588],[-4.60388,51.6726314],[-4.345773,51.6726314],[-4.3355001,51.4962964],[-3.9528341,51.5106841],[-3.9425611,51.5905333],[-3.8809237,51.5953198],[-3.8706508,51.5074872],[-3.7679216,51.4978952],[-3.7550805,51.4242895],[-3.5855774,51.41468],[-3.5778727,51.3329177],[-3.0796364,51.3329177],[-3.0770682,51.2494018],[-3.7216935,51.2381477],[-3.7216935,51.2558315],[-3.8706508,51.2558315],[-3.8680825,51.2365398],[-4.2944084,51.2252825],[-4.289272,51.0496352],[-4.5692089,51.0431767],[-4.5624122,50.9497388],[-4.5905604,50.9520269],[-4.5896524,50.8627065],[-4.6296046,50.8592677],[-4.6226411,50.7691513],[-4.6952816,50.7680028],[-4.6934655,50.6967379],[-4.8342064,50.6938621],[-4.8296664,50.6046231],[-4.9676833,50.6000126],[-4.9685913,50.5821427],[-5.1084242,50.5786832],[-5.1029762,50.4892254],[-5.1311244,50.48807],[-5.1274923,50.4163798],[-5.2664172,50.4117509],[-5.2609692,50.3034214],[-5.5124868,50.2976214],[-5.5061308,50.2256428],[-5.6468717,50.2209953],[-5.6453263,50.2029809]],[[-5.1336607,55.2630226],[-5.1021999,55.2639372],[-5.0999527,55.2458239],[-5.1322161,55.2446343],[-5.1336607,55.2630226]],[[-5.6431878,55.5095745],[-5.4861028,55.5126594],[-5.4715747,55.3348829],[-5.6277517,55.3302345],[-5.6431878,55.5095745]],[[-4.7213517,51.2180246],[-4.5804201,51.2212417],[-4.5746416,51.1306736],[-4.7174993,51.1280545],[-4.7213517,51.2180246]],[[-5.1608796,55.4153626],[-5.0045387,55.4190069],[-5.0184798,55.6153521],[-5.1755648,55.6138137],[-5.1608796,55.4153626]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-25inch-hist","name":"NLS - OS 25-inch (Scotland), 1892-1905","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25_inch/scotland_1/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-6inch-Scotland-hist","name":"NLS - OS 6-inch Scotland 1842-82","type":"tms","template":"http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLSC-EMAP5","name":"NLSC General Map with Contour line","type":"tms","template":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://maps.nlsc.gov.tw/","terms_text":"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0","description":"The emap from Taiwan National Land Surveying and Mapping Center","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,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"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"terms_url":"https://www.openstreetmap.org/copyright","terms_text":"© OpenStreetMap contributors","terms_html":"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>←</span> <span style='color: #96f;'>↓</span> <span style='color: #6e0;'>↑</span> <span style='color: #f63;'>→</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.","description":"Public GPS traces uploaded to OpenStreetMap.","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.ortho2010","name":"Ortho 2010 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2010-07-02T00:00:00.000Z","startDate":"2010-06-24T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2013","name":"Ortho 2013 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2013-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2016","name":"Ortho 2016 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2016-08-16T00:00:00.000Z","startDate":"2013-08-30T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","best":true,"icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"overlay":true},{"id":"OS-OpenData_StreetView","name":"OS OpenData StreetView","type":"tms","template":"http://os.openstreetmap.org/sv/{zoom}/{x}/{y}.png","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"terms_url":"http://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance","terms_text":"Kadaster / Beeldmateriaal.nl, CC BY 4.0","best":true,"description":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,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"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,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"},{"id":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"id":"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017","name":"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017","type":"tms","template":"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"id":"South_Africa-CD_NGI-Aerial","name":"South Africa CD:NGI Aerial","type":"tms","template":"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{"id":"South-Tyrol-Orthofoto-2014-2015","name":"South Tyrol Orthofoto 2014/2015","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","endDate":"2015-11-01T00:00:00.000Z","startDate":"2014-07-01T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0","best":true},{"id":"South-Tyrol-Topomap","name":"South Tyrol Topomap","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,20],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern ","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"id":"Surrey-Air_Survey","name":"Surrey Air Survey","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true},{"id":"tnris.org","name":"Texas Orthophoto","type":"tms","template":"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"id":"US-TIGER-Roads-2017","name":"TIGER Roads 2017","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.topo","name":"Topographical Map geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1919978,43.6328791],[1.2015377,43.6329729],[1.2011107,43.6554932],[1.2227985,43.6557029],[1.2226231,43.6653353],[1.2275341,43.6653849],[1.2275417,43.6656387],[1.2337568,43.6656883],[1.2337644,43.6650153],[1.2351218,43.6650319],[1.2350913,43.6670729],[1.2443566,43.6671556],[1.2441584,43.6743925],[1.2493973,43.6744256],[1.2493973,43.6746628],[1.2555666,43.6747234],[1.2555742,43.6744532],[1.2569545,43.6744697],[1.2568782,43.678529],[1.2874873,43.6788257],[1.2870803,43.7013229],[1.3088219,43.7014632],[1.3086493,43.7127673],[1.3303262,43.7129544],[1.3300242,43.7305221],[1.3367106,43.7305845],[1.3367322,43.7312235],[1.3734338,43.7310456],[1.3735848,43.7245772],[1.4604504,43.7252947],[1.4607783,43.7028034],[1.4824875,43.7029516],[1.4829828,43.6692071],[1.5046832,43.6693616],[1.5048383,43.6581174],[1.5265475,43.6582656],[1.5266945,43.6470298],[1.548368,43.6471633],[1.5485357,43.6359385],[1.5702172,43.636082],[1.5705123,43.6135777],[1.5488166,43.6134276],[1.549097,43.5909479],[1.5707695,43.5910694],[1.5709373,43.5798341],[1.5793714,43.5798894],[1.5794782,43.5737682],[1.5809119,43.5737792],[1.5810859,43.5573794],[1.5712334,43.5573131],[1.5716504,43.5235497],[1.3984804,43.5222618],[1.3986509,43.5110113],[1.3120959,43.5102543],[1.3118968,43.5215192],[1.2902569,43.5213126],[1.2898637,43.5438168],[1.311517,43.5440133],[1.3113271,43.5552596],[1.3036924,43.5551924],[1.3036117,43.5595099],[1.2955449,43.5594317],[1.2955449,43.5595489],[1.2895595,43.5594473],[1.2892899,43.5775366],[1.2675698,43.5773647],[1.2673973,43.5886141],[1.25355,43.5885047],[1.2533774,43.5956282],[1.2518029,43.5956282],[1.2518029,43.5949409],[1.2350437,43.5947847],[1.2350437,43.5945972],[1.2239572,43.5945972],[1.2239357,43.5994708],[1.2139708,43.599299],[1.2138845,43.6046408],[1.2020647,43.6044846],[1.2019464,43.61048],[1.1924294,43.6103695],[1.1919978,43.6328791]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2011","name":"Toulouse - Orthophotoplan 2011","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2013","name":"Toulouse - Orthophotoplan 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2013/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2015","name":"Toulouse - Orthophotoplan 2015","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2015/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Tours-Orthophoto-2008_2010","name":"Tours - Orthophotos 2008-2010","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s) Plus 2008"},{"id":"Tours-Orthophoto-2013","name":"Tours - Orthophotos 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[0.427093505859375,47.26199018174824],[0.427093505859375,47.50096732311069],[0.814361572265625,47.50096732311069],[0.814361572265625,47.26199018174824],[0.427093505859375,47.26199018174824]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,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"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,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"},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"id":"wien.gv.at-labels","name":"Vienna: Beschriftungen (annotations)","type":"tms","template":"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-aerial_image","name":"Vienna: Orthofoto (aerial image)","type":"tms","template":"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"}];
23191 var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"airport","fields":["aeroway"],"geometry":["point","vertex","line","area"],"tags":{"aeroway":"*"},"searchable":false,"name":"Aeroway"},"amenity":{"fields":["amenity"],"geometry":["point","vertex","area"],"tags":{"amenity":"*"},"searchable":false,"name":"Amenity"},"highway":{"fields":["name","highway"],"geometry":["point","vertex","line","area"],"tags":{"highway":"*"},"searchable":false,"name":"Highway"},"place":{"fields":["name","place"],"geometry":["point","vertex","area"],"tags":{"place":"*"},"searchable":false,"name":"Place"},"power":{"geometry":["point","vertex","line","area"],"tags":{"power":"*"},"fields":["power"],"searchable":false,"name":"Power"},"railway":{"fields":["railway"],"geometry":["point","vertex","line","area"],"tags":{"railway":"*"},"searchable":false,"name":"Railway"},"roundabout":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"roundabout"},"name":"Roundabout","searchable":false},"waterway":{"fields":["name","waterway"],"geometry":["point","vertex","line","area"],"tags":{"waterway":"*"},"searchable":false,"name":"Waterway"},"address":{"fields":["address"],"geometry":["point","vertex","area"],"tags":{"addr:*":"*"},"addTags":{},"removeTags":{},"reference":{"key":"addr"},"name":"Address","matchScore":0.15},"advertising/billboard":{"fields":["parallel_direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/cable_car":{"geometry":["line"],"terms":["tramway","ropeway"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"cable_car"},"name":"Cable Car"},"aerialway/chair_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"chair_lift"},"name":"Chair Lift"},"aerialway/drag_lift":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"drag_lift"},"name":"Drag Lift"},"aerialway/gondola":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"gondola"},"name":"Gondola"},"aerialway/goods":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"goods"},"name":"Goods Aerialway"},"aerialway/magic_carpet":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"magic_carpet"},"name":"Magic Carpet Lift"},"aerialway/mixed_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"mixed_lift"},"name":"Mixed Lift"},"aerialway/platter":{"geometry":["line"],"terms":["button lift","poma lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"platter"},"name":"Platter Lift"},"aerialway/pylon":{"geometry":["point","vertex"],"fields":["ref"],"tags":{"aerialway":"pylon"},"name":"Aerialway Pylon"},"aerialway/rope_tow":{"geometry":["line"],"terms":["handle tow","bugel lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"rope_tow"},"name":"Rope Tow Lift"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station"},"aerialway/t-bar":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"terms":["tbar"],"tags":{"aerialway":"t-bar"},"name":"T-bar Lift"},"aeroway/aerodrome":{"icon":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"airport","geometry":["point"],"fields":["ref_aeroway_gate"],"tags":{"aeroway":"gate"},"name":"Airport Gate"},"aeroway/hangar":{"geometry":["area"],"fields":["name","building_area"],"tags":{"aeroway":"hangar"},"name":"Hangar"},"aeroway/helipad":{"icon":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"geometry":["line","area"],"terms":["landing strip"],"fields":["ref_runway","surface","length","width"],"tags":{"aeroway":"runway"},"name":"Runway"},"aeroway/taxiway":{"geometry":["line"],"fields":["ref_taxiway","surface"],"tags":{"aeroway":"taxiway"},"name":"Taxiway"},"aeroway/terminal":{"icon":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/coworking_space":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"coworking_space"},"name":"Coworking Space","searchable":false},"amenity/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"tags":{"amenity":"nursing_home"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home","searchable":false},"amenity/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"amenity":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office","searchable":false},"amenity/swimming_pool":{"icon":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_boarding"],"geometry":["point","area"],"terms":["boarding","cat","dog","horse","kitten","pet boarding","pet care","pet hotel","puppy","reptile"],"tags":{"amenity":"animal_boarding"},"name":"Animal Boarding Facility"},"amenity/animal_breeding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_breeding"],"geometry":["point","area"],"terms":["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],"tags":{"amenity":"animal_breeding"},"name":"Animal Breeding Facility"},"amenity/animal_shelter":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_shelter"],"geometry":["point","area"],"terms":["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],"tags":{"amenity":"animal_shelter"},"name":"Animal Shelter"},"amenity/arts_centre":{"icon":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"bank","fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],"tags":{"amenity":"bank"},"name":"Bank"},"amenity/bar":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["dive","beer","bier","booze"],"tags":{"amenity":"bar"},"name":"Bar"},"amenity/bbq":{"icon":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"bicycle","fields":["bicycle_parking","capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_parking"},"name":"Bicycle Parking"},"amenity/bicycle_rental":{"icon":"bicycle","fields":["capacity","network","operator"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_rental"},"name":"Bicycle Rental"},"amenity/bicycle_repair_station":{"icon":"bicycle","fields":["operator","brand","opening_hours","fee","service/bicycle"],"geometry":["point","vertex"],"terms":["bike","repair","chain","pump"],"tags":{"amenity":"bicycle_repair_station"},"name":"Bicycle Repair Tool Stand"},"amenity/biergarten":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/bus_station":{"icon":"bus","fields":["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"bus_station"},"name":"Bus Station"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_rental":{"icon":"car","fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","roulette","craps","poker","blackjack"],"tags":{"amenity":"casino"},"name":"Casino"},"amenity/charging_station":{"icon":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"school","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["daycare","orphanage","playgroup"],"tags":{"amenity":"childcare"},"name":"Nursery/Childcare"},"amenity/cinema":{"icon":"cinema","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drive-in","film","flick","movie","theater","picture","show","screen"],"tags":{"amenity":"cinema"},"name":"Cinema"},"amenity/clinic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medical","urgentcare"],"tags":{"amenity":"clinic"},"addTags":{"amenity":"clinic","healthcare":"clinic"},"removeTags":{"amenity":"clinic","healthcare":"clinic"},"reference":{"key":"amenity","value":"clinic"},"name":"Clinic"},"amenity/clinic/abortion":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"abortion"},"reference":{"key":"amenity","value":"clinic"},"name":"Abortion Clinic"},"amenity/clinic/fertility":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["egg","fertility","reproductive","sperm","ovulation"],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"fertility"},"reference":{"key":"amenity","value":"clinic"},"name":"Fertility Clinic"},"amenity/clock":{"icon":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["university"],"tags":{"amenity":"college"},"name":"College Grounds"},"amenity/community_centre":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["event","hall"],"tags":{"amenity":"community_centre"},"name":"Community Center"},"amenity/compressed_air":{"icon":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"dentist","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["tooth","teeth"],"tags":{"amenity":"dentist"},"addTags":{"amenity":"dentist","healthcare":"dentist"},"removeTags":{"amenity":"dentist","healthcare":"dentist"},"reference":{"key":"amenity","value":"dentist"},"name":"Dentist"},"amenity/doctors":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medic*","physician"],"tags":{"amenity":"doctors"},"addTags":{"amenity":"doctors","healthcare":"doctor"},"removeTags":{"amenity":"doctors","healthcare":"doctor"},"reference":{"key":"amenity","value":"doctors"},"name":"Doctor"},"amenity/dojo":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["martial arts","dojang"],"tags":{"amenity":"dojo"},"name":"Dojo / Martial Arts Academy"},"amenity/drinking_water":{"icon":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"fast-food","fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"fast_food"},"terms":["restaurant","takeaway"],"name":"Fast Food"},"amenity/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Terminal"},"amenity/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["fast food","restaurant","food"],"tags":{"amenity":"food_court"},"name":"Food Court"},"amenity/fountain":{"icon":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"fuel"},"name":"Gas Station"},"amenity/grave_yard":{"icon":"cemetery","fields":["religion","denomination"],"geometry":["point","area"],"tags":{"amenity":"grave_yard"},"name":"Graveyard"},"amenity/grit_bin":{"fields":["access_simple"],"geometry":["point","vertex"],"tags":{"amenity":"grit_bin"},"terms":["salt","sand"],"name":"Grit Bin"},"amenity/hospital":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","emergency"],"geometry":["point","area"],"terms":["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],"tags":{"amenity":"hospital"},"addTags":{"amenity":"hospital","healthcare":"hospital"},"removeTags":{"amenity":"hospital","healthcare":"hospital"},"reference":{"key":"amenity","value":"hospital"},"name":"Hospital Grounds"},"amenity/hunting_stand":{"icon":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"ice-cream","fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"geometry":["point","area"],"terms":["gelato","sorbet","sherbet","frozen","yogurt"],"tags":{"amenity":"ice_cream"},"name":"Ice Cream Shop"},"amenity/internet_cafe":{"icon":"poi-mast","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],"tags":{"amenity":"internet_cafe"},"name":"Internet Cafe"},"amenity/kindergarten":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"library","fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/nightclub":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"amenity":"nightclub"},"terms":["disco*","night club","dancing","dance club"],"name":"Nightclub"},"amenity/parking_entrance":{"icon":"entrance-alt1","fields":["access_simple","ref"],"geometry":["vertex"],"tags":{"amenity":"parking_entrance"},"name":"Parking Garage Entrance/Exit"},"amenity/parking_space":{"fields":["capacity"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"parking_space"},"matchScore":0.95,"name":"Parking Space"},"amenity/parking":{"icon":"parking","fields":["operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay","address"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"pharmacy","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"tags":{"amenity":"pharmacy"},"addTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"removeTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"reference":{"key":"amenity","value":"pharmacy"},"terms":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area","service_times"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"place_of_worship"},"name":"Place of Worship"},"amenity/place_of_worship/buddhist":{"icon":"buddhism","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],"tags":{"amenity":"place_of_worship","religion":"buddhist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Buddhist Temple"},"amenity/place_of_worship/christian":{"icon":"religious-christian","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],"tags":{"amenity":"place_of_worship","religion":"christian"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Church"},"amenity/place_of_worship/hindu":{"icon":"poi-hinduist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["garbhargriha","mandu","puja","shrine","temple"],"tags":{"amenity":"place_of_worship","religion":"hindu"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Hindu Temple"},"amenity/place_of_worship/jewish":{"icon":"religious-jewish","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["jewish"],"tags":{"amenity":"place_of_worship","religion":"jewish"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Synagogue"},"amenity/place_of_worship/muslim":{"icon":"religious-muslim","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["muslim"],"tags":{"amenity":"place_of_worship","religion":"muslim"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Mosque"},"amenity/place_of_worship/shinto":{"icon":"poi-shintoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kami","torii"],"tags":{"amenity":"place_of_worship","religion":"shinto"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Shinto Shrine"},"amenity/place_of_worship/sikh":{"icon":"poi-sikhist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["gurudwara","temple"],"tags":{"amenity":"place_of_worship","religion":"sikh"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Sikh Temple"},"amenity/place_of_worship/taoist":{"icon":"poi-taoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["daoist","monastery","temple"],"tags":{"amenity":"place_of_worship","religion":"taoist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Taoist Temple"},"amenity/planetarium":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"police","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],"tags":{"amenity":"police"},"name":"Police"},"amenity/post_box":{"icon":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"post","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["letter","mail"],"tags":{"amenity":"post_office"},"name":"Post Office"},"amenity/prison":{"icon":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"pub"},"terms":["alcohol","drink","dive","beer","bier","booze"],"name":"Pub"},"amenity/public_bath":{"icon":"water","fields":["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"public_bath"},"terms":["onsen","foot bath","hot springs"],"name":"Public Bath"},"amenity/public_bookcase":{"icon":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/ranger_station":{"fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],"tags":{"amenity":"ranger_station"},"name":"Ranger Station"},"amenity/recycling_centre":{"icon":"waste-basket","fields":["name","operator","address","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_type","recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"name":"Recycling"},"amenity/restaurant":{"icon":"restaurant","fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],"tags":{"amenity":"restaurant"},"name":"Restaurant"},"amenity/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"amenity":"sanitary_dump_station"},"name":"RV Toilet Disposal"},"amenity/school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"amenity/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard"},"amenity/shelter":{"icon":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"water","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/social_facility":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility"},"name":"Social Facility"},"amenity/social_facility/food_bank":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility","social_facility":"food_bank"},"reference":{"key":"social_facility","value":"food_bank"},"name":"Food Bank"},"amenity/social_facility/group_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["old","senior","living","care home","assisted living"],"tags":{"amenity":"social_facility","social_facility":"group_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"group_home"},"name":"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["houseless","unhoused","displaced"],"tags":{"amenity":"social_facility","social_facility":"shelter","social_facility:for":"homeless"},"reference":{"key":"social_facility","value":"shelter"},"name":"Homeless Shelter"},"amenity/social_facility/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["elderly","living","nursing","old","senior","assisted living"],"tags":{"amenity":"social_facility","social_facility":"nursing_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home"},"amenity/studio":{"icon":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"toilet","fields":["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],"geometry":["point","vertex","area"],"terms":["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],"tags":{"amenity":"toilets"},"name":"Toilets"},"amenity/townhall":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["village","city","government","courthouse","municipal"],"tags":{"amenity":"townhall"},"name":"Town Hall"},"amenity/university":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":[],"tags":{"amenity":"vending_machine"},"name":"Vending Machine"},"amenity/vending_machine/news_papers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"news_papers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine","searchable":false},"amenity/vending_machine/cigarettes":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cigarette"],"tags":{"amenity":"vending_machine","vending":"cigarettes"},"reference":{"key":"vending","value":"cigarettes"},"name":"Cigarette Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom"],"tags":{"amenity":"vending_machine","vending":"condoms"},"reference":{"key":"vending","value":"condoms"},"name":"Condom Vending Machine"},"amenity/vending_machine/drinks":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["drink","soda","beverage","juice","pop"],"tags":{"amenity":"vending_machine","vending":"drinks"},"reference":{"key":"vending","value":"drinks"},"name":"Drink Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["excrement bags","poop","dog","animal"],"tags":{"amenity":"vending_machine","vending":"excrement_bags"},"reference":{"key":"vending","value":"excrement_bags"},"name":"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],"tags":{"amenity":"vending_machine","vending":"feminine_hygiene"},"reference":{"key":"vending","value":"feminine_hygiene"},"name":"Feminine Hygiene Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"newspapers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parking","ticket"],"tags":{"amenity":"vending_machine","vending":"parking_tickets"},"reference":{"key":"vending","value":"parking_tickets"},"matchScore":0.94,"name":"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["bus","train","ferry","rail","ticket","transportation"],"tags":{"amenity":"vending_machine","vending":"public_transport_tickets"},"reference":{"key":"vending","value":"public_transport_tickets"},"name":"Transit Ticket Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["candy","gum","chip","pretzel","cookie","cracker"],"tags":{"amenity":"vending_machine","vending":"sweets"},"reference":{"key":"vending","value":"sweets"},"name":"Snack Vending Machine"},"amenity/veterinary":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pet clinic","veterinarian","animal hospital","pet doctor"],"tags":{"amenity":"veterinary"},"name":"Veterinary"},"amenity/waste_basket":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex"],"tags":{"amenity":"waste_basket"},"terms":["bin","garbage","rubbish","litter","trash"],"name":"Waste Basket"},"amenity/waste_disposal":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_disposal"},"terms":["garbage","rubbish","litter","trash"],"name":"Garbage Dumpster"},"amenity/waste_transfer_station":{"icon":"waste-basket","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["dump","garbage","recycling","rubbish","scrap","trash"],"tags":{"amenity":"waste_transfer_station"},"name":"Waste Transfer Station"},"amenity/waste/dog_excrement":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_basket","waste":"dog_excrement"},"reference":{"key":"waste","value":"dog_excrement"},"terms":["bin","garbage","rubbish","litter","trash","poo","dog"],"name":"Dog Excrement Bin"},"amenity/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"watering_place"},"name":"Animal Watering Place"},"area":{"fields":["name"],"geometry":["area"],"tags":{"area":"yes"},"name":"Area","matchScore":0.1},"area/highway":{"fields":["name","area/highway"],"geometry":["area"],"tags":{"area:highway":"*"},"name":"Road Surface"},"attraction/amusement_ride":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","carnival ride"],"tags":{"attraction":"amusement_ride"},"name":"Amusement Ride"},"attraction/animal":{"icon":"zoo","fields":["name","operator"],"geometry":["point","area"],"terms":["zoo","theme park","animal park","lion","tiger","bear"],"tags":{"attraction":"animal"},"name":"Animal"},"attraction/big_wheel":{"icon":"amusement-park","fields":["name","operator","height","opening_hours"],"geometry":["point"],"terms":["ferris wheel","theme park","amusement ride"],"tags":{"attraction":"big_wheel"},"name":"Big Wheel"},"attraction/bumper_car":{"icon":"car","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","dodgem cars","autoscooter"],"tags":{"attraction":"bumper_car"},"name":"Bumper Car"},"attraction/bungee_jumping":{"icon":"pitch","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","bungy jumping","jumping platform"],"tags":{"attraction":"bungee_jumping"},"name":"Bungee Jumping"},"attraction/carousel":{"icon":"horse-riding","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],"tags":{"attraction":"carousel"},"name":"Carousel"},"attraction/dark_ride":{"icon":"rail-metro","fields":["name","operator","opening_hours"],"geometry":["point","line","area"],"terms":["theme park","ghost train"],"tags":{"attraction":"dark_ride"},"name":"Dark Ride"},"attraction/drop_tower":{"icon":"poi-tower","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride","gondola","tower","big drop"],"tags":{"attraction":"drop_tower"},"name":"Drop Tower"},"attraction/pirate_ship":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point"],"terms":["theme park","carnival ride","amusement ride"],"tags":{"attraction":"pirate_ship"},"name":"Pirate Ship"},"attraction/river_rafting":{"icon":"ferry","fields":["name","operator","opening_hours"],"geometry":["point","line"],"terms":["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],"tags":{"attraction":"river_rafting"},"name":"River Rafting"},"attraction/roller_coaster":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"rail","fields":["name","operator","fee","opening_hours"],"geometry":["point","line"],"terms":["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],"tags":{"attraction":"train"},"name":"Tourist Train"},"attraction/water_slide":{"icon":"swimming","fields":["name","operator","opening_hours"],"geometry":["line","area"],"terms":["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],"tags":{"attraction":"water_slide"},"name":"Water Slide"},"barrier":{"icon":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"barrier","fields":["wall","height"],"geometry":["line","area"],"tags":{"barrier":"wall"},"name":"Wall","matchScore":0.25},"boundary/administrative":{"name":"Administrative Boundary","geometry":["line"],"tags":{"boundary":"administrative"},"fields":["name","admin_level"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"jeweler"},"reference":{"key":"shop","value":"jewelry"},"name":"Jeweler","searchable":false},"craft/locksmith":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"locksmith"},"reference":{"key":"shop","value":"locksmith"},"name":"Locksmith","searchable":false},"craft/optician":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"optician"},"reference":{"key":"shop","value":"optician"},"name":"Optician","searchable":false},"craft/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"craft":"tailor"},"reference":{"key":"shop","value":"tailor"},"name":"Tailor","searchable":false},"craft/basket_maker":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beer","beverage","bier","booze","cider"],"tags":{"craft":"brewery"},"name":"Brewery"},"craft/carpenter":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],"tags":{"craft":"distillery"},"name":"Distillery"},"craft/dressmaker":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculpter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculpter"},"name":"Sculpter"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/sweep":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sweep"},"name":"Chimney Sweep"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"emergency/designated":{"fields":[],"geometry":["line"],"tags":{"emergency":"designated"},"terms":[],"name":"Emergency Access Designated","searchable":false,"matchScore":0.01},"emergency/destination":{"fields":[],"geometry":["line"],"tags":{"emergency":"destination"},"terms":[],"name":"Emergency Access Destination","searchable":false,"matchScore":0.01},"emergency/no":{"fields":[],"geometry":["line"],"tags":{"emergency":"no"},"terms":[],"name":"Emergency Access No","searchable":false,"matchScore":0.01},"emergency/official":{"fields":[],"geometry":["line"],"tags":{"emergency":"official"},"terms":[],"name":"Emergency Access Official","searchable":false,"matchScore":0.01},"emergency/private":{"fields":[],"geometry":["line"],"tags":{"emergency":"private"},"terms":[],"name":"Emergency Access Private","searchable":false,"matchScore":0.01},"emergency/yes":{"fields":[],"geometry":["line"],"tags":{"emergency":"yes"},"terms":[],"name":"Emergency Access Yes","searchable":false,"matchScore":0.01},"emergency/ambulance_station":{"icon":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-fire-hydrant","fields":["fire_hydrant/type","fire_hydrant/position","ref","operator"],"geometry":["point","vertex"],"terms":["fire plug"],"tags":{"emergency":"fire_hydrant"},"name":"Fire Hydrant"},"emergency/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"green","landuse":"grass","leisure":"pitch","sport":"golf"},"reference":{"key":"golf","value":"green"},"name":"Putting Green"},"golf/hole":{"icon":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"lateral_water_hazard","natural":"water"},"reference":{"key":"golf","value":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"tee","landuse":"grass"},"terms":["teeing ground"],"reference":{"key":"golf","value":"tee"},"name":"Tee Box"},"golf/water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"water_hazard","natural":"water"},"reference":{"key":"golf","value":"water_hazard"},"name":"Water Hazard"},"golf/water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"hospital","fields":["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"healthcare":"*"},"terms":["clinic","doctor","disease","health","institution","sick","surgery","wellness"],"name":"Healthcare Facility"},"healthcare/alternative":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],"tags":{"healthcare":"alternative"},"name":"Alternative Medicine"},"healthcare/alternative/chiropractic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["back","pain","spine"],"tags":{"healthcare":"alternative","healthcare:speciality":"chiropractic"},"name":"Chiropractor"},"healthcare/audiologist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["ear","hearing","sound"],"tags":{"healthcare":"audiologist"},"name":"Audiologist"},"healthcare/birthing_center":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"birthing_center"},"name":"Birthing Center"},"healthcare/blood_donation":{"icon":"blood-bank","fields":["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],"tags":{"healthcare":"blood_donation"},"name":"Blood Donor Center"},"healthcare/hospice":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"midwife"},"name":"Midwife"},"healthcare/occupational_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["therapist","therapy"],"tags":{"healthcare":"occupational_therapist"},"name":"Occupational Therapist"},"healthcare/optometrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses","lasik","lenses","vision"],"tags":{"healthcare":"optometrist"},"name":"Optometrist"},"healthcare/physiotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["physical","therapist","therapy"],"tags":{"healthcare":"physiotherapist"},"name":"Physiotherapist"},"healthcare/podiatrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["foot","feet","nails"],"tags":{"healthcare":"podiatrist"},"name":"Podiatrist"},"healthcare/psychotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],"tags":{"healthcare":"psychotherapist"},"name":"Psychotherapist"},"healthcare/rehabilitation":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["rehab","therapist","therapy"],"tags":{"healthcare":"rehabilitation"},"name":"Rehabilitation Facility"},"healthcare/speech_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["speech","therapist","therapy","voice"],"tags":{"healthcare":"speech_therapist"},"name":"Speech Therapist"},"highway/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"terms":[],"name":"Bus Stop"},"highway/corridor":{"icon":"highway-footway","fields":["name","width","level","access_simple"],"geometry":["line"],"tags":{"highway":"corridor"},"terms":["gallery","hall","hallway","indoor","passage","passageway"],"name":"Indoor Corridor"},"highway/crossing-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["parallel_direction"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["clock_direction"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"highway-motorway","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"motorway"},"terms":["autobahn","expressway","freeway","highway","interstate","parkway","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line","area"],"tags":{"highway":"pedestrian"},"terms":[],"name":"Pedestrian Street"},"highway/primary_link":{"icon":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"highway-unclassified","fields":["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],"geometry":["point","line","area"],"tags":{"highway":"raceway"},"addTags":{"highway":"raceway","sport":"motor"},"terms":["auto*","formula one","kart","motocross","nascar","race*","track"],"name":"Racetrack (Motorsport)"},"highway/residential":{"icon":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"alley"},"reference":{"key":"service","value":"alley"},"name":"Alley"},"highway/service/drive-through":{"icon":"highway-service","fields":["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],"geometry":["line"],"tags":{"highway":"service","service":"drive-through"},"reference":{"key":"service","value":"drive-through"},"name":"Drive-Through"},"highway/service/driveway":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"driveway"},"reference":{"key":"service","value":"driveway"},"name":"Driveway"},"highway/service/emergency_access":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"emergency_access"},"reference":{"key":"service","value":"emergency_access"},"name":"Emergency Access"},"highway/service/parking_aisle":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"parking_aisle"},"reference":{"key":"service","value":"parking_aisle"},"name":"Parking Aisle"},"highway/services":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","parallel_direction"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-street-lamp","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","ref"],"terms":["streetlight","street light","lamp","light","gaslight"],"name":"Street Lamp"},"highway/tertiary_link":{"icon":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"geometry":["line"],"tags":{"highway":"track"},"terms":["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],"name":"Unmaintained Track Road"},"highway/traffic_mirror":{"geometry":["point","vertex"],"tags":{"highway":"traffic_mirror"},"terms":["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],"name":"Traffic Mirror"},"highway/traffic_signals":{"icon":"poi-traffic-signals","geometry":["vertex"],"tags":{"highway":"traffic_signals"},"fields":["traffic_signals"],"terms":["light","stoplight","traffic light"],"name":"Traffic Signals"},"highway/trunk_link":{"icon":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-junction","fields":["name"],"geometry":["vertex","area"],"tags":{"junction":"yes"},"name":"Junction"},"landuse":{"fields":["name","landuse"],"geometry":["area"],"tags":{"landuse":"*"},"matchScore":0.9,"name":"Land Use"},"landuse/farm":{"icon":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"aquarium","fields":["name","operator","produce"],"geometry":["area"],"tags":{"landuse":"aquaculture"},"terms":["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],"name":"Aquaculture"},"landuse/basin":{"icon":"water","fields":["name"],"geometry":["area"],"tags":{"landuse":"basin"},"terms":[],"name":"Basin"},"landuse/cemetery":{"icon":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"commercial","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"garages"},"terms":[],"name":"Garages"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/harbour":{"icon":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"barracks"},"addTags":{"landuse":"military","military":"barracks"},"removeTags":{"landuse":"military","military":"barracks"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Barracks"},"landuse/military/bunker":{"icon":"poi-military","fields":["name","bunker_type","building_area"],"geometry":["point","area"],"tags":{"military":"bunker"},"addTags":{"building":"bunker","landuse":"military","military":"bunker"},"removeTags":{"building":"bunker","landuse":"military","military":"bunker"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Military Bunker"},"landuse/military/checkpoint":{"icon":"barrier","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"checkpoint"},"addTags":{"landuse":"military","military":"checkpoint"},"removeTags":{"landuse":"military","military":"checkpoint"},"terms":["air force","army","base","force","guard","marine","navy","troop","war"],"name":"Checkpoint"},"landuse/military/danger_area":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"danger_area"},"addTags":{"landuse":"military","military":"danger_area"},"removeTags":{"landuse":"military","military":"danger_area"},"terms":["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],"name":"Danger Area"},"landuse/military/naval_base":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"naval_base"},"addTags":{"landuse":"military","military":"naval_base"},"removeTags":{"landuse":"military","military":"naval_base"},"terms":["base","fight","force","guard","marine","navy","ship","sub","troop","war"],"name":"Naval Base"},"landuse/military/nuclear_explosion_site":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"nuclear_explosion_site"},"addTags":{"landuse":"military","military":"nuclear_explosion_site"},"removeTags":{"landuse":"military","military":"nuclear_explosion_site"},"terms":["atom","blast","bomb","detonat*","nuke","site","test"],"name":"Nuclear Explosion Site"},"landuse/military/obstacle_course":{"icon":"poi-military","geometry":["point","area"],"tags":{"military":"obstacle_course"},"addTags":{"landuse":"military","military":"obstacle_course"},"removeTags":{"landuse":"military","military":"obstacle_course"},"terms":["army","base","force","guard","marine","navy","troop","war"],"name":"Obstacle Course"},"landuse/military/office":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"office"},"addTags":{"landuse":"military","military":"office"},"removeTags":{"landuse":"military","military":"office"},"terms":["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],"name":"Military Office"},"landuse/military/range":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"range"},"addTags":{"landuse":"military","military":"range"},"removeTags":{"landuse":"military","military":"range"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Military Range"},"landuse/military/training_area":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"training_area"},"addTags":{"landuse":"military","military":"training_area"},"removeTags":{"landuse":"military","military":"training_area"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Training Area"},"landuse/orchard":{"icon":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"garden","fields":["name","operator","plant"],"geometry":["area"],"tags":{"landuse":"plant_nursery"},"terms":["flower","garden","grow","vivero"],"name":"Plant Nursery"},"landuse/quarry":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"quarry"},"terms":[],"name":"Quarry"},"landuse/railway":{"icon":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"name":"Residential Area"},"landuse/retail":{"icon":"shop","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"name":"Retail Area"},"landuse/vineyard":{"fields":["name","operator","grape_variety"],"geometry":["area"],"tags":{"landuse":"vineyard"},"addTags":{"landuse":"vineyard","crop":"grape"},"removeTags":{"landuse":"vineyard","crop":"grape","grape_variety":"*"},"terms":["grape","wine"],"name":"Vineyard"},"leisure":{"icon":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","slot machine"],"tags":{"leisure":"adult_gaming_centre"},"name":"Adult Gaming Center"},"leisure/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-bowling","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["bowling center"],"tags":{"leisure":"bowling_alley"},"name":"Bowling Alley"},"leisure/common":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_centre"},"terms":["health","gym","leisure","studio"],"name":"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["studio"],"tags":{"leisure":"fitness_centre","sport":"yoga"},"reference":{"key":"sport","value":"yoga"},"name":"Yoga Studio"},"leisure/fitness_station":{"icon":"pitch","fields":["name","sport","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"terms":["fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/garden":{"icon":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"commercial","fields":["name","address","building_area","opening_hours","website"],"geometry":["point","area"],"terms":["makerspace","hackspace","hacklab"],"tags":{"leisure":"hackerspace"},"name":"Hackerspace"},"leisure/horse_riding":{"icon":"horse-riding","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["equestrian","stable"],"tags":{"leisure":"horse_riding"},"name":"Horseback Riding Facility"},"leisure/ice_rink":{"icon":"pitch","fields":["name","seasonal","sport_ice","operator","address","building","opening_hours"],"geometry":["point","area"],"terms":["hockey","skating","curling"],"tags":{"leisure":"ice_rink"},"name":"Ice Rink"},"leisure/marina":{"icon":"harbor","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["boat"],"tags":{"leisure":"marina"},"name":"Marina"},"leisure/miniature_golf":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["crazy golf","mini golf","putt-putt"],"tags":{"leisure":"miniature_golf"},"name":"Miniature Golf"},"leisure/nature_reserve":{"icon":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"park","geometry":["point","area"],"fields":["name"],"terms":["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],"tags":{"leisure":"park"},"name":"Park"},"leisure/picnic_table":{"icon":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["surface","hoops","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"basketball"},"reference":{"key":"sport","value":"basketball"},"terms":[],"name":"Basketball Court"},"leisure/pitch/beachvolleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"beachvolleyball"},"addTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"removeTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"reference":{"key":"sport","value":"beachvolleyball"},"terms":["volleyball"],"name":"Beach Volleyball Court"},"leisure/pitch/bowls":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["surface","lit","building"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"equestrian"},"reference":{"key":"sport","value":"equestrian"},"terms":["dressage","equestrian","horse","horseback","riding"],"name":"Riding Arena"},"leisure/pitch/rugby_league":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_league"},"reference":{"key":"sport","value":"rugby_league"},"terms":[],"name":"Rugby League Field"},"leisure/pitch/rugby_union":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_union"},"reference":{"key":"sport","value":"rugby_union"},"terms":[],"name":"Rugby Union Field"},"leisure/pitch/skateboard":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"table_tennis"},"reference":{"key":"sport","value":"table_tennis"},"terms":["table tennis","ping pong"],"name":"Ping Pong Table"},"leisure/pitch/tennis":{"icon":"tennis","fields":["surface","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"tennis"},"reference":{"key":"sport","value":"tennis"},"terms":[],"name":"Tennis Court"},"leisure/pitch/volleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"playground","fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"geometry":["point","area"],"terms":["jungle gym","play area"],"tags":{"leisure":"playground"},"name":"Playground"},"leisure/resort":{"icon":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"pitch","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track","sport":"running"},"terms":["race*","running","sprint","track"],"name":"Racetrack (Running)"},"leisure/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"sports_centre"},"terms":[],"name":"Sports Center / Complex"},"leisure/sports_centre/swimming":{"icon":"swimming","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"sports_centre","sport":"swimming"},"reference":{"key":"sport","value":"swimming"},"name":"Swimming Pool Facility"},"leisure/stadium":{"icon":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"highway-road","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track"},"terms":["cycle","dog","greyhound","horse","race*","track"],"name":"Racetrack (Non-Motorsport)"},"leisure/water_park":{"icon":"swimming","fields":["name","operator","address"],"geometry":["point","area"],"terms":["swim","pool","dive"],"tags":{"leisure":"water_park"},"name":"Water Park"},"line":{"fields":["name"],"geometry":["line"],"tags":{},"name":"Line","matchScore":0.1},"man_made":{"icon":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","geometry":["point","area"],"terms":["gas holder"],"tags":{"man_made":"gasometer"},"name":"Gasometer"},"man_made/groyne":{"geometry":["line","area"],"tags":{"man_made":"groyne"},"name":"Groyne"},"man_made/lighthouse":{"icon":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","fields":["tower/type","tower/construction","height","communication_multi"],"geometry":["point"],"terms":["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],"tags":{"man_made":"mast"},"name":"Mast"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-storage-tank","geometry":["point"],"terms":["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],"tags":{"man_made":"petroleum_well"},"name":"Oil Well"},"man_made/pier":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance","surveillance:type":"camera"},"name":"Surveillance Camera"},"man_made/surveillance":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","surveillance/zone"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance"},"name":"Surveillance"},"man_made/survey_point":{"icon":"monument","fields":["ref"],"geometry":["point","vertex"],"terms":["trig point","triangulation pillar","trigonometrical station"],"tags":{"man_made":"survey_point"},"name":"Survey Point"},"man_made/tower":{"icon":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"terms":["sewage*","water treatment plant","reclamation plant"],"tags":{"man_made":"wastewater_plant"},"name":"Wastewater Plant"},"man_made/water_tower":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"industry","fields":["name","operator","address","building_area","product"],"geometry":["point","area"],"terms":["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],"tags":{"man_made":"works"},"name":"Factory"},"manhole":{"icon":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"natural","fields":["name","natural"],"geometry":["point","vertex","area"],"tags":{"natural":"*"},"name":"Natural"},"natural/bare_rock":{"geometry":["area"],"tags":{"natural":"bare_rock"},"terms":["rock"],"name":"Bare Rock"},"natural/bay":{"icon":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"triangle","geometry":["point","area"],"fields":["fee","access_simple"],"tags":{"natural":"cave_entrance"},"terms":["cavern","hollow","grotto","shelter","cavity"],"name":"Cave Entrance"},"natural/cliff":{"icon":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"name":"Cliff"},"natural/coastline":{"geometry":["line"],"tags":{"natural":"coastline"},"terms":["shore"],"name":"Coastline"},"natural/fell":{"geometry":["area"],"tags":{"natural":"fell"},"terms":[],"name":"Fell"},"natural/glacier":{"geometry":["area"],"tags":{"natural":"glacier"},"terms":[],"name":"Glacier"},"natural/grassland":{"geometry":["area"],"tags":{"natural":"grassland"},"terms":["prairie","savanna"],"name":"Grassland"},"natural/heath":{"geometry":["area"],"tags":{"natural":"heath"},"terms":[],"name":"Heath"},"natural/peak":{"icon":"mountain","fields":["name","elevation"],"geometry":["point","vertex"],"tags":{"natural":"peak"},"terms":["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],"name":"Peak"},"natural/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"triangle-stroked","fields":["elevation"],"geometry":["point","vertex"],"tags":{"natural":"saddle"},"terms":["pass","mountain pass","top"],"name":"Saddle"},"natural/sand":{"geometry":["area"],"tags":{"natural":"sand"},"terms":["desert"],"name":"Sand"},"natural/scree":{"geometry":["area"],"tags":{"natural":"scree"},"terms":["loose rocks"],"name":"Scree"},"natural/scrub":{"geometry":["area"],"tags":{"natural":"scrub"},"terms":["bush","shrubs"],"name":"Scrub"},"natural/spring":{"icon":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"lake"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","loch","mere"],"name":"Lake"},"natural/water/pond":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"pond"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","millpond","tarn","pool","mere"],"name":"Pond"},"natural/water/reservoir":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"commercial","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/physician":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant"},"office/administrative":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"administrative"},"terms":[],"name":"Administrative Office"},"office/architect":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect"},"office/company":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"company"},"terms":[],"name":"Company Office"},"office/coworking":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["coworking","office"],"tags":{"office":"coworking"},"reference":{"key":"amenity","value":"coworking_space"},"name":"Coworking Space"},"office/educational_institution":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/estate_agent":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/government":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"government"},"terms":[],"name":"Government Office"},"office/government/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["clerk","marriage","death","birth","certificate"],"tags":{"office":"government","government":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office"},"office/insurance":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"it"},"terms":[],"name":"IT Office"},"office/lawyer":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"terms":["clerk","signature","wills","deeds","estate"],"name":"Notary Office"},"office/newspaper":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper"},"office/ngo":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"ngo"},"terms":[],"name":"NGO Office"},"office/political_party":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/research":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/telecommunication":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"telecommunication"},"terms":[],"name":"Telecom Office"},"office/therapist":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"therapist"},"terms":[],"name":"Therapist"},"piste":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"tags":{"place":"square"},"name":"Square"},"place/suburb":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Spring Rider","terms":["spring rocker","springy rocker"]},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout","terms":["merry-go-round"]},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"zipwire"},"name":"Zip Wire"},"point":{"fields":["name"],"geometry":["point"],"tags":{},"name":"Point","matchScore":0.1},"power/sub_station":{"fields":["substation","operator","building"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-power","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity"],"geometry":["point","vertex","area"],"terms":["hydro","solar","turbine","wind"],"tags":{"power":"generator"},"name":"Power Generator"},"power/generator/source_nuclear":{"icon":"poi-nuclear","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity"],"geometry":["point","vertex","area"],"terms":["fission","generator","nuclear","nuke","reactor"],"tags":{"power":"generator","generator:source":"nuclear","generator:method":"fission"},"reference":{"key":"generator:source","value":"nuclear"},"name":"Nuclear Reactor"},"power/generator/source_wind":{"icon":"poi-wind","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","height"],"geometry":["point","vertex","area"],"terms":["generator","turbine","windmill","wind"],"tags":{"power":"generator","generator:source":"wind","generator:method":"wind_turbine"},"reference":{"key":"generator:source","value":"wind"},"name":"Wind Turbine"},"power/line":{"icon":"power-line","geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"industry","fields":["name","operator","address","plant/output/electricity","start_date"],"geometry":["area"],"tags":{"power":"plant"},"addTags":{"power":"plant","landuse":"industrial"},"removeTags":{"power":"plant","landuse":"industrial"},"terms":["coal","gas","generat*","hydro","nuclear","power","station"],"name":"Power Station Grounds"},"power/pole":{"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/tower":{"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","shelter"],"geometry":["point","vertex","line","area"],"tags":{"public_transport":"platform"},"name":"Platform"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"name":"Stop Position"},"railway/abandoned":{"icon":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"crossing"},"terms":["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],"name":"Railway Crossing (Path)"},"railway/derail":{"icon":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"railway-rail","geometry":["line"],"terms":["venicular","cliff railway","cable car","cable railway","funicular railway"],"fields":["structure","gauge","service_rail"],"tags":{"railway":"funicular"},"name":"Funicular"},"railway/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"name":"Railway Halt","terms":["break","interrupt","rest","wait","interruption"]},"railway/level_crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"level_crossing"},"terms":["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],"name":"Railway Crossing (Road)"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["milestone_position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/monorail":{"icon":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Railway Platform"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-railway-signals","geometry":["point","vertex"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"railway/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"tags":{"railway":"station"},"terms":["train station","station"],"name":"Railway Station"},"railway/subway_entrance":{"icon":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram_stop":{"icon":"rail-light","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stop"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fishmonger"},"reference":{"key":"shop","value":"seafood"},"name":"Fishmonger","searchable":false},"shop/furnace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["oven","stove"],"tags":{"shop":"furnace"},"name":"Furnace Store","searchable":false},"shop/vacant":{"icon":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["alcohol","beer","booze","wine"],"tags":{"shop":"alcohol"},"name":"Liquor Store"},"shop/anime":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"anime"},"terms":["manga","japan","cosplay","figurine","dakimakura"],"name":"Anime Shop"},"shop/antiques":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],"tags":{"shop":"appliance"},"name":"Appliance Store"},"shop/art":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery"],"tags":{"shop":"art"},"name":"Art Store"},"shop/baby_goods":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["handbag","purse"],"tags":{"shop":"bag"},"name":"Bag/Luggage Store"},"shop/bakery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","beauty"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["manicure","pedicure"],"tags":{"shop":"beauty","beauty":"nails"},"reference":{"key":"shop","value":"beauty"},"name":"Nail Salon"},"shop/beauty/tanning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beauty","beauty":"tanning"},"reference":{"key":"leisure","value":"tanning_salon"},"name":"Tanning Salon"},"shop/bed":{"icon":"lodging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"shop":"books"},"name":"Book Store"},"shop/boutique":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"geometry":["point","area"],"terms":["auto","garage","service"],"tags":{"shop":"car_repair"},"name":"Car Repair Shop"},"shop/car":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["thrift","op shop","nonprofit"],"tags":{"shop":"charity"},"name":"Charity Store"},"shop/cheese":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"craft"},"terms":["art*","paint*","frame"],"name":"Arts and Crafts Store"},"shop/curtain":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["milk","egg","cheese"],"tags":{"shop":"dairy"},"name":"Dairy Store"},"shop/deli":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lunch","meat","sandwich"],"tags":{"shop":"deli"},"name":"Deli"},"shop/department_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"e-cigarette"},"terms":["electronic","vapor"],"name":"E-Cigarette Shop"},"shop/electronics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],"tags":{"shop":"electronics"},"name":"Electronics Store"},"shop/erotic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["farm shop","farm stand"],"tags":{"shop":"farm"},"name":"Produce Stand"},"shop/fashion":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"frame"},"terms":["art*","paint*","photo*","frame"],"name":"Framing Shop"},"shop/funeral_directors":{"icon":"cemetery","fields":["name","operator","address","building_area","religion","denomination"],"geometry":["point","area"],"terms":["undertaker","memorial home"],"tags":{"shop":"funeral_directors"},"name":"Funeral Home"},"shop/furniture":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["chair","sofa","table"],"tags":{"shop":"furniture"},"name":"Furniture Store"},"shop/garden_centre":{"icon":"garden-center","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscape","mulch","shrub","tree"],"tags":{"shop":"garden_centre"},"name":"Garden Center"},"shop/gas":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cng","lpg","natural gas","propane","refill","tank"],"tags":{"shop":"gas"},"name":"Bottled Gas Shop"},"shop/gift":{"icon":"gift","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["home","household"],"tags":{"shop":"houseware"},"name":"Houseware Store"},"shop/interior_decoration":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"News Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"medical_supply"},"name":"Medical Supply Store"},"shop/mobile_phone":{"icon":"mobile-phone","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"mobile_phone"},"name":"Mobile Phone Store"},"shop/money_lender":{"icon":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["CD","vinyl"],"tags":{"shop":"music"},"name":"Music Store"},"shop/musical_instrument":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["guitar"],"tags":{"shop":"musical_instrument"},"name":"Musical Instrument Store"},"shop/newsagent":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camping","climbing","hiking"],"tags":{"shop":"outdoor"},"name":"Outdoors Store"},"shop/paint":{"icon":"water","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pastry"},"terms":["patisserie","cake shop","cakery"],"name":"Pastry Shop"},"shop/pawnbroker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["animal","cat","dog","fish","kitten","puppy","reptile"],"tags":{"shop":"pet"},"name":"Pet Store"},"shop/photo":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","religion","denomination"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["secondhand","second hand","resale","thrift","used"],"tags":{"shop":"second_hand"},"name":"Consignment/Thrift Store"},"shop/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["grocery","store","shop"],"tags":{"shop":"supermarket"},"name":"Supermarket"},"shop/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"lodging","fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"alpine_hut"},"name":"Alpine Hut"},"tourism/apartment":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"apartment"},"name":"Guest Apartment / Condo"},"tourism/aquarium":{"icon":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"monument","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["tent","rv"],"tags":{"tourism":"camp_site"},"name":"Campground"},"tourism/caravan_site":{"icon":"bus","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper"],"tags":{"tourism":"caravan_site"},"name":"RV Park"},"tourism/chalet":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"chalet"},"name":"Chalet"},"tourism/gallery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","paint*","photo*","sculpt*"],"tags":{"tourism":"gallery"},"name":"Art Gallery"},"tourism/guest_house":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"guest_house"},"terms":["B&B","Bed and Breakfast"],"name":"Guest House"},"tourism/hostel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hostel"},"name":"Hostel"},"tourism/hotel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hotel"},"name":"Hotel"},"tourism/information":{"icon":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"information","fields":["name","operator","board_type"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["operator","ref"],"geometry":["point","vertex"],"terms":["signpost"],"tags":{"tourism":"information","information":"guidepost"},"reference":{"key":"information","value":"guidepost"},"name":"Guidepost"},"tourism/information/map":{"icon":"information","fields":["operator","map_type","map_size"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"map"},"reference":{"key":"information","value":"map"},"name":"Map"},"tourism/information/office":{"icon":"information","fields":["name","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information","information":"office"},"reference":{"key":"information","value":"office"},"name":"Tourist Information Office"},"tourism/motel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"motel"},"name":"Motel"},"tourism/museum":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],"tags":{"tourism":"museum"},"name":"Museum"},"tourism/picnic_site":{"icon":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","parallel_direction"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"restriction-no-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_left_turn"},"name":"No Left Turn"},"type/restriction/no_right_turn":{"icon":"restriction-no-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_right_turn"},"name":"No Right Turn"},"type/restriction/no_straight_on":{"icon":"restriction-no-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_straight_on"},"name":"No Straight On"},"type/restriction/no_u_turn":{"icon":"restriction-no-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_u_turn"},"name":"No U-turn"},"type/restriction/only_left_turn":{"icon":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"route-water","fields":["name","waterway","ref"],"geometry":["relation"],"tags":{"type":"waterway"},"name":"Waterway"},"vertex":{"fields":["name"],"geometry":["vertex"],"tags":{},"name":"Other","matchScore":0.1},"waterway/boatyard":{"icon":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"harbor","fields":["name","dock","operator"],"geometry":["area","vertex","point"],"terms":["boat","ship","vessel","marine"],"tags":{"waterway":"dock"},"name":"Wet Dock / Dry Dock"},"waterway/drain":{"icon":"waterway-stream","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","gas","diesel","boat"],"tags":{"waterway":"fuel"},"name":"Marine Fuel Station"},"waterway/river":{"icon":"waterway-river","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],"tags":{"waterway":"river"},"name":"River"},"waterway/riverbank":{"icon":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["name","operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"waterway":"sanitary_dump_station"},"name":"Marine Toilet Disposal"},"waterway/stream_intermittent":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],"tags":{"waterway":"stream","intermittent":"yes"},"reference":{"key":"waterway","value":"stream"},"name":"Intermittent Stream"},"waterway/stream":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],"tags":{"waterway":"stream"},"name":"Stream"},"waterway/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Shop":{"tags":{"name":"Coffee Shop","amenity":"cafe"},"name":"Coffee Shop","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Consultorio Dental":{"tags":{"name":"Consultorio Dental","healthcare":"dentist","amenity":"dentist"},"name":"Consultorio Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Dentista":{"tags":{"name":"Dentista","healthcare":"dentist","amenity":"dentist"},"name":"Dentista","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Food Court":{"tags":{"name":"Food Court","amenity":"fast_food"},"name":"Food Court","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gas":{"tags":{"name":"Costco Gas","amenity":"fuel"},"name":"Costco Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gasoline":{"tags":{"name":"Costco Gasoline","amenity":"fuel"},"name":"Costco Gasoline","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GNV":{"tags":{"name":"GNV","amenity":"fuel"},"name":"GNV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gas":{"tags":{"name":"Gas","amenity":"fuel"},"name":"Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jardin Infantil":{"tags":{"name":"Jardin Infantil","amenity":"kindergarten"},"name":"Jardin Infantil","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Municipal":{"tags":{"name":"Biblioteca Municipal","amenity":"library"},"name":"Biblioteca Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública":{"tags":{"name":"Biblioteca Pública","amenity":"library"},"name":"Biblioteca Pública","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública Municipal":{"tags":{"name":"Biblioteca Pública Municipal","amenity":"library"},"name":"Biblioteca Pública Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmácia":{"tags":{"name":"Farmácia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmácia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Belvedere":{"tags":{"name":"Belvedere","amenity":"restaurant"},"name":"Belvedere","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak House":{"tags":{"name":"Steak House","amenity":"restaurant"},"name":"Steak House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Estadual":{"tags":{"name":"Escola Estadual","amenity":"school"},"name":"Escola Estadual","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Municipal":{"tags":{"name":"Escola Municipal","amenity":"school"},"name":"Escola Municipal","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Anfiteatro":{"tags":{"name":"Anfiteatro","amenity":"theatre"},"name":"Anfiteatro","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Municipal":{"tags":{"name":"Teatro Municipal","amenity":"theatre"},"name":"Teatro Municipal","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/veterinary/Clinica Veterinaria":{"tags":{"name":"Clinica Veterinaria","amenity":"veterinary"},"name":"Clinica Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/veterinary/Veterinaria":{"tags":{"name":"Veterinaria","amenity":"veterinary"},"name":"Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Polideportivo":{"tags":{"name":"Polideportivo","leisure":"sports_centre"},"name":"Polideportivo","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Panaderia":{"tags":{"name":"Panaderia","shop":"bakery"},"name":"Panaderia","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimarket":{"tags":{"name":"Minimarket","shop":"convenience"},"name":"Minimarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/funeral_directors/Funeraria":{"tags":{"name":"Funeraria","shop":"funeral_directors"},"name":"Funeraria","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Barbershop":{"tags":{"name":"Barbershop","shop":"hairdresser"},"name":"Barbershop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon":{"tags":{"name":"Salon","shop":"hairdresser"},"name":"Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosco":{"tags":{"name":"Kiosco","shop":"kiosk"},"name":"Kiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Kitchen":{"tags":{"name":"Kitchen","shop":"kitchen"},"name":"Kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/kitchen":{"tags":{"name":"kitchen","shop":"kitchen"},"name":"kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket":{"tags":{"name":"Cricket","shop":"mobile_phone"},"name":"Cricket","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optica":{"tags":{"name":"Optica","shop":"optician"},"name":"Optica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Stadium":{"tags":{"name":"Stadium","shop":"sports"},"name":"Stadium","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Casino":{"tags":{"name":"Casino","shop":"supermarket"},"name":"Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Costco":{"tags":{"name":"Costco","shop":"supermarket"},"name":"Costco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado":{"tags":{"name":"Mercado","shop":"supermarket"},"name":"Mercado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tattoo/Tattoo":{"tags":{"name":"Tattoo","shop":"tattoo"},"name":"Tattoo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vulcanizing Shop":{"tags":{"name":"Vulcanizing Shop","shop":"tyres"},"name":"Vulcanizing Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Lavoir":{"tags":{"name":"Lavoir","tourism":"attraction"},"name":"Lavoir","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path continues":{"tags":{"name":"path continues","tourism":"attraction"},"name":"path continues","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Campsite":{"tags":{"name":"Campsite","tourism":"camp_site"},"name":"Campsite","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Guest House":{"tags":{"name":"Guest House","tourism":"guest_house"},"name":"Guest House","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel":{"tags":{"name":"Motel","tourism":"motel"},"name":"Motel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Museum":{"tags":{"name":"Museum","tourism":"museum"},"name":"Museum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
23193 var defaults = {"area":["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],"line":["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],"point":["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],"vertex":["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],"relation":["category-route","category-restriction","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23195 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"golf","geometry":"area","name":"Golf Features","members":["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{"icon":"landuse","geometry":"area","name":"Land Use Features","members":["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military"]},"category-natural-area":{"icon":"natural","geometry":"area","name":"Natural Features","members":["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{"icon":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"restriction","geometry":"relation","name":"Restriction Features","members":["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction"]},"category-road":{"icon":"category-roads","geometry":"line","name":"Road Features","members":["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{"icon":"route","geometry":"relation","name":"Route Features","members":["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/bus","type/route/train","type/route/tram","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23197 var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","no"]},"access":{"keys":["access","foot","motor_vehicle","bicycle","horse"],"reference":{"key":"access"},"type":"access","label":"Allowed Access","placeholder":"Not Specified","strings":{"types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"address":{"type":"address","keys":["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],"reference":{"key":"addr"},"icon":"address","universal":true,"label":"Address","strings":{"placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}}},"admin_level":{"key":"admin_level","type":"number","label":"Admin Level"},"aerialway":{"key":"aerialway","type":"typeCombo","label":"Type"},"aerialway/access":{"key":"aerialway:access","type":"combo","label":"Access","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aerialway/bubble":{"key":"aerialway:bubble","type":"check","label":"Bubble"},"aerialway/capacity":{"key":"aerialway:capacity","type":"number","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"key":"aerialway:summer:access","type":"combo","label":"Access (summer)","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aeroway":{"key":"aeroway","type":"typeCombo","label":"Type"},"amenity":{"key":"amenity","type":"typeCombo","label":"Type"},"animal_boarding":{"key":"animal_boarding","type":"semiCombo","label":"For Animals"},"animal_breeding":{"key":"animal_breeding","type":"semiCombo","label":"For Animals"},"animal_shelter":{"key":"animal_shelter","type":"semiCombo","label":"For Animals"},"area/highway":{"key":"area:highway","type":"typeCombo","label":"Type"},"artist":{"key":"artist_name","type":"text","label":"Artist"},"artwork_type":{"key":"artwork_type","type":"combo","label":"Type"},"atm":{"key":"atm","type":"check","label":"ATM"},"backrest":{"key":"backrest","type":"check","label":"Backrest"},"barrier":{"key":"barrier","type":"typeCombo","label":"Type"},"bath/open_air":{"key":"bath:open_air","label":"Open Air","type":"check"},"bath/sand_bath":{"key":"bath:sand_bath","label":"Sand Bath","type":"check"},"bath/type":{"key":"bath:type","type":"combo","label":"Specialty","strings":{"options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}}},"beauty":{"key":"beauty","type":"combo","label":"Shop Type"},"bench":{"key":"bench","type":"check","label":"Bench"},"bicycle_parking":{"key":"bicycle_parking","type":"combo","label":"Type"},"bin":{"key":"bin","type":"check","label":"Waste Bin"},"blood_components":{"key":"blood:","type":"multiCombo","label":"Blood Components","strings":{"options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}}},"board_type":{"key":"board_type","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"bridge":{"key":"bridge","type":"typeCombo","label":"Type","placeholder":"Default"},"building_area":{"key":"building","type":"combo","default":"yes","geometry":"area","label":"Building"},"building":{"key":"building","type":"combo","label":"Building"},"bunker_type":{"key":"bunker_type","type":"combo","label":"Type"},"camera/direction":{"key":"camera:direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"key":"camera:mount","type":"combo","label":"Camera Mount"},"camera/type":{"key":"camera:type","type":"combo","label":"Camera Type","strings":{"options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}}},"capacity":{"key":"capacity","type":"number","label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}}},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clock_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"clothes":{"key":"clothes","type":"semiCombo","label":"Clothes"},"club":{"key":"club","type":"typeCombo","label":"Type"},"collection_times":{"key":"collection_times","type":"text","label":"Collection Times"},"comment":{"key":"comment","type":"textarea","label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"key":"communication:","type":"multiCombo","label":"Communication Types"},"construction":{"key":"construction","type":"combo","label":"Type"},"contact/webcam":{"key":"contact:webcam","type":"url","icon":"website","label":"Webcam URL","placeholder":"http://example.com/"},"content":{"key":"content","type":"combo","label":"Content"},"country":{"key":"country","type":"combo","label":"Country"},"covered":{"key":"covered","type":"check","label":"Covered"},"craft":{"key":"craft","type":"typeCombo","label":"Type"},"crane/type":{"key":"crane:type","type":"combo","label":"Crane Type","strings":{"options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}}},"crop":{"key":"crop","type":"semiCombo","label":"Crops"},"crossing":{"key":"crossing","type":"combo","label":"Type"},"cuisine":{"key":"cuisine","type":"semiCombo","label":"Cuisines"},"currency_multi":{"key":"currency:","type":"multiCombo","label":"Currency Types"},"cutting":{"key":"cutting","type":"typeCombo","label":"Type","placeholder":"Default"},"cycle_network":{"key":"cycle_network","type":"networkCombo","label":"Network"},"cycleway":{"keys":["cycleway:left","cycleway:right"],"reference":{"key":"cycleway"},"type":"cycleway","label":"Bike Lanes","placeholder":"none","strings":{"types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}}},"date":{"key":"date","type":"check","label":"Date"},"delivery":{"key":"delivery","type":"check","label":"Delivery"},"denomination":{"key":"denomination","type":"combo","label":"Denomination"},"denotation":{"key":"denotation","type":"combo","label":"Denotation"},"description":{"key":"description","type":"textarea","label":"Description","universal":true},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"display":{"key":"display","type":"combo","label":"Display","options":["analog","digital","sundial","unorthodox"]},"dock":{"key":"dock","type":"combo","label":"Type"},"drive_through":{"key":"drive_through","type":"check","label":"Drive-Through"},"duration":{"key":"duration","type":"text","label":"Duration","placeholder":"00:00"},"electrified":{"key":"electrified","type":"combo","label":"Electrification","placeholder":"Contact Line, Electrified Rail...","strings":{"options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}}},"elevation":{"key":"ele","type":"number","icon":"elevation","universal":true,"label":"Elevation"},"email":{"key":"email","type":"email","placeholder":"example@example.com","universal":true,"label":"Email"},"embankment":{"key":"embankment","type":"typeCombo","label":"Type","placeholder":"Default"},"emergency":{"key":"emergency","type":"check","label":"Emergency"},"entrance":{"key":"entrance","type":"typeCombo","label":"Type"},"except":{"key":"except","type":"combo","label":"Exceptions"},"fax":{"key":"fax","type":"tel","label":"Fax","universal":true,"placeholder":"+31 42 123 4567"},"fee":{"key":"fee","type":"check","label":"Fee"},"fence_type":{"key":"fence_type","type":"combo","label":"Type"},"fire_hydrant/position":{"key":"fire_hydrant:position","type":"combo","label":"Position","strings":{"options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}}},"fire_hydrant/type":{"key":"fire_hydrant:type","type":"combo","label":"Type","strings":{"options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}}},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"fuel_multi":{"key":"fuel:","type":"multiCombo","label":"Fuel Types"},"fuel":{"key":"fuel","type":"combo","label":"Fuel"},"gauge":{"key":"gauge","type":"combo","label":"Gauge"},"gender":{"type":"radio","keys":["male","female","unisex"],"label":"Gender","placeholder":"Unknown","strings":{"options":{"male":"Male","female":"Female","unisex":"Unisex"}}},"generator/method":{"key":"generator:method","type":"combo","label":"Method"},"generator/output/electricity":{"key":"generator:output:electricity","type":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"key":"generator:source","type":"combo","label":"Source"},"generator/type":{"key":"generator:type","type":"combo","label":"Type"},"grape_variety":{"key":"grape_variety","type":"semiCombo","label":"Grape Varieties"},"handicap":{"key":"handicap","type":"number","label":"Handicap","placeholder":"1-18"},"handrail":{"key":"handrail","type":"check","label":"Handrail"},"hashtags":{"key":"hashtags","type":"semiCombo","label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"key":"healthcare","type":"typeCombo","label":"Type"},"healthcare/speciality":{"key":"healthcare:speciality","type":"semiCombo","reference":{"key":"healthcare"},"label":"Specialties"},"height":{"key":"height","type":"number","label":"Height (Meters)"},"highway":{"key":"highway","type":"typeCombo","label":"Type"},"historic":{"key":"historic","type":"typeCombo","label":"Type"},"historic/civilization":{"key":"historic:civilization","type":"combo","label":"Historic Civilization"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"key":"iata","type":"text","label":"IATA"},"icao":{"key":"icao","type":"text","label":"ICAO"},"incline_steps":{"key":"incline","type":"combo","label":"Incline","strings":{"options":{"up":"Up","down":"Down"}}},"incline":{"key":"incline","type":"combo","label":"Incline"},"indoor":{"key":"indoor","type":"check","label":"Indoor"},"information":{"key":"information","type":"typeCombo","label":"Type"},"inscription":{"key":"inscription","type":"textarea","label":"Inscription"},"intermittent":{"key":"intermittent","type":"check","label":"Intermittent"},"internet_access":{"key":"internet_access","type":"combo","label":"Internet Access","strings":{"options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}}},"internet_access/fee":{"key":"internet_access:fee","type":"check","label":"Internet Access Fee"},"internet_access/ssid":{"key":"internet_access:ssid","type":"text","label":"SSID (Network Name)"},"kerb":{"key":"kerb","type":"combo","label":"Curb"},"label":{"key":"label","type":"textarea","label":"Label"},"lamp_type":{"key":"lamp_type","type":"combo","label":"Type"},"landuse":{"key":"landuse","type":"typeCombo","label":"Type"},"lanes":{"key":"lanes","type":"number","label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"key":"layer","type":"number","label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}}},"leaf_cycle":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}}},"leaf_type_singular":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}}},"leaf_type":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}}},"leisure":{"key":"leisure","type":"typeCombo","label":"Type"},"length":{"key":"length","type":"number","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"location":{"key":"location","type":"combo","label":"Location"},"man_made":{"key":"man_made","type":"typeCombo","label":"Type"},"manhole":{"key":"manhole","type":"typeCombo","label":"Type"},"map_size":{"key":"map_size","type":"typeCombo","label":"Coverage"},"map_type":{"key":"map_type","type":"typeCombo","label":"Type"},"maxheight":{"key":"maxheight","type":"combo","label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\"","snake_case":false},"maxspeed":{"key":"maxspeed","type":"maxspeed","label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"key":"maxstay","type":"combo","label":"Max Stay","options":["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],"snake_case":false},"maxweight":{"key":"maxweight","type":"combo","label":"Max Weight","snake_case":false},"memorial":{"key":"memorial","type":"typeCombo","label":"Type"},"milestone_position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"mtb/scale":{"key":"mtb:scale","type":"combo","label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{"key":"mtb:scale:imba","type":"combo","label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","strings":{"options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{"key":"mtb:scale:uphill","type":"combo","label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},"name":{"key":"name","type":"localized","label":"Name","universal":true,"placeholder":"Common name (if any)"},"natural":{"key":"natural","type":"typeCombo","label":"Natural"},"network_bicycle":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}}},"network_foot":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}}},"network_horse":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}}},"network_road":{"key":"network","type":"networkCombo","label":"Network"},"network":{"key":"network","type":"text","label":"Network"},"note":{"key":"note","type":"textarea","universal":true,"icon":"note","label":"Note"},"office":{"key":"office","type":"typeCombo","label":"Type"},"oneway_yes":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}}},"opening_hours":{"key":"opening_hours","type":"combo","label":"Hours","snake_case":false},"operator":{"key":"operator","type":"text","label":"Operator"},"outdoor_seating":{"key":"outdoor_seating","type":"check","label":"Outdoor Seating"},"par":{"key":"par","type":"number","label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward"}}},"park_ride":{"key":"park_ride","type":"check","label":"Park and Ride"},"parking":{"key":"parking","type":"combo","label":"Type","strings":{"options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}}},"payment_multi":{"key":"payment:","type":"multiCombo","label":"Payment Types"},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"key":"piste:difficulty","type":"combo","label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","strings":{"options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}}},"piste/grooming":{"key":"piste:grooming","type":"combo","label":"Grooming","strings":{"options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}}},"piste/type":{"key":"piste:type","type":"typeCombo","label":"Type","strings":{"options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}}},"place":{"key":"place","type":"typeCombo","label":"Type"},"plant":{"key":"plant","type":"combo","label":"Plant"},"plant/output/electricity":{"key":"plant:output:electricity","type":"text","label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"key":"baby","type":"check","label":"Baby Seat"},"playground/max_age":{"key":"max_age","type":"number","label":"Maximum Age"},"playground/min_age":{"key":"max_age","type":"number","label":"Minimum Age"},"population":{"key":"population","type":"text","label":"Population"},"power_supply":{"key":"power_supply","type":"check","label":"Power Supply"},"power":{"key":"power","type":"typeCombo","label":"Type"},"produce":{"key":"produce","type":"semiCombo","label":"Produce"},"product":{"key":"product","type":"semiCombo","label":"Products"},"railway":{"key":"railway","type":"typeCombo","label":"Type"},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"recycling_type":{"key":"recycling_type","default":"container","type":"combo","label":"Recycling Type","strings":{"options":{"container":"Container","centre":"Recycling Center"}}},"ref_aeroway_gate":{"key":"ref","type":"text","label":"Gate Number"},"ref_golf_hole":{"key":"ref","type":"text","label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"key":"ref","type":"text","label":"Junction Number"},"ref_platform":{"key":"ref","type":"text","label":"Platform Number"},"ref_road_number":{"key":"ref","type":"text","label":"Road Number"},"ref_route":{"key":"ref","type":"text","label":"Route Number"},"ref_runway":{"key":"ref","type":"text","label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"key":"ref","type":"text","label":"Stop Number"},"ref_taxiway":{"key":"ref","type":"text","label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"key":"ref","type":"text","label":"Reference Code"},"relation":{"key":"type","type":"combo","label":"Type"},"religion":{"key":"religion","type":"combo","label":"Religion"},"restriction":{"key":"restriction","type":"combo","label":"Type"},"restrictions":{"type":"restrictions","geometry":"vertex","icon":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","label":"Rooms"},"route_master":{"key":"route_master","type":"combo","label":"Type"},"route":{"key":"route","type":"combo","label":"Type"},"sac_scale":{"key":"sac_scale","type":"combo","label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","strings":{"options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}}},"sanitary_dump_station":{"key":"sanitary_dump_station","type":"check","label":"Toilet Disposal"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"second_hand":{"key":"second_hand","type":"combo","label":"Sells Used","placeholder":"Yes, No, Only","strings":{"options":{"yes":"Yes","no":"No","only":"Only"}}},"service_rail":{"key":"service","type":"combo","label":"Service Type","strings":{"options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}}},"service_times":{"key":"service_times","type":"text","label":"Service Times"},"service":{"key":"service","type":"combo","label":"Type","options":["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{"key":"service:bicycle:","type":"multiCombo","label":"Services"},"service/vehicle":{"key":"service:vehicle:","type":"multiCombo","label":"Services"},"shelter_type":{"key":"shelter_type","type":"combo","label":"Type"},"shelter":{"key":"shelter","type":"check","label":"Shelter"},"shop":{"key":"shop","type":"typeCombo","label":"Type"},"site":{"key":"site","type":"combo","label":"Type"},"smoking":{"key":"smoking","type":"combo","label":"Smoking","placeholder":"No, Separated, Yes...","strings":{"options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}}},"smoothness":{"key":"smoothness","type":"combo","label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","strings":{"options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}}},"social_facility_for":{"key":"social_facility:for","type":"combo","label":"People Served"},"social_facility":{"key":"social_facility","type":"combo","label":"Type"},"source":{"key":"source","type":"semiCombo","icon":"source","universal":true,"label":"Sources","options":["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},"sport_ice":{"key":"sport","type":"semiCombo","label":"Sports","options":["skating","hockey","multi","curling","ice_stock"]},"sport_racing_motor":{"key":"sport","type":"semiCombo","label":"Sports","options":["motor","karting","motocross"]},"sport_racing_nonmotor":{"key":"sport","type":"semiCombo","label":"Sports","options":["bmx","cycling","dog_racing","horse_racing","running"]},"sport":{"key":"sport","type":"semiCombo","label":"Sports"},"stars":{"key":"stars","type":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","label":"Number of Steps"},"stop":{"key":"stop","type":"combo","label":"Stop Type","strings":{"options":{"all":"All Ways","minor":"Minor Road"}}},"structure_waterway":{"type":"structureRadio","keys":["tunnel"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"tunnel":"Tunnel"}}},"structure":{"type":"structureRadio","keys":["bridge","tunnel","embankment","cutting","ford"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}}},"studio":{"key":"studio","type":"combo","label":"Type"},"substation":{"key":"substation","type":"typeCombo","label":"Type"},"supervised":{"key":"supervised","type":"check","label":"Supervised"},"support":{"key":"support","type":"combo","label":"Support"},"surface":{"key":"surface","type":"combo","label":"Surface"},"surveillance":{"key":"surveillance","type":"combo","label":"Surveillance Kind"},"surveillance/type":{"key":"surveillance:type","type":"combo","label":"Surveillance Type","strings":{"options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}}},"surveillance/zone":{"key":"surveillance:zone","type":"combo","label":"Surveillance Zone"},"tactile_paving":{"key":"tactile_paving","type":"check","label":"Tactile Paving"},"takeaway":{"key":"takeaway","type":"combo","label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","strings":{"options":{"yes":"Yes","no":"No","only":"Takeaway Only"}}},"toilets/disposal":{"key":"toilets:disposal","type":"combo","label":"Disposal","strings":{"options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}}},"toll":{"key":"toll","type":"check","label":"Toll"},"tomb":{"key":"tomb","type":"typeCombo","label":"Type"},"tourism_attraction":{"key":"tourism","default":"attraction","type":"typeCombo","universal":true,"label":"Tourism"},"tourism":{"key":"tourism","type":"typeCombo","label":"Type"},"tower/construction":{"key":"tower:construction","type":"combo","label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"key":"tower:type","type":"combo","label":"Type"},"tracktype":{"key":"tracktype","type":"combo","label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","strings":{"options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}}},"trade":{"key":"trade","type":"typeCombo","label":"Type"},"traffic_calming":{"key":"traffic_calming","type":"typeCombo","label":"Type"},"traffic_signals":{"key":"traffic_signals","type":"combo","label":"Type","default":"signal"},"trail_visibility":{"key":"trail_visibility","type":"combo","label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","strings":{"options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}}},"trees":{"key":"trees","type":"semiCombo","label":"Trees"},"tunnel":{"key":"tunnel","type":"typeCombo","label":"Type","placeholder":"Default"},"vending":{"key":"vending","type":"combo","label":"Type of Goods"},"visibility":{"key":"visibility","type":"combo","label":"Visibility","strings":{"options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}}},"volcano/status":{"key":"volcano:status","type":"combo","label":"Volcano Status","strings":{"options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}}},"volcano/type":{"key":"volcano:type","type":"combo","label":"Volcano Type","strings":{"options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}}},"wall":{"key":"wall","type":"combo","label":"Type"},"water_point":{"key":"water_point","type":"check","label":"Water Point"},"water":{"key":"water","type":"combo","label":"Type"},"waterway":{"key":"waterway","type":"typeCombo","label":"Type"},"website":{"key":"website","type":"url","icon":"website","placeholder":"http://example.com/","universal":true,"label":"Website"},"wetland":{"key":"wetland","type":"combo","label":"Type"},"wheelchair":{"key":"wheelchair","type":"radio","options":["yes","limited","no"],"icon":"wheelchair","universal":true,"label":"Wheelchair Access"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"}};
23199 var all = ["aerialway","airfield","airport","alcohol-shop","america-football","amusement-park","aquarium","art-gallery","attraction","bakery","bank","bar","barrier","baseball","basketball","bbq","beer","bicycle","bicycle-share","blood-bank","buddhism","building","building-alt1","bus","cafe","campsite","car","castle","cemetery","cinema","circle","circle-stroked","city","clothing-store","college","commercial","cricket","cross","dam","danger","defibrillator","dentist","doctor","dog-park","drinking-water","embassy","emergency-phone","entrance","entrance-alt1","farm","fast-food","fence","ferry","fire-station","florist","fuel","gaming","garden","garden-center","gift","golf","grocery","hairdresser","harbor","heart","heliport","home","horse-riding","hospital","ice-cream","industry","information","karaoke","landmark","landuse","laundry","library","lighthouse","lodging","logging","marker","marker-stroked","mobile-phone","monument","mountain","museum","music","natural","park","park-alt1","parking","parking-garage","pharmacy","picnic-site","pitch","place-of-worship","playground","police","post","prison","rail","rail-light","rail-metro","ranger-station","recycling","religious-christian","religious-jewish","religious-muslim","residential-community","restaurant","roadblock","rocket","school","scooter","shelter","shop","skiing","slaughterhouse","snowmobile","soccer","square","square-stroked","stadium","star","star-stroked","suitcase","sushi","swimming","teahouse","telephone","tennis","theatre","toilet","town","town-hall","triangle","triangle-stroked","veterinary","village","volcano","warehouse","waste-basket","water","wetland","wheelchair","zoo"];
23204 var all$2 = Object.freeze({
23209 var Airport = ["airfield","airport","heliport","rocket"];
23210 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23211 var Education = ["college","school"];
23212 var General = ["alcohol-shop","amusement-park","aquarium","art-gallery","attraction","bank","bicycle","bicycle-share","car","castle","cinema","circle","circle-stroked","clothing-store","drinking-water","embassy","fire-station","fuel","grocery","harbor","information","laundry","library","lodging","marker","monument","museum","music","place-of-worship","police","post","prison","religious-christian","religious-jewish","religious-muslim","shop","stadium","star","suitcase","swimming","theatre","toilet","town-hall","triangle","triangle-stroked","veterinary"];
23213 var Health = ["dentist","doctor","hospital","pharmacy"];
23214 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23215 var Transit = ["bus","ferry"];
23219 Education: Education,
23222 Outdoors: Outdoors,
23224 "Mountain peak": ["mountain","volcano"],
23225 "Rail station": ["entrance","rail","rail-light","rail-metro"]
23228 var streets$1 = Object.freeze({
23231 Education: Education,
23234 Outdoors: Outdoors,
23239 var require$$0 = ( all$2 && all$1 ) || all$2;
23241 var require$$1 = ( streets$1 && streets ) || streets$1;
23246 streets: require$$1
23250 var dataFeatureIcons = maki.layouts.all.all;
23253 imagery: dataImagery,
23256 defaults: defaults,
23257 categories: categories,
23262 function osmEntity$$1(attrs) {
23263 // For prototypal inheritance.
23264 if (this instanceof osmEntity$$1) return;
23266 // Create the appropriate subtype.
23267 if (attrs && attrs.type) {
23268 return osmEntity$$1[attrs.type].apply(this, arguments);
23269 } else if (attrs && attrs.id) {
23270 return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23273 // Initialize a generic Entity (used only in tests).
23274 return (new osmEntity$$1()).initialize(arguments);
23278 osmEntity$$1.id = function(type) {
23279 return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23283 osmEntity$$1.id.next = {
23284 changeset: -1, node: -1, way: -1, relation: -1
23288 osmEntity$$1.id.fromOSM = function(type, id) {
23289 return type[0] + id;
23293 osmEntity$$1.id.toOSM = function(id) {
23294 return id.slice(1);
23298 osmEntity$$1.id.type = function(id) {
23299 return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23303 // A function suitable for use as the second argument to d3.selection#data().
23304 osmEntity$$1.key = function(entity) {
23305 return entity.id + 'v' + (entity.v || 0);
23309 osmEntity$$1.prototype = {
23314 initialize: function(sources) {
23315 for (var i = 0; i < sources.length; ++i) {
23316 var source = sources[i];
23317 for (var prop in source) {
23318 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23319 if (source[prop] === undefined) {
23322 this[prop] = source[prop];
23328 if (!this.id && this.type) {
23329 this.id = osmEntity$$1.id(this.type);
23331 if (!this.hasOwnProperty('visible')) {
23332 this.visible = true;
23336 Object.freeze(this);
23337 Object.freeze(this.tags);
23339 if (this.loc) Object.freeze(this.loc);
23340 if (this.nodes) Object.freeze(this.nodes);
23341 if (this.members) Object.freeze(this.members);
23348 copy: function(resolver, copies) {
23349 if (copies[this.id])
23350 return copies[this.id];
23352 var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23353 copies[this.id] = copy;
23359 osmId: function() {
23360 return osmEntity$$1.id.toOSM(this.id);
23364 isNew: function() {
23365 return this.osmId() < 0;
23369 update: function(attrs) {
23370 return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23374 mergeTags: function(tags) {
23375 var merged = clone(this.tags), changed = false;
23376 for (var k in tags) {
23377 var t1 = merged[k],
23382 } else if (t1 !== t2) {
23384 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23387 return changed ? this.update({tags: merged}) : this;
23391 intersects: function(extent, resolver) {
23392 return this.extent(resolver).intersects(extent);
23396 isUsed: function(resolver) {
23397 return without(Object.keys(this.tags), 'area').length > 0 ||
23398 resolver.parentRelations(this).length > 0;
23402 hasInterestingTags: function() {
23403 return keys$1(this.tags).some(osmIsInterestingTag);
23407 isHighwayIntersection: function() {
23411 isDegenerate: function() {
23415 deprecatedTags: function() {
23416 var tags = toPairs(this.tags);
23417 var deprecated = {};
23419 dataDeprecated.forEach(function(d) {
23420 var match = toPairs(d.old)[0];
23421 tags.forEach(function(t) {
23422 if (t[0] === match[0] &&
23423 (t[1] === match[1] || match[1] === '*')) {
23424 deprecated[t[0]] = t[1];
23434 * A specialized version of `_.every` for arrays without support for
23435 * iteratee shorthands.
23438 * @param {Array} [array] The array to iterate over.
23439 * @param {Function} predicate The function invoked per iteration.
23440 * @returns {boolean} Returns `true` if all elements pass the predicate check,
23443 function arrayEvery(array, predicate) {
23445 length = array == null ? 0 : array.length;
23447 while (++index < length) {
23448 if (!predicate(array[index], index, array)) {
23456 * The base implementation of `_.every` without support for iteratee shorthands.
23459 * @param {Array|Object} collection The collection to iterate over.
23460 * @param {Function} predicate The function invoked per iteration.
23461 * @returns {boolean} Returns `true` if all elements pass the predicate check,
23464 function baseEvery(collection, predicate) {
23466 baseEach(collection, function(value, index, collection) {
23467 result = !!predicate(value, index, collection);
23474 * Checks if `predicate` returns truthy for **all** elements of `collection`.
23475 * Iteration is stopped once `predicate` returns falsey. The predicate is
23476 * invoked with three arguments: (value, index|key, collection).
23478 * **Note:** This method returns `true` for
23479 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
23480 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
23481 * elements of empty collections.
23486 * @category Collection
23487 * @param {Array|Object} collection The collection to iterate over.
23488 * @param {Function} [predicate=_.identity] The function invoked per iteration.
23489 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23490 * @returns {boolean} Returns `true` if all elements pass the predicate check,
23494 * _.every([true, 1, null, 'yes'], Boolean);
23498 * { 'user': 'barney', 'age': 36, 'active': false },
23499 * { 'user': 'fred', 'age': 40, 'active': false }
23502 * // The `_.matches` iteratee shorthand.
23503 * _.every(users, { 'user': 'barney', 'active': false });
23506 * // The `_.matchesProperty` iteratee shorthand.
23507 * _.every(users, ['active', false]);
23510 * // The `_.property` iteratee shorthand.
23511 * _.every(users, 'active');
23514 function every(collection, predicate, guard) {
23515 var func = isArray(collection) ? arrayEvery : baseEvery;
23516 if (guard && isIterateeCall(collection, predicate, guard)) {
23517 predicate = undefined;
23519 return func(collection, baseIteratee(predicate, 3));
23523 * The base implementation of `_.some` without support for iteratee shorthands.
23526 * @param {Array|Object} collection The collection to iterate over.
23527 * @param {Function} predicate The function invoked per iteration.
23528 * @returns {boolean} Returns `true` if any element passes the predicate check,
23531 function baseSome(collection, predicate) {
23534 baseEach(collection, function(value, index, collection) {
23535 result = predicate(value, index, collection);
23542 * Checks if `predicate` returns truthy for **any** element of `collection`.
23543 * Iteration is stopped once `predicate` returns truthy. The predicate is
23544 * invoked with three arguments: (value, index|key, collection).
23549 * @category Collection
23550 * @param {Array|Object} collection The collection to iterate over.
23551 * @param {Function} [predicate=_.identity] The function invoked per iteration.
23552 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23553 * @returns {boolean} Returns `true` if any element passes the predicate check,
23557 * _.some([null, 0, 'yes', false], Boolean);
23561 * { 'user': 'barney', 'active': true },
23562 * { 'user': 'fred', 'active': false }
23565 * // The `_.matches` iteratee shorthand.
23566 * _.some(users, { 'user': 'barney', 'active': false });
23569 * // The `_.matchesProperty` iteratee shorthand.
23570 * _.some(users, ['active', false]);
23573 * // The `_.property` iteratee shorthand.
23574 * _.some(users, 'active');
23577 function some(collection, predicate, guard) {
23578 var func = isArray(collection) ? arraySome : baseSome;
23579 if (guard && isIterateeCall(collection, predicate, guard)) {
23580 predicate = undefined;
23582 return func(collection, baseIteratee(predicate, 3));
23585 function geoRoundCoords(c) {
23586 return [Math.floor(c[0]), Math.floor(c[1])];
23590 function geoInterp(p1, p2, t) {
23591 return [p1[0] + (p2[0] - p1[0]) * t,
23592 p1[1] + (p2[1] - p1[1]) * t];
23596 // 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product.
23597 // Returns a positive value, if OAB makes a counter-clockwise turn,
23598 // negative for clockwise turn, and zero if the points are collinear.
23599 function geoCross(o, a, b) {
23600 return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
23604 // http://jsperf.com/id-dist-optimization
23605 function geoEuclideanDistance(a, b) {
23606 var x = a[0] - b[0], y = a[1] - b[1];
23607 return Math.sqrt((x * x) + (y * y));
23611 // using WGS84 polar radius (6356752.314245179 m)
23612 // const = 2 * PI * r / 360
23613 function geoLatToMeters(dLat) {
23614 return dLat * 110946.257617;
23618 // using WGS84 equatorial radius (6378137.0 m)
23619 // const = 2 * PI * r / 360
23620 function geoLonToMeters(dLon, atLat) {
23621 return Math.abs(atLat) >= 90 ? 0 :
23622 dLon * 111319.490793 * Math.abs(Math.cos(atLat * (Math.PI/180)));
23626 // using WGS84 polar radius (6356752.314245179 m)
23627 // const = 2 * PI * r / 360
23628 function geoMetersToLat(m) {
23629 return m / 110946.257617;
23633 // using WGS84 equatorial radius (6378137.0 m)
23634 // const = 2 * PI * r / 360
23635 function geoMetersToLon(m, atLat) {
23636 return Math.abs(atLat) >= 90 ? 0 :
23637 m / 111319.490793 / Math.abs(Math.cos(atLat * (Math.PI/180)));
23641 function geoOffsetToMeters(offset) {
23642 var equatRadius = 6356752.314245179,
23643 polarRadius = 6378137.0,
23647 offset[0] * 2 * Math.PI * equatRadius / tileSize,
23648 -offset[1] * 2 * Math.PI * polarRadius / tileSize
23653 function geoMetersToOffset(meters) {
23654 var equatRadius = 6356752.314245179,
23655 polarRadius = 6378137.0,
23659 meters[0] * tileSize / (2 * Math.PI * equatRadius),
23660 -meters[1] * tileSize / (2 * Math.PI * polarRadius)
23665 // Equirectangular approximation of spherical distances on Earth
23666 function geoSphericalDistance(a, b) {
23667 var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2),
23668 y = geoLatToMeters(a[1] - b[1]);
23669 return Math.sqrt((x * x) + (y * y));
23673 function geoEdgeEqual(a, b) {
23674 return (a[0] === b[0] && a[1] === b[1]) ||
23675 (a[0] === b[1] && a[1] === b[0]);
23679 // Return the counterclockwise angle in the range (-pi, pi)
23680 // between the positive X axis and the line intersecting a and b.
23681 function geoAngle(a, b, projection) {
23682 a = projection(a.loc);
23683 b = projection(b.loc);
23684 return Math.atan2(b[1] - a[1], b[0] - a[0]);
23688 // Rotate all points counterclockwise around a pivot point by given angle
23689 function geoRotate(points, angle, around) {
23690 return points.map(function(point) {
23691 var radial = [point[0] - around[0], point[1] - around[1]];
23693 radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
23694 radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
23700 // Choose the edge with the minimal distance from `point` to its orthogonal
23701 // projection onto that edge, if such a projection exists, or the distance to
23702 // the closest vertex on that edge. Returns an object with the `index` of the
23703 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
23704 function geoChooseEdge(nodes, point, projection) {
23705 var dist = geoEuclideanDistance,
23706 points = nodes.map(function(n) { return projection(n.loc); }),
23710 function dot(p, q) {
23711 return p[0] * q[0] + p[1] * q[1];
23714 for (var i = 0; i < points.length - 1; i++) {
23716 s = [points[i + 1][0] - o[0],
23717 points[i + 1][1] - o[1]],
23718 v = [point[0] - o[0],
23720 proj = dot(v, s) / dot(s, s),
23725 } else if (proj > 1) {
23728 p = [o[0] + proj * s[0], o[1] + proj * s[1]];
23731 var d = dist(p, point);
23735 loc = projection.invert(p);
23747 // Return the intersection point of 2 line segments.
23748 // From https://github.com/pgkelley4/line-segments-intersect
23749 // This uses the vector cross product approach described below:
23750 // http://stackoverflow.com/a/565282/786339
23751 function geoLineIntersection(a, b) {
23752 function subtractPoints(point1, point2) {
23753 return [point1[0] - point2[0], point1[1] - point2[1]];
23755 function crossProduct(point1, point2) {
23756 return point1[0] * point2[1] - point1[1] * point2[0];
23759 var p = [a[0][0], a[0][1]],
23760 p2 = [a[1][0], a[1][1]],
23761 q = [b[0][0], b[0][1]],
23762 q2 = [b[1][0], b[1][1]],
23763 r = subtractPoints(p2, p),
23764 s = subtractPoints(q2, q),
23765 uNumerator = crossProduct(subtractPoints(q, p), r),
23766 denominator = crossProduct(r, s);
23768 if (uNumerator && denominator) {
23769 var u = uNumerator / denominator,
23770 t = crossProduct(subtractPoints(q, p), s) / denominator;
23772 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
23773 return geoInterp(p, p2, t);
23781 function geoPathIntersections(path1, path2) {
23782 var intersections = [];
23783 for (var i = 0; i < path1.length - 1; i++) {
23784 for (var j = 0; j < path2.length - 1; j++) {
23785 var a = [ path1[i], path1[i+1] ],
23786 b = [ path2[j], path2[j+1] ],
23787 hit = geoLineIntersection(a, b);
23788 if (hit) intersections.push(hit);
23791 return intersections;
23795 // Return whether point is contained in polygon.
23797 // `point` should be a 2-item array of coordinates.
23798 // `polygon` should be an array of 2-item arrays of coordinates.
23800 // From https://github.com/substack/point-in-polygon.
23801 // ray-casting algorithm based on
23802 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
23804 function geoPointInPolygon(point, polygon) {
23809 for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
23810 var xi = polygon[i][0], yi = polygon[i][1];
23811 var xj = polygon[j][0], yj = polygon[j][1];
23813 var intersect = ((yi > y) !== (yj > y)) &&
23814 (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
23815 if (intersect) inside = !inside;
23822 function geoPolygonContainsPolygon(outer, inner) {
23823 return every(inner, function(point) {
23824 return geoPointInPolygon(point, outer);
23829 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
23830 function testSegments(outer, inner) {
23831 for (var i = 0; i < outer.length - 1; i++) {
23832 for (var j = 0; j < inner.length - 1; j++) {
23833 var a = [ outer[i], outer[i+1] ],
23834 b = [ inner[j], inner[j+1] ];
23835 if (geoLineIntersection(a, b)) return true;
23841 function testPoints(outer, inner) {
23842 return some(inner, function(point) {
23843 return geoPointInPolygon(point, outer);
23847 return testPoints(outer, inner) || (!!checkSegments && testSegments(outer, inner));
23851 function geoPathLength(path) {
23853 for (var i = 0; i < path.length - 1; i++) {
23854 length += geoEuclideanDistance(path[i], path[i + 1]);
23859 function geoExtent$$1(min, max) {
23860 if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23861 if (min instanceof geoExtent$$1) {
23863 } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23867 this[0] = min || [ Infinity, Infinity];
23868 this[1] = max || min || [-Infinity, -Infinity];
23872 geoExtent$$1.prototype = new Array(2);
23874 assignIn$1(geoExtent$$1.prototype, {
23876 equals: function (obj) {
23877 return this[0][0] === obj[0][0] &&
23878 this[0][1] === obj[0][1] &&
23879 this[1][0] === obj[1][0] &&
23880 this[1][1] === obj[1][1];
23884 extend: function(obj) {
23885 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23886 return geoExtent$$1(
23887 [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23888 [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23893 _extend: function(extent) {
23894 this[0][0] = Math.min(extent[0][0], this[0][0]);
23895 this[0][1] = Math.min(extent[0][1], this[0][1]);
23896 this[1][0] = Math.max(extent[1][0], this[1][0]);
23897 this[1][1] = Math.max(extent[1][1], this[1][1]);
23902 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23906 center: function() {
23907 return [(this[0][0] + this[1][0]) / 2,
23908 (this[0][1] + this[1][1]) / 2];
23912 rectangle: function() {
23913 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23918 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23922 polygon: function() {
23924 [this[0][0], this[0][1]],
23925 [this[0][0], this[1][1]],
23926 [this[1][0], this[1][1]],
23927 [this[1][0], this[0][1]],
23928 [this[0][0], this[0][1]]
23933 contains: function(obj) {
23934 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23935 return obj[0][0] >= this[0][0] &&
23936 obj[0][1] >= this[0][1] &&
23937 obj[1][0] <= this[1][0] &&
23938 obj[1][1] <= this[1][1];
23942 intersects: function(obj) {
23943 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23944 return obj[0][0] <= this[1][0] &&
23945 obj[0][1] <= this[1][1] &&
23946 obj[1][0] >= this[0][0] &&
23947 obj[1][1] >= this[0][1];
23951 intersection: function(obj) {
23952 if (!this.intersects(obj)) return new geoExtent$$1();
23953 return new geoExtent$$1(
23954 [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23955 [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23960 percentContainedIn: function(obj) {
23961 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23962 var a1 = this.intersection(obj).area(),
23965 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23973 padByMeters: function(meters) {
23974 var dLat = geoMetersToLat(meters),
23975 dLon = geoMetersToLon(meters, this.center()[1]);
23976 return geoExtent$$1(
23977 [this[0][0] - dLon, this[0][1] - dLat],
23978 [this[1][0] + dLon, this[1][1] + dLat]
23983 toParam: function() {
23984 return this.rectangle().join(',');
23990 Bypasses features of D3's default projection stream pipeline that are unnecessary:
23991 * Antimeridian clipping
23992 * Spherical rotation
23995 function geoRawMercator() {
23996 var project = mercatorRaw,
23997 k = 512 / Math.PI, // scale
23998 x = 0, y = 0, // translate
23999 clipExtent = [[0, 0], [0, 0]];
24002 function projection$$1(point) {
24003 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24004 return [point[0] * k + x, y - point[1] * k];
24008 projection$$1.invert = function(point) {
24009 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24010 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24014 projection$$1.scale = function(_) {
24015 if (!arguments.length) return k;
24017 return projection$$1;
24021 projection$$1.translate = function(_) {
24022 if (!arguments.length) return [x, y];
24025 return projection$$1;
24029 projection$$1.clipExtent = function(_) {
24030 if (!arguments.length) return clipExtent;
24032 return projection$$1;
24036 projection$$1.transform = function(_) {
24037 if (!arguments.length) return identity$7.translate(x, y).scale(k);
24041 return projection$$1;
24045 projection$$1.stream = d3_geoTransform({
24046 point: function(x, y) {
24047 x = projection$$1([x, y]);
24048 this.stream.point(x[0], x[1]);
24053 return projection$$1;
24056 function osmChangeset() {
24057 if (!(this instanceof osmChangeset)) {
24058 return (new osmChangeset()).initialize(arguments);
24059 } else if (arguments.length) {
24060 this.initialize(arguments);
24065 osmEntity$$1.changeset = osmChangeset;
24067 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24069 assignIn$1(osmChangeset.prototype, {
24074 extent: function() {
24075 return new geoExtent$$1();
24079 geometry: function() {
24080 return 'changeset';
24084 asJXON: function() {
24088 tag: map$4(this.tags, function(value, key) {
24089 return { '@k': key, '@v': value };
24099 // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24100 // XML. Returns a string.
24101 osmChangeJXON: function(changes) {
24102 var changeset_id = this.id;
24104 function nest(x, order) {
24106 for (var i = 0; i < x.length; i++) {
24107 var tagName = Object.keys(x[i])[0];
24108 if (!groups[tagName]) groups[tagName] = [];
24109 groups[tagName].push(x[i][tagName]);
24112 order.forEach(function(o) {
24113 if (groups[o]) ordered[o] = groups[o];
24119 // sort relations in a changeset by dependencies
24120 function sort(changes) {
24122 // find a referenced relation in the current changeset
24123 function resolve(item) {
24124 return find$1(relations, function(relation) {
24125 return item.keyAttributes.type === 'relation'
24126 && item.keyAttributes.ref === relation['@id'];
24130 // a new item is an item that has not been already processed
24131 function isNew(item) {
24132 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24133 return proc['@id'] === item['@id'];
24137 var processing = [],
24139 relations = changes.relation;
24141 if (!relations) return changes;
24143 for (var i = 0; i < relations.length; i++) {
24144 var relation = relations[i];
24146 // skip relation if already sorted
24147 if (!sorted[relation['@id']]) {
24148 processing.push(relation);
24151 while (processing.length > 0) {
24152 var next = processing[0],
24153 deps = filter(compact(next.member.map(resolve)), isNew);
24154 if (deps.length === 0) {
24155 sorted[next['@id']] = next;
24156 processing.shift();
24158 processing = deps.concat(processing);
24163 changes.relation = values$1(sorted);
24167 function rep(entity) {
24168 return entity.asJXON(changeset_id);
24174 '@generator': 'iD',
24175 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24176 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24177 'delete': assignIn$1(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24183 asGeoJSON: function() {
24189 function osmNode() {
24190 if (!(this instanceof osmNode)) {
24191 return (new osmNode()).initialize(arguments);
24192 } else if (arguments.length) {
24193 this.initialize(arguments);
24197 osmEntity$$1.node = osmNode;
24199 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24201 assignIn$1(osmNode.prototype, {
24206 extent: function() {
24207 return new geoExtent$$1(this.loc);
24211 geometry: function(graph) {
24212 return graph.transient(this, 'geometry', function() {
24213 return graph.isPoi(this) ? 'point' : 'vertex';
24218 move: function(loc) {
24219 return this.update({loc: loc});
24223 isDegenerate: function() {
24225 Array.isArray(this.loc) && this.loc.length === 2 &&
24226 this.loc[0] >= -180 && this.loc[0] <= 180 &&
24227 this.loc[1] >= -90 && this.loc[1] <= 90
24232 isEndpoint: function(resolver) {
24233 return resolver.transient(this, 'isEndpoint', function() {
24235 return resolver.parentWays(this).filter(function(parent) {
24236 return !parent.isClosed() && !!parent.affix(id);
24242 isConnected: function(resolver) {
24243 return resolver.transient(this, 'isConnected', function() {
24244 var parents = resolver.parentWays(this);
24246 function isLine(entity) {
24247 return entity.geometry(resolver) === 'line' &&
24248 entity.hasInterestingTags();
24251 // vertex is connected to multiple parent lines
24252 if (parents.length > 1 && some(parents, isLine)) {
24255 } else if (parents.length === 1) {
24256 var way = parents[0],
24257 nodes = way.nodes.slice();
24258 if (way.isClosed()) { nodes.pop(); } // ignore connecting node if closed
24260 // return true if vertex appears multiple times (way is self intersecting)
24261 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24269 isIntersection: function(resolver) {
24270 return resolver.transient(this, 'isIntersection', function() {
24271 return resolver.parentWays(this).filter(function(parent) {
24272 return (parent.tags.highway ||
24273 parent.tags.waterway ||
24274 parent.tags.railway ||
24275 parent.tags.aeroway) &&
24276 parent.geometry(resolver) === 'line';
24282 isHighwayIntersection: function(resolver) {
24283 return resolver.transient(this, 'isHighwayIntersection', function() {
24284 return resolver.parentWays(this).filter(function(parent) {
24285 return parent.tags.highway && parent.geometry(resolver) === 'line';
24291 isOnAddressLine: function(resolver) {
24292 return resolver.transient(this, 'isOnAddressLine', function() {
24293 return resolver.parentWays(this).filter(function(parent) {
24294 return parent.tags.hasOwnProperty('addr:interpolation') &&
24295 parent.geometry(resolver) === 'line';
24301 asJXON: function(changeset_id) {
24304 '@id': this.osmId(),
24305 '@lon': this.loc[0],
24306 '@lat': this.loc[1],
24307 '@version': (this.version || 0),
24308 tag: map$4(this.tags, function(v, k) {
24309 return { keyAttributes: { k: k, v: v } };
24313 if (changeset_id) r.node['@changeset'] = changeset_id;
24318 asGeoJSON: function() {
24321 coordinates: this.loc
24326 /** Error message constants. */
24327 var FUNC_ERROR_TEXT$1 = 'Expected a function';
24330 * Creates a function that negates the result of the predicate `func`. The
24331 * `func` predicate is invoked with the `this` binding and arguments of the
24332 * created function.
24337 * @category Function
24338 * @param {Function} predicate The predicate to negate.
24339 * @returns {Function} Returns the new negated function.
24342 * function isEven(n) {
24343 * return n % 2 == 0;
24346 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
24349 function negate(predicate) {
24350 if (typeof predicate != 'function') {
24351 throw new TypeError(FUNC_ERROR_TEXT$1);
24353 return function() {
24354 var args = arguments;
24355 switch (args.length) {
24356 case 0: return !predicate.call(this);
24357 case 1: return !predicate.call(this, args[0]);
24358 case 2: return !predicate.call(this, args[0], args[1]);
24359 case 3: return !predicate.call(this, args[0], args[1], args[2]);
24361 return !predicate.apply(this, args);
24366 * The opposite of `_.filter`; this method returns the elements of `collection`
24367 * that `predicate` does **not** return truthy for.
24372 * @category Collection
24373 * @param {Array|Object} collection The collection to iterate over.
24374 * @param {Function} [predicate=_.identity] The function invoked per iteration.
24375 * @returns {Array} Returns the new filtered array.
24380 * { 'user': 'barney', 'age': 36, 'active': false },
24381 * { 'user': 'fred', 'age': 40, 'active': true }
24384 * _.reject(users, function(o) { return !o.active; });
24385 * // => objects for ['fred']
24387 * // The `_.matches` iteratee shorthand.
24388 * _.reject(users, { 'age': 40, 'active': true });
24389 * // => objects for ['barney']
24391 * // The `_.matchesProperty` iteratee shorthand.
24392 * _.reject(users, ['active', false]);
24393 * // => objects for ['fred']
24395 * // The `_.property` iteratee shorthand.
24396 * _.reject(users, 'active');
24397 * // => objects for ['barney']
24399 function reject(collection, predicate) {
24400 var func = isArray(collection) ? arrayFilter : baseFilter;
24401 return func(collection, negate(baseIteratee(predicate, 3)));
24405 * An alternative to `_.reduce`; this method transforms `object` to a new
24406 * `accumulator` object which is the result of running each of its own
24407 * enumerable string keyed properties thru `iteratee`, with each invocation
24408 * potentially mutating the `accumulator` object. If `accumulator` is not
24409 * provided, a new object with the same `[[Prototype]]` will be used. The
24410 * iteratee is invoked with four arguments: (accumulator, value, key, object).
24411 * Iteratee functions may exit iteration early by explicitly returning `false`.
24417 * @param {Object} object The object to iterate over.
24418 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
24419 * @param {*} [accumulator] The custom accumulator value.
24420 * @returns {*} Returns the accumulated value.
24423 * _.transform([2, 3, 4], function(result, n) {
24424 * result.push(n *= n);
24425 * return n % 2 == 0;
24429 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
24430 * (result[value] || (result[value] = [])).push(key);
24432 * // => { '1': ['a', 'c'], '2': ['b'] }
24434 function transform$1(object, iteratee, accumulator) {
24435 var isArr = isArray(object),
24436 isArrLike = isArr || isBuffer(object) || isTypedArray(object);
24438 iteratee = baseIteratee(iteratee, 4);
24439 if (accumulator == null) {
24440 var Ctor = object && object.constructor;
24442 accumulator = isArr ? new Ctor : [];
24444 else if (isObject(object)) {
24445 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
24451 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
24452 return iteratee(accumulator, value, index, object);
24454 return accumulator;
24458 Order the nodes of a way in reverse order and reverse any direction dependent tags
24459 other than `oneway`. (We assume that correcting a backwards oneway is the primary
24460 reason for reversing a way.)
24462 The following transforms are performed:
24465 *:right=* ⟺ *:left=*
24466 *:forward=* ⟺ *:backward=*
24467 direction=up ⟺ direction=down
24468 incline=up ⟺ incline=down
24472 role=forward ⟺ role=backward
24473 role=north ⟺ role=south
24474 role=east ⟺ role=west
24476 In addition, numeric-valued `incline` tags are negated.
24478 The JOSM implementation was used as a guide, but transformations that were of unclear benefit
24479 or adjusted tags that don't seem to be used in practice were omitted.
24481 Also, each node on the way is examined for its own tags and the following transformations are performed
24482 in order to ensure associated nodes (eg a Stop Sign) is also reversed
24485 direction=forward ⟺ direction=backward
24486 direction=left ⟺ direction=right
24487 *:forward=* ⟺ *:backward=*
24488 *:left=* ⟺ *:right=*
24491 http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
24492 http://wiki.openstreetmap.org/wiki/Key:direction#Steps
24493 http://wiki.openstreetmap.org/wiki/Key:incline
24494 http://wiki.openstreetmap.org/wiki/Route#Members
24495 http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
24496 http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
24497 http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
24499 function actionReverse(wayId, options) {
24500 var replacements = [
24501 [/:right$/, ':left'], [/:left$/, ':right'],
24502 [/:forward$/, ':backward'], [/:backward$/, ':forward']
24504 numeric = /^([+\-]?)(?=[\d.])/,
24506 forward: 'backward',
24507 backward: 'forward',
24515 function reverseKey(key) {
24516 for (var i = 0; i < replacements.length; ++i) {
24517 var replacement = replacements[i];
24518 if (replacement[0].test(key)) {
24519 return key.replace(replacement[0], replacement[1]);
24526 function reverseValue(key, value) {
24527 if (key === 'incline' && numeric.test(value)) {
24528 return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
24529 } else if (key === 'incline' || key === 'direction') {
24530 return {up: 'down', down: 'up'}[value] || value;
24531 } else if (options && options.reverseOneway && key === 'oneway') {
24532 return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
24534 return {left: 'right', right: 'left'}[value] || value;
24539 function reverseDirectionTags(node) {
24540 // Update the direction based tags as appropriate then return an updated node
24541 return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
24542 // See if this is a direction tag and reverse (or use existing value if not recognised)
24543 if (tagKey === 'direction') {
24544 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
24546 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
24547 // This will pass through other tags unchanged
24548 acc[reverseKey(tagKey)] = tagValue;
24555 function reverseTagsOnNodes(graph, nodeIds) {
24556 // Reverse the direction of appropriate tags attached to the nodes (#3076)
24558 // Get each node from the graph
24559 .map(function(nodeId) { return graph.entity(nodeId);})
24560 // Check tags on the node, if there aren't any, we can skip
24561 .filter(function(existingNode) { return existingNode.tags !== undefined;})
24562 // Get a new version of each node with the appropriate tags reversed
24563 .map(function(existingNode) { return reverseDirectionTags(existingNode);})
24564 // Chain together consecutive updates to the graph for each updated node and return
24565 .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
24569 return function(graph) {
24570 var way = graph.entity(wayId),
24571 nodes = way.nodes.slice().reverse(),
24572 tags = {}, key, role;
24574 for (key in way.tags) {
24575 tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
24578 graph.parentRelations(way).forEach(function(relation) {
24579 relation.members.forEach(function(member, index) {
24580 if (member.id === way.id && (role = roleReversals[member.role])) {
24581 relation = relation.updateMember({role: role}, index);
24582 graph = graph.replace(relation);
24587 // Reverse any associated directions on nodes on the way and then replace
24588 // the way itself with the reversed node ids and updated way tags
24589 return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
24593 // For fixing up rendering of multipolygons with tags on the outer member.
24594 // https://github.com/openstreetmap/iD/issues/613
24595 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
24596 if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
24599 var parents = graph.parentRelations(entity);
24600 if (parents.length !== 1)
24603 var parent = parents[0];
24604 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24607 var members = parent.members, member;
24608 for (var i = 0; i < members.length; i++) {
24609 member = members[i];
24610 if (member.id === entity.id && member.role && member.role !== 'outer')
24611 return false; // Not outer member
24612 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
24613 return false; // Not a simple multipolygon
24620 function osmSimpleMultipolygonOuterMember(entity, graph) {
24621 if (entity.type !== 'way')
24624 var parents = graph.parentRelations(entity);
24625 if (parents.length !== 1)
24628 var parent = parents[0];
24629 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24632 var members = parent.members, member, outerMember;
24633 for (var i = 0; i < members.length; i++) {
24634 member = members[i];
24635 if (!member.role || member.role === 'outer') {
24637 return false; // Not a simple multipolygon
24638 outerMember = member;
24645 var outerEntity = graph.hasEntity(outerMember.id);
24646 if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
24649 return outerEntity;
24653 // Join `array` into sequences of connecting ways.
24655 // Segments which share identical start/end nodes will, as much as possible,
24656 // be connected with each other.
24658 // The return value is a nested array. Each constituent array contains elements
24659 // of `array` which have been determined to connect. Each consitituent array
24660 // also has a `nodes` property whose value is an ordered array of member nodes,
24661 // with appropriate order reversal and start/end coordinate de-duplication.
24663 // Members of `array` must have, at minimum, `type` and `id` properties.
24664 // Thus either an array of `osmWay`s or a relation member array may be
24667 // If an member has a `tags` property, its tags will be reversed via
24668 // `actionReverse` in the output.
24670 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
24671 // false) and non-way members are ignored.
24673 function osmJoinWays(array, graph) {
24674 var joined = [], member, current, nodes, first, last, i, how, what;
24676 array = array.filter(function(member) {
24677 return member.type === 'way' && graph.hasEntity(member.id);
24680 function resolve(member) {
24681 return graph.childNodes(graph.entity(member.id));
24684 function reverse(member) {
24685 return member.tags ? actionReverse(member.id, { reverseOneway: true })(graph).entity(member.id) : member;
24688 while (array.length) {
24689 member = array.shift();
24690 current = [member];
24691 current.nodes = nodes = resolve(member).slice();
24692 joined.push(current);
24694 while (array.length && nodes[0] !== nodes[nodes.length - 1]) {
24696 last = nodes[nodes.length - 1];
24698 for (i = 0; i < array.length; i++) {
24700 what = resolve(member);
24702 if (last === what[0]) {
24704 what = what.slice(1);
24706 } else if (last === what[what.length - 1]) {
24708 what = what.slice(0, -1).reverse();
24709 member = reverse(member);
24711 } else if (first === what[what.length - 1]) {
24712 how = nodes.unshift;
24713 what = what.slice(0, -1);
24715 } else if (first === what[0]) {
24716 how = nodes.unshift;
24717 what = what.slice(1).reverse();
24718 member = reverse(member);
24726 break; // No more joinable ways.
24728 how.apply(current, [member]);
24729 how.apply(nodes, what);
24731 array.splice(i, 1);
24738 function osmRelation() {
24739 if (!(this instanceof osmRelation)) {
24740 return (new osmRelation()).initialize(arguments);
24741 } else if (arguments.length) {
24742 this.initialize(arguments);
24747 osmEntity$$1.relation = osmRelation;
24749 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
24752 osmRelation.creationOrder = function(a, b) {
24753 var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
24754 var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
24756 if (aId < 0 || bId < 0) return aId - bId;
24761 assignIn$1(osmRelation.prototype, {
24766 copy: function(resolver, copies) {
24767 if (copies[this.id])
24768 return copies[this.id];
24770 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
24772 var members = this.members.map(function(member) {
24773 return assignIn$1({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
24776 copy = copy.update({members: members});
24777 copies[this.id] = copy;
24783 extent: function(resolver, memo) {
24784 return resolver.transient(this, 'extent', function() {
24785 if (memo && memo[this.id]) return geoExtent$$1();
24787 memo[this.id] = true;
24789 var extent = geoExtent$$1();
24790 for (var i = 0; i < this.members.length; i++) {
24791 var member = resolver.hasEntity(this.members[i].id);
24793 extent._extend(member.extent(resolver, memo));
24801 geometry: function(graph) {
24802 return graph.transient(this, 'geometry', function() {
24803 return this.isMultipolygon() ? 'area' : 'relation';
24808 isDegenerate: function() {
24809 return this.members.length === 0;
24813 // Return an array of members, each extended with an 'index' property whose value
24814 // is the member index.
24815 indexedMembers: function() {
24816 var result = new Array(this.members.length);
24817 for (var i = 0; i < this.members.length; i++) {
24818 result[i] = assignIn$1({}, this.members[i], {index: i});
24824 // Return the first member with the given role. A copy of the member object
24825 // is returned, extended with an 'index' property whose value is the member index.
24826 memberByRole: function(role) {
24827 for (var i = 0; i < this.members.length; i++) {
24828 if (this.members[i].role === role) {
24829 return assignIn$1({}, this.members[i], {index: i});
24835 // Return the first member with the given id. A copy of the member object
24836 // is returned, extended with an 'index' property whose value is the member index.
24837 memberById: function(id) {
24838 for (var i = 0; i < this.members.length; i++) {
24839 if (this.members[i].id === id) {
24840 return assignIn$1({}, this.members[i], {index: i});
24846 // Return the first member with the given id and role. A copy of the member object
24847 // is returned, extended with an 'index' property whose value is the member index.
24848 memberByIdAndRole: function(id, role) {
24849 for (var i = 0; i < this.members.length; i++) {
24850 if (this.members[i].id === id && this.members[i].role === role) {
24851 return assignIn$1({}, this.members[i], {index: i});
24857 addMember: function(member, index) {
24858 var members = this.members.slice();
24859 members.splice(index === undefined ? members.length : index, 0, member);
24860 return this.update({members: members});
24864 updateMember: function(member, index) {
24865 var members = this.members.slice();
24866 members.splice(index, 1, assignIn$1({}, members[index], member));
24867 return this.update({members: members});
24871 removeMember: function(index) {
24872 var members = this.members.slice();
24873 members.splice(index, 1);
24874 return this.update({members: members});
24878 removeMembersWithID: function(id) {
24879 var members = reject(this.members, function(m) { return m.id === id; });
24880 return this.update({members: members});
24884 // Wherever a member appears with id `needle.id`, replace it with a member
24885 // with id `replacement.id`, type `replacement.type`, and the original role,
24886 // unless a member already exists with that id and role. Return an updated
24888 replaceMember: function(needle, replacement) {
24889 if (!this.memberById(needle.id))
24894 for (var i = 0; i < this.members.length; i++) {
24895 var member = this.members[i];
24896 if (member.id !== needle.id) {
24897 members.push(member);
24898 } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
24899 members.push({id: replacement.id, type: replacement.type, role: member.role});
24903 return this.update({members: members});
24907 asJXON: function(changeset_id) {
24910 '@id': this.osmId(),
24911 '@version': this.version || 0,
24912 member: map$4(this.members, function(member) {
24917 ref: osmEntity$$1.id.toOSM(member.id)
24921 tag: map$4(this.tags, function(v, k) {
24922 return { keyAttributes: { k: k, v: v } };
24926 if (changeset_id) r.relation['@changeset'] = changeset_id;
24931 asGeoJSON: function(resolver) {
24932 return resolver.transient(this, 'GeoJSON', function () {
24933 if (this.isMultipolygon()) {
24935 type: 'MultiPolygon',
24936 coordinates: this.multipolygon(resolver)
24940 type: 'FeatureCollection',
24941 properties: this.tags,
24942 features: this.members.map(function (member) {
24943 return assignIn$1({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
24951 area: function(resolver) {
24952 return resolver.transient(this, 'area', function() {
24953 return d3_geoArea(this.asGeoJSON(resolver));
24958 isMultipolygon: function() {
24959 return this.tags.type === 'multipolygon';
24963 isComplete: function(resolver) {
24964 for (var i = 0; i < this.members.length; i++) {
24965 if (!resolver.hasEntity(this.members[i].id)) {
24973 isRestriction: function() {
24974 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
24978 // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
24979 // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
24981 // This corresponds to the structure needed for rendering a multipolygon path using a
24982 // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
24984 // In the case of invalid geometries, this function will still return a result which
24985 // includes the nodes of all way members, but some Nds may be unclosed and some inner
24986 // rings not matched with the intended outer ring.
24988 multipolygon: function(resolver) {
24989 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
24990 inners = this.members.filter(function(m) { return 'inner' === m.role; });
24992 outers = osmJoinWays(outers, resolver);
24993 inners = osmJoinWays(inners, resolver);
24995 outers = outers.map(function(outer) { return map$4(outer.nodes, 'loc'); });
24996 inners = inners.map(function(inner) { return map$4(inner.nodes, 'loc'); });
24998 var result = outers.map(function(o) {
24999 // Heuristic for detecting counterclockwise winding order. Assumes
25000 // that OpenStreetMap polygons are not hemisphere-spanning.
25001 return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
25004 function findOuter(inner) {
25007 for (o = 0; o < outers.length; o++) {
25009 if (geoPolygonContainsPolygon(outer, inner))
25013 for (o = 0; o < outers.length; o++) {
25015 if (geoPolygonIntersectsPolygon(outer, inner, false))
25020 for (var i = 0; i < inners.length; i++) {
25021 var inner = inners[i];
25023 if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
25024 inner = inner.reverse();
25027 var o = findOuter(inners[i]);
25028 if (o !== undefined)
25029 result[o].push(inners[i]);
25031 result.push([inners[i]]); // Invalid geometry
25039 * Creates a duplicate-free version of an array, using
25040 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25041 * for equality comparisons, in which only the first occurrence of each element
25042 * is kept. The order of result values is determined by the order they occur
25049 * @param {Array} array The array to inspect.
25050 * @returns {Array} Returns the new duplicate free array.
25053 * _.uniq([2, 1, 2]);
25056 function uniq(array) {
25057 return (array && array.length) ? baseUniq(array) : [];
25060 /** `Object#toString` result references. */
25061 var numberTag$4 = '[object Number]';
25064 * Checks if `value` is classified as a `Number` primitive or object.
25066 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25067 * classified as numbers, use the `_.isFinite` method.
25073 * @param {*} value The value to check.
25074 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25080 * _.isNumber(Number.MIN_VALUE);
25083 * _.isNumber(Infinity);
25089 function isNumber(value) {
25090 return typeof value == 'number' ||
25091 (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25094 /** `Object#toString` result references. */
25095 var stringTag$4 = '[object String]';
25098 * Checks if `value` is classified as a `String` primitive or object.
25104 * @param {*} value The value to check.
25105 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25108 * _.isString('abc');
25114 function isString(value) {
25115 return typeof value == 'string' ||
25116 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25120 * Checks if `value` is `NaN`.
25122 * **Note:** This method is based on
25123 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25124 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25125 * `undefined` and other non-number values.
25131 * @param {*} value The value to check.
25132 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25138 * _.isNaN(new Number(NaN));
25141 * isNaN(undefined);
25144 * _.isNaN(undefined);
25147 function isNaN$1(value) {
25148 // An `NaN` primitive is the only value that is not equal to itself.
25149 // Perform the `toStringTag` check first to avoid errors with some
25150 // ActiveX objects in IE.
25151 return isNumber(value) && value != +value;
25154 function osmLanes(entity) {
25155 if (entity.type !== 'way') return null;
25156 if (!entity.tags.highway) return null;
25158 var tags = entity.tags;
25159 var isOneWay = entity.isOneWay();
25160 var laneCount = getLaneCount(tags, isOneWay);
25161 var maxspeed = parseMaxspeed(tags);
25163 var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25164 var forward = laneDirections.forward;
25165 var backward = laneDirections.backward;
25166 var bothways = laneDirections.bothways;
25168 // parse the piped string 'x|y|z' format
25169 var turnLanes = {};
25170 turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25171 turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25172 turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25174 var maxspeedLanes = {};
25175 maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25176 maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25177 maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25180 psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25181 psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25182 psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25185 busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25186 busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25187 busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25189 var taxiLanes = {};
25190 taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25191 taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25192 taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25195 hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25196 hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25197 hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25200 hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25201 hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25202 hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25204 var bicyclewayLanes = {};
25205 bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25206 bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25207 bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25215 // map forward/backward/unspecified of each lane type to lanesObj
25216 mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25217 mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25218 mapToLanesObj(lanesObj, psvLanes, 'psv');
25219 mapToLanesObj(lanesObj, busLanes, 'bus');
25220 mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25221 mapToLanesObj(lanesObj, hovLanes, 'hov');
25222 mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25223 mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25230 backward: backward,
25231 bothways: bothways,
25232 turnLanes: turnLanes,
25233 maxspeed: maxspeed,
25234 maxspeedLanes: maxspeedLanes,
25235 psvLanes: psvLanes,
25236 busLanes: busLanes,
25237 taxiLanes: taxiLanes,
25238 hovLanes: hovLanes,
25239 hgvLanes: hgvLanes,
25240 bicyclewayLanes: bicyclewayLanes
25247 function getLaneCount(tags, isOneWay) {
25250 count = parseInt(tags.lanes, 10);
25257 switch (tags.highway) {
25260 count = isOneWay ? 2 : 4;
25263 count = isOneWay ? 1 : 2;
25271 function parseMaxspeed(tags) {
25272 var maxspeed = tags.maxspeed;
25273 if (isNumber(maxspeed)) return maxspeed;
25274 if (isString(maxspeed)) {
25275 maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25276 if (!maxspeed) return;
25277 return parseInt(maxspeed, 10);
25282 function parseLaneDirections(tags, isOneWay, laneCount) {
25283 var forward = parseInt(tags['lanes:forward'], 10);
25284 var backward = parseInt(tags['lanes:backward'], 10);
25285 var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25287 if (parseInt(tags.oneway, 10) === -1) {
25290 backward = laneCount;
25292 else if (isOneWay) {
25293 forward = laneCount;
25297 else if (isNaN$1(forward) && isNaN$1(backward)) {
25298 backward = Math.floor((laneCount - bothways) / 2);
25299 forward = laneCount - bothways - backward;
25301 else if (isNaN$1(forward)) {
25302 if (backward > laneCount - bothways) {
25303 backward = laneCount - bothways;
25305 forward = laneCount - bothways - backward;
25307 else if (isNaN$1(backward)) {
25308 if (forward > laneCount - bothways) {
25309 forward = laneCount - bothways;
25311 backward = laneCount - bothways - forward;
25315 backward: backward,
25321 function parseTurnLanes(tag){
25324 var validValues = [
25325 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25326 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25329 return tag.split('|')
25330 .map(function (s) {
25331 if (s === '') s = 'none';
25332 return s.split(';')
25333 .map(function (d) {
25334 return validValues.indexOf(d) === -1 ? 'unknown': d;
25340 function parseMaxspeedLanes(tag, maxspeed) {
25343 return tag.split('|')
25344 .map(function (s) {
25345 if (s === 'none') return s;
25346 var m = parseInt(s, 10);
25347 if (s === '' || m === maxspeed) return null;
25348 return isNaN$1(m) ? 'unknown': m;
25353 function parseMiscLanes(tag) {
25356 var validValues = [
25357 'yes', 'no', 'designated'
25360 return tag.split('|')
25361 .map(function (s) {
25362 if (s === '') s = 'no';
25363 return validValues.indexOf(s) === -1 ? 'unknown': s;
25368 function parseBicycleWay(tag) {
25371 var validValues = [
25372 'yes', 'no', 'designated', 'lane'
25375 return tag.split('|')
25376 .map(function (s) {
25377 if (s === '') s = 'no';
25378 return validValues.indexOf(s) === -1 ? 'unknown': s;
25383 function mapToLanesObj(lanesObj, data, key) {
25384 if (data.forward) data.forward.forEach(function(l, i) {
25385 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25386 lanesObj.forward[i][key] = l;
25388 if (data.backward) data.backward.forEach(function(l, i) {
25389 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25390 lanesObj.backward[i][key] = l;
25392 if (data.unspecified) data.unspecified.forEach(function(l, i) {
25393 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25394 lanesObj.unspecified[i][key] = l;
25398 /** Used to compose bitmasks for cloning. */
25399 var CLONE_DEEP_FLAG$3 = 1;
25400 var CLONE_SYMBOLS_FLAG$2 = 4;
25403 * This method is like `_.clone` except that it recursively clones `value`.
25409 * @param {*} value The value to recursively clone.
25410 * @returns {*} Returns the deep cloned value.
25414 * var objects = [{ 'a': 1 }, { 'b': 2 }];
25416 * var deep = _.cloneDeep(objects);
25417 * console.log(deep[0] === objects[0]);
25420 function cloneDeep(value) {
25421 return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$2);
25425 * Gets the timestamp of the number of milliseconds that have elapsed since
25426 * the Unix epoch (1 January 1970 00:00:00 UTC).
25432 * @returns {number} Returns the timestamp.
25435 * _.defer(function(stamp) {
25436 * console.log(_.now() - stamp);
25438 * // => Logs the number of milliseconds it took for the deferred invocation.
25440 var now$1 = function() {
25441 return root$2.Date.now();
25444 /** Error message constants. */
25445 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25447 /* Built-in method references for those with the same name as other `lodash` methods. */
25448 var nativeMax$2 = Math.max;
25449 var nativeMin = Math.min;
25452 * Creates a debounced function that delays invoking `func` until after `wait`
25453 * milliseconds have elapsed since the last time the debounced function was
25454 * invoked. The debounced function comes with a `cancel` method to cancel
25455 * delayed `func` invocations and a `flush` method to immediately invoke them.
25456 * Provide `options` to indicate whether `func` should be invoked on the
25457 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25458 * with the last arguments provided to the debounced function. Subsequent
25459 * calls to the debounced function return the result of the last `func`
25462 * **Note:** If `leading` and `trailing` options are `true`, `func` is
25463 * invoked on the trailing edge of the timeout only if the debounced function
25464 * is invoked more than once during the `wait` timeout.
25466 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25467 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25469 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25470 * for details over the differences between `_.debounce` and `_.throttle`.
25475 * @category Function
25476 * @param {Function} func The function to debounce.
25477 * @param {number} [wait=0] The number of milliseconds to delay.
25478 * @param {Object} [options={}] The options object.
25479 * @param {boolean} [options.leading=false]
25480 * Specify invoking on the leading edge of the timeout.
25481 * @param {number} [options.maxWait]
25482 * The maximum time `func` is allowed to be delayed before it's invoked.
25483 * @param {boolean} [options.trailing=true]
25484 * Specify invoking on the trailing edge of the timeout.
25485 * @returns {Function} Returns the new debounced function.
25488 * // Avoid costly calculations while the window size is in flux.
25489 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25491 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25492 * jQuery(element).on('click', _.debounce(sendMail, 300, {
25494 * 'trailing': false
25497 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25498 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25499 * var source = new EventSource('/stream');
25500 * jQuery(source).on('message', debounced);
25502 * // Cancel the trailing debounced invocation.
25503 * jQuery(window).on('popstate', debounced.cancel);
25505 function debounce$1(func, wait, options) {
25512 lastInvokeTime = 0,
25517 if (typeof func != 'function') {
25518 throw new TypeError(FUNC_ERROR_TEXT$2);
25520 wait = toNumber(wait) || 0;
25521 if (isObject(options)) {
25522 leading = !!options.leading;
25523 maxing = 'maxWait' in options;
25524 maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25525 trailing = 'trailing' in options ? !!options.trailing : trailing;
25528 function invokeFunc(time) {
25529 var args = lastArgs,
25530 thisArg = lastThis;
25532 lastArgs = lastThis = undefined;
25533 lastInvokeTime = time;
25534 result = func.apply(thisArg, args);
25538 function leadingEdge(time) {
25539 // Reset any `maxWait` timer.
25540 lastInvokeTime = time;
25541 // Start the timer for the trailing edge.
25542 timerId = setTimeout(timerExpired, wait);
25543 // Invoke the leading edge.
25544 return leading ? invokeFunc(time) : result;
25547 function remainingWait(time) {
25548 var timeSinceLastCall = time - lastCallTime,
25549 timeSinceLastInvoke = time - lastInvokeTime,
25550 result = wait - timeSinceLastCall;
25552 return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
25555 function shouldInvoke(time) {
25556 var timeSinceLastCall = time - lastCallTime,
25557 timeSinceLastInvoke = time - lastInvokeTime;
25559 // Either this is the first call, activity has stopped and we're at the
25560 // trailing edge, the system time has gone backwards and we're treating
25561 // it as the trailing edge, or we've hit the `maxWait` limit.
25562 return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25563 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25566 function timerExpired() {
25567 var time = now$1();
25568 if (shouldInvoke(time)) {
25569 return trailingEdge(time);
25571 // Restart the timer.
25572 timerId = setTimeout(timerExpired, remainingWait(time));
25575 function trailingEdge(time) {
25576 timerId = undefined;
25578 // Only invoke if we have `lastArgs` which means `func` has been
25579 // debounced at least once.
25580 if (trailing && lastArgs) {
25581 return invokeFunc(time);
25583 lastArgs = lastThis = undefined;
25587 function cancel() {
25588 if (timerId !== undefined) {
25589 clearTimeout(timerId);
25591 lastInvokeTime = 0;
25592 lastArgs = lastCallTime = lastThis = timerId = undefined;
25596 return timerId === undefined ? result : trailingEdge(now$1());
25599 function debounced() {
25600 var time = now$1(),
25601 isInvoking = shouldInvoke(time);
25603 lastArgs = arguments;
25605 lastCallTime = time;
25608 if (timerId === undefined) {
25609 return leadingEdge(lastCallTime);
25612 // Handle invocations in a tight loop.
25613 timerId = setTimeout(timerExpired, wait);
25614 return invokeFunc(lastCallTime);
25617 if (timerId === undefined) {
25618 timerId = setTimeout(timerExpired, wait);
25622 debounced.cancel = cancel;
25623 debounced.flush = flush;
25628 * Casts `value` to `identity` if it's not a function.
25631 * @param {*} value The value to inspect.
25632 * @returns {Function} Returns cast function.
25634 function castFunction(value) {
25635 return typeof value == 'function' ? value : identity$8;
25639 * Iterates over elements of `collection` and invokes `iteratee` for each element.
25640 * The iteratee is invoked with three arguments: (value, index|key, collection).
25641 * Iteratee functions may exit iteration early by explicitly returning `false`.
25643 * **Note:** As with other "Collections" methods, objects with a "length"
25644 * property are iterated like arrays. To avoid this behavior use `_.forIn`
25645 * or `_.forOwn` for object iteration.
25651 * @category Collection
25652 * @param {Array|Object} collection The collection to iterate over.
25653 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25654 * @returns {Array|Object} Returns `collection`.
25655 * @see _.forEachRight
25658 * _.forEach([1, 2], function(value) {
25659 * console.log(value);
25661 * // => Logs `1` then `2`.
25663 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25664 * console.log(key);
25666 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25668 function forEach(collection, iteratee) {
25669 var func = isArray(collection) ? arrayEach : baseEach;
25670 return func(collection, castFunction(iteratee));
25674 * Iterates over own enumerable string keyed properties of an object and
25675 * invokes `iteratee` for each property. The iteratee is invoked with three
25676 * arguments: (value, key, object). Iteratee functions may exit iteration
25677 * early by explicitly returning `false`.
25683 * @param {Object} object The object to iterate over.
25684 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25685 * @returns {Object} Returns `object`.
25686 * @see _.forOwnRight
25694 * Foo.prototype.c = 3;
25696 * _.forOwn(new Foo, function(value, key) {
25697 * console.log(key);
25699 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25701 function forOwn(object, iteratee) {
25702 return object && baseForOwn(object, castFunction(iteratee));
25705 var translations = Object.create(null);
25707 var currentLocale = 'en';
25708 var textDirection = 'ltr';
25710 function setLocale(_) {
25711 if (translations[_] !== undefined) {
25713 } else if (translations[_.split('-')[0]]) {
25714 currentLocale = _.split('-')[0];
25718 function addTranslation(id, value) {
25719 translations[id] = value;
25723 * Given a string identifier, try to find that string in the current
25724 * language, and return it.
25726 * @param {string} s string identifier
25727 * @returns {string?} locale string
25729 function t(s, o, loc) {
25730 loc = loc || currentLocale;
25734 .map(function(s) { return s.replace('<TX_DOT>', '.'); })
25737 var rep = translations[loc];
25739 while (rep !== undefined && path.length) rep = rep[path.pop()];
25741 if (rep !== undefined) {
25742 if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
25746 if (loc !== 'en') {
25747 return t(s, o, 'en');
25750 if (o && 'default' in o) {
25754 var missing = 'Missing ' + loc + ' translation: ' + s;
25755 if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
25761 * Given string 'ltr' or 'rtl', save that setting
25763 * @param {string} s ltr or rtl
25766 function setTextDirection(dir) {
25767 textDirection = dir;
25770 /** Used to compose bitmasks for cloning. */
25771 var CLONE_DEEP_FLAG$4 = 1;
25772 var CLONE_SYMBOLS_FLAG$3 = 4;
25775 * This method is like `_.cloneWith` except that it recursively clones `value`.
25781 * @param {*} value The value to recursively clone.
25782 * @param {Function} [customizer] The function to customize cloning.
25783 * @returns {*} Returns the deep cloned value.
25787 * function customizer(value) {
25788 * if (_.isElement(value)) {
25789 * return value.cloneNode(true);
25793 * var el = _.cloneDeepWith(document.body, customizer);
25795 * console.log(el === document.body);
25797 * console.log(el.nodeName);
25799 * console.log(el.childNodes.length);
25802 function cloneDeepWith(value, customizer) {
25803 customizer = typeof customizer == 'function' ? customizer : undefined;
25804 return baseClone(value, CLONE_DEEP_FLAG$4 | CLONE_SYMBOLS_FLAG$3, customizer);
25808 * Creates an array of `array` values not included in the other given arrays
25809 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25810 * for equality comparisons. The order and references of result values are
25811 * determined by the first array.
25813 * **Note:** Unlike `_.pullAll`, this method returns a new array.
25819 * @param {Array} array The array to inspect.
25820 * @param {...Array} [values] The values to exclude.
25821 * @returns {Array} Returns the new array of filtered values.
25822 * @see _.without, _.xor
25825 * _.difference([2, 1], [2, 3]);
25828 var difference = baseRest(function(array, values) {
25829 return isArrayLikeObject(array)
25830 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
25835 * Flattens `array` a single level deep.
25841 * @param {Array} array The array to flatten.
25842 * @returns {Array} Returns the new flattened array.
25845 * _.flatten([1, [2, [3, [4]], 5]]);
25846 * // => [1, 2, [3, [4]], 5]
25848 function flatten(array) {
25849 var length = array == null ? 0 : array.length;
25850 return length ? baseFlatten(array, 1) : [];
25854 * A specialized version of `baseAggregator` for arrays.
25857 * @param {Array} [array] The array to iterate over.
25858 * @param {Function} setter The function to set `accumulator` values.
25859 * @param {Function} iteratee The iteratee to transform keys.
25860 * @param {Object} accumulator The initial aggregated object.
25861 * @returns {Function} Returns `accumulator`.
25863 function arrayAggregator(array, setter, iteratee, accumulator) {
25865 length = array == null ? 0 : array.length;
25867 while (++index < length) {
25868 var value = array[index];
25869 setter(accumulator, value, iteratee(value), array);
25871 return accumulator;
25875 * Aggregates elements of `collection` on `accumulator` with keys transformed
25876 * by `iteratee` and values set by `setter`.
25879 * @param {Array|Object} collection The collection to iterate over.
25880 * @param {Function} setter The function to set `accumulator` values.
25881 * @param {Function} iteratee The iteratee to transform keys.
25882 * @param {Object} accumulator The initial aggregated object.
25883 * @returns {Function} Returns `accumulator`.
25885 function baseAggregator(collection, setter, iteratee, accumulator) {
25886 baseEach(collection, function(value, key, collection) {
25887 setter(accumulator, value, iteratee(value), collection);
25889 return accumulator;
25893 * Creates a function like `_.groupBy`.
25896 * @param {Function} setter The function to set accumulator values.
25897 * @param {Function} [initializer] The accumulator object initializer.
25898 * @returns {Function} Returns the new aggregator function.
25900 function createAggregator(setter, initializer) {
25901 return function(collection, iteratee) {
25902 var func = isArray(collection) ? arrayAggregator : baseAggregator,
25903 accumulator = initializer ? initializer() : {};
25905 return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
25909 /** Used for built-in method references. */
25910 var objectProto$15 = Object.prototype;
25912 /** Used to check objects for own properties. */
25913 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
25916 * Creates an object composed of keys generated from the results of running
25917 * each element of `collection` thru `iteratee`. The order of grouped values
25918 * is determined by the order they occur in `collection`. The corresponding
25919 * value of each key is an array of elements responsible for generating the
25920 * key. The iteratee is invoked with one argument: (value).
25925 * @category Collection
25926 * @param {Array|Object} collection The collection to iterate over.
25927 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
25928 * @returns {Object} Returns the composed aggregate object.
25931 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
25932 * // => { '4': [4.2], '6': [6.1, 6.3] }
25934 * // The `_.property` iteratee shorthand.
25935 * _.groupBy(['one', 'two', 'three'], 'length');
25936 * // => { '3': ['one', 'two'], '5': ['three'] }
25938 var groupBy = createAggregator(function(result, value, key) {
25939 if (hasOwnProperty$12.call(result, key)) {
25940 result[key].push(value);
25942 baseAssignValue(result, key, [value]);
25946 /** `Object#toString` result references. */
25947 var mapTag$6 = '[object Map]';
25948 var setTag$6 = '[object Set]';
25950 /** Used for built-in method references. */
25951 var objectProto$16 = Object.prototype;
25953 /** Used to check objects for own properties. */
25954 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
25957 * Checks if `value` is an empty object, collection, map, or set.
25959 * Objects are considered empty if they have no own enumerable string keyed
25962 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
25963 * jQuery-like collections are considered empty if they have a `length` of `0`.
25964 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
25970 * @param {*} value The value to check.
25971 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
25983 * _.isEmpty([1, 2, 3]);
25986 * _.isEmpty({ 'a': 1 });
25989 function isEmpty(value) {
25990 if (value == null) {
25993 if (isArrayLike(value) &&
25994 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
25995 isBuffer(value) || isTypedArray(value) || isArguments(value))) {
25996 return !value.length;
25998 var tag = getTag$1(value);
25999 if (tag == mapTag$6 || tag == setTag$6) {
26000 return !value.size;
26002 if (isPrototype(value)) {
26003 return !baseKeys(value).length;
26005 for (var key in value) {
26006 if (hasOwnProperty$13.call(value, key)) {
26014 * Gets the last element of `array`.
26020 * @param {Array} array The array to query.
26021 * @returns {*} Returns the last element of `array`.
26024 * _.last([1, 2, 3]);
26027 function last(array) {
26028 var length = array == null ? 0 : array.length;
26029 return length ? array[length - 1] : undefined;
26033 * The base implementation of `_.slice` without an iteratee call guard.
26036 * @param {Array} array The array to slice.
26037 * @param {number} [start=0] The start position.
26038 * @param {number} [end=array.length] The end position.
26039 * @returns {Array} Returns the slice of `array`.
26041 function baseSlice(array, start, end) {
26043 length = array.length;
26046 start = -start > length ? 0 : (length + start);
26048 end = end > length ? length : end;
26052 length = start > end ? 0 : ((end - start) >>> 0);
26055 var result = Array(length);
26056 while (++index < length) {
26057 result[index] = array[index + start];
26063 * Gets the parent value at `path` of `object`.
26066 * @param {Object} object The object to query.
26067 * @param {Array} path The path to get the parent value of.
26068 * @returns {*} Returns the parent value.
26070 function parent(object, path) {
26071 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
26075 * The base implementation of `_.unset`.
26078 * @param {Object} object The object to modify.
26079 * @param {Array|string} path The property path to unset.
26080 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
26082 function baseUnset(object, path) {
26083 path = castPath(path, object);
26084 object = parent(object, path);
26085 return object == null || delete object[toKey(last(path))];
26088 /** `Object#toString` result references. */
26089 var objectTag$4 = '[object Object]';
26091 /** Used for built-in method references. */
26092 var funcProto$2 = Function.prototype;
26093 var objectProto$17 = Object.prototype;
26095 /** Used to resolve the decompiled source of functions. */
26096 var funcToString$2 = funcProto$2.toString;
26098 /** Used to check objects for own properties. */
26099 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26101 /** Used to infer the `Object` constructor. */
26102 var objectCtorString = funcToString$2.call(Object);
26105 * Checks if `value` is a plain object, that is, an object created by the
26106 * `Object` constructor or one with a `[[Prototype]]` of `null`.
26112 * @param {*} value The value to check.
26113 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
26120 * _.isPlainObject(new Foo);
26123 * _.isPlainObject([1, 2, 3]);
26126 * _.isPlainObject({ 'x': 0, 'y': 0 });
26129 * _.isPlainObject(Object.create(null));
26132 function isPlainObject(value) {
26133 if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
26136 var proto = getPrototype(value);
26137 if (proto === null) {
26140 var Ctor = hasOwnProperty$14.call(proto, 'constructor') && proto.constructor;
26141 return typeof Ctor == 'function' && Ctor instanceof Ctor &&
26142 funcToString$2.call(Ctor) == objectCtorString;
26146 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
26150 * @param {*} value The value to inspect.
26151 * @param {string} key The key of the property to inspect.
26152 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
26154 function customOmitClone(value) {
26155 return isPlainObject(value) ? undefined : value;
26159 * A specialized version of `baseRest` which flattens the rest array.
26162 * @param {Function} func The function to apply a rest parameter to.
26163 * @returns {Function} Returns the new function.
26165 function flatRest(func) {
26166 return setToString(overRest(func, undefined, flatten), func + '');
26169 /** Used to compose bitmasks for cloning. */
26170 var CLONE_DEEP_FLAG$5 = 1;
26171 var CLONE_FLAT_FLAG$1 = 2;
26172 var CLONE_SYMBOLS_FLAG$4 = 4;
26175 * The opposite of `_.pick`; this method creates an object composed of the
26176 * own and inherited enumerable property paths of `object` that are not omitted.
26178 * **Note:** This method is considerably slower than `_.pick`.
26184 * @param {Object} object The source object.
26185 * @param {...(string|string[])} [paths] The property paths to omit.
26186 * @returns {Object} Returns the new object.
26189 * var object = { 'a': 1, 'b': '2', 'c': 3 };
26191 * _.omit(object, ['a', 'c']);
26192 * // => { 'b': '2' }
26194 var omit = flatRest(function(object, paths) {
26196 if (object == null) {
26199 var isDeep = false;
26200 paths = arrayMap(paths, function(path) {
26201 path = castPath(path, object);
26202 isDeep || (isDeep = path.length > 1);
26205 copyObject(object, getAllKeysIn(object), result);
26207 result = baseClone(result, CLONE_DEEP_FLAG$5 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$4, customOmitClone);
26209 var length = paths.length;
26211 baseUnset(result, paths[length]);
26218 function utilDetect(force) {
26219 if (detected && !force) return detected;
26222 var ua = navigator.userAgent,
26225 m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
26227 detected.browser = m[1];
26228 detected.version = m[2];
26230 if (!detected.browser) {
26231 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
26233 detected.browser = 'msie';
26234 detected.version = m[1];
26237 if (!detected.browser) {
26238 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
26240 detected.browser = 'Opera';
26241 detected.version = m[2];
26244 if (!detected.browser) {
26245 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26247 detected.browser = m[1];
26248 detected.version = m[2];
26249 m = ua.match(/version\/([\.\d]+)/i);
26250 if (m !== null) detected.version = m[1];
26253 if (!detected.browser) {
26254 detected.browser = navigator.appName;
26255 detected.version = navigator.appVersion;
26258 // keep major.minor version only..
26259 detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26261 if (detected.browser.toLowerCase() === 'msie') {
26262 detected.ie = true;
26263 detected.browser = 'Internet Explorer';
26264 detected.support = parseFloat(detected.version) >= 11;
26266 detected.ie = false;
26267 detected.support = true;
26270 // Added due to incomplete svg style support. See #715
26271 detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26273 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26274 detected.language = detected.locale.split('-')[0];
26276 // Search `navigator.languages` for a better locale.. Prefer the first language,
26277 // unless the second language is a culture-specific version of the first one, see #3842
26278 if (navigator.languages && navigator.languages.length > 0) {
26279 var code0 = navigator.languages[0],
26280 parts0 = code0.split('-');
26282 detected.locale = code0;
26283 detected.language = parts0[0];
26285 if (navigator.languages.length > 1 && parts0.length === 1) {
26286 var code1 = navigator.languages[1],
26287 parts1 = code1.split('-');
26289 if (parts1[0] === parts0[0]) {
26290 detected.locale = code1;
26295 // Loaded locale is stored in currentLocale
26296 // return that instead (except in the situation where 'en' might override 'en-US')
26297 var loadedLocale = currentLocale || 'en';
26298 if (loadedLocale !== 'en') {
26299 detected.locale = loadedLocale;
26300 detected.language = detected.locale.split('-')[0];
26303 // detect text direction
26304 var q = utilStringQs(window.location.hash.substring(1));
26305 var lang = dataLocales[detected.locale];
26306 if ((lang && lang.rtl) || (q.rtl === 'true')) {
26307 detected.textDirection = 'rtl';
26309 detected.textDirection = 'ltr';
26311 setTextDirection(detected.textDirection);
26314 var loc = window.top.location;
26315 var origin = loc.origin;
26316 if (!origin) { // for unpatched IE11
26317 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26320 detected.host = origin + loc.pathname;
26322 detected.filedrop = (window.FileReader && 'ondrop' in window);
26324 detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26327 return navigator.userAgent.indexOf(x) !== -1;
26331 detected.os = 'win';
26332 detected.platform = 'Windows';
26334 else if (nav('Mac')) {
26335 detected.os = 'mac';
26336 detected.platform = 'Macintosh';
26338 else if (nav('X11') || nav('Linux')) {
26339 detected.os = 'linux';
26340 detected.platform = 'Linux';
26343 detected.os = 'win';
26344 detected.platform = 'Unknown';
26350 var remove$1 = removeDiacritics;
26352 var replacementList = [
26361 chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
26367 chars: "\u00C6\u01FC\u01E2",
26376 chars: "\uA738\uA73A",
26382 chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26385 chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26388 chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26394 chars: "\u01F1\u01C4",
26397 chars: "\u01F2\u01C5",
26400 chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
26403 chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26406 chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26409 chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26412 chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26415 chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26418 chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26421 chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26430 chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26433 chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26442 chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
26457 chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26460 chars: "\u24C6\uFF31\uA756\uA758\u024A",
26463 chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26466 chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26469 chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26478 chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
26481 chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26487 chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26490 chars: "\u24CD\uFF38\u1E8A\u1E8C",
26493 chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26496 chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26499 chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
26505 chars: "\u00E6\u01FD\u01E3",
26514 chars: "\uA739\uA73B",
26520 chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26523 chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26526 chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26532 chars: "\u01F3\u01C6",
26535 chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
26538 chars: "\u24D5\uFF46\u1E1F\u0192",
26556 chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26559 chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26565 chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26568 chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26571 chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26574 chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26580 chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26583 chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26589 chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
26604 chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26607 chars: "\u24E0\uFF51\u024B\uA757\uA759",
26610 chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26613 chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26619 chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26628 chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
26631 chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26637 chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26640 chars: "\u24E7\uFF58\u1E8B\u1E8D",
26643 chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26646 chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26650 var diacriticsMap = {};
26651 for (var i = 0; i < replacementList.length; i += 1) {
26652 var chars = replacementList[i].chars;
26653 for (var j = 0; j < chars.length; j += 1) {
26654 diacriticsMap[chars[j]] = replacementList[i].base;
26658 function removeDiacritics(str) {
26659 return str.replace(/[^\u0000-\u007e]/g, function(c) {
26660 return diacriticsMap[c] || c;
26664 // see https://github.com/openstreetmap/iD/pull/3707
26665 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26668 // madda above alef
26669 1570: { initial: 'آ', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26671 // hamza above and below alef
26672 1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26674 1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26676 1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26677 1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26680 1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26682 1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26683 1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26684 1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26685 1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26686 1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26687 1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26688 1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26689 1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26690 1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26691 1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26692 1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26693 1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26694 1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26695 1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26696 1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26697 1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26698 1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26699 1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26701 // 1595 ػ - may be very rare
26703 1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26704 1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26705 1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26706 1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26707 1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26708 1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26709 1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26712 1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26714 1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26716 // short vowel sounds / tashkil markings
26718 1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26720 1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26721 1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26722 1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26723 1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26724 1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26725 5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26728 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26730 function fixRTLTextForSvg(inputText) {
26731 var context = true;
26733 var rtlBuffer = [];
26734 var arabicRegex = /[\u0600-\u06FF]/g;
26735 var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26736 var thaanaVowel = /[\u07A6-\u07B0]/;
26737 var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26739 if (!arabicRegex.test(inputText)) {
26740 // Hebrew or Thaana RTL script
26741 for (var n = 0; n < inputText.length; n++) {
26742 var c = inputText[n];
26743 if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26744 rtlBuffer[rtlBuffer.length - 1] += c;
26745 } else if (rtlRegex.test(c)) {
26747 } else if (c === ' ' && rtlBuffer.length) {
26748 // whitespace within RTL text
26749 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26751 // non-RTL character
26752 ret += rtlBuffer.reverse().join('') + c;
26757 for (var i = 0, l = inputText.length; i < l; i++) {
26758 var code = inputText[i].charCodeAt(0);
26759 var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26761 if (!chars$1[code]) {
26762 if (code === 32 && rtlBuffer.length) {
26764 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26765 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26767 rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26769 // non-RTL character
26770 ret += rtlBuffer.reverse().join('') + inputText[i];
26776 if (i === l - 1 || nextCode === 32) {
26777 rtlBuffer.push(chars$1[code].isolated);
26779 // special case for لا
26780 if (code === 1604 && nextCode === 1575) {
26781 rtlBuffer.push(chars$1[5000].initial);
26786 rtlBuffer.push(chars$1[code].initial);
26789 if (i === l - 1 || nextCode === 32){
26790 rtlBuffer.push(chars$1[code].final);
26792 // special case for ﻼ
26793 if (code === 1604 && nextCode === 1575){
26794 rtlBuffer.push(chars$1[5000].final);
26799 if (chars$1[code].medial === ''){
26800 rtlBuffer.push(chars$1[code].final);
26802 rtlBuffer.push(chars$1[code].medial);
26806 context = (chars$1[code].medial === '') || nextCode === 32;
26809 ret += rtlBuffer.reverse().join('');
26813 function utilTagText(entity) {
26814 return map$4(entity.tags, function(v, k) {
26815 return k + '=' + v;
26820 function utilEntitySelector(ids) {
26821 return ids.length ? '.' + ids.join(',.') : 'nothing';
26825 function utilEntityOrMemberSelector(ids, graph) {
26826 var s = utilEntitySelector(ids);
26828 ids.forEach(function(id) {
26829 var entity = graph.hasEntity(id);
26830 if (entity && entity.type === 'relation') {
26831 entity.members.forEach(function(member) {
26832 s += ',.' + member.id;
26841 function utilGetAllNodes(ids, graph) {
26844 ids.forEach(getNodes);
26847 function getNodes(id) {
26848 if (seen[id]) return;
26851 var entity = graph.hasEntity(id);
26852 if (!entity) return;
26854 if (entity.type === 'node') {
26855 nodes.push(entity);
26856 } else if (entity.type === 'way') {
26857 entity.nodes.forEach(getNodes);
26859 entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26865 function utilDisplayName(entity) {
26866 var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26867 name = entity.tags[localizedNameKey] || entity.tags.name || '',
26868 network = entity.tags.cycle_network || entity.tags.network;
26870 if (!name && entity.tags.ref) {
26871 name = entity.tags.ref;
26873 name = network + ' ' + name;
26881 function utilDisplayNameForPath(entity) {
26882 var name = utilDisplayName(entity);
26883 var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26885 if (!isFirefox && name && rtlRegex.test(name)) {
26886 name = fixRTLTextForSvg(name);
26893 function utilDisplayType(id) {
26895 n: t('inspector.node'),
26896 w: t('inspector.way'),
26897 r: t('inspector.relation')
26902 function utilStringQs(str) {
26903 return str.split('&').reduce(function(obj, pair){
26904 var parts = pair.split('=');
26905 if (parts.length === 2) {
26906 obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26913 function utilQsString(obj, noencode) {
26914 function softEncode(s) {
26915 // encode everything except special characters used in certain hash parameters:
26916 // "/" in map states, ":", ",", {" and "}" in background
26917 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26919 return Object.keys(obj).sort().map(function(key) {
26920 return encodeURIComponent(key) + '=' + (
26921 noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26926 function utilPrefixDOMProperty(property) {
26927 var prefixes = ['webkit', 'ms', 'moz', 'o'],
26929 n = prefixes.length,
26935 property = property.substr(0, 1).toUpperCase() + property.substr(1);
26938 if (prefixes[i] + property in s)
26939 return prefixes[i] + property;
26945 function utilPrefixCSSProperty(property) {
26946 var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26948 n = prefixes.length,
26949 s = document.body.style;
26951 if (property.toLowerCase() in s)
26952 return property.toLowerCase();
26955 if (prefixes[i] + property in s)
26956 return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26962 var transformProperty;
26963 function utilSetTransform(el, x, y, scale) {
26964 var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26965 translate = utilDetect().opera ?
26966 'translate(' + x + 'px,' + y + 'px)' :
26967 'translate3d(' + x + 'px,' + y + 'px,0)';
26968 return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26972 // Calculates Levenshtein distance between two strings
26973 // see: https://en.wikipedia.org/wiki/Levenshtein_distance
26974 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26975 function utilEditDistance(a, b) {
26976 a = remove$1(a.toLowerCase());
26977 b = remove$1(b.toLowerCase());
26978 if (a.length === 0) return b.length;
26979 if (b.length === 0) return a.length;
26981 for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26982 for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26983 for (i = 1; i <= b.length; i++) {
26984 for (j = 1; j <= a.length; j++) {
26985 if (b.charAt(i-1) === a.charAt(j-1)) {
26986 matrix[i][j] = matrix[i-1][j-1];
26988 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26989 Math.min(matrix[i][j-1] + 1, // insertion
26990 matrix[i-1][j] + 1)); // deletion
26994 return matrix[b.length][a.length];
26998 // a d3.mouse-alike which
26999 // 1. Only works on HTML elements, not SVG
27000 // 2. Does not cause style recalculation
27001 function utilFastMouse(container) {
27002 var rect = container.getBoundingClientRect(),
27003 rectLeft = rect.left,
27004 rectTop = rect.top,
27005 clientLeft = +container.clientLeft,
27006 clientTop = +container.clientTop;
27007 if (textDirection === 'rtl') {
27010 return function(e) {
27012 e.clientX - rectLeft - clientLeft,
27013 e.clientY - rectTop - clientTop];
27018 /* eslint-disable no-proto */
27019 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27020 /* eslint-enable no-proto */
27023 function utilAsyncMap(inputs, func, callback) {
27024 var remaining = inputs.length,
27028 inputs.forEach(function(d, i) {
27029 func(d, function done(err, data) {
27033 if (!remaining) callback(errors, results);
27039 // wraps an index to an interval [0..length-1]
27040 function utilWrap(index, length) {
27042 index += Math.ceil(-index/length)*length;
27043 return index % length;
27048 * a replacement for functor
27050 * @param {*} value any value
27051 * @returns {Function} a function that returns that value or the value if it's a function
27053 function utilFunctor(value) {
27054 if (typeof value === 'function') return value;
27055 return function() {
27061 function utilNoAuto(selection) {
27063 .attr('autocomplete', 'off')
27064 .attr('autocorrect', 'off')
27065 .attr('autocapitalize', 'off')
27066 .attr('spellcheck', 'false');
27069 // note the function should be of low priority
27070 // and should not be returning a value.
27071 function utilCallWhenIdle(func, timeout) {
27072 return function() {
27073 var args = arguments;
27075 window.requestIdleCallback(function() {
27076 func.apply(that, args);
27077 }, {timeout: timeout});
27081 // Like selection.property('value', ...), but avoids no-op value sets,
27082 // which can result in layout/repaint thrashing in some situations.
27083 function utilGetSetValue(selection, value) {
27084 function d3_selection_value(value) {
27085 function valueNull() {
27089 function valueConstant() {
27090 if (this.value !== value) {
27091 this.value = value;
27095 function valueFunction() {
27096 var x = value.apply(this, arguments);
27099 } else if (this.value !== x) {
27104 return value == null
27105 ? valueNull : (typeof value === 'function'
27106 ? valueFunction : valueConstant);
27109 if (arguments.length === 1) {
27110 return selection.property('value');
27113 return selection.each(d3_selection_value(value));
27116 function utilIdleWorker(tasks, processor, callback) {
27117 var processed = [];
27118 var currentPos = 0;
27119 var totalTasks = tasks.length;
27121 function worker(deadline) {
27122 while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27123 var result = processor(tasks[currentPos]);
27125 // if falsy dont add to the processed list
27126 if (result) processed.push(result);
27130 // more tasks are left, we might need more idleCallbacks
27131 if (currentPos < totalTasks) {
27132 return window.requestIdleCallback(function(deadline) {worker(deadline);});
27135 // tasks are completed
27136 return callback(processed);
27139 window.requestIdleCallback(function(deadline) {worker(deadline);});
27143 window.requestIdleCallback =
27144 window.requestIdleCallback ||
27146 var start = Date.now();
27147 return setTimeout(function() {
27150 timeRemaining: function() {
27151 return Math.max(0, 50 - (Date.now() - start));
27157 window.cancelIdleCallback =
27158 window.cancelIdleCallback ||
27163 // Copies a variable number of methods from source to target.
27164 function utilRebind(target, source) {
27165 var i = 1, n = arguments.length, method;
27167 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27172 // Method is assumed to be a standard D3 getter-setter:
27173 // If passed with no arguments, gets the value.
27174 // If passed with arguments, sets the value and returns the target.
27175 function d3_rebind(target, source, method) {
27176 return function() {
27177 var value = method.apply(source, arguments);
27178 return value === source ? target : value;
27182 // A per-domain session mutex backed by a cookie and dead man's
27183 // switch. If the session crashes, the mutex will auto-release
27184 // after 5 seconds.
27186 function utilSessionMutex(name) {
27191 var expires = new Date();
27192 expires.setSeconds(expires.getSeconds() + 5);
27193 document.cookie = name + '=1; expires=' + expires.toUTCString();
27196 mutex.lock = function() {
27197 if (intervalID) return true;
27198 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27199 if (cookie) return false;
27201 intervalID = window.setInterval(renew, 4000);
27205 mutex.unlock = function() {
27206 if (!intervalID) return;
27207 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27208 clearInterval(intervalID);
27212 mutex.locked = function() {
27213 return !!intervalID;
27219 function utilSuggestNames(preset, suggestions) {
27220 preset = preset.id.split('/', 2);
27224 return function(value, callback) {
27226 if (value && value.length > 2) {
27227 if (suggestions[k] && suggestions[k][v]) {
27228 for (var sugg in suggestions[k][v]) {
27229 var dist = utilEditDistance(value, sugg.substring(0, value.length));
27239 result.sort(function(a, b) {
27240 return a.dist - b.dist;
27243 result = result.slice(0,3);
27248 function utilTriggerEvent(target, type) {
27249 target.each(function() {
27250 var evt = document.createEvent('HTMLEvents');
27251 evt.initEvent(type, true, true);
27252 this.dispatchEvent(evt);
27256 function validationDeprecatedTag() {
27258 var validation = function(changes) {
27260 for (var i = 0; i < changes.created.length; i++) {
27261 var change = changes.created[i],
27262 deprecatedTags = change.deprecatedTags();
27264 if (!isEmpty(deprecatedTags)) {
27265 var tags = utilTagText({ tags: deprecatedTags });
27267 id: 'deprecated_tags',
27268 message: t('validations.deprecated_tags', { tags: tags }),
27281 function validationDisconnectedHighway() {
27283 function isDisconnectedHighway(entity, graph) {
27284 if (!entity.tags.highway) return false;
27285 if (entity.geometry(graph) !== 'line') return false;
27287 return graph.childNodes(entity)
27288 .every(function(vertex) {
27289 var parents = graph.parentWays(vertex);
27290 if (parents.length === 1) { // standalone vertex
27292 } else { // shared vertex
27293 return !vertex.tags.entrance &&
27294 parents.filter(function(parent) {
27295 return parent.tags.highway && parent !== entity;
27302 var validation = function(changes, graph) {
27304 for (var i = 0; i < changes.created.length; i++) {
27305 var entity = changes.created[i];
27307 if (isDisconnectedHighway(entity, graph)) {
27309 id: 'disconnected_highway',
27310 message: t('validations.disconnected_highway'),
27311 tooltip: t('validations.disconnected_highway_tooltip'),
27324 function validationManyDeletions() {
27325 var threshold = 100;
27327 var validation = function(changes) {
27329 if (changes.deleted.length > threshold) {
27331 id: 'many_deletions',
27332 message: t('validations.many_deletions', { n: changes.deleted.length })
27343 function validationMissingTag() {
27345 // Slightly stricter check than Entity#isUsed (#3091)
27346 function hasTags(entity, graph) {
27347 return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27348 graph.parentRelations(entity).length > 0;
27351 var validation = function(changes, graph) {
27352 var types = ['point', 'line', 'area', 'relation'],
27355 for (var i = 0; i < changes.created.length; i++) {
27356 var change = changes.created[i],
27357 geometry = change.geometry(graph);
27359 if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27362 message: t('validations.untagged_' + geometry),
27363 tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27376 function validationOldMultipolygon() {
27378 return function validation(changes, graph) {
27380 for (var i = 0; i < changes.created.length; i++) {
27381 var entity = changes.created[i];
27382 var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27385 id: 'old_multipolygon',
27386 message: t('validations.old_multipolygon'),
27387 tooltip: t('validations.old_multipolygon_tooltip'),
27396 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27397 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27398 function validationTagSuggestsArea() {
27400 function tagSuggestsArea(tags) {
27401 if (isEmpty(tags)) return false;
27403 var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27404 for (var i = 0; i < presence.length; i++) {
27405 if (tags[presence[i]] !== undefined) {
27406 return presence[i] + '=' + tags[presence[i]];
27410 if (tags.building && tags.building === 'yes') return 'building=yes';
27414 var validation = function(changes, graph) {
27416 for (var i = 0; i < changes.created.length; i++) {
27417 var change = changes.created[i],
27418 geometry = change.geometry(graph),
27419 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27423 id: 'tag_suggests_area',
27424 message: t('validations.tag_suggests_area', { tag: suggestion }),
27439 var Validations = Object.freeze({
27440 validationDeprecatedTag: validationDeprecatedTag,
27441 validationDisconnectedHighway: validationDisconnectedHighway,
27442 validationManyDeletions: validationManyDeletions,
27443 validationMissingTag: validationMissingTag,
27444 validationOldMultipolygon: validationOldMultipolygon,
27445 validationTagSuggestsArea: validationTagSuggestsArea
27449 * Performs a deep comparison between two values to determine if they are
27452 * **Note:** This method supports comparing arrays, array buffers, booleans,
27453 * date objects, error objects, maps, numbers, `Object` objects, regexes,
27454 * sets, strings, symbols, and typed arrays. `Object` objects are compared
27455 * by their own, not inherited, enumerable properties. Functions and DOM
27456 * nodes are compared by strict equality, i.e. `===`.
27462 * @param {*} value The value to compare.
27463 * @param {*} other The other value to compare.
27464 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27467 * var object = { 'a': 1 };
27468 * var other = { 'a': 1 };
27470 * _.isEqual(object, other);
27473 * object === other;
27476 function isEqual(value, other) {
27477 return baseIsEqual(value, other);
27481 iD.Difference represents the difference between two graphs.
27482 It knows how to calculate the set of entities that were
27483 created, modified, or deleted, and also contains the logic
27484 for recursively extending a difference to the complete set
27485 of entities that will require a redraw, taking into account
27486 child and parent relationships.
27488 function coreDifference(base, head) {
27490 difference$$1 = {},
27494 function changed(h, b) {
27495 return h !== b && !isEqual(omit(h, 'v'), omit(b, 'v'));
27499 forEach(head.entities, function(h, id) {
27500 var b = base.entities[id];
27501 if (changed(h, b)) {
27502 changes[id] = {base: b, head: h};
27508 forEach(base.entities, function(b, id) {
27509 var h = head.entities[id];
27510 if (!changes[id] && changed(h, b)) {
27511 changes[id] = {base: b, head: h};
27517 function addParents(parents, result) {
27518 for (var i = 0; i < parents.length; i++) {
27519 var parent = parents[i];
27521 if (parent.id in result)
27524 result[parent.id] = parent;
27525 addParents(head.parentRelations(parent), result);
27530 difference$$1.length = function() {
27535 difference$$1.changes = function() {
27540 difference$$1.extantIDs = function() {
27542 forEach(changes, function(change, id) {
27543 if (change.head) result.push(id);
27549 difference$$1.modified = function() {
27551 forEach(changes, function(change) {
27552 if (change.base && change.head) result.push(change.head);
27558 difference$$1.created = function() {
27560 forEach(changes, function(change) {
27561 if (!change.base && change.head) result.push(change.head);
27567 difference$$1.deleted = function() {
27569 forEach(changes, function(change) {
27570 if (change.base && !change.head) result.push(change.base);
27576 difference$$1.summary = function() {
27579 function addEntity(entity, graph, changeType) {
27580 relevant[entity.id] = {
27583 changeType: changeType
27587 function addParents(entity) {
27588 var parents = head.parentWays(entity);
27589 for (var j = parents.length - 1; j >= 0; j--) {
27590 var parent = parents[j];
27591 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27595 forEach(changes, function(change) {
27596 if (change.head && change.head.geometry(head) !== 'vertex') {
27597 addEntity(change.head, head, change.base ? 'modified' : 'created');
27599 } else if (change.base && change.base.geometry(base) !== 'vertex') {
27600 addEntity(change.base, base, 'deleted');
27602 } else if (change.base && change.head) { // modified vertex
27603 var moved = !isEqual(change.base.loc, change.head.loc),
27604 retagged = !isEqual(change.base.tags, change.head.tags);
27607 addParents(change.head);
27610 if (retagged || (moved && change.head.hasInterestingTags())) {
27611 addEntity(change.head, head, 'modified');
27614 } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27615 addEntity(change.head, head, 'created');
27617 } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27618 addEntity(change.base, base, 'deleted');
27622 return values$1(relevant);
27626 difference$$1.complete = function(extent) {
27627 var result = {}, id, change;
27629 for (id in changes) {
27630 change = changes[id];
27632 var h = change.head,
27637 (!h || !h.intersects(extent, head)) &&
27638 (!b || !b.intersects(extent, base)))
27643 if (entity.type === 'way') {
27644 var nh = h ? h.nodes : [],
27645 nb = b ? b.nodes : [],
27648 diff = difference(nh, nb);
27649 for (i = 0; i < diff.length; i++) {
27650 result[diff[i]] = head.hasEntity(diff[i]);
27653 diff = difference(nb, nh);
27654 for (i = 0; i < diff.length; i++) {
27655 result[diff[i]] = head.hasEntity(diff[i]);
27659 addParents(head.parentWays(entity), result);
27660 addParents(head.parentRelations(entity), result);
27667 return difference$$1;
27670 /** Used for built-in method references. */
27671 var objectProto$18 = Object.prototype;
27673 /** Used to check objects for own properties. */
27674 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27677 * Assigns own enumerable string keyed properties of source objects to the
27678 * destination object. Source objects are applied from left to right.
27679 * Subsequent sources overwrite property assignments of previous sources.
27681 * **Note:** This method mutates `object` and is loosely based on
27682 * [`Object.assign`](https://mdn.io/Object/assign).
27688 * @param {Object} object The destination object.
27689 * @param {...Object} [sources] The source objects.
27690 * @returns {Object} Returns `object`.
27702 * Foo.prototype.b = 2;
27703 * Bar.prototype.d = 4;
27705 * _.assign({ 'a': 0 }, new Foo, new Bar);
27706 * // => { 'a': 1, 'c': 3 }
27708 var assign = createAssigner(function(object, source) {
27709 if (isPrototype(source) || isArrayLike(source)) {
27710 copyObject(source, keys$1(source), object);
27713 for (var key in source) {
27714 if (hasOwnProperty$15.call(source, key)) {
27715 assignValue(object, key, source[key]);
27720 /* Built-in method references for those with the same name as other `lodash` methods. */
27721 var nativeMax$3 = Math.max;
27724 * Checks if `value` is in `collection`. If `collection` is a string, it's
27725 * checked for a substring of `value`, otherwise
27726 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27727 * is used for equality comparisons. If `fromIndex` is negative, it's used as
27728 * the offset from the end of `collection`.
27733 * @category Collection
27734 * @param {Array|Object|string} collection The collection to inspect.
27735 * @param {*} value The value to search for.
27736 * @param {number} [fromIndex=0] The index to search from.
27737 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27738 * @returns {boolean} Returns `true` if `value` is found, else `false`.
27741 * _.includes([1, 2, 3], 1);
27744 * _.includes([1, 2, 3], 1, 2);
27747 * _.includes({ 'a': 1, 'b': 2 }, 1);
27750 * _.includes('abcd', 'bc');
27753 function includes(collection, value, fromIndex, guard) {
27754 collection = isArrayLike(collection) ? collection : values$1(collection);
27755 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27757 var length = collection.length;
27758 if (fromIndex < 0) {
27759 fromIndex = nativeMax$3(length + fromIndex, 0);
27761 return isString(collection)
27762 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27763 : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27766 function coreGraph$$1(other, mutable) {
27767 if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27769 if (other instanceof coreGraph$$1) {
27770 var base = other.base();
27771 this.entities = assign(Object.create(base.entities), other.entities);
27772 this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27773 this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27776 this.entities = Object.create({});
27777 this._parentWays = Object.create({});
27778 this._parentRels = Object.create({});
27779 this.rebase(other || [], [this]);
27782 this.transients = {};
27783 this._childNodes = {};
27784 this.frozen = !mutable;
27788 coreGraph$$1.prototype = {
27790 hasEntity: function(id) {
27791 return this.entities[id];
27795 entity: function(id) {
27796 var entity = this.entities[id];
27798 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27800 entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
27804 throw new Error('entity ' + id + ' not found');
27810 transient: function(entity, key, fn) {
27811 var id = entity.id,
27812 transients = this.transients[id] ||
27813 (this.transients[id] = {});
27815 if (transients[key] !== undefined) {
27816 return transients[key];
27819 transients[key] = fn.call(entity);
27821 return transients[key];
27825 parentWays: function(entity) {
27826 var parents = this._parentWays[entity.id],
27830 for (var i = 0; i < parents.length; i++) {
27831 result.push(this.entity(parents[i]));
27838 isPoi: function(entity) {
27839 var parentWays = this._parentWays[entity.id];
27840 return !parentWays || parentWays.length === 0;
27844 isShared: function(entity) {
27845 var parentWays = this._parentWays[entity.id];
27846 return parentWays && parentWays.length > 1;
27850 parentRelations: function(entity) {
27851 var parents = this._parentRels[entity.id],
27855 for (var i = 0; i < parents.length; i++) {
27856 result.push(this.entity(parents[i]));
27863 childNodes: function(entity) {
27864 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27865 if (!entity.nodes) return [];
27868 for (var i = 0; i < entity.nodes.length; i++) {
27869 nodes[i] = this.entity(entity.nodes[i]);
27872 if (debug) Object.freeze(nodes);
27874 this._childNodes[entity.id] = nodes;
27875 return this._childNodes[entity.id];
27881 'entities': utilGetPrototypeOf(this.entities),
27882 'parentWays': utilGetPrototypeOf(this._parentWays),
27883 'parentRels': utilGetPrototypeOf(this._parentRels)
27888 // Unlike other graph methods, rebase mutates in place. This is because it
27889 // is used only during the history operation that merges newly downloaded
27890 // data into each state. To external consumers, it should appear as if the
27891 // graph always contained the newly downloaded data.
27892 rebase: function(entities, stack, force) {
27893 var base = this.base(),
27896 for (i = 0; i < entities.length; i++) {
27897 var entity = entities[i];
27899 if (!entity.visible || (!force && base.entities[entity.id]))
27902 // Merging data into the base graph
27903 base.entities[entity.id] = entity;
27904 this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27906 // Restore provisionally-deleted nodes that are discovered to have an extant parent
27907 if (entity.type === 'way') {
27908 for (j = 0; j < entity.nodes.length; j++) {
27909 id = entity.nodes[j];
27910 for (k = 1; k < stack.length; k++) {
27911 var ents = stack[k].entities;
27912 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27920 for (i = 0; i < stack.length; i++) {
27921 stack[i]._updateRebased();
27926 _updateRebased: function() {
27927 var base = this.base(),
27928 i, k, child, id, keys;
27930 keys = Object.keys(this._parentWays);
27931 for (i = 0; i < keys.length; i++) {
27933 if (base.parentWays[child]) {
27934 for (k = 0; k < base.parentWays[child].length; k++) {
27935 id = base.parentWays[child][k];
27936 if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27937 this._parentWays[child].push(id);
27943 keys = Object.keys(this._parentRels);
27944 for (i = 0; i < keys.length; i++) {
27946 if (base.parentRels[child]) {
27947 for (k = 0; k < base.parentRels[child].length; k++) {
27948 id = base.parentRels[child][k];
27949 if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27950 this._parentRels[child].push(id);
27956 this.transients = {};
27958 // this._childNodes is not updated, under the assumption that
27959 // ways are always downloaded with their child nodes.
27963 // Updates calculated properties (parentWays, parentRels) for the specified change
27964 _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27966 parentWays = parentWays || this._parentWays;
27967 parentRels = parentRels || this._parentRels;
27969 var type = entity && entity.type || oldentity && oldentity.type,
27970 removed, added, ways, rels, i;
27973 if (type === 'way') {
27975 // Update parentWays
27976 if (oldentity && entity) {
27977 removed = difference(oldentity.nodes, entity.nodes);
27978 added = difference(entity.nodes, oldentity.nodes);
27979 } else if (oldentity) {
27980 removed = oldentity.nodes;
27982 } else if (entity) {
27984 added = entity.nodes;
27986 for (i = 0; i < removed.length; i++) {
27987 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27989 for (i = 0; i < added.length; i++) {
27990 ways = without(parentWays[added[i]], entity.id);
27991 ways.push(entity.id);
27992 parentWays[added[i]] = ways;
27995 } else if (type === 'relation') {
27997 // Update parentRels
27998 if (oldentity && entity) {
27999 removed = difference(oldentity.members, entity.members);
28000 added = difference(entity.members, oldentity);
28001 } else if (oldentity) {
28002 removed = oldentity.members;
28004 } else if (entity) {
28006 added = entity.members;
28008 for (i = 0; i < removed.length; i++) {
28009 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28011 for (i = 0; i < added.length; i++) {
28012 rels = without(parentRels[added[i].id], entity.id);
28013 rels.push(entity.id);
28014 parentRels[added[i].id] = rels;
28020 replace: function(entity) {
28021 if (this.entities[entity.id] === entity)
28024 return this.update(function() {
28025 this._updateCalculated(this.entities[entity.id], entity);
28026 this.entities[entity.id] = entity;
28031 remove: function(entity) {
28032 return this.update(function() {
28033 this._updateCalculated(entity, undefined);
28034 this.entities[entity.id] = undefined;
28039 revert: function(id) {
28040 var baseEntity = this.base().entities[id],
28041 headEntity = this.entities[id];
28043 if (headEntity === baseEntity)
28046 return this.update(function() {
28047 this._updateCalculated(headEntity, baseEntity);
28048 delete this.entities[id];
28053 update: function() {
28054 var graph = this.frozen ? coreGraph$$1(this, true) : this;
28056 for (var i = 0; i < arguments.length; i++) {
28057 arguments[i].call(graph, graph);
28060 if (this.frozen) graph.frozen = true;
28066 // Obliterates any existing entities
28067 load: function(entities) {
28068 var base = this.base();
28069 this.entities = Object.create(base.entities);
28071 for (var i in entities) {
28072 this.entities[i] = entities[i];
28073 this._updateCalculated(base.entities[i], this.entities[i]);
28080 var quickselect = partialSort;
28082 // Floyd-Rivest selection algorithm:
28083 // Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
28084 // The k-th element will have the (k - left + 1)th smallest value in [left, right]
28086 function partialSort(arr, k, left, right, compare) {
28088 right = right || (arr.length - 1);
28089 compare = compare || defaultCompare;
28091 while (right > left) {
28092 if (right - left > 600) {
28093 var n = right - left + 1;
28094 var m = k - left + 1;
28095 var z = Math.log(n);
28096 var s = 0.5 * Math.exp(2 * z / 3);
28097 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28098 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28099 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28100 partialSort(arr, k, newLeft, newRight, compare);
28107 swap(arr, left, k);
28108 if (compare(arr[right], t) > 0) swap(arr, left, right);
28114 while (compare(arr[i], t) < 0) i++;
28115 while (compare(arr[j], t) > 0) j--;
28118 if (compare(arr[left], t) === 0) swap(arr, left, j);
28121 swap(arr, j, right);
28124 if (j <= k) left = j + 1;
28125 if (k <= j) right = j - 1;
28129 function swap(arr, i, j) {
28135 function defaultCompare(a, b) {
28136 return a < b ? -1 : a > b ? 1 : 0;
28139 var rbush_1 = rbush;
28143 function rbush(maxEntries, format) {
28144 if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28146 // max entries in a node is 9 by default; min node fill is 40% for best performance
28147 this._maxEntries = Math.max(4, maxEntries || 9);
28148 this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28151 this._initFormat(format);
28157 rbush.prototype = {
28160 return this._all(this.data, []);
28163 search: function (bbox) {
28165 var node = this.data,
28167 toBBox = this.toBBox;
28169 if (!intersects$1(bbox, node)) return result;
28171 var nodesToSearch = [],
28172 i, len, child, childBBox;
28175 for (i = 0, len = node.children.length; i < len; i++) {
28177 child = node.children[i];
28178 childBBox = node.leaf ? toBBox(child) : child;
28180 if (intersects$1(bbox, childBBox)) {
28181 if (node.leaf) result.push(child);
28182 else if (contains$2(bbox, childBBox)) this._all(child, result);
28183 else nodesToSearch.push(child);
28186 node = nodesToSearch.pop();
28192 collides: function (bbox) {
28194 var node = this.data,
28195 toBBox = this.toBBox;
28197 if (!intersects$1(bbox, node)) return false;
28199 var nodesToSearch = [],
28200 i, len, child, childBBox;
28203 for (i = 0, len = node.children.length; i < len; i++) {
28205 child = node.children[i];
28206 childBBox = node.leaf ? toBBox(child) : child;
28208 if (intersects$1(bbox, childBBox)) {
28209 if (node.leaf || contains$2(bbox, childBBox)) return true;
28210 nodesToSearch.push(child);
28213 node = nodesToSearch.pop();
28219 load: function (data) {
28220 if (!(data && data.length)) return this;
28222 if (data.length < this._minEntries) {
28223 for (var i = 0, len = data.length; i < len; i++) {
28224 this.insert(data[i]);
28229 // recursively build the tree with the given data from stratch using OMT algorithm
28230 var node = this._build(data.slice(), 0, data.length - 1, 0);
28232 if (!this.data.children.length) {
28233 // save as is if tree is empty
28236 } else if (this.data.height === node.height) {
28237 // split root if trees have the same height
28238 this._splitRoot(this.data, node);
28241 if (this.data.height < node.height) {
28242 // swap trees if inserted one is bigger
28243 var tmpNode = this.data;
28248 // insert the small tree into the large tree at appropriate level
28249 this._insert(node, this.data.height - node.height - 1, true);
28255 insert: function (item) {
28256 if (item) this._insert(item, this.data.height - 1);
28260 clear: function () {
28261 this.data = createNode([]);
28265 remove: function (item, equalsFn) {
28266 if (!item) return this;
28268 var node = this.data,
28269 bbox = this.toBBox(item),
28272 i, parent, index, goingUp;
28274 // depth-first iterative tree traversal
28275 while (node || path.length) {
28277 if (!node) { // go up
28279 parent = path[path.length - 1];
28284 if (node.leaf) { // check current node
28285 index = findItem(item, node.children, equalsFn);
28287 if (index !== -1) {
28288 // item found, remove the item and condense tree upwards
28289 node.children.splice(index, 1);
28291 this._condense(path);
28296 if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28301 node = node.children[0];
28303 } else if (parent) { // go right
28305 node = parent.children[i];
28308 } else node = null; // nothing found
28314 toBBox: function (item) { return item; },
28316 compareMinX: compareNodeMinX,
28317 compareMinY: compareNodeMinY,
28319 toJSON: function () { return this.data; },
28321 fromJSON: function (data) {
28326 _all: function (node, result) {
28327 var nodesToSearch = [];
28329 if (node.leaf) result.push.apply(result, node.children);
28330 else nodesToSearch.push.apply(nodesToSearch, node.children);
28332 node = nodesToSearch.pop();
28337 _build: function (items, left, right, height) {
28339 var N = right - left + 1,
28340 M = this._maxEntries,
28344 // reached leaf level; return leaf
28345 node = createNode(items.slice(left, right + 1));
28346 calcBBox(node, this.toBBox);
28351 // target height of the bulk-loaded tree
28352 height = Math.ceil(Math.log(N) / Math.log(M));
28354 // target number of root entries to maximize storage utilization
28355 M = Math.ceil(N / Math.pow(M, height - 1));
28358 node = createNode([]);
28360 node.height = height;
28362 // split the items into M mostly square tiles
28364 var N2 = Math.ceil(N / M),
28365 N1 = N2 * Math.ceil(Math.sqrt(M)),
28366 i, j, right2, right3;
28368 multiSelect(items, left, right, N1, this.compareMinX);
28370 for (i = left; i <= right; i += N1) {
28372 right2 = Math.min(i + N1 - 1, right);
28374 multiSelect(items, i, right2, N2, this.compareMinY);
28376 for (j = i; j <= right2; j += N2) {
28378 right3 = Math.min(j + N2 - 1, right2);
28380 // pack each entry recursively
28381 node.children.push(this._build(items, j, right3, height - 1));
28385 calcBBox(node, this.toBBox);
28390 _chooseSubtree: function (bbox, node, level, path) {
28392 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28397 if (node.leaf || path.length - 1 === level) break;
28399 minArea = minEnlargement = Infinity;
28401 for (i = 0, len = node.children.length; i < len; i++) {
28402 child = node.children[i];
28403 area = bboxArea(child);
28404 enlargement = enlargedArea(bbox, child) - area;
28406 // choose entry with the least area enlargement
28407 if (enlargement < minEnlargement) {
28408 minEnlargement = enlargement;
28409 minArea = area < minArea ? area : minArea;
28410 targetNode = child;
28412 } else if (enlargement === minEnlargement) {
28413 // otherwise choose one with the smallest area
28414 if (area < minArea) {
28416 targetNode = child;
28421 node = targetNode || node.children[0];
28427 _insert: function (item, level, isNode) {
28429 var toBBox = this.toBBox,
28430 bbox = isNode ? item : toBBox(item),
28433 // find the best node for accommodating the item, saving all nodes along the path too
28434 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28436 // put the item into the node
28437 node.children.push(item);
28438 extend$1(node, bbox);
28440 // split on node overflow; propagate upwards if necessary
28441 while (level >= 0) {
28442 if (insertPath[level].children.length > this._maxEntries) {
28443 this._split(insertPath, level);
28448 // adjust bboxes along the insertion path
28449 this._adjustParentBBoxes(bbox, insertPath, level);
28452 // split overflowed node into two
28453 _split: function (insertPath, level) {
28455 var node = insertPath[level],
28456 M = node.children.length,
28457 m = this._minEntries;
28459 this._chooseSplitAxis(node, m, M);
28461 var splitIndex = this._chooseSplitIndex(node, m, M);
28463 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28464 newNode.height = node.height;
28465 newNode.leaf = node.leaf;
28467 calcBBox(node, this.toBBox);
28468 calcBBox(newNode, this.toBBox);
28470 if (level) insertPath[level - 1].children.push(newNode);
28471 else this._splitRoot(node, newNode);
28474 _splitRoot: function (node, newNode) {
28476 this.data = createNode([node, newNode]);
28477 this.data.height = node.height + 1;
28478 this.data.leaf = false;
28479 calcBBox(this.data, this.toBBox);
28482 _chooseSplitIndex: function (node, m, M) {
28484 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28486 minOverlap = minArea = Infinity;
28488 for (i = m; i <= M - m; i++) {
28489 bbox1 = distBBox(node, 0, i, this.toBBox);
28490 bbox2 = distBBox(node, i, M, this.toBBox);
28492 overlap = intersectionArea(bbox1, bbox2);
28493 area = bboxArea(bbox1) + bboxArea(bbox2);
28495 // choose distribution with minimum overlap
28496 if (overlap < minOverlap) {
28497 minOverlap = overlap;
28500 minArea = area < minArea ? area : minArea;
28502 } else if (overlap === minOverlap) {
28503 // otherwise choose distribution with minimum area
28504 if (area < minArea) {
28514 // sorts node children by the best axis for split
28515 _chooseSplitAxis: function (node, m, M) {
28517 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28518 compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28519 xMargin = this._allDistMargin(node, m, M, compareMinX),
28520 yMargin = this._allDistMargin(node, m, M, compareMinY);
28522 // if total distributions margin value is minimal for x, sort by minX,
28523 // otherwise it's already sorted by minY
28524 if (xMargin < yMargin) node.children.sort(compareMinX);
28527 // total margin of all possible split distributions where each node is at least m full
28528 _allDistMargin: function (node, m, M, compare) {
28530 node.children.sort(compare);
28532 var toBBox = this.toBBox,
28533 leftBBox = distBBox(node, 0, m, toBBox),
28534 rightBBox = distBBox(node, M - m, M, toBBox),
28535 margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28538 for (i = m; i < M - m; i++) {
28539 child = node.children[i];
28540 extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28541 margin += bboxMargin(leftBBox);
28544 for (i = M - m - 1; i >= m; i--) {
28545 child = node.children[i];
28546 extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28547 margin += bboxMargin(rightBBox);
28553 _adjustParentBBoxes: function (bbox, path, level) {
28554 // adjust bboxes along the given tree path
28555 for (var i = level; i >= 0; i--) {
28556 extend$1(path[i], bbox);
28560 _condense: function (path) {
28561 // go through the path, removing empty nodes and updating bboxes
28562 for (var i = path.length - 1, siblings; i >= 0; i--) {
28563 if (path[i].children.length === 0) {
28565 siblings = path[i - 1].children;
28566 siblings.splice(siblings.indexOf(path[i]), 1);
28568 } else this.clear();
28570 } else calcBBox(path[i], this.toBBox);
28574 _initFormat: function (format) {
28575 // data format (minX, minY, maxX, maxY accessors)
28577 // uses eval-type function compilation instead of just accepting a toBBox function
28578 // because the algorithms are very sensitive to sorting functions performance,
28579 // so they should be dead simple and without inner calls
28581 var compareArr = ['return a', ' - b', ';'];
28583 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28584 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28586 this.toBBox = new Function('a',
28587 'return {minX: a' + format[0] +
28588 ', minY: a' + format[1] +
28589 ', maxX: a' + format[2] +
28590 ', maxY: a' + format[3] + '};');
28594 function findItem(item, items, equalsFn) {
28595 if (!equalsFn) return items.indexOf(item);
28597 for (var i = 0; i < items.length; i++) {
28598 if (equalsFn(item, items[i])) return i;
28603 // calculate node's bbox from bboxes of its children
28604 function calcBBox(node, toBBox) {
28605 distBBox(node, 0, node.children.length, toBBox, node);
28608 // min bounding rectangle of node children from k to p-1
28609 function distBBox(node, k, p, toBBox, destNode) {
28610 if (!destNode) destNode = createNode(null);
28611 destNode.minX = Infinity;
28612 destNode.minY = Infinity;
28613 destNode.maxX = -Infinity;
28614 destNode.maxY = -Infinity;
28616 for (var i = k, child; i < p; i++) {
28617 child = node.children[i];
28618 extend$1(destNode, node.leaf ? toBBox(child) : child);
28624 function extend$1(a, b) {
28625 a.minX = Math.min(a.minX, b.minX);
28626 a.minY = Math.min(a.minY, b.minY);
28627 a.maxX = Math.max(a.maxX, b.maxX);
28628 a.maxY = Math.max(a.maxY, b.maxY);
28632 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28633 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28635 function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28636 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28638 function enlargedArea(a, b) {
28639 return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28640 (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28643 function intersectionArea(a, b) {
28644 var minX = Math.max(a.minX, b.minX),
28645 minY = Math.max(a.minY, b.minY),
28646 maxX = Math.min(a.maxX, b.maxX),
28647 maxY = Math.min(a.maxY, b.maxY);
28649 return Math.max(0, maxX - minX) *
28650 Math.max(0, maxY - minY);
28653 function contains$2(a, b) {
28654 return a.minX <= b.minX &&
28655 a.minY <= b.minY &&
28656 b.maxX <= a.maxX &&
28660 function intersects$1(a, b) {
28661 return b.minX <= a.maxX &&
28662 b.minY <= a.maxY &&
28663 b.maxX >= a.minX &&
28667 function createNode(children) {
28669 children: children,
28679 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28680 // combines selection algorithm with binary divide & conquer approach
28682 function multiSelect(arr, left, right, n, compare) {
28683 var stack = [left, right],
28686 while (stack.length) {
28687 right = stack.pop();
28688 left = stack.pop();
28690 if (right - left <= n) continue;
28692 mid = left + Math.ceil((right - left) / n / 2) * n;
28693 quickselect(arr, mid, left, right, compare);
28695 stack.push(left, mid, mid, right);
28699 function coreTree(head) {
28700 var rtree = rbush_1(),
28705 function entityBBox(entity) {
28706 var bbox = entity.extent(head).bbox();
28707 bbox.id = entity.id;
28708 bboxes[entity.id] = bbox;
28713 function updateParents(entity, insertions, memo) {
28714 head.parentWays(entity).forEach(function(way) {
28715 if (bboxes[way.id]) {
28716 rtree.remove(bboxes[way.id]);
28717 insertions[way.id] = way;
28719 updateParents(way, insertions, memo);
28722 head.parentRelations(entity).forEach(function(relation) {
28723 if (memo[entity.id]) return;
28724 memo[entity.id] = true;
28725 if (bboxes[relation.id]) {
28726 rtree.remove(bboxes[relation.id]);
28727 insertions[relation.id] = relation;
28729 updateParents(relation, insertions, memo);
28734 tree.rebase = function(entities, force) {
28735 var insertions = {};
28737 for (var i = 0; i < entities.length; i++) {
28738 var entity = entities[i];
28740 if (!entity.visible)
28743 if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28746 } else if (bboxes[entity.id]) {
28747 rtree.remove(bboxes[entity.id]);
28751 insertions[entity.id] = entity;
28752 updateParents(entity, insertions, {});
28755 rtree.load(map$4(insertions, entityBBox));
28761 tree.intersects = function(extent, graph) {
28762 if (graph !== head) {
28763 var diff = coreDifference(head, graph),
28768 diff.deleted().forEach(function(entity) {
28769 rtree.remove(bboxes[entity.id]);
28770 delete bboxes[entity.id];
28773 diff.modified().forEach(function(entity) {
28774 rtree.remove(bboxes[entity.id]);
28775 insertions[entity.id] = entity;
28776 updateParents(entity, insertions, {});
28779 diff.created().forEach(function(entity) {
28780 insertions[entity.id] = entity;
28783 rtree.load(map$4(insertions, entityBBox));
28786 return rtree.search(extent.bbox()).map(function(bbox) {
28787 return head.entity(bbox.id);
28796 * This code is licensed under the MIT license.
28798 * Copyright © 2013, iD authors.
28800 * Portions copyright © 2011, Keith Cirkel
28801 * See https://github.com/keithamus/jwerty
28804 function d3keybinding(namespace$$1) {
28808 function testBindings(isCapturing) {
28809 var didMatch = false,
28812 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28813 // so we don't strictly match on the shift key, but we prioritize
28814 // shifted bindings first, and fallback to unshifted only if no match.
28815 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28817 // priority match shifted bindings first
28818 for (i = 0; i < bindings.length; i++) {
28819 binding = bindings[i];
28820 if (!binding.event.modifiers.shiftKey) continue; // no shift
28821 if (!!binding.capture !== isCapturing) continue;
28822 if (matches(binding, true)) {
28823 binding.callback();
28828 // then unshifted bindings
28829 if (didMatch) return;
28830 for (i = 0; i < bindings.length; i++) {
28831 binding = bindings[i];
28832 if (binding.event.modifiers.shiftKey) continue; // shift
28833 if (!!binding.capture !== isCapturing) continue;
28834 if (matches(binding, false)) {
28835 binding.callback();
28840 function matches(binding, testShift) {
28841 var event$$1 = event;
28842 if (event$$1.key !== undefined) {
28843 if (binding.event.key === undefined) {
28845 } else if (Array.isArray(binding.event.key)) {
28846 if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28849 if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28853 // check keycodes if browser doesn't support KeyboardEvent.key
28854 if (event$$1.keyCode !== binding.event.keyCode)
28858 // test modifier keys
28859 if (!(event$$1.ctrlKey && event$$1.altKey)) { // if both are set, assume AltGr and skip it - #4096
28860 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28861 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28863 if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28864 if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28871 function capture() {
28872 testBindings(true);
28876 function bubble() {
28877 var tagName = d3_select(event.target).node().tagName;
28878 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28881 testBindings(false);
28885 function keybinding(selection$$1) {
28886 selection$$1 = selection$$1 || d3_select(document);
28887 selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28888 selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28893 keybinding.off = function(selection$$1) {
28895 selection$$1 = selection$$1 || d3_select(document);
28896 selection$$1.on('keydown.capture' + namespace$$1, null);
28897 selection$$1.on('keydown.bubble' + namespace$$1, null);
28902 keybinding.on = function(codes, callback, capture) {
28903 var arr = [].concat(codes);
28904 for (var i = 0; i < arr.length; i++) {
28909 keyCode: 0, // only for browsers that don't support KeyboardEvent.key
28921 code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28923 for (var j = 0; j < code.length; j++) {
28924 // Normalise matching errors
28925 if (code[j] === '++') code[j] = '+';
28927 if (code[j] in d3keybinding.modifierCodes) {
28928 binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28930 binding.event.key = d3keybinding.keys[code[j]] || code[j];
28931 if (code[j] in d3keybinding.keyCodes) {
28932 binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28937 bindings.push(binding);
28947 d3keybinding.modifierCodes = {
28949 '⇧': 16, shift: 16,
28950 // CTRL key, on Mac: ⌃
28952 // ALT key, on Mac: ⌥ (Alt)
28953 '⌥': 18, alt: 18, option: 18,
28954 // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28955 '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28958 d3keybinding.modifierProperties = {
28965 d3keybinding.keys = {
28966 // Backspace key, on Mac: ⌫ (Backspace)
28967 '⌫': 'Backspace', backspace: 'Backspace',
28968 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28969 '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28971 '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28973 'pause': 'Pause', 'pause-break': 'Pause',
28974 // Caps Lock key, ⇪
28975 '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28976 // Escape key, on Mac: ⎋, on Windows: Esc
28977 '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28979 space: [' ', 'Spacebar'],
28980 // Page-Up key, or pgup, on Mac: ↖
28981 '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28982 // Page-Down key, or pgdown, on Mac: ↘
28983 '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28984 // END key, on Mac: ⇟
28985 '⇟': 'End', end: 'End',
28986 // HOME key, on Mac: ⇞
28987 '⇞': 'Home', home: 'Home',
28988 // Insert key, or ins
28989 ins: 'Insert', insert: 'Insert',
28990 // Delete key, on Mac: ⌦ (Delete)
28991 '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28992 // Left Arrow Key, or ←
28993 '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28994 // Up Arrow Key, or ↑
28995 '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
28996 // Right Arrow Key, or →
28997 '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
28998 // Up Arrow Key, or ↓
28999 '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29000 // odities, stuff for backward compatibility (browsers and code):
29001 // Num-Multiply, or *
29002 '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29004 '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29005 // Num-Subtract, or -
29006 '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29013 // Period, or ., or full-stop
29014 period: '.', 'full-stop': '.',
29015 // Slash, or /, or forward-slash
29016 slash: '/', 'forward-slash': '/',
29017 // Tick, or `, or back-quote
29018 tick: '`', 'back-quote': '`',
29019 // Open bracket, or [
29020 'open-bracket': '[',
29021 // Back slash, or \
29022 'back-slash': '\\',
29023 // Close backet, or ]
29024 'close-bracket': ']',
29025 // Apostrophe, or Quote, or '
29026 quote: '\'', apostrophe: '\'',
29066 d3keybinding.keyCodes = {
29067 // Backspace key, on Mac: ⌫ (Backspace)
29068 '⌫': 8, backspace: 8,
29069 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29070 '⇥': 9, '⇆': 9, tab: 9,
29072 '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29074 'pause': 19, 'pause-break': 19,
29075 // Caps Lock key, ⇪
29076 '⇪': 20, caps: 20, 'caps-lock': 20,
29077 // Escape key, on Mac: ⎋, on Windows: Esc
29078 '⎋': 27, escape: 27, esc: 27,
29081 // Page-Up key, or pgup, on Mac: ↖
29082 '↖': 33, pgup: 33, 'page-up': 33,
29083 // Page-Down key, or pgdown, on Mac: ↘
29084 '↘': 34, pgdown: 34, 'page-down': 34,
29085 // END key, on Mac: ⇟
29087 // HOME key, on Mac: ⇞
29089 // Insert key, or ins
29090 ins: 45, insert: 45,
29091 // Delete key, on Mac: ⌦ (Delete)
29092 '⌦': 46, del: 46, 'delete': 46,
29093 // Left Arrow Key, or ←
29094 '←': 37, left: 37, 'arrow-left': 37,
29095 // Up Arrow Key, or ↑
29096 '↑': 38, up: 38, 'arrow-up': 38,
29097 // Right Arrow Key, or →
29098 '→': 39, right: 39, 'arrow-right': 39,
29099 // Up Arrow Key, or ↓
29100 '↓': 40, down: 40, 'arrow-down': 40,
29101 // odities, printing characters that come out wrong:
29104 // Num-Multiply, or *
29105 '*': 106, star: 106, asterisk: 106, multiply: 106,
29107 '+': 107, 'plus': 107,
29108 // Num-Subtract, or -
29109 '-': 109, subtract: 109,
29115 ';': 186, semicolon: 186,
29117 '=': 187, 'equals': 187,
29119 ',': 188, comma: 188,
29120 // Dash / Underscore key
29122 // Period, or ., or full-stop
29123 '.': 190, period: 190, 'full-stop': 190,
29124 // Slash, or /, or forward-slash
29125 '/': 191, slash: 191, 'forward-slash': 191,
29126 // Tick, or `, or back-quote
29127 '`': 192, tick: 192, 'back-quote': 192,
29128 // Open bracket, or [
29129 '[': 219, 'open-bracket': 219,
29130 // Back slash, or \
29131 '\\': 220, 'back-slash': 220,
29132 // Close backet, or ]
29133 ']': 221, 'close-bracket': 221,
29134 // Apostrophe, or Quote, or '
29135 '\'': 222, quote: 222, apostrophe: 222
29141 while (++i$1 < 106) {
29142 d3keybinding.keyCodes['num-' + n] = i$1;
29148 while (++i$1 < 58) {
29149 d3keybinding.keyCodes[n] = i$1;
29155 while (++i$1 < 136) {
29156 d3keybinding.keyCodes['f' + n] = i$1;
29162 while (++i$1 < 91) {
29163 d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29166 function tooltip() {
29167 var tooltip = function(selection$$1) {
29168 selection$$1.each(setup);
29170 animation = utilFunctor(false),
29171 html = utilFunctor(false),
29172 title = function() {
29173 var title = this.getAttribute('data-original-title');
29177 title = this.getAttribute('title');
29178 this.removeAttribute('title');
29179 this.setAttribute('data-original-title', title);
29183 over = 'mouseenter.tooltip',
29184 out = 'mouseleave.tooltip',
29185 placement = utilFunctor('top');
29188 tooltip.title = function(_) {
29189 if (arguments.length) {
29190 title = utilFunctor(_);
29198 tooltip.html = function(_) {
29199 if (arguments.length) {
29200 html = utilFunctor(_);
29208 tooltip.placement = function(_) {
29209 if (arguments.length) {
29210 placement = utilFunctor(_);
29218 tooltip.show = function(selection$$1) {
29219 selection$$1.each(show);
29223 tooltip.hide = function(selection$$1) {
29224 selection$$1.each(hide);
29228 tooltip.toggle = function(selection$$1) {
29229 selection$$1.each(toggle);
29233 tooltip.destroy = function(selection$$1) {
29237 .attr('title', function() {
29238 return this.getAttribute('data-original-title') || this.getAttribute('title');
29240 .attr('data-original-title', null)
29241 .selectAll('.tooltip')
29247 var root = d3_select(this),
29248 animate = animation.apply(this, arguments),
29249 tip = root.selectAll('.tooltip').data([0]);
29251 var enter = tip.enter()
29253 .attr('class', 'tooltip');
29257 .attr('class', 'tooltip-arrow');
29261 .attr('class', 'tooltip-inner');
29267 tip.classed('fade', true);
29270 var place = placement.apply(this, arguments);
29271 tip.classed(place, true);
29273 root.on(over, show);
29274 root.on(out, hide);
29279 var root = d3_select(this),
29280 content = title.apply(this, arguments),
29281 tip = root.selectAll('.tooltip')
29282 .classed('in', true),
29283 markup = html.apply(this, arguments);
29285 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29286 var place = placement.apply(this, arguments),
29287 outer = getPosition(root.node()),
29288 inner = getPosition(tip.node()),
29293 pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29296 pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29299 pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29302 pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29307 tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29309 tip.style('left', null).style('top', null);
29312 this.tooltipVisible = true;
29317 d3_select(this).selectAll('.tooltip')
29318 .classed('in', false);
29320 this.tooltipVisible = false;
29324 function toggle() {
29325 if (this.tooltipVisible) {
29326 hide.apply(this, arguments);
29328 show.apply(this, arguments);
29336 function getPosition(node) {
29337 var mode = d3_select(node).style('position');
29338 if (mode === 'absolute' || mode === 'static') {
29340 x: node.offsetLeft,
29342 w: node.offsetWidth,
29343 h: node.offsetHeight
29349 w: node.offsetWidth,
29350 h: node.offsetHeight
29355 function svgAreas$$1(projection, context) {
29356 // Patterns only work in Firefox when set directly on element.
29357 // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
29360 cemetery: 'cemetery',
29361 construction: 'construction',
29363 farmland: 'farmland',
29364 grave_yard: 'cemetery',
29366 military: 'construction',
29367 orchard: 'orchard',
29370 wetland: 'wetland',
29373 var patternKeys = ['landuse', 'natural', 'amenity'];
29376 function setPattern(d) {
29377 for (var i = 0; i < patternKeys.length; i++) {
29378 if (d.tags.building && d.tags.building !== 'no') continue;
29380 if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
29381 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
29385 this.style.fill = this.style.stroke = '';
29389 return function drawAreas(selection, graph, entities, filter) {
29390 var path = svgPath(projection, graph, true),
29394 for (var i = 0; i < entities.length; i++) {
29395 var entity = entities[i];
29396 if (entity.geometry(graph) !== 'area') continue;
29398 multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
29399 if (multipolygon) {
29400 areas[multipolygon.id] = {
29401 entity: multipolygon.mergeTags(entity.tags),
29402 area: Math.abs(entity.area(graph))
29404 } else if (!areas[entity.id]) {
29405 areas[entity.id] = {
29407 area: Math.abs(entity.area(graph))
29412 areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
29413 areas.sort(function areaSort(a, b) { return b.area - a.area; });
29414 areas = map$4(areas, 'entity');
29416 var strokes = areas.filter(function(area) {
29417 return area.type === 'way';
29427 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
29429 .data(data.clip, osmEntity$$1.key);
29434 var clipPathsEnter = clipPaths.enter()
29435 .append('clipPath')
29436 .attr('class', 'clipPath')
29437 .attr('id', function(entity) { return entity.id + '-clippath'; });
29442 clipPaths.merge(clipPathsEnter)
29447 var layer = selection.selectAll('.layer-areas');
29449 var areagroup = layer
29450 .selectAll('g.areagroup')
29451 .data(['fill', 'shadow', 'stroke']);
29453 areagroup = areagroup.enter()
29455 .attr('class', function(d) { return 'areagroup area-' + d; })
29458 var paths = areagroup
29461 .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
29466 var fills = selection.selectAll('.area-fill path.area').nodes();
29468 var bisect = d3_bisector(function(node) {
29469 return -node.__data__.area(graph);
29472 function sortedByArea(entity) {
29473 if (this._parent.__data__ === 'fill') {
29474 return fills[bisect(fills, -entity.area(graph))];
29478 paths = paths.enter()
29479 .insert('path', sortedByArea)
29481 .each(function(entity) {
29482 var layer = this.parentNode.__data__;
29484 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
29486 if (layer === 'fill') {
29487 this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
29488 setPattern.apply(this, arguments);
29491 .call(svgTagClasses())
29496 function svgDebug(projection$$1, context) {
29498 function multipolygons(imagery) {
29499 return imagery.map(function(data$$1) {
29501 type: 'MultiPolygon',
29502 coordinates: [ data$$1.polygon ]
29507 function drawDebug(selection$$1) {
29508 var showsTile = context.getDebug('tile'),
29509 showsCollision = context.getDebug('collision'),
29510 showsImagery = context.getDebug('imagery'),
29511 showsImperial = context.getDebug('imperial'),
29512 showsDriveLeft = context.getDebug('driveLeft'),
29513 path = d3_geoPath(projection$$1);
29516 var debugData = [];
29518 debugData.push({ class: 'red', label: 'tile' });
29520 if (showsCollision) {
29521 debugData.push({ class: 'yellow', label: 'collision' });
29523 if (showsImagery) {
29524 debugData.push({ class: 'orange', label: 'imagery' });
29526 if (showsImperial) {
29527 debugData.push({ class: 'cyan', label: 'imperial' });
29529 if (showsDriveLeft) {
29530 debugData.push({ class: 'green', label: 'driveLeft' });
29534 var legend = d3_select('#content')
29535 .selectAll('.debug-legend')
29536 .data(debugData.length ? [0] : []);
29541 legend = legend.enter()
29543 .attr('class', 'fillD debug-legend')
29547 var legendItems = legend.selectAll('.debug-legend-item')
29548 .data(debugData, function(d) { return d.label; });
29553 legendItems.enter()
29555 .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
29556 .text(function(d) { return d.label; });
29559 var layer = selection$$1.selectAll('.layer-debug')
29560 .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
29565 layer = layer.enter()
29567 .attr('class', 'layer-debug')
29571 var extent = context.map().extent(),
29572 dataImagery = data.imagery || [],
29573 availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
29574 if (!source.polygon) return false;
29575 return source.polygon.some(function(polygon) {
29576 return geoPolygonIntersectsPolygon(polygon, extent, true);
29580 var imagery = layer.selectAll('path.debug-imagery')
29581 .data(showsImagery ? availableImagery : []);
29588 .attr('class', 'debug-imagery debug orange');
29591 var imperial = layer
29592 .selectAll('path.debug-imperial')
29593 .data(showsImperial ? [dataImperial] : []);
29600 .attr('class', 'debug-imperial debug cyan');
29603 var driveLeft = layer
29604 .selectAll('path.debug-drive-left')
29605 .data(showsDriveLeft ? [dataDriveLeft] : []);
29612 .attr('class', 'debug-drive-left debug green');
29616 layer.selectAll('path')
29621 // This looks strange because `enabled` methods on other layers are
29622 // chainable getter/setters, and this one is just a getter.
29623 drawDebug.enabled = function() {
29624 if (!arguments.length) {
29625 return context.getDebug('tile') ||
29626 context.getDebug('collision') ||
29627 context.getDebug('imagery') ||
29628 context.getDebug('imperial') ||
29629 context.getDebug('driveLeft');
29640 A standalone SVG element that contains only a `defs` sub-element. To be
29641 used once globally, since defs IDs must be unique within a document.
29643 function svgDefs(context) {
29645 function SVGSpriteDefinition(id, href) {
29646 return function(defs) {
29648 .mimeType('image/svg+xml')
29649 .response(function(xhr) { return xhr.responseXML; })
29650 .get(function(err, svg) {
29652 defs.node().appendChild(
29653 d3_select(svg.documentElement).attr('id', id).node()
29660 return function drawDefs(selection$$1) {
29661 var defs = selection$$1.append('defs');
29664 defs.append('marker')
29665 .attr('id', 'oneway-marker')
29666 .attr('viewBox', '0 0 10 10')
29669 .attr('markerWidth', 2)
29670 .attr('markerHeight', 2)
29671 .attr('markerUnits', 'strokeWidth')
29672 .attr('orient', 'auto')
29675 .attr('class', 'oneway')
29676 .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z')
29677 .attr('stroke', 'none')
29678 .attr('fill', '#000')
29679 .attr('opacity', '0.75');
29682 var patterns = defs.selectAll('pattern')
29684 // pattern name, pattern image name
29685 ['wetland', 'wetland'],
29686 ['construction', 'construction'],
29687 ['cemetery', 'cemetery'],
29688 ['orchard', 'orchard'],
29689 ['farmland', 'farmland'],
29696 .attr('id', function (d) {
29697 return 'pattern-' + d[0];
29700 .attr('height', 32)
29701 .attr('patternUnits', 'userSpaceOnUse');
29703 patterns.append('rect')
29707 .attr('height', 32)
29708 .attr('class', function (d) {
29709 return 'pattern-color-' + d[0];
29712 patterns.append('image')
29716 .attr('height', 32)
29717 .attr('xlink:href', function (d) {
29718 return context.imagePath('pattern/' + d[1] + '.png');
29723 .data([12, 18, 20, 32, 45])
29725 .append('clipPath')
29726 .attr('id', function (d) {
29727 return 'clip-square-' + d;
29732 .attr('width', function (d) {
29735 .attr('height', function (d) {
29739 defs.call(SVGSpriteDefinition(
29741 context.imagePath('iD-sprite.svg')));
29743 defs.call(SVGSpriteDefinition(
29745 context.imagePath('maki-sprite.svg')));
29750 * Checks if `value` is `undefined`.
29756 * @param {*} value The value to check.
29757 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
29760 * _.isUndefined(void 0);
29763 * _.isUndefined(null);
29766 function isUndefined(value) {
29767 return value === undefined;
29771 * The base implementation of `_.reduce` and `_.reduceRight`, without support
29772 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
29775 * @param {Array|Object} collection The collection to iterate over.
29776 * @param {Function} iteratee The function invoked per iteration.
29777 * @param {*} accumulator The initial value.
29778 * @param {boolean} initAccum Specify using the first or last element of
29779 * `collection` as the initial value.
29780 * @param {Function} eachFunc The function to iterate over `collection`.
29781 * @returns {*} Returns the accumulated value.
29783 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
29784 eachFunc(collection, function(value, index, collection) {
29785 accumulator = initAccum
29786 ? (initAccum = false, value)
29787 : iteratee(accumulator, value, index, collection);
29789 return accumulator;
29793 * Reduces `collection` to a value which is the accumulated result of running
29794 * each element in `collection` thru `iteratee`, where each successive
29795 * invocation is supplied the return value of the previous. If `accumulator`
29796 * is not given, the first element of `collection` is used as the initial
29797 * value. The iteratee is invoked with four arguments:
29798 * (accumulator, value, index|key, collection).
29800 * Many lodash methods are guarded to work as iteratees for methods like
29801 * `_.reduce`, `_.reduceRight`, and `_.transform`.
29803 * The guarded methods are:
29804 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
29810 * @category Collection
29811 * @param {Array|Object} collection The collection to iterate over.
29812 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
29813 * @param {*} [accumulator] The initial value.
29814 * @returns {*} Returns the accumulated value.
29815 * @see _.reduceRight
29818 * _.reduce([1, 2], function(sum, n) {
29823 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
29824 * (result[value] || (result[value] = [])).push(key);
29827 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
29829 function reduce(collection, iteratee, accumulator) {
29830 var func = isArray(collection) ? arrayReduce : baseReduce,
29831 initAccum = arguments.length < 3;
29833 return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
29836 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
29842 function createCommonjsModule(fn, module) {
29843 return module = { exports: {} }, fn(module, module.exports), module.exports;
29846 //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
29847 //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
29848 //[5] Name ::= NameStartChar (NameChar)*
29849 var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
29850 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
29851 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
29852 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
29853 //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
29855 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
29856 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
29857 var S_TAG = 0;//tag name offerring
29858 var S_ATTR = 1;//attr name offerring
29859 var S_ATTR_SPACE=2;//attr name end and space offer
29860 var S_EQ = 3;//=space?
29861 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
29862 var S_ATTR_END = 5;//attr value end and no space(quot end)
29863 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
29864 var S_TAG_CLOSE = 7;//closed el<el />
29866 function XMLReader(){
29870 XMLReader.prototype = {
29871 parse:function(source,defaultNSMap,entityMap){
29872 var domBuilder = this.domBuilder;
29873 domBuilder.startDocument();
29874 _copy(defaultNSMap ,defaultNSMap = {});
29875 parse(source,defaultNSMap,entityMap,
29876 domBuilder,this.errorHandler);
29877 domBuilder.endDocument();
29880 function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
29881 function fixedFromCharCode(code) {
29882 // String.prototype.fromCharCode does not supports
29883 // > 2 bytes unicode chars directly
29884 if (code > 0xffff) {
29886 var surrogate1 = 0xd800 + (code >> 10)
29887 , surrogate2 = 0xdc00 + (code & 0x3ff);
29889 return String.fromCharCode(surrogate1, surrogate2);
29891 return String.fromCharCode(code);
29894 function entityReplacer(a){
29895 var k = a.slice(1,-1);
29896 if(k in entityMap){
29897 return entityMap[k];
29898 }else if(k.charAt(0) === '#'){
29899 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
29901 errorHandler.error('entity not found:'+a);
29905 function appendText(end){//has some bugs
29907 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
29908 locator&&position(start);
29909 domBuilder.characters(xt,0,end-start);
29913 function position(p,m){
29914 while(p>=lineEnd && (m = linePattern.exec(source))){
29915 lineStart = m.index;
29916 lineEnd = lineStart + m[0].length;
29917 locator.lineNumber++;
29918 //console.log('line++:',locator,startPos,endPos)
29920 locator.columnNumber = p-lineStart+1;
29924 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
29925 var locator = domBuilder.locator;
29927 var parseStack = [{currentNSMap:defaultNSMapCopy}];
29932 var tagStart = source.indexOf('<',start);
29934 if(!source.substr(start).match(/^\s*$/)){
29935 var doc = domBuilder.doc;
29936 var text = doc.createTextNode(source.substr(start));
29937 doc.appendChild(text);
29938 domBuilder.currentElement = text;
29942 if(tagStart>start){
29943 appendText(tagStart);
29945 switch(source.charAt(tagStart+1)){
29947 var end = source.indexOf('>',tagStart+3);
29948 var tagName = source.substring(tagStart+2,end);
29949 var config = parseStack.pop();
29952 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
29953 //console.error('#@@@@@@'+tagName)
29954 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
29955 end = tagStart+1+tagName.length;
29956 }else if(tagName.match(/\s</)){
29957 tagName = tagName.replace(/[\s<].*/,'');
29958 errorHandler.error("end tag name: "+tagName+' maybe not complete');
29959 end = tagStart+1+tagName.length;
29961 //console.error(parseStack.length,parseStack)
29962 //console.error(config);
29963 var localNSMap = config.localNSMap;
29964 var endMatch = config.tagName == tagName;
29965 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
29966 if(endIgnoreCaseMach){
29967 domBuilder.endElement(config.uri,config.localName,tagName);
29969 for(var prefix in localNSMap){
29970 domBuilder.endPrefixMapping(prefix) ;
29974 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
29977 parseStack.push(config);
29983 case '?':// <?...?>
29984 locator&&position(tagStart);
29985 end = parseInstruction(source,tagStart,domBuilder);
29987 case '!':// <!doctype,<![CDATA,<!--
29988 locator&&position(tagStart);
29989 end = parseDCC(source,tagStart,domBuilder,errorHandler);
29992 locator&&position(tagStart);
29993 var el = new ElementAttributes();
29994 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
29996 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
29997 var len = el.length;
30000 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
30002 if(!entityMap.nbsp){
30003 errorHandler.warning('unclosed xml attribute');
30006 if(locator && len){
30007 var locator2 = copyLocator(locator,{});
30008 //try{//attribute position fixed
30009 for(var i = 0;i<len;i++){
30011 position(a.offset);
30012 a.locator = copyLocator(locator,{});
30014 //}catch(e){console.error('@@@@@'+e)}
30015 domBuilder.locator = locator2;
30016 if(appendElement(el,domBuilder,currentNSMap)){
30017 parseStack.push(el);
30019 domBuilder.locator = locator;
30021 if(appendElement(el,domBuilder,currentNSMap)){
30022 parseStack.push(el);
30028 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
30029 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
30035 errorHandler.error('element parse error: '+e);
30036 //errorHandler.error('element parse error: '+e);
30043 //TODO: 这里有可能sax回退,有位置错误风险
30044 appendText(Math.max(tagStart,start)+1);
30048 function copyLocator(f,t){
30049 t.lineNumber = f.lineNumber;
30050 t.columnNumber = f.columnNumber;
30055 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
30056 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
30058 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
30062 var s = S_TAG;//status
30064 var c = source.charAt(p);
30067 if(s === S_ATTR){//attrName
30068 attrName = source.slice(start,p);
30070 }else if(s === S_ATTR_SPACE){
30073 //fatalError: equal must after attrName or space after attrName
30074 throw new Error('attribute equal must after attrName');
30079 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
30082 errorHandler.warning('attribute value must after "="');
30083 attrName = source.slice(start,p);
30086 p = source.indexOf(c,start);
30088 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30089 el.add(attrName,value,start-1);
30092 //fatalError: no end quot match
30093 throw new Error('attribute value no end \''+c+'\' match');
30095 }else if(s == S_ATTR_NOQUOT_VALUE){
30096 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30097 //console.log(attrName,value,start,p)
30098 el.add(attrName,value,start);
30100 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
30104 //fatalError: no equal before
30105 throw new Error('attribute value must after "="');
30111 el.setTagName(source.slice(start,p));
30117 case S_ATTR_NOQUOT_VALUE:
30123 throw new Error("attribute invalid close char('/')")
30126 case ''://end document
30127 //throw new Error('unexpected end of input')
30128 errorHandler.error('unexpected end of input');
30130 el.setTagName(source.slice(start,p));
30136 el.setTagName(source.slice(start,p));
30141 case S_ATTR_NOQUOT_VALUE://Compatible state
30143 value = source.slice(start,p);
30144 if(value.slice(-1) === '/'){
30146 value = value.slice(0,-1);
30149 if(s === S_ATTR_SPACE){
30152 if(s == S_ATTR_NOQUOT_VALUE){
30153 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
30154 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
30156 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
30157 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
30159 el.add(value,value,start);
30163 throw new Error('attribute value missed!!');
30165 // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
30167 /*xml space '\x20' | #x9 | #xD | #xA; */
30171 if(c<= ' '){//space
30174 el.setTagName(source.slice(start,p));//tagName
30178 attrName = source.slice(start,p);
30181 case S_ATTR_NOQUOT_VALUE:
30182 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30183 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
30184 el.add(attrName,value,start);
30188 //case S_TAG_SPACE:
30190 //case S_ATTR_SPACE:
30192 //case S_TAG_CLOSE:
30196 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
30197 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
30199 //case S_TAG:void();break;
30200 //case S_ATTR:void();break;
30201 //case S_ATTR_NOQUOT_VALUE:void();break;
30203 var tagName = el.tagName;
30204 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
30205 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
30207 el.add(attrName,attrName,start);
30212 errorHandler.warning('attribute space is required"'+attrName+'"!!');
30218 s = S_ATTR_NOQUOT_VALUE;
30222 throw new Error("elements closed character '/' and '>' must be connected to");
30225 }//end outer switch
30226 //console.log('p++',p)
30231 * @return true if has new namespace define
30233 function appendElement(el,domBuilder,currentNSMap){
30234 var tagName = el.tagName;
30235 var localNSMap = null;
30236 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
30240 var qName = a.qName;
30241 var value = a.value;
30242 var nsp = qName.indexOf(':');
30244 var prefix = a.prefix = qName.slice(0,nsp);
30245 var localName = qName.slice(nsp+1);
30246 var nsPrefix = prefix === 'xmlns' && localName;
30250 nsPrefix = qName === 'xmlns' && '';
30252 //can not set prefix,because prefix !== ''
30253 a.localName = localName ;
30254 //prefix == null for no ns prefix attribute
30255 if(nsPrefix !== false){//hack!!
30256 if(localNSMap == null){
30258 //console.log(currentNSMap,0)
30259 _copy(currentNSMap,currentNSMap={});
30260 //console.log(currentNSMap,1)
30262 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
30263 a.uri = 'http://www.w3.org/2000/xmlns/';
30264 domBuilder.startPrefixMapping(nsPrefix, value);
30270 var prefix = a.prefix;
30271 if(prefix){//no prefix attribute has no namespace
30272 if(prefix === 'xml'){
30273 a.uri = 'http://www.w3.org/XML/1998/namespace';
30274 }if(prefix !== 'xmlns'){
30275 a.uri = currentNSMap[prefix || ''];
30277 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
30281 var nsp = tagName.indexOf(':');
30283 prefix = el.prefix = tagName.slice(0,nsp);
30284 localName = el.localName = tagName.slice(nsp+1);
30286 prefix = null;//important!!
30287 localName = el.localName = tagName;
30289 //no prefix element has default namespace
30290 var ns = el.uri = currentNSMap[prefix || ''];
30291 domBuilder.startElement(ns,localName,tagName,el);
30292 //endPrefixMapping and startPrefixMapping have not any help for dom builder
30293 //localNSMap = null
30295 domBuilder.endElement(ns,localName,tagName);
30297 for(prefix in localNSMap){
30298 domBuilder.endPrefixMapping(prefix);
30302 el.currentNSMap = currentNSMap;
30303 el.localNSMap = localNSMap;
30304 //parseStack.push(el);
30308 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
30309 if(/^(?:script|textarea)$/i.test(tagName)){
30310 var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
30311 var text = source.substring(elStartEnd+1,elEndStart);
30312 if(/[&<]/.test(text)){
30313 if(/^script$/i.test(tagName)){
30314 //if(!/\]\]>/.test(text)){
30315 //lexHandler.startCDATA();
30316 domBuilder.characters(text,0,text.length);
30317 //lexHandler.endCDATA();
30320 }//}else{//text area
30321 text = text.replace(/&#?\w+;/g,entityReplacer);
30322 domBuilder.characters(text,0,text.length);
30328 return elStartEnd+1;
30330 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
30331 //if(tagName in closeMap){
30332 var pos = closeMap[tagName];
30334 //console.log(tagName)
30335 pos = source.lastIndexOf('</'+tagName+'>');
30336 if(pos<elStartEnd){//忘记闭合
30337 pos = source.lastIndexOf('</'+tagName);
30339 closeMap[tagName] =pos;
30341 return pos<elStartEnd;
30344 function _copy(source,target){
30345 for(var n in source){target[n] = source[n];}
30347 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
30348 var next= source.charAt(start+2);
30351 if(source.charAt(start + 3) === '-'){
30352 var end = source.indexOf('-->',start+4);
30353 //append comment source.substring(4,end)//<!--
30355 domBuilder.comment(source,start+4,end-start-4);
30358 errorHandler.error("Unclosed comment");
30366 if(source.substr(start+3,6) == 'CDATA['){
30367 var end = source.indexOf(']]>',start+9);
30368 domBuilder.startCDATA();
30369 domBuilder.characters(source,start+9,end-start-9);
30370 domBuilder.endCDATA();
30374 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
30375 var matchs = split(source,start);
30376 var len = matchs.length;
30377 if(len>1 && /!doctype/i.test(matchs[0][0])){
30378 var name = matchs[1][0];
30379 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
30380 var sysid = len>4 && matchs[4][0];
30381 var lastMatch = matchs[len-1];
30382 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
30383 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
30384 domBuilder.endDTD();
30386 return lastMatch.index+lastMatch[0].length
30394 function parseInstruction(source,start,domBuilder){
30395 var end = source.indexOf('?>',start);
30397 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
30399 var len = match[0].length;
30400 domBuilder.processingInstruction(match[1], match[2]) ;
30412 function ElementAttributes(source){
30415 ElementAttributes.prototype = {
30416 setTagName:function(tagName){
30417 if(!tagNamePattern.test(tagName)){
30418 throw new Error('invalid tagName:'+tagName)
30420 this.tagName = tagName;
30422 add:function(qName,value,offset){
30423 if(!tagNamePattern.test(qName)){
30424 throw new Error('invalid attribute:'+qName)
30426 this[this.length++] = {qName:qName,value:value,offset:offset};
30429 getLocalName:function(i){return this[i].localName},
30430 getLocator:function(i){return this[i].locator},
30431 getQName:function(i){return this[i].qName},
30432 getURI:function(i){return this[i].uri},
30433 getValue:function(i){return this[i].value}
30434 // ,getIndex:function(uri, localName)){
30441 // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
30442 // getType:function(uri,localName){}
30443 // getType:function(i){},
30449 function _set_proto_(thiz,parent){
30450 thiz.__proto__ = parent;
30453 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
30454 _set_proto_ = function(thiz,parent){
30456 p.prototype = parent;
30458 for(parent in thiz){
30459 p[parent] = thiz[parent];
30465 function split(source,start){
30468 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
30469 reg.lastIndex = start;
30470 reg.exec(source);//skip <
30471 while(match = reg.exec(source)){
30473 if(match[1])return buf;
30477 var XMLReader_1 = XMLReader;
30480 XMLReader: XMLReader_1
30485 * Object DOMException
30486 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
30487 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
30490 function copy$1(src,dest){
30496 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
30497 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
30499 function _extends(Class,Super){
30500 var pt = Class.prototype;
30502 var ppt = Object.create(Super.prototype);
30503 pt.__proto__ = ppt;
30505 if(!(pt instanceof Super)){
30507 t.prototype = Super.prototype;
30510 Class.prototype = pt = t;
30512 if(pt.constructor != Class){
30513 if(typeof Class != 'function'){
30514 console.error("unknow Class:"+Class);
30516 pt.constructor = Class;
30519 var htmlns = 'http://www.w3.org/1999/xhtml';
30522 var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
30523 var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
30524 var TEXT_NODE = NodeType.TEXT_NODE = 3;
30525 var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
30526 var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
30527 var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
30528 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
30529 var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
30530 var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
30531 var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
30532 var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
30533 var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
30536 var ExceptionCode = {};
30537 var ExceptionMessage = {};
30538 var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
30539 var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
30540 var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
30541 var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
30542 var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
30543 var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
30544 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
30545 var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
30546 var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
30547 var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
30549 var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
30550 var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
30551 var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
30552 var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
30553 var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
30556 function DOMException(code, message) {
30557 if(message instanceof Error){
30558 var error = message;
30561 Error.call(this, ExceptionMessage[code]);
30562 this.message = ExceptionMessage[code];
30563 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
30566 if(message) this.message = this.message + ": " + message;
30569 DOMException.prototype = Error.prototype;
30570 copy$1(ExceptionCode,DOMException);
30572 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
30573 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
30574 * The items in the NodeList are accessible via an integral index, starting from 0.
30576 function NodeList() {
30578 NodeList.prototype = {
30580 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
30585 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
30587 * @param index unsigned long
30588 * Index into the collection.
30590 * The node at the indexth position in the NodeList, or null if that is not a valid index.
30592 item: function(index) {
30593 return this[index] || null;
30595 toString:function(isHTML,nodeFilter){
30596 for(var buf = [], i = 0;i<this.length;i++){
30597 serializeToString(this[i],buf,isHTML,nodeFilter);
30599 return buf.join('');
30602 function LiveNodeList(node,refresh){
30604 this._refresh = refresh;
30605 _updateLiveList(this);
30607 function _updateLiveList(list){
30608 var inc = list._node._inc || list._node.ownerDocument._inc;
30609 if(list._inc != inc){
30610 var ls = list._refresh(list._node);
30611 //console.log(ls.length)
30612 __set__(list,'length',ls.length);
30617 LiveNodeList.prototype.item = function(i){
30618 _updateLiveList(this);
30622 _extends(LiveNodeList,NodeList);
30625 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
30626 * NamedNodeMap objects in the DOM are live.
30627 * used for attributes or DocumentType entities
30629 function NamedNodeMap() {
30632 function _findNodeIndex(list,node){
30633 var i = list.length;
30635 if(list[i] === node){return i}
30639 function _addNamedNode(el,list,newAttr,oldAttr){
30641 list[_findNodeIndex(list,oldAttr)] = newAttr;
30643 list[list.length++] = newAttr;
30646 newAttr.ownerElement = el;
30647 var doc = el.ownerDocument;
30649 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
30650 _onAddAttribute(doc,el,newAttr);
30654 function _removeNamedNode(el,list,attr){
30655 //console.log('remove attr:'+attr)
30656 var i = _findNodeIndex(list,attr);
30658 var lastIndex = list.length-1;
30659 while(i<lastIndex){
30660 list[i] = list[++i];
30662 list.length = lastIndex;
30664 var doc = el.ownerDocument;
30666 _onRemoveAttribute(doc,el,attr);
30667 attr.ownerElement = null;
30671 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
30674 NamedNodeMap.prototype = {
30676 item:NodeList.prototype.item,
30677 getNamedItem: function(key) {
30678 // if(key.indexOf(':')>0 || key == 'xmlns'){
30682 var i = this.length;
30684 var attr = this[i];
30685 //console.log(attr.nodeName,key)
30686 if(attr.nodeName == key){
30691 setNamedItem: function(attr) {
30692 var el = attr.ownerElement;
30693 if(el && el!=this._ownerElement){
30694 throw new DOMException(INUSE_ATTRIBUTE_ERR);
30696 var oldAttr = this.getNamedItem(attr.nodeName);
30697 _addNamedNode(this._ownerElement,this,attr,oldAttr);
30701 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
30702 var el = attr.ownerElement, oldAttr;
30703 if(el && el!=this._ownerElement){
30704 throw new DOMException(INUSE_ATTRIBUTE_ERR);
30706 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
30707 _addNamedNode(this._ownerElement,this,attr,oldAttr);
30712 removeNamedItem: function(key) {
30713 var attr = this.getNamedItem(key);
30714 _removeNamedNode(this._ownerElement,this,attr);
30718 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
30721 removeNamedItemNS:function(namespaceURI,localName){
30722 var attr = this.getNamedItemNS(namespaceURI,localName);
30723 _removeNamedNode(this._ownerElement,this,attr);
30726 getNamedItemNS: function(namespaceURI, localName) {
30727 var i = this.length;
30729 var node = this[i];
30730 if(node.localName == localName && node.namespaceURI == namespaceURI){
30738 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
30740 function DOMImplementation(/* Object */ features) {
30741 this._features = {};
30743 for (var feature in features) {
30744 this._features = features[feature];
30749 DOMImplementation.prototype = {
30750 hasFeature: function(/* string */ feature, /* string */ version) {
30751 var versions = this._features[feature.toLowerCase()];
30752 if (versions && (!version || version in versions)) {
30758 // Introduced in DOM Level 2:
30759 createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
30760 var doc = new Document();
30761 doc.implementation = this;
30762 doc.childNodes = new NodeList();
30763 doc.doctype = doctype;
30765 doc.appendChild(doctype);
30768 var root = doc.createElementNS(namespaceURI,qualifiedName);
30769 doc.appendChild(root);
30773 // Introduced in DOM Level 2:
30774 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
30775 var node = new DocumentType();
30776 node.name = qualifiedName;
30777 node.nodeName = qualifiedName;
30778 node.publicId = publicId;
30779 node.systemId = systemId;
30780 // Introduced in DOM Level 2:
30781 //readonly attribute DOMString internalSubset;
30784 // readonly attribute NamedNodeMap entities;
30785 // readonly attribute NamedNodeMap notations;
30792 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
30795 function Node$2() {
30798 Node$2.prototype = {
30801 previousSibling : null,
30802 nextSibling : null,
30806 ownerDocument : null,
30808 namespaceURI : null,
30811 // Modified in DOM Level 2:
30812 insertBefore:function(newChild, refChild){//raises
30813 return _insertBefore(this,newChild,refChild);
30815 replaceChild:function(newChild, oldChild){//raises
30816 this.insertBefore(newChild,oldChild);
30818 this.removeChild(oldChild);
30821 removeChild:function(oldChild){
30822 return _removeChild(this,oldChild);
30824 appendChild:function(newChild){
30825 return this.insertBefore(newChild,null);
30827 hasChildNodes:function(){
30828 return this.firstChild != null;
30830 cloneNode:function(deep){
30831 return cloneNode(this.ownerDocument||this,this,deep);
30833 // Modified in DOM Level 2:
30834 normalize:function(){
30835 var child = this.firstChild;
30837 var next = child.nextSibling;
30838 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
30839 this.removeChild(next);
30840 child.appendData(next.data);
30847 // Introduced in DOM Level 2:
30848 isSupported:function(feature, version){
30849 return this.ownerDocument.implementation.hasFeature(feature,version);
30851 // Introduced in DOM Level 2:
30852 hasAttributes:function(){
30853 return this.attributes.length>0;
30855 lookupPrefix:function(namespaceURI){
30858 var map = el._nsMap;
30862 if(map[n] == namespaceURI){
30867 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
30871 // Introduced in DOM Level 3:
30872 lookupNamespaceURI:function(prefix){
30875 var map = el._nsMap;
30879 return map[prefix] ;
30882 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
30886 // Introduced in DOM Level 3:
30887 isDefaultNamespace:function(namespaceURI){
30888 var prefix = this.lookupPrefix(namespaceURI);
30889 return prefix == null;
30894 function _xmlEncoder(c){
30895 return c == '<' && '<' ||
30896 c == '>' && '>' ||
30897 c == '&' && '&' ||
30898 c == '"' && '"' ||
30899 '&#'+c.charCodeAt()+';'
30903 copy$1(NodeType,Node$2);
30904 copy$1(NodeType,Node$2.prototype);
30907 * @param callback return true for continue,false for break
30908 * @return boolean true: break visit;
30910 function _visitNode(node,callback){
30911 if(callback(node)){
30914 if(node = node.firstChild){
30916 if(_visitNode(node,callback)){return true}
30917 }while(node=node.nextSibling)
30923 function Document(){
30925 function _onAddAttribute(doc,el,newAttr){
30927 var ns = newAttr.namespaceURI;
30928 if(ns == 'http://www.w3.org/2000/xmlns/'){
30930 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
30933 function _onRemoveAttribute(doc,el,newAttr,remove){
30935 var ns = newAttr.namespaceURI;
30936 if(ns == 'http://www.w3.org/2000/xmlns/'){
30938 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
30941 function _onUpdateChild(doc,el,newChild){
30942 if(doc && doc._inc){
30944 //update childNodes
30945 var cs = el.childNodes;
30947 cs[cs.length++] = newChild;
30950 var child = el.firstChild;
30954 child =child.nextSibling;
30965 * writeable properties:
30966 * nodeValue,Attr:value,CharacterData:data
30969 function _removeChild(parentNode,child){
30970 var previous = child.previousSibling;
30971 var next = child.nextSibling;
30973 previous.nextSibling = next;
30975 parentNode.firstChild = next;
30978 next.previousSibling = previous;
30980 parentNode.lastChild = previous;
30982 _onUpdateChild(parentNode.ownerDocument,parentNode);
30986 * preformance key(refChild == null)
30988 function _insertBefore(parentNode,newChild,nextChild){
30989 var cp = newChild.parentNode;
30991 cp.removeChild(newChild);//remove and update
30993 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
30994 var newFirst = newChild.firstChild;
30995 if (newFirst == null) {
30998 var newLast = newChild.lastChild;
31000 newFirst = newLast = newChild;
31002 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
31004 newFirst.previousSibling = pre;
31005 newLast.nextSibling = nextChild;
31009 pre.nextSibling = newFirst;
31011 parentNode.firstChild = newFirst;
31013 if(nextChild == null){
31014 parentNode.lastChild = newLast;
31016 nextChild.previousSibling = newLast;
31019 newFirst.parentNode = parentNode;
31020 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
31021 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
31022 //console.log(parentNode.lastChild.nextSibling == null)
31023 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
31024 newChild.firstChild = newChild.lastChild = null;
31028 function _appendSingleChild(parentNode,newChild){
31029 var cp = newChild.parentNode;
31031 var pre = parentNode.lastChild;
31032 cp.removeChild(newChild);//remove and update
31033 var pre = parentNode.lastChild;
31035 var pre = parentNode.lastChild;
31036 newChild.parentNode = parentNode;
31037 newChild.previousSibling = pre;
31038 newChild.nextSibling = null;
31040 pre.nextSibling = newChild;
31042 parentNode.firstChild = newChild;
31044 parentNode.lastChild = newChild;
31045 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
31047 //console.log("__aa",parentNode.lastChild.nextSibling == null)
31049 Document.prototype = {
31050 //implementation : null,
31051 nodeName : '#document',
31052 nodeType : DOCUMENT_NODE,
31054 documentElement : null,
31057 insertBefore : function(newChild, refChild){//raises
31058 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
31059 var child = newChild.firstChild;
31061 var next = child.nextSibling;
31062 this.insertBefore(child,refChild);
31067 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
31068 this.documentElement = newChild;
31071 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
31073 removeChild : function(oldChild){
31074 if(this.documentElement == oldChild){
31075 this.documentElement = null;
31077 return _removeChild(this,oldChild);
31079 // Introduced in DOM Level 2:
31080 importNode : function(importedNode,deep){
31081 return importNode(this,importedNode,deep);
31083 // Introduced in DOM Level 2:
31084 getElementById : function(id){
31086 _visitNode(this.documentElement,function(node){
31087 if(node.nodeType == ELEMENT_NODE){
31088 if(node.getAttribute('id') == id){
31097 //document factory method:
31098 createElement : function(tagName){
31099 var node = new Element();
31100 node.ownerDocument = this;
31101 node.nodeName = tagName;
31102 node.tagName = tagName;
31103 node.childNodes = new NodeList();
31104 var attrs = node.attributes = new NamedNodeMap();
31105 attrs._ownerElement = node;
31108 createDocumentFragment : function(){
31109 var node = new DocumentFragment();
31110 node.ownerDocument = this;
31111 node.childNodes = new NodeList();
31114 createTextNode : function(data){
31115 var node = new Text();
31116 node.ownerDocument = this;
31117 node.appendData(data);
31120 createComment : function(data){
31121 var node = new Comment();
31122 node.ownerDocument = this;
31123 node.appendData(data);
31126 createCDATASection : function(data){
31127 var node = new CDATASection();
31128 node.ownerDocument = this;
31129 node.appendData(data);
31132 createProcessingInstruction : function(target,data){
31133 var node = new ProcessingInstruction();
31134 node.ownerDocument = this;
31135 node.tagName = node.target = target;
31136 node.nodeValue= node.data = data;
31139 createAttribute : function(name){
31140 var node = new Attr();
31141 node.ownerDocument = this;
31143 node.nodeName = name;
31144 node.localName = name;
31145 node.specified = true;
31148 createEntityReference : function(name){
31149 var node = new EntityReference();
31150 node.ownerDocument = this;
31151 node.nodeName = name;
31154 // Introduced in DOM Level 2:
31155 createElementNS : function(namespaceURI,qualifiedName){
31156 var node = new Element();
31157 var pl = qualifiedName.split(':');
31158 var attrs = node.attributes = new NamedNodeMap();
31159 node.childNodes = new NodeList();
31160 node.ownerDocument = this;
31161 node.nodeName = qualifiedName;
31162 node.tagName = qualifiedName;
31163 node.namespaceURI = namespaceURI;
31164 if(pl.length == 2){
31165 node.prefix = pl[0];
31166 node.localName = pl[1];
31168 //el.prefix = null;
31169 node.localName = qualifiedName;
31171 attrs._ownerElement = node;
31174 // Introduced in DOM Level 2:
31175 createAttributeNS : function(namespaceURI,qualifiedName){
31176 var node = new Attr();
31177 var pl = qualifiedName.split(':');
31178 node.ownerDocument = this;
31179 node.nodeName = qualifiedName;
31180 node.name = qualifiedName;
31181 node.namespaceURI = namespaceURI;
31182 node.specified = true;
31183 if(pl.length == 2){
31184 node.prefix = pl[0];
31185 node.localName = pl[1];
31187 //el.prefix = null;
31188 node.localName = qualifiedName;
31193 _extends(Document,Node$2);
31196 function Element() {
31199 Element.prototype = {
31200 nodeType : ELEMENT_NODE,
31201 hasAttribute : function(name){
31202 return this.getAttributeNode(name)!=null;
31204 getAttribute : function(name){
31205 var attr = this.getAttributeNode(name);
31206 return attr && attr.value || '';
31208 getAttributeNode : function(name){
31209 return this.attributes.getNamedItem(name);
31211 setAttribute : function(name, value){
31212 var attr = this.ownerDocument.createAttribute(name);
31213 attr.value = attr.nodeValue = "" + value;
31214 this.setAttributeNode(attr);
31216 removeAttribute : function(name){
31217 var attr = this.getAttributeNode(name);
31218 attr && this.removeAttributeNode(attr);
31221 //four real opeartion method
31222 appendChild:function(newChild){
31223 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
31224 return this.insertBefore(newChild,null);
31226 return _appendSingleChild(this,newChild);
31229 setAttributeNode : function(newAttr){
31230 return this.attributes.setNamedItem(newAttr);
31232 setAttributeNodeNS : function(newAttr){
31233 return this.attributes.setNamedItemNS(newAttr);
31235 removeAttributeNode : function(oldAttr){
31236 //console.log(this == oldAttr.ownerElement)
31237 return this.attributes.removeNamedItem(oldAttr.nodeName);
31239 //get real attribute name,and remove it by removeAttributeNode
31240 removeAttributeNS : function(namespaceURI, localName){
31241 var old = this.getAttributeNodeNS(namespaceURI, localName);
31242 old && this.removeAttributeNode(old);
31245 hasAttributeNS : function(namespaceURI, localName){
31246 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
31248 getAttributeNS : function(namespaceURI, localName){
31249 var attr = this.getAttributeNodeNS(namespaceURI, localName);
31250 return attr && attr.value || '';
31252 setAttributeNS : function(namespaceURI, qualifiedName, value){
31253 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
31254 attr.value = attr.nodeValue = "" + value;
31255 this.setAttributeNode(attr);
31257 getAttributeNodeNS : function(namespaceURI, localName){
31258 return this.attributes.getNamedItemNS(namespaceURI, localName);
31261 getElementsByTagName : function(tagName){
31262 return new LiveNodeList(this,function(base){
31264 _visitNode(base,function(node){
31265 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
31272 getElementsByTagNameNS : function(namespaceURI, localName){
31273 return new LiveNodeList(this,function(base){
31275 _visitNode(base,function(node){
31276 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
31285 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
31286 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
31289 _extends(Element,Node$2);
31292 Attr.prototype.nodeType = ATTRIBUTE_NODE;
31293 _extends(Attr,Node$2);
31296 function CharacterData() {
31298 CharacterData.prototype = {
31300 substringData : function(offset, count) {
31301 return this.data.substring(offset, offset+count);
31303 appendData: function(text) {
31304 text = this.data+text;
31305 this.nodeValue = this.data = text;
31306 this.length = text.length;
31308 insertData: function(offset,text) {
31309 this.replaceData(offset,0,text);
31312 appendChild:function(newChild){
31313 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
31315 deleteData: function(offset, count) {
31316 this.replaceData(offset,count,"");
31318 replaceData: function(offset, count, text) {
31319 var start = this.data.substring(0,offset);
31320 var end = this.data.substring(offset+count);
31321 text = start + text + end;
31322 this.nodeValue = this.data = text;
31323 this.length = text.length;
31326 _extends(CharacterData,Node$2);
31330 nodeName : "#text",
31331 nodeType : TEXT_NODE,
31332 splitText : function(offset) {
31333 var text = this.data;
31334 var newText = text.substring(offset);
31335 text = text.substring(0, offset);
31336 this.data = this.nodeValue = text;
31337 this.length = text.length;
31338 var newNode = this.ownerDocument.createTextNode(newText);
31339 if(this.parentNode){
31340 this.parentNode.insertBefore(newNode, this.nextSibling);
31345 _extends(Text,CharacterData);
31346 function Comment() {
31348 Comment.prototype = {
31349 nodeName : "#comment",
31350 nodeType : COMMENT_NODE
31352 _extends(Comment,CharacterData);
31354 function CDATASection() {
31356 CDATASection.prototype = {
31357 nodeName : "#cdata-section",
31358 nodeType : CDATA_SECTION_NODE
31360 _extends(CDATASection,CharacterData);
31363 function DocumentType() {
31365 DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
31366 _extends(DocumentType,Node$2);
31368 function Notation() {
31370 Notation.prototype.nodeType = NOTATION_NODE;
31371 _extends(Notation,Node$2);
31373 function Entity() {
31375 Entity.prototype.nodeType = ENTITY_NODE;
31376 _extends(Entity,Node$2);
31378 function EntityReference() {
31380 EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
31381 _extends(EntityReference,Node$2);
31383 function DocumentFragment() {
31385 DocumentFragment.prototype.nodeName = "#document-fragment";
31386 DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
31387 _extends(DocumentFragment,Node$2);
31390 function ProcessingInstruction() {
31392 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
31393 _extends(ProcessingInstruction,Node$2);
31394 function XMLSerializer$1(){}
31395 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
31396 return nodeSerializeToString.call(node,isHtml,nodeFilter);
31398 Node$2.prototype.toString = nodeSerializeToString;
31399 function nodeSerializeToString(isHtml,nodeFilter){
31401 var refNode = this.nodeType == 9?this.documentElement:this;
31402 var prefix = refNode.prefix;
31403 var uri = refNode.namespaceURI;
31405 if(uri && prefix == null){
31406 //console.log(prefix)
31407 var prefix = refNode.lookupPrefix(uri);
31408 if(prefix == null){
31410 var visibleNamespaces=[
31411 {namespace:uri,prefix:null}
31412 //{namespace:uri,prefix:''}
31416 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
31417 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
31418 return buf.join('');
31420 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
31421 var prefix = node.prefix||'';
31422 var uri = node.namespaceURI;
31423 if (!prefix && !uri){
31426 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
31427 || uri == 'http://www.w3.org/2000/xmlns/'){
31431 var i = visibleNamespaces.length;
31432 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
31434 var ns = visibleNamespaces[i];
31435 // get namespace prefix
31436 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
31437 if (ns.prefix == prefix){
31438 return ns.namespace != uri;
31441 //console.log(isHTML,uri,prefix=='')
31442 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
31445 //node.flag = '11111'
31446 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
31449 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
31451 node = nodeFilter(node);
31453 if(typeof node == 'string'){
31460 //buf.sort.apply(attrs, attributeSorter);
31462 switch(node.nodeType){
31464 if (!visibleNamespaces) visibleNamespaces = [];
31465 var startVisibleNamespaces = visibleNamespaces.length;
31466 var attrs = node.attributes;
31467 var len = attrs.length;
31468 var child = node.firstChild;
31469 var nodeName = node.tagName;
31471 isHTML = (htmlns === node.namespaceURI) ||isHTML;
31472 buf.push('<',nodeName);
31476 for(var i=0;i<len;i++){
31477 // add namespaces for attributes
31478 var attr = attrs.item(i);
31479 if (attr.prefix == 'xmlns') {
31480 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
31481 }else if(attr.nodeName == 'xmlns'){
31482 visibleNamespaces.push({ prefix: '', namespace: attr.value });
31485 for(var i=0;i<len;i++){
31486 var attr = attrs.item(i);
31487 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
31488 var prefix = attr.prefix||'';
31489 var uri = attr.namespaceURI;
31490 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
31491 buf.push(ns, '="' , uri , '"');
31492 visibleNamespaces.push({ prefix: prefix, namespace:uri });
31494 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
31496 // add namespace for current node
31497 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
31498 var prefix = node.prefix||'';
31499 var uri = node.namespaceURI;
31500 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
31501 buf.push(ns, '="' , uri , '"');
31502 visibleNamespaces.push({ prefix: prefix, namespace:uri });
31505 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
31507 //if is cdata child node
31508 if(isHTML && /^script$/i.test(nodeName)){
31511 buf.push(child.data);
31513 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31515 child = child.nextSibling;
31520 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31521 child = child.nextSibling;
31524 buf.push('</',nodeName,'>');
31528 // remove added visible namespaces
31529 //visibleNamespaces.length = startVisibleNamespaces;
31531 case DOCUMENT_NODE:
31532 case DOCUMENT_FRAGMENT_NODE:
31533 var child = node.firstChild;
31535 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31536 child = child.nextSibling;
31539 case ATTRIBUTE_NODE:
31540 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
31542 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
31543 case CDATA_SECTION_NODE:
31544 return buf.push( '<![CDATA[',node.data,']]>');
31546 return buf.push( "<!--",node.data,"-->");
31547 case DOCUMENT_TYPE_NODE:
31548 var pubid = node.publicId;
31549 var sysid = node.systemId;
31550 buf.push('<!DOCTYPE ',node.name);
31552 buf.push(' PUBLIC "',pubid);
31553 if (sysid && sysid!='.') {
31554 buf.push( '" "',sysid);
31557 }else if(sysid && sysid!='.'){
31558 buf.push(' SYSTEM "',sysid,'">');
31560 var sub = node.internalSubset;
31562 buf.push(" [",sub,"]");
31567 case PROCESSING_INSTRUCTION_NODE:
31568 return buf.push( "<?",node.target," ",node.data,"?>");
31569 case ENTITY_REFERENCE_NODE:
31570 return buf.push( '&',node.nodeName,';');
31571 //case ENTITY_NODE:
31572 //case NOTATION_NODE:
31574 buf.push('??',node.nodeName);
31577 function importNode(doc,node,deep){
31579 switch (node.nodeType) {
31581 node2 = node.cloneNode(false);
31582 node2.ownerDocument = doc;
31583 //var attrs = node2.attributes;
31584 //var len = attrs.length;
31585 //for(var i=0;i<len;i++){
31586 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
31588 case DOCUMENT_FRAGMENT_NODE:
31590 case ATTRIBUTE_NODE:
31593 //case ENTITY_REFERENCE_NODE:
31594 //case PROCESSING_INSTRUCTION_NODE:
31595 ////case TEXT_NODE:
31596 //case CDATA_SECTION_NODE:
31597 //case COMMENT_NODE:
31600 //case DOCUMENT_NODE:
31601 //case DOCUMENT_TYPE_NODE:
31602 //cannot be imported.
31603 //case ENTITY_NODE:
31604 //case NOTATION_NODE:
31605 //can not hit in level3
31609 node2 = node.cloneNode(false);//false
31611 node2.ownerDocument = doc;
31612 node2.parentNode = null;
31614 var child = node.firstChild;
31616 node2.appendChild(importNode(doc,child,deep));
31617 child = child.nextSibling;
31623 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
31624 // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
31625 function cloneNode(doc,node,deep){
31626 var node2 = new node.constructor();
31627 for(var n in node){
31629 if(typeof v != 'object' ){
31635 if(node.childNodes){
31636 node2.childNodes = new NodeList();
31638 node2.ownerDocument = doc;
31639 switch (node2.nodeType) {
31641 var attrs = node.attributes;
31642 var attrs2 = node2.attributes = new NamedNodeMap();
31643 var len = attrs.length;
31644 attrs2._ownerElement = node2;
31645 for(var i=0;i<len;i++){
31646 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
31649 case ATTRIBUTE_NODE:
31653 var child = node.firstChild;
31655 node2.appendChild(cloneNode(doc,child,deep));
31656 child = child.nextSibling;
31662 function __set__(object,key,value){
31663 object[key] = value;
31667 if(Object.defineProperty){
31668 Object.defineProperty(LiveNodeList.prototype,'length',{
31670 _updateLiveList(this);
31671 return this.$$length;
31674 Object.defineProperty(Node$2.prototype,'textContent',{
31676 return getTextContent(this);
31678 set:function(data){
31679 switch(this.nodeType){
31681 case DOCUMENT_FRAGMENT_NODE:
31682 while(this.firstChild){
31683 this.removeChild(this.firstChild);
31685 if(data || String(data)){
31686 this.appendChild(this.ownerDocument.createTextNode(data));
31693 this.nodeValue = data;
31698 function getTextContent(node){
31699 switch(node.nodeType){
31701 case DOCUMENT_FRAGMENT_NODE:
31703 node = node.firstChild;
31705 if(node.nodeType!==7 && node.nodeType !==8){
31706 buf.push(getTextContent(node));
31708 node = node.nextSibling;
31710 return buf.join('');
31712 return node.nodeValue;
31715 __set__ = function(object,key,value){
31716 //console.log(value)
31717 object['$$'+key] = value;
31723 //if(typeof require == 'function'){
31724 var DOMImplementation_1 = DOMImplementation;
31725 var XMLSerializer_1 = XMLSerializer$1;
31729 DOMImplementation: DOMImplementation_1,
31730 XMLSerializer: XMLSerializer_1
31733 var domParser = createCommonjsModule(function (module, exports) {
31734 function DOMParser(options){
31735 this.options = options ||{locator:{}};
31738 DOMParser.prototype.parseFromString = function(source,mimeType){
31739 var options = this.options;
31740 var sax$$1 = new XMLReader();
31741 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
31742 var errorHandler = options.errorHandler;
31743 var locator = options.locator;
31744 var defaultNSMap = options.xmlns||{};
31745 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
31747 domBuilder.setDocumentLocator(locator);
31750 sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
31751 sax$$1.domBuilder = options.domBuilder || domBuilder;
31752 if(/\/x?html?$/.test(mimeType)){
31753 entityMap.nbsp = '\xa0';
31754 entityMap.copy = '\xa9';
31755 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
31757 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
31759 sax$$1.parse(source,defaultNSMap,entityMap);
31761 sax$$1.errorHandler.error("invalid doc source");
31763 return domBuilder.doc;
31765 function buildErrorHandler(errorImpl,domBuilder,locator){
31767 if(domBuilder instanceof DOMHandler){
31770 errorImpl = domBuilder ;
31772 var errorHandler = {};
31773 var isCallback = errorImpl instanceof Function;
31774 locator = locator||{};
31775 function build(key){
31776 var fn = errorImpl[key];
31777 if(!fn && isCallback){
31778 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
31780 errorHandler[key] = fn && function(msg){
31781 fn('[xmldom '+key+']\t'+msg+_locator(locator));
31786 build('fatalError');
31787 return errorHandler;
31790 //console.log('#\n\n\n\n\n\n\n####')
31792 * +ContentHandler+ErrorHandler
31793 * +LexicalHandler+EntityResolver2
31794 * -DeclHandler-DTDHandler
31796 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
31797 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
31798 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
31800 function DOMHandler() {
31801 this.cdata = false;
31803 function position(locator,node){
31804 node.lineNumber = locator.lineNumber;
31805 node.columnNumber = locator.columnNumber;
31808 * @see org.xml.sax.ContentHandler#startDocument
31809 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
31811 DOMHandler.prototype = {
31812 startDocument : function() {
31813 this.doc = new DOMImplementation().createDocument(null, null, null);
31814 if (this.locator) {
31815 this.doc.documentURI = this.locator.systemId;
31818 startElement:function(namespaceURI, localName, qName, attrs) {
31819 var doc = this.doc;
31820 var el = doc.createElementNS(namespaceURI, qName||localName);
31821 var len = attrs.length;
31822 appendElement(this, el);
31823 this.currentElement = el;
31825 this.locator && position(this.locator,el);
31826 for (var i = 0 ; i < len; i++) {
31827 var namespaceURI = attrs.getURI(i);
31828 var value = attrs.getValue(i);
31829 var qName = attrs.getQName(i);
31830 var attr = doc.createAttributeNS(namespaceURI, qName);
31831 this.locator &&position(attrs.getLocator(i),attr);
31832 attr.value = attr.nodeValue = value;
31833 el.setAttributeNode(attr);
31836 endElement:function(namespaceURI, localName, qName) {
31837 var current = this.currentElement;
31838 var tagName = current.tagName;
31839 this.currentElement = current.parentNode;
31841 startPrefixMapping:function(prefix, uri) {
31843 endPrefixMapping:function(prefix) {
31845 processingInstruction:function(target, data) {
31846 var ins = this.doc.createProcessingInstruction(target, data);
31847 this.locator && position(this.locator,ins);
31848 appendElement(this, ins);
31850 ignorableWhitespace:function(ch, start, length) {
31852 characters:function(chars, start, length) {
31853 chars = _toString.apply(this,arguments);
31854 //console.log(chars)
31857 var charNode = this.doc.createCDATASection(chars);
31859 var charNode = this.doc.createTextNode(chars);
31861 if(this.currentElement){
31862 this.currentElement.appendChild(charNode);
31863 }else if(/^\s*$/.test(chars)){
31864 this.doc.appendChild(charNode);
31867 this.locator && position(this.locator,charNode);
31870 skippedEntity:function(name) {
31872 endDocument:function() {
31873 this.doc.normalize();
31875 setDocumentLocator:function (locator) {
31876 if(this.locator = locator){// && !('lineNumber' in locator)){
31877 locator.lineNumber = 0;
31881 comment:function(chars, start, length) {
31882 chars = _toString.apply(this,arguments);
31883 var comm = this.doc.createComment(chars);
31884 this.locator && position(this.locator,comm);
31885 appendElement(this, comm);
31888 startCDATA:function() {
31889 //used in characters() methods
31892 endCDATA:function() {
31893 this.cdata = false;
31896 startDTD:function(name, publicId, systemId) {
31897 var impl = this.doc.implementation;
31898 if (impl && impl.createDocumentType) {
31899 var dt = impl.createDocumentType(name, publicId, systemId);
31900 this.locator && position(this.locator,dt);
31901 appendElement(this, dt);
31905 * @see org.xml.sax.ErrorHandler
31906 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
31908 warning:function(error) {
31909 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
31911 error:function(error) {
31912 console.error('[xmldom error]\t'+error,_locator(this.locator));
31914 fatalError:function(error) {
31915 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
31919 function _locator(l){
31921 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
31924 function _toString(chars,start,length){
31925 if(typeof chars == 'string'){
31926 return chars.substr(start,length)
31927 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
31928 if(chars.length >= start+length || start){
31929 return new java.lang.String(chars,start,length)+'';
31936 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
31937 * used method of org.xml.sax.ext.LexicalHandler:
31938 * #comment(chars, start, length)
31941 * #startDTD(name, publicId, systemId)
31944 * IGNORED method of org.xml.sax.ext.LexicalHandler:
31946 * #startEntity(name)
31950 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
31951 * IGNORED method of org.xml.sax.ext.DeclHandler
31952 * #attributeDecl(eName, aName, type, mode, value)
31953 * #elementDecl(name, model)
31954 * #externalEntityDecl(name, publicId, systemId)
31955 * #internalEntityDecl(name, value)
31956 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
31957 * IGNORED method of org.xml.sax.EntityResolver2
31958 * #resolveEntity(String name,String publicId,String baseURI,String systemId)
31959 * #resolveEntity(publicId, systemId)
31960 * #getExternalSubset(name, baseURI)
31961 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
31962 * IGNORED method of org.xml.sax.DTDHandler
31963 * #notationDecl(name, publicId, systemId) {};
31964 * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
31966 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
31967 DOMHandler.prototype[key] = function(){return null};
31970 /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
31971 function appendElement (hander,node) {
31972 if (!hander.currentElement) {
31973 hander.doc.appendChild(node);
31975 hander.currentElement.appendChild(node);
31977 }//appendChild and setAttributeNS are preformance key
31979 //if(typeof require == 'function'){
31980 var XMLReader = sax.XMLReader;
31981 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
31982 exports.XMLSerializer = dom.XMLSerializer ;
31983 exports.DOMParser = DOMParser;
31987 var togeojson = createCommonjsModule(function (module, exports) {
31988 var toGeoJSON = (function() {
31991 var removeSpace = /\s*/g,
31992 trimSpace = /^\s*|\s*$/g,
31993 splitSpace = /\s+/;
31994 // generate a short, numeric hash of a string
31995 function okhash(x) {
31996 if (!x || !x.length) return 0;
31997 for (var i = 0, h = 0; i < x.length; i++) {
31998 h = ((h << 5) - h) + x.charCodeAt(i) | 0;
32001 // all Y children of X
32002 function get(x, y) { return x.getElementsByTagName(y); }
32003 function attr(x, y) { return x.getAttribute(y); }
32004 function attrf(x, y) { return parseFloat(attr(x, y)); }
32005 // one Y child of X, if any, otherwise null
32006 function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
32007 // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
32008 function norm(el) { if (el.normalize) { el.normalize(); } return el; }
32009 // cast array x into numbers
32010 function numarray(x) {
32011 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
32014 // get the content of a text node, if any
32015 function nodeVal(x) {
32016 if (x) { norm(x); }
32017 return (x && x.textContent) || '';
32019 // get the contents of multiple text nodes, if present
32020 function getMulti(x, ys) {
32022 for (k = 0; k < ys.length; k++) {
32023 n = get1(x, ys[k]);
32024 if (n) o[ys[k]] = nodeVal(n);
32028 // add properties of Y to X, overwriting if present in both
32029 function extend(x, y) { for (var k in y) x[k] = y[k]; }
32030 // get one coordinate from a coordinate array, if any
32031 function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
32032 // get all coordinates from a coordinate array as [[],[]]
32033 function coord(v) {
32034 var coords = v.replace(trimSpace, '').split(splitSpace),
32036 for (var i = 0; i < coords.length; i++) {
32037 o.push(coord1(coords[i]));
32041 function coordPair(x) {
32042 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
32043 ele = get1(x, 'ele'),
32044 // handle namespaced attribute in browser
32045 heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
32046 time = get1(x, 'time'),
32049 e = parseFloat(nodeVal(ele));
32056 time: time ? nodeVal(time) : null,
32057 heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
32061 // create a new feature collection parent object
32064 type: 'FeatureCollection',
32070 if (typeof XMLSerializer !== 'undefined') {
32071 /* istanbul ignore next */
32072 serializer = new XMLSerializer();
32073 // only require xmldom in a node environment
32074 } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
32075 serializer = new (domParser.XMLSerializer)();
32077 function xml2str(str) {
32078 // IE9 will create a new XMLSerializer but it'll crash immediately.
32079 // This line is ignored because we don't run coverage tests in IE9
32080 /* istanbul ignore next */
32081 if (str.xml !== undefined) return str.xml;
32082 return serializer.serializeToString(str);
32086 kml: function(doc) {
32089 // styleindex keeps track of hashed styles in order to match features
32090 styleIndex = {}, styleByHash = {},
32091 // stylemapindex keeps track of style maps to expose in properties
32092 styleMapIndex = {},
32093 // atomic geospatial types supported by KML - MultiGeometry is
32094 // handled separately
32095 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
32096 // all root placemarks in the file
32097 placemarks = get(doc, 'Placemark'),
32098 styles = get(doc, 'Style'),
32099 styleMaps = get(doc, 'StyleMap');
32101 for (var k = 0; k < styles.length; k++) {
32102 var hash = okhash(xml2str(styles[k])).toString(16);
32103 styleIndex['#' + attr(styles[k], 'id')] = hash;
32104 styleByHash[hash] = styles[k];
32106 for (var l = 0; l < styleMaps.length; l++) {
32107 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
32108 var pairs = get(styleMaps[l], 'Pair');
32110 for (var m = 0; m < pairs.length; m++) {
32111 pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
32113 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
32116 for (var j = 0; j < placemarks.length; j++) {
32117 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
32119 function kmlColor(v) {
32120 var color, opacity;
32122 if (v.substr(0, 1) === '#') { v = v.substr(1); }
32123 if (v.length === 6 || v.length === 3) { color = v; }
32124 if (v.length === 8) {
32125 opacity = parseInt(v.substr(0, 2), 16) / 255;
32126 color = '#' + v.substr(6, 2) +
32130 return [color, isNaN(opacity) ? undefined : opacity];
32132 function gxCoord(v) { return numarray(v.split(' ')); }
32133 function gxCoords(root) {
32134 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
32135 if (elems.length === 0) elems = get(root, 'gx:coord');
32136 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
32137 var timeElems = get(root, 'when');
32138 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
32144 function getGeometry(root) {
32145 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
32146 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
32147 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
32148 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
32149 for (i = 0; i < geotypes.length; i++) {
32150 geomNodes = get(root, geotypes[i]);
32152 for (j = 0; j < geomNodes.length; j++) {
32153 geomNode = geomNodes[j];
32154 if (geotypes[i] === 'Point') {
32157 coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
32159 } else if (geotypes[i] === 'LineString') {
32161 type: 'LineString',
32162 coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
32164 } else if (geotypes[i] === 'Polygon') {
32165 var rings = get(geomNode, 'LinearRing'),
32167 for (k = 0; k < rings.length; k++) {
32168 coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
32172 coordinates: coords
32174 } else if (geotypes[i] === 'Track' ||
32175 geotypes[i] === 'gx:Track') {
32176 var track = gxCoords(geomNode);
32178 type: 'LineString',
32179 coordinates: track.coords
32181 if (track.times.length) coordTimes.push(track.times);
32188 coordTimes: coordTimes
32191 function getPlacemark(root) {
32192 var geomsAndTimes = getGeometry(root), i, properties = {},
32193 name = nodeVal(get1(root, 'name')),
32194 address = nodeVal(get1(root, 'address')),
32195 styleUrl = nodeVal(get1(root, 'styleUrl')),
32196 description = nodeVal(get1(root, 'description')),
32197 timeSpan = get1(root, 'TimeSpan'),
32198 timeStamp = get1(root, 'TimeStamp'),
32199 extendedData = get1(root, 'ExtendedData'),
32200 lineStyle = get1(root, 'LineStyle'),
32201 polyStyle = get1(root, 'PolyStyle'),
32202 visibility = get1(root, 'visibility');
32204 if (!geomsAndTimes.geoms.length) return [];
32205 if (name) properties.name = name;
32206 if (address) properties.address = address;
32208 if (styleUrl[0] !== '#') {
32209 styleUrl = '#' + styleUrl;
32212 properties.styleUrl = styleUrl;
32213 if (styleIndex[styleUrl]) {
32214 properties.styleHash = styleIndex[styleUrl];
32216 if (styleMapIndex[styleUrl]) {
32217 properties.styleMapHash = styleMapIndex[styleUrl];
32218 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
32220 // Try to populate the lineStyle or polyStyle since we got the style hash
32221 var style = styleByHash[properties.styleHash];
32223 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
32224 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
32227 if (description) properties.description = description;
32229 var begin = nodeVal(get1(timeSpan, 'begin'));
32230 var end = nodeVal(get1(timeSpan, 'end'));
32231 properties.timespan = { begin: begin, end: end };
32234 properties.timestamp = nodeVal(get1(timeStamp, 'when'));
32237 var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
32238 color = linestyles[0],
32239 opacity = linestyles[1],
32240 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
32241 if (color) properties.stroke = color;
32242 if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
32243 if (!isNaN(width)) properties['stroke-width'] = width;
32246 var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
32247 pcolor = polystyles[0],
32248 popacity = polystyles[1],
32249 fill = nodeVal(get1(polyStyle, 'fill')),
32250 outline = nodeVal(get1(polyStyle, 'outline'));
32251 if (pcolor) properties.fill = pcolor;
32252 if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
32253 if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
32254 if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
32256 if (extendedData) {
32257 var datas = get(extendedData, 'Data'),
32258 simpleDatas = get(extendedData, 'SimpleData');
32260 for (i = 0; i < datas.length; i++) {
32261 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
32263 for (i = 0; i < simpleDatas.length; i++) {
32264 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
32268 properties.visibility = nodeVal(visibility);
32270 if (geomsAndTimes.coordTimes.length) {
32271 properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
32272 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
32276 geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
32277 type: 'GeometryCollection',
32278 geometries: geomsAndTimes.geoms
32280 properties: properties
32282 if (attr(root, 'id')) feature.id = attr(root, 'id');
32287 gpx: function(doc) {
32289 tracks = get(doc, 'trk'),
32290 routes = get(doc, 'rte'),
32291 waypoints = get(doc, 'wpt'),
32292 // a feature collection
32295 for (i = 0; i < tracks.length; i++) {
32296 feature = getTrack(tracks[i]);
32297 if (feature) gj.features.push(feature);
32299 for (i = 0; i < routes.length; i++) {
32300 feature = getRoute(routes[i]);
32301 if (feature) gj.features.push(feature);
32303 for (i = 0; i < waypoints.length; i++) {
32304 gj.features.push(getPoint(waypoints[i]));
32306 function getPoints(node, pointname) {
32307 var pts = get(node, pointname),
32312 if (l < 2) return {}; // Invalid line in GeoJSON
32313 for (var i = 0; i < l; i++) {
32314 var c = coordPair(pts[i]);
32315 line.push(c.coordinates);
32316 if (c.time) times.push(c.time);
32317 if (c.heartRate) heartRates.push(c.heartRate);
32322 heartRates: heartRates
32325 function getTrack(node) {
32326 var segments = get(node, 'trkseg'),
32331 for (var i = 0; i < segments.length; i++) {
32332 line = getPoints(segments[i], 'trkpt');
32334 if (line.line) track.push(line.line);
32335 if (line.times && line.times.length) times.push(line.times);
32336 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
32339 if (track.length === 0) return;
32340 var properties = getProperties(node);
32341 extend(properties, getLineStyle(get1(node, 'extensions')));
32342 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
32343 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
32346 properties: properties,
32348 type: track.length === 1 ? 'LineString' : 'MultiLineString',
32349 coordinates: track.length === 1 ? track[0] : track
32353 function getRoute(node) {
32354 var line = getPoints(node, 'rtept');
32355 if (!line.line) return;
32356 var prop = getProperties(node);
32357 extend(prop, getLineStyle(get1(node, 'extensions')));
32362 type: 'LineString',
32363 coordinates: line.line
32368 function getPoint(node) {
32369 var prop = getProperties(node);
32370 extend(prop, getMulti(node, ['sym']));
32376 coordinates: coordPair(node).coordinates
32380 function getLineStyle(extensions) {
32383 var lineStyle = get1(extensions, 'line');
32385 var color = nodeVal(get1(lineStyle, 'color')),
32386 opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
32387 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
32388 if (color) style.stroke = color;
32389 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
32390 // GPX width is in mm, convert to px with 96 px per inch
32391 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
32396 function getProperties(node) {
32397 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
32398 links = get(node, 'link');
32399 if (links.length) prop.links = [];
32400 for (var i = 0, link; i < links.length; i++) {
32401 link = { href: attr(links[i], 'href') };
32402 extend(link, getMulti(links[i], ['text', 'type']));
32403 prop.links.push(link);
32413 module.exports = toGeoJSON;
32416 function svgGpx(projection$$1, context, dispatch) {
32417 var showLabels = true,
32418 detected = utilDetect(),
32423 if (svgGpx.initialized) return; // run once
32425 svgGpx.geojson = {};
32426 svgGpx.enabled = true;
32429 event.stopPropagation();
32430 event.preventDefault();
32431 event.dataTransfer.dropEffect = 'copy';
32435 .attr('dropzone', 'copy')
32436 .on('drop.localgpx', function() {
32437 event.stopPropagation();
32438 event.preventDefault();
32439 if (!detected.filedrop) return;
32440 drawGpx.files(event.dataTransfer.files);
32442 .on('dragenter.localgpx', over)
32443 .on('dragexit.localgpx', over)
32444 .on('dragover.localgpx', over);
32446 svgGpx.initialized = true;
32450 function drawGpx(selection$$1) {
32451 var geojson = svgGpx.geojson,
32452 enabled = svgGpx.enabled;
32454 layer = selection$$1.selectAll('.layer-gpx')
32455 .data(enabled ? [0] : []);
32460 layer = layer.enter()
32462 .attr('class', 'layer-gpx')
32473 paths = paths.enter()
32475 .attr('class', 'gpx')
32479 var path = d3_geoPath(projection$$1);
32485 var labels = layer.selectAll('text')
32486 .data(showLabels && geojson.features ? geojson.features : []);
32491 labels = labels.enter()
32493 .attr('class', 'gpx')
32497 .text(function(d) {
32498 return d.properties.desc || d.properties.name;
32500 .attr('x', function(d) {
32501 var centroid = path.centroid(d);
32502 return centroid[0] + 7;
32504 .attr('y', function(d) {
32505 var centroid = path.centroid(d);
32506 return centroid[1];
32512 function toDom(x) {
32513 return (new DOMParser()).parseFromString(x, 'text/xml');
32517 function getExtension(fileName) {
32518 if (isUndefined(fileName)) {
32522 var lastDotIndex = fileName.lastIndexOf('.');
32523 if (lastDotIndex < 0) {
32527 return fileName.substr(lastDotIndex);
32531 function parseSaveAndZoom(extension, data) {
32532 switch (extension) {
32534 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
32537 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
32541 drawGpx.geojson(JSON.parse(data)).fitZoom();
32547 drawGpx.showLabels = function(_) {
32548 if (!arguments.length) return showLabels;
32554 drawGpx.enabled = function(_) {
32555 if (!arguments.length) return svgGpx.enabled;
32556 svgGpx.enabled = _;
32557 dispatch.call('change');
32562 drawGpx.hasGpx = function() {
32563 var geojson = svgGpx.geojson;
32564 return (!(isEmpty(geojson) || isEmpty(geojson.features)));
32568 drawGpx.geojson = function(gj) {
32569 if (!arguments.length) return svgGpx.geojson;
32570 if (isEmpty(gj) || isEmpty(gj.features)) return this;
32571 svgGpx.geojson = gj;
32572 dispatch.call('change');
32577 drawGpx.url = function(url) {
32578 d3_text(url, function(err, data) {
32580 var extension = getExtension(url);
32581 parseSaveAndZoom(extension, data);
32588 drawGpx.files = function(fileList) {
32589 if (!fileList.length) return this;
32590 var f = fileList[0],
32591 reader = new FileReader();
32593 reader.onload = (function(file) {
32594 var extension = getExtension(file.name);
32596 return function (e) {
32597 parseSaveAndZoom(extension, e.target.result);
32601 reader.readAsText(f);
32606 drawGpx.fitZoom = function() {
32607 if (!this.hasGpx()) return this;
32608 var geojson = svgGpx.geojson;
32610 var map = context.map(),
32611 viewport = map.trimmedExtent().polygon(),
32612 coords = reduce(geojson.features, function(coords, feature) {
32613 var c = feature.geometry.coordinates;
32615 /* eslint-disable no-fallthrough */
32616 switch (feature.geometry.type) {
32623 case 'MultiPolygon':
32626 case 'MultiLineString':
32630 /* eslint-enable no-fallthrough */
32632 return union(coords, c);
32635 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
32636 var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
32637 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
32648 function svgIcon(name, svgklass, useklass) {
32649 return function drawIcon(selection) {
32650 selection.selectAll('svg')
32654 .attr('class', 'icon ' + (svgklass || ''))
32656 .attr('xlink:href', name)
32657 .attr('class', useklass);
32661 /** Error message constants. */
32662 var FUNC_ERROR_TEXT$3 = 'Expected a function';
32665 * Creates a throttled function that only invokes `func` at most once per
32666 * every `wait` milliseconds. The throttled function comes with a `cancel`
32667 * method to cancel delayed `func` invocations and a `flush` method to
32668 * immediately invoke them. Provide `options` to indicate whether `func`
32669 * should be invoked on the leading and/or trailing edge of the `wait`
32670 * timeout. The `func` is invoked with the last arguments provided to the
32671 * throttled function. Subsequent calls to the throttled function return the
32672 * result of the last `func` invocation.
32674 * **Note:** If `leading` and `trailing` options are `true`, `func` is
32675 * invoked on the trailing edge of the timeout only if the throttled function
32676 * is invoked more than once during the `wait` timeout.
32678 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
32679 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
32681 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
32682 * for details over the differences between `_.throttle` and `_.debounce`.
32687 * @category Function
32688 * @param {Function} func The function to throttle.
32689 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
32690 * @param {Object} [options={}] The options object.
32691 * @param {boolean} [options.leading=true]
32692 * Specify invoking on the leading edge of the timeout.
32693 * @param {boolean} [options.trailing=true]
32694 * Specify invoking on the trailing edge of the timeout.
32695 * @returns {Function} Returns the new throttled function.
32698 * // Avoid excessively updating the position while scrolling.
32699 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
32701 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
32702 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
32703 * jQuery(element).on('click', throttled);
32705 * // Cancel the trailing throttled invocation.
32706 * jQuery(window).on('popstate', throttled.cancel);
32708 function throttle(func, wait, options) {
32709 var leading = true,
32712 if (typeof func != 'function') {
32713 throw new TypeError(FUNC_ERROR_TEXT$3);
32715 if (isObject(options)) {
32716 leading = 'leading' in options ? !!options.leading : leading;
32717 trailing = 'trailing' in options ? !!options.trailing : trailing;
32719 return debounce$1(func, wait, {
32720 'leading': leading,
32722 'trailing': trailing
32726 function svgLabels(projection$$1, context) {
32727 var path = d3_geoPath(projection$$1),
32728 detected = utilDetect(),
32729 baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge'),
32730 rdrawn = rbush_1(),
32731 rskipped = rbush_1(),
32732 textWidthCache = {},
32735 // Listed from highest to lowest priority
32737 ['line', 'aeroway', '*', 12],
32738 ['line', 'highway', 'motorway', 12],
32739 ['line', 'highway', 'trunk', 12],
32740 ['line', 'highway', 'primary', 12],
32741 ['line', 'highway', 'secondary', 12],
32742 ['line', 'highway', 'tertiary', 12],
32743 ['line', 'highway', '*', 12],
32744 ['line', 'railway', '*', 12],
32745 ['line', 'waterway', '*', 12],
32746 ['area', 'aeroway', '*', 12],
32747 ['area', 'amenity', '*', 12],
32748 ['area', 'building', '*', 12],
32749 ['area', 'historic', '*', 12],
32750 ['area', 'leisure', '*', 12],
32751 ['area', 'man_made', '*', 12],
32752 ['area', 'natural', '*', 12],
32753 ['area', 'shop', '*', 12],
32754 ['area', 'tourism', '*', 12],
32755 ['area', 'camp_site', '*', 12],
32756 ['point', 'aeroway', '*', 10],
32757 ['point', 'amenity', '*', 10],
32758 ['point', 'building', '*', 10],
32759 ['point', 'historic', '*', 10],
32760 ['point', 'leisure', '*', 10],
32761 ['point', 'man_made', '*', 10],
32762 ['point', 'natural', '*', 10],
32763 ['point', 'shop', '*', 10],
32764 ['point', 'tourism', '*', 10],
32765 ['point', 'camp_site', '*', 10],
32766 ['line', 'name', '*', 12],
32767 ['area', 'name', '*', 12],
32768 ['point', 'name', '*', 10]
32772 function blacklisted(preset) {
32773 var noIcons = ['building', 'landuse', 'natural'];
32774 return some(noIcons, function(s) {
32775 return preset.id.indexOf(s) >= 0;
32780 function get(array, prop) {
32781 return function(d, i) { return array[i][prop]; };
32785 function textWidth(text, size, elem) {
32786 var c = textWidthCache[size];
32787 if (!c) c = textWidthCache[size] = {};
32793 c[text] = elem.getComputedTextLength();
32797 var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
32798 if (str === null) {
32799 return size / 3 * 2 * text.length;
32801 return size / 3 * (2 * text.length + str.length);
32807 function drawLinePaths(selection, entities, filter, classes, labels) {
32808 var paths = selection.selectAll('path')
32810 .data(entities, osmEntity$$1.key);
32817 .style('stroke-width', get(labels, 'font-size'))
32818 .attr('id', function(d) { return 'labelpath-' + d.id; })
32819 .attr('class', classes)
32821 .attr('d', get(labels, 'lineString'));
32825 function drawLineLabels(selection, entities, filter, classes, labels) {
32826 var texts = selection.selectAll('text.' + classes)
32828 .data(entities, osmEntity$$1.key);
32835 .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
32836 .attr('dy', baselineHack ? '0.35em' : null)
32837 .append('textPath')
32838 .attr('class', 'textpath');
32840 texts = selection.selectAll('text.' + classes);
32842 texts.selectAll('.textpath')
32844 .data(entities, osmEntity$$1.key)
32845 .attr('startOffset', '50%')
32846 .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
32847 .text(utilDisplayNameForPath);
32851 function drawPointLabels(selection, entities, filter, classes, labels) {
32852 var texts = selection.selectAll('text.' + classes)
32854 .data(entities, osmEntity$$1.key);
32859 texts = texts.enter()
32861 .attr('class', function(d, i) {
32862 return classes + ' ' + labels[i].classes + ' ' + d.id;
32867 .attr('x', get(labels, 'x'))
32868 .attr('y', get(labels, 'y'))
32869 .style('text-anchor', get(labels, 'textAnchor'))
32870 .text(utilDisplayName)
32871 .each(function(d, i) {
32872 textWidth(utilDisplayName(d), labels[i].height, this);
32877 function drawAreaLabels(selection, entities, filter, classes, labels) {
32878 entities = entities.filter(hasText);
32879 labels = labels.filter(hasText);
32880 drawPointLabels(selection, entities, filter, classes, labels);
32882 function hasText(d, i) {
32883 return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
32888 function drawAreaIcons(selection, entities, filter, classes, labels) {
32889 var icons = selection.selectAll('use.' + classes)
32891 .data(entities, osmEntity$$1.key);
32896 icons = icons.enter()
32898 .attr('class', 'icon ' + classes)
32899 .attr('width', '17px')
32900 .attr('height', '17px')
32904 .attr('transform', get(labels, 'transform'))
32905 .attr('xlink:href', function(d) {
32906 var preset = context.presets().match(d, context.graph()),
32907 picon = preset && preset.icon;
32912 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
32913 return '#' + picon + (isMaki ? '-15' : '');
32919 function drawCollisionBoxes(selection, rtree, which) {
32920 var showDebug = context.getDebug('collision'),
32921 classes = 'debug ' + which + ' ' +
32922 (which === 'debug-skipped' ? 'orange' : 'yellow');
32924 var debug = selection.selectAll('.layer-label-debug')
32925 .data(showDebug ? [true] : []);
32930 debug = debug.enter()
32932 .attr('class', 'layer-label-debug')
32936 var gj = rtree.all().map(function(d) {
32937 return { type: 'Polygon', coordinates: [[
32946 var debugboxes = debug.selectAll('.' + which)
32952 debugboxes = debugboxes.enter()
32954 .attr('class', classes)
32955 .merge(debugboxes);
32958 .attr('d', d3_geoPath());
32963 function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
32964 var lowZoom = context.surface().classed('low-zoom');
32966 var labelable = [], i, j, k, entity, geometry;
32967 for (i = 0; i < labelStack.length; i++) {
32968 labelable.push([]);
32976 for (i = 0; i < entities.length; i++) {
32977 entity = entities[i];
32979 .concat(entitybboxes[entity.id] || [])
32980 .concat(entitybboxes[entity.id + 'I'] || []);
32982 for (j = 0; j < toRemove.length; j++) {
32983 rdrawn.remove(toRemove[j]);
32984 rskipped.remove(toRemove[j]);
32989 // Split entities into groups specified by labelStack
32990 for (i = 0; i < entities.length; i++) {
32991 entity = entities[i];
32992 geometry = entity.geometry(graph);
32993 if (geometry === 'vertex') { geometry = 'point'; } // treat vertex like point
32995 var preset = geometry === 'area' && context.presets().match(entity, graph),
32996 icon = preset && !blacklisted(preset) && preset.icon;
32998 if (!icon && !utilDisplayName(entity))
33001 for (k = 0; k < labelStack.length; k++) {
33002 var matchGeom = labelStack[k][0],
33003 matchKey = labelStack[k][1],
33004 matchVal = labelStack[k][2],
33005 hasVal = entity.tags[matchKey];
33007 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
33008 labelable[k].push(entity);
33026 // Try and find a valid label for labellable entities
33027 for (k = 0; k < labelable.length; k++) {
33028 var fontSize = labelStack[k][3];
33029 for (i = 0; i < labelable[k].length; i++) {
33030 entity = labelable[k][i];
33031 geometry = entity.geometry(graph);
33033 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName,
33034 name = getName(entity),
33035 width = name && textWidth(name, fontSize),
33038 if (geometry === 'point') {
33039 p = getPointLabel(entity, width, fontSize, geometry);
33040 } else if (geometry === 'vertex' && !lowZoom) {
33041 // don't label vertices at low zoom because they don't have icons
33042 p = getPointLabel(entity, width, fontSize, geometry);
33043 } else if (geometry === 'line') {
33044 p = getLineLabel(entity, width, fontSize);
33045 } else if (geometry === 'area') {
33046 p = getAreaLabel(entity, width, fontSize);
33050 if (geometry === 'vertex') { geometry = 'point'; } // treat vertex like point
33051 p.classes = geometry + ' tag-' + labelStack[k][1];
33052 positions[geometry].push(p);
33053 labelled[geometry].push(entity);
33059 function getPointLabel(entity, width, height, geometry) {
33060 var y = (geometry === 'point' ? -12 : 0),
33062 ltr: [15, y, 'start'],
33063 rtl: [-15, y, 'end']
33066 var coord = projection$$1(entity.loc),
33068 offset = pointOffsets[textDirection],
33072 x: coord[0] + offset[0],
33073 y: coord[1] + offset[1],
33074 textAnchor: offset[2]
33078 if (textDirection === 'rtl') {
33080 minX: p.x - width - margin,
33081 minY: p.y - (height / 2) - margin,
33082 maxX: p.x + margin,
33083 maxY: p.y + (height / 2) + margin
33087 minX: p.x - margin,
33088 minY: p.y - (height / 2) - margin,
33089 maxX: p.x + width + margin,
33090 maxY: p.y + (height / 2) + margin
33094 if (tryInsert([bbox], entity.id, true)) {
33100 function getLineLabel(entity, width, height) {
33101 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon(),
33102 nodes = map$4(graph.childNodes(entity), 'loc').map(projection$$1),
33103 length = geoPathLength(nodes);
33105 if (length < width + 20) return;
33107 // % along the line to attempt to place the label
33108 var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
33109 25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
33112 for (var i = 0; i < lineOffsets.length; i++) {
33113 var offset = lineOffsets[i],
33114 middle = offset / 100 * length,
33115 start = middle - width / 2;
33117 if (start < 0 || start + width > length) continue;
33119 // generate subpath and ignore paths that are invalid or don't cross viewport.
33120 var sub = subpath(nodes, start, start + width);
33121 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
33125 var isReverse = reverse(sub);
33127 sub = sub.reverse();
33131 boxsize = (height + 2) / 2;
33133 for (var j = 0; j < sub.length - 1; j++) {
33135 var b = sub[j + 1];
33136 var num = Math.max(1, Math.floor(geoEuclideanDistance(a, b) / boxsize / 2));
33138 for (var box = 0; box < num; box++) {
33139 var p = geoInterp(a, b, box / num);
33140 var x0 = p[0] - boxsize - margin;
33141 var y0 = p[1] - boxsize - margin;
33142 var x1 = p[0] + boxsize + margin;
33143 var y1 = p[1] + boxsize + margin;
33146 minX: Math.min(x0, x1),
33147 minY: Math.min(y0, y1),
33148 maxX: Math.max(x0, x1),
33149 maxY: Math.max(y0, y1)
33154 if (tryInsert(bboxes, entity.id, false)) {
33156 'font-size': height + 2,
33157 lineString: lineString(sub),
33158 startOffset: offset + '%'
33163 function reverse(p) {
33164 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
33165 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
33168 function lineString(nodes) {
33169 return 'M' + nodes.join('L');
33172 function subpath(nodes, from, to) {
33174 start, end, i0, i1;
33176 for (var i = 0; i < nodes.length - 1; i++) {
33179 var current = geoEuclideanDistance(a, b);
33181 if (!start && sofar + current >= from) {
33182 portion = (from - sofar) / current;
33184 a[0] + portion * (b[0] - a[0]),
33185 a[1] + portion * (b[1] - a[1])
33189 if (!end && sofar + current >= to) {
33190 portion = (to - sofar) / current;
33192 a[0] + portion * (b[0] - a[0]),
33193 a[1] + portion * (b[1] - a[1])
33200 var ret = nodes.slice(i0, i1);
33201 ret.unshift(start);
33208 function getAreaLabel(entity, width, height) {
33209 var centroid = path.centroid(entity.asGeoJSON(graph, true)),
33210 extent = entity.extent(graph),
33211 entitywidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
33213 if (isNaN(centroid[0]) || entitywidth < 20) return;
33216 iconX = centroid[0] - (iconSize / 2),
33217 iconY = centroid[1] - (iconSize / 2),
33219 textOffset = iconSize + margin,
33220 p = { transform: 'translate(' + iconX + ',' + iconY + ')' };
33225 maxX: iconX + iconSize,
33226 maxY: iconY + iconSize
33230 if (tryInsert([bbox], entity.id + 'I', true)) {
33231 if (width && entitywidth >= width + 20) {
33232 var labelX = centroid[0],
33233 labelY = centroid[1] + textOffset;
33236 minX: labelX - (width / 2) - margin,
33237 minY: labelY - (height / 2) - margin,
33238 maxX: labelX + (width / 2) + margin,
33239 maxY: labelY + (height / 2) + margin
33242 // try to add label
33243 if (tryInsert([bbox], entity.id, true)) {
33246 p.textAnchor = 'middle';
33256 function tryInsert(bboxes, id, saveSkipped) {
33257 var skipped = false,
33260 for (var i = 0; i < bboxes.length; i++) {
33264 // Check that label is visible
33265 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
33269 if (rdrawn.collides(bbox)) {
33275 entitybboxes[id] = bboxes;
33279 rskipped.load(bboxes);
33282 rdrawn.load(bboxes);
33289 var label = selection.selectAll('.layer-label'),
33290 halo = selection.selectAll('.layer-halo');
33293 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
33294 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
33297 drawLinePaths(halo, labelled.line, filter, '', positions.line);
33298 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
33299 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
33302 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
33303 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
33304 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
33305 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
33308 drawCollisionBoxes(label, rskipped, 'debug-skipped');
33309 drawCollisionBoxes(label, rdrawn, 'debug-drawn');
33311 selection.call(filterLabels);
33315 function filterLabels(selection) {
33316 var layers = selection
33317 .selectAll('.layer-label, .layer-halo');
33319 layers.selectAll('.proximate')
33320 .classed('proximate', false);
33322 var mouse = context.mouse(),
33323 graph = context.graph(),
33324 selectedIDs = context.selectedIDs(),
33328 // hide labels near the mouse
33331 bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
33332 ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
33335 // hide labels along selected ways, or near selected vertices
33336 for (var i = 0; i < selectedIDs.length; i++) {
33337 var entity = graph.hasEntity(selectedIDs[i]);
33338 if (!entity) continue;
33339 var geometry = entity.geometry(graph);
33341 if (geometry === 'line') {
33342 ids.push(selectedIDs[i]);
33343 } else if (geometry === 'vertex') {
33344 var point = context.projection(entity.loc);
33346 bbox = { minX: point[0] - pad, minY: point[1] - pad, maxX: point[0] + pad, maxY: point[1] + pad };
33347 ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
33351 layers.selectAll(utilEntitySelector(ids))
33352 .classed('proximate', true);
33356 var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
33359 drawLabels.observe = function(selection) {
33360 var listener = function() { throttleFilterLabels(selection); };
33361 selection.on('mousemove.hidelabels', listener);
33362 context.on('enter.hidelabels', listener);
33366 drawLabels.off = function(selection) {
33367 throttleFilterLabels.cancel();
33368 selection.on('mousemove.hidelabels', null);
33369 context.on('enter.hidelabels', null);
33376 function svgPointTransform(projection) {
33377 return function(entity) {
33378 // http://jsperf.com/short-array-join
33379 var pt = projection(entity.loc);
33380 return 'translate(' + pt[0] + ',' + pt[1] + ')';
33384 function d3geoTile() {
33385 var size = [960, 500],
33387 scaleExtent = [0, 20],
33388 translate = [size[0] / 2, size[1] / 2],
33391 function bound(_) {
33392 return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
33396 var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
33397 z0 = bound(Math.round(z + zoomDelta)),
33398 k = Math.pow(2, z - z0 + 8),
33399 origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
33401 cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
33402 rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
33404 rows.forEach(function(y) {
33405 cols.forEach(function(x) {
33406 tiles.push([x, y, z0]);
33410 tiles.translate = origin;
33416 tile.scaleExtent = function(_) {
33417 if (!arguments.length) return scaleExtent;
33422 tile.size = function(_) {
33423 if (!arguments.length) return size;
33428 tile.scale = function(_) {
33429 if (!arguments.length) return scale;
33434 tile.translate = function(_) {
33435 if (!arguments.length) return translate;
33440 tile.zoomDelta = function(_) {
33441 if (!arguments.length) return zoomDelta;
33449 /* global Mapillary:false */
33450 var apibase = 'https://a.mapillary.com/v3/';
33451 var viewercss = 'mapillary-js/mapillary.min.css';
33452 var viewerjs = 'mapillary-js/mapillary.min.js';
33453 var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
33454 var maxResults = 1000;
33456 var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
33457 var mapillaryCache;
33458 var mapillaryClicks;
33459 var mapillaryImage;
33460 var mapillarySignDefs;
33461 var mapillarySignSprite;
33462 var mapillaryViewer;
33465 function abortRequest(i) {
33470 function nearNullIsland(x, y, z) {
33472 var center = Math.pow(2, z - 1),
33473 width = Math.pow(2, z - 6),
33474 min$$1 = center - (width / 2),
33475 max$$1 = center + (width / 2) - 1;
33476 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
33482 function maxPageAtZoom(z) {
33483 if (z < 15) return 2;
33484 if (z === 15) return 5;
33485 if (z === 16) return 10;
33486 if (z === 17) return 20;
33487 if (z === 18) return 40;
33488 if (z > 18) return 80;
33492 function getTiles(projection) {
33493 var s = projection.scale() * 2 * Math.PI,
33494 z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
33495 ts = 256 * Math.pow(2, z - tileZoom),
33497 s / 2 - projection.translate()[0],
33498 s / 2 - projection.translate()[1]];
33501 .scaleExtent([tileZoom, tileZoom])
33503 .size(projection.clipExtent()[1])
33504 .translate(projection.translate())()
33505 .map(function(tile) {
33506 var x = tile[0] * ts - origin[0],
33507 y = tile[1] * ts - origin[1];
33510 id: tile.toString(),
33512 extent: geoExtent$$1(
33513 projection.invert([x, y + ts]),
33514 projection.invert([x + ts, y])
33521 function loadTiles(which, url, projection) {
33522 var s = projection.scale() * 2 * Math.PI,
33523 currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
33525 var tiles = getTiles(projection).filter(function(t) {
33526 return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
33529 filter(which.inflight, function(v, k) {
33530 var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
33531 if (!wanted) delete which.inflight[k];
33533 }).map(abortRequest);
33535 tiles.forEach(function(tile) {
33536 loadNextTilePage(which, currZoom, url, tile);
33541 function loadNextTilePage(which, currZoom, url, tile) {
33542 var cache = mapillaryCache[which],
33543 rect = tile.extent.rectangle(),
33544 maxPages = maxPageAtZoom(currZoom),
33545 nextPage = cache.nextPage[tile.id] || 0,
33546 nextURL = cache.nextURL[tile.id] || url +
33548 per_page: maxResults,
33550 client_id: clientId,
33551 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
33554 if (nextPage > maxPages) return;
33556 var id = tile.id + ',' + String(nextPage);
33557 if (cache.loaded[id] || cache.inflight[id]) return;
33558 cache.inflight[id] = d3_request(nextURL)
33559 .mimeType('application/json')
33560 .response(function(xhr) {
33561 var linkHeader = xhr.getResponseHeader('Link');
33563 var pagination = parsePagination(xhr.getResponseHeader('Link'));
33564 if (pagination.next) {
33565 cache.nextURL[tile.id] = pagination.next;
33568 return JSON.parse(xhr.responseText);
33570 .get(function(err, data) {
33571 cache.loaded[id] = true;
33572 delete cache.inflight[id];
33573 if (err || !data.features || !data.features.length) return;
33575 var features = data.features.map(function(feature) {
33576 var loc = feature.geometry.coordinates,
33579 if (which === 'images') {
33582 key: feature.properties.key,
33583 ca: feature.properties.ca,
33584 captured_at: feature.properties.captured_at,
33585 pano: feature.properties.pano
33587 } else if (which === 'objects') {
33590 key: feature.properties.key,
33591 value: feature.properties.value,
33592 package: feature.properties.package,
33593 detections: feature.properties.detections
33596 // cache image_key -> detection_key
33597 feature.properties.detections.forEach(function(detection) {
33598 var ik = detection.image_key;
33599 var dk = detection.detection_key;
33600 if (!mapillaryCache.detections[ik]) {
33601 mapillaryCache.detections[ik] = {};
33603 if (!mapillaryCache.detections[ik][dk]) {
33604 mapillaryCache.detections[ik][dk] = {};
33610 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
33614 cache.rtree.load(features);
33616 if (which === 'images') {
33617 dispatch$1.call('loadedImages');
33618 } else if (which === 'objects') {
33619 dispatch$1.call('loadedSigns');
33622 if (data.features.length === maxResults) { // more pages to load
33623 cache.nextPage[tile.id] = nextPage + 1;
33624 loadNextTilePage(which, currZoom, url, tile);
33626 cache.nextPage[tile.id] = Infinity; // no more pages to load
33631 // extract links to pages of API results
33632 function parsePagination(links) {
33633 return links.split(',').map(function(rel) {
33634 var elements = rel.split(';');
33635 if (elements.length === 2) {
33637 /<(.+)>/.exec(elements[0])[1],
33638 /rel="(.+)"/.exec(elements[1])[1]
33643 }).reduce(function(pagination, val) {
33644 pagination[val[1]] = val[0];
33650 // partition viewport into `psize` x `psize` regions
33651 function partitionViewport(psize, projection) {
33652 var dimensions = projection.clipExtent()[1];
33653 psize = psize || 16;
33654 var cols = d3_range(0, dimensions[0], psize),
33655 rows = d3_range(0, dimensions[1], psize),
33658 rows.forEach(function(y) {
33659 cols.forEach(function(x) {
33660 var min$$1 = [x, y + psize],
33661 max$$1 = [x + psize, y];
33663 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
33671 // no more than `limit` results per partition.
33672 function searchLimited(psize, limit, projection, rtree) {
33673 limit = limit || 3;
33675 var partitions = partitionViewport(psize, projection);
33678 // console.time('previous');
33679 results = flatten(map$4(partitions, function(extent$$1) {
33680 return rtree.search(extent$$1.bbox())
33682 .map(function(d) { return d.data; });
33684 // console.timeEnd('previous');
33686 // console.time('new');
33687 // results = partitions.reduce(function(result, extent) {
33688 // var found = rtree.search(extent.bbox())
33689 // .map(function(d) { return d.data; })
33690 // .sort(function(a, b) {
33691 // return a.loc[1] - b.loc[1];
33692 // // return a.key.localeCompare(b.key);
33694 // .slice(0, limit);
33696 // return (found.length ? result.concat(found) : result);
33698 // console.timeEnd('new');
33705 var serviceMapillary = {
33708 if (!mapillaryCache) {
33712 this.event = utilRebind(this, dispatch$1, 'on');
33715 reset: function() {
33716 var cache = mapillaryCache;
33719 if (cache.images && cache.images.inflight) {
33720 forEach(cache.images.inflight, abortRequest);
33722 if (cache.objects && cache.objects.inflight) {
33723 forEach(cache.objects.inflight, abortRequest);
33728 images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
33729 objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
33733 mapillaryImage = null;
33734 mapillaryClicks = [];
33738 images: function(projection) {
33739 var psize = 16, limit = 3;
33740 return searchLimited(psize, limit, projection, mapillaryCache.images.rtree);
33744 signs: function(projection) {
33745 var psize = 32, limit = 3;
33746 return searchLimited(psize, limit, projection, mapillaryCache.objects.rtree);
33750 signsSupported: function() {
33751 var detected = utilDetect();
33752 if (detected.ie) return false;
33753 if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
33758 signHTML: function(d) {
33759 if (!mapillarySignDefs || !mapillarySignSprite) return;
33760 var position = mapillarySignDefs[d.value];
33761 if (!position) return '<div></div>';
33763 'background-image:url(' + mapillarySignSprite + ')',
33764 'background-repeat:no-repeat',
33765 'height:' + position.height + 'px',
33766 'width:' + position.width + 'px',
33767 'background-position-x:-' + position.x + 'px',
33768 'background-position-y:-' + position.y + 'px',
33771 return '<div style="' + iconStyle.join(';') +'"></div>';
33775 loadImages: function(projection) {
33776 var url = apibase + 'images?';
33777 loadTiles('images', url, projection);
33781 loadSigns: function(context, projection) {
33782 var url = apibase + 'objects?';
33783 loadTiles('objects', url, projection);
33785 // load traffic sign defs
33786 if (!mapillarySignDefs) {
33787 mapillarySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
33788 mapillarySignDefs = {};
33789 d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
33791 mapillarySignDefs = data;
33797 loadViewer: function(context) {
33799 var wrap = d3_select('#content').selectAll('.mapillary-wrap')
33802 var enter = wrap.enter()
33804 .attr('class', 'mapillary-wrap')
33805 .classed('al', true) // 'al'=left, 'ar'=right
33806 .classed('hidden', true);
33810 .attr('class', 'thumb-hide')
33811 .on('click', function () { that.hideViewer(); })
33813 .call(svgIcon('#icon-close'));
33818 .attr('class', 'mly-wrapper')
33819 .classed('active', false);
33821 // load mapillary-viewercss
33822 d3_select('head').selectAll('#mapillary-viewercss')
33826 .attr('id', 'mapillary-viewercss')
33827 .attr('rel', 'stylesheet')
33828 .attr('href', context.asset(viewercss));
33830 // load mapillary-viewerjs
33831 d3_select('head').selectAll('#mapillary-viewerjs')
33835 .attr('id', 'mapillary-viewerjs')
33836 .attr('src', context.asset(viewerjs));
33840 showViewer: function() {
33841 d3_select('#content')
33842 .selectAll('.mapillary-wrap')
33843 .classed('hidden', false)
33844 .selectAll('.mly-wrapper')
33845 .classed('active', true);
33851 hideViewer: function() {
33852 d3_select('#content')
33853 .selectAll('.mapillary-wrap')
33854 .classed('hidden', true)
33855 .selectAll('.mly-wrapper')
33856 .classed('active', false);
33858 d3_selectAll('.layer-mapillary-images .viewfield-group, .layer-mapillary-signs .icon-sign')
33859 .classed('selected', false);
33861 mapillaryImage = null;
33866 parsePagination: parsePagination,
33869 updateViewer: function(imageKey, context) {
33870 if (!imageKey) return;
33872 if (!mapillaryViewer) {
33873 this.initViewer(imageKey, context);
33875 mapillaryViewer.moveToKey(imageKey);
33882 initViewer: function(imageKey, context) {
33884 if (Mapillary && imageKey) {
33886 baseImageSize: 320,
33894 mapillaryViewer = new Mapillary.Viewer('mly', clientId, imageKey, opts);
33895 mapillaryViewer.on('nodechanged', nodeChanged);
33898 // nodeChanged: called after the viewer has changed images and is ready.
33900 // There is some logic here to batch up clicks into a mapillaryClicks array
33901 // because the user might click on a lot of markers quickly and nodechanged
33902 // may be called out of order asychronously.
33904 // Clicks are added to the array in `selectedImage` and removed here.
33906 function nodeChanged(node) {
33907 mapillaryViewer.getComponent('tag').removeAll(); // remove previous detections
33909 var clicks = mapillaryClicks;
33910 var index = clicks.indexOf(node.key);
33911 if (index > -1) { // `nodechanged` initiated from clicking on a marker..
33912 clicks.splice(index, 1);
33913 // If `node.key` matches the current mapillaryImage, call `selectedImage()`
33914 // one more time to update the detections and attribution..
33915 if (node.key === mapillaryImage) {
33916 that.selectedImage(node.key, false);
33918 } else { // `nodechanged` initiated from the Mapillary viewer controls..
33919 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
33920 context.map().centerEase(loc);
33921 that.selectedImage(node.key, false);
33927 selectedImage: function(imageKey, fromClick) {
33928 if (!arguments.length) return mapillaryImage;
33929 mapillaryImage = imageKey;
33932 mapillaryClicks.push(imageKey);
33935 d3_selectAll('.layer-mapillary-images .viewfield-group')
33936 .classed('selected', function(d) {
33937 return d.key === imageKey;
33940 d3_selectAll('.layer-mapillary-signs .icon-sign')
33941 .classed('selected', function(d) {
33942 return some(d.detections, function(detection) {
33943 return detection.image_key === imageKey;
33947 if (!imageKey) return this;
33950 function localeTimestamp(s) {
33951 if (!s) return null;
33952 var d = new Date(s);
33953 if (isNaN(d.getTime())) return null;
33954 return d.toLocaleString(undefined, { timeZone: 'UTC' });
33957 var selected = d3_selectAll('.layer-mapillary-images .viewfield-group.selected');
33958 if (selected.empty()) return this;
33960 var datum = selected.datum();
33961 var timestamp = localeTimestamp(datum.captured_at);
33962 var attribution = d3_select('.mapillary-js-dom .Attribution');
33963 var capturedAt = attribution.selectAll('.captured-at');
33964 if (capturedAt.empty()) {
33968 capturedAt = attribution
33970 .attr('class', 'captured-at');
33975 this.updateDetections();
33981 updateDetections: function() {
33982 if (!mapillaryViewer) return;
33984 var detections = mapillaryCache.detections[mapillaryImage];
33985 forEach(detections, function(data, k) {
33986 if (isEmpty(data)) {
33989 var tag = makeTag(data);
33991 var tagComponent = mapillaryViewer.getComponent('tag');
33992 tagComponent.add([tag]);
33998 function loadDetection(detectionKey) {
33999 var url = apibase + 'detections/'+
34000 detectionKey + '?' + utilQsString({
34001 client_id: clientId,
34005 .mimeType('application/json')
34006 .response(function(xhr) {
34007 return JSON.parse(xhr.responseText);
34009 .get(function(err, data) {
34010 if (!data || !data.properties) return;
34012 var ik = data.properties.image_key;
34013 mapillaryCache.detections[ik][detectionKey] = data;
34015 if (mapillaryImage === ik) {
34016 var tag = makeTag(data);
34018 var tagComponent = mapillaryViewer.getComponent('tag');
34019 tagComponent.add([tag]);
34026 function makeTag(data) {
34027 var valueParts = data.properties.value.split('--');
34028 if (valueParts.length !== 3) return;
34030 var text = valueParts[1].replace(/-/g, ' ');
34033 // Currently only two shapes <Polygon|Point>
34034 if (data.properties.shape.type === 'Polygon') {
34035 var polygonGeometry = new Mapillary
34037 .PolygonGeometry(data.properties.shape.coordinates[0]);
34039 tag = new Mapillary.TagComponent.OutlineTag(
34040 data.properties.key,
34044 textColor: 0xffff00,
34045 lineColor: 0xffff00,
34047 fillColor: 0xffff00,
34052 } else if (data.properties.shape.type === 'Point') {
34053 var pointGeometry = new Mapillary
34055 .PointGeometry(data.properties.shape.coordinates[0]);
34057 tag = new Mapillary.TagComponent.SpotTag(
34058 data.properties.key,
34063 textColor: 0xffff00
34073 cache: function(_) {
34074 if (!arguments.length) return mapillaryCache;
34075 mapillaryCache = _;
34080 signDefs: function(_) {
34081 if (!arguments.length) return mapillarySignDefs;
34082 mapillarySignDefs = _;
34088 var apibase$1 = 'https://nominatim.openstreetmap.org/';
34090 var nominatimCache;
34093 var serviceNominatim = {
34097 nominatimCache = rbush_1();
34100 reset: function() {
34101 forEach(inflight, function(req) { req.abort(); });
34103 nominatimCache = rbush_1();
34107 countryCode: function (location, callback) {
34108 this.reverse(location, function(err, result) {
34110 return callback(err);
34111 } else if (result.address) {
34112 return callback(null, result.address.country_code);
34114 return callback('Unable to geocode', null);
34120 reverse: function (location, callback) {
34121 var cached = nominatimCache.search(
34122 { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
34125 if (cached.length > 0) {
34126 return callback(null, cached[0].data);
34129 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
34130 var url = apibase$1 + 'reverse?' + utilQsString(params);
34131 if (inflight[url]) return;
34133 inflight[url] = d3_json(url, function(err, result) {
34134 delete inflight[url];
34137 return callback(err);
34138 } else if (result && result.error) {
34139 return callback(result.error);
34142 var extent = geoExtent$$1(location).padByMeters(200);
34143 nominatimCache.insert(assign(extent.bbox(), {data: result}));
34145 callback(null, result);
34150 search: function (val, callback) {
34151 var searchVal = encodeURIComponent(val);
34152 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
34153 if (inflight[url]) return;
34155 inflight[url] = d3_json(url, function(err, result) {
34156 delete inflight[url];
34157 callback(err, result);
34163 /* Built-in method references for those with the same name as other `lodash` methods. */
34164 var nativeCeil = Math.ceil;
34165 var nativeMax$4 = Math.max;
34168 * Creates an array of elements split into groups the length of `size`.
34169 * If `array` can't be split evenly, the final chunk will be the remaining
34176 * @param {Array} array The array to process.
34177 * @param {number} [size=1] The length of each chunk
34178 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
34179 * @returns {Array} Returns the new array of chunks.
34182 * _.chunk(['a', 'b', 'c', 'd'], 2);
34183 * // => [['a', 'b'], ['c', 'd']]
34185 * _.chunk(['a', 'b', 'c', 'd'], 3);
34186 * // => [['a', 'b', 'c'], ['d']]
34188 function chunk(array, size, guard) {
34189 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
34192 size = nativeMax$4(toInteger(size), 0);
34194 var length = array == null ? 0 : array.length;
34195 if (!length || size < 1) {
34200 result = Array(nativeCeil(length / size));
34202 while (index < length) {
34203 result[resIndex++] = baseSlice(array, index, (index += size));
34208 var hashes = createCommonjsModule(function (module, exports) {
34210 * jshashes - https://github.com/h2non/jshashes
34211 * Released under the "New BSD" license
34213 * Algorithms specification:
34215 * MD5 - http://www.ietf.org/rfc/rfc1321.txt
34216 * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
34217 * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34218 * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34219 * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34220 * HMAC - http://www.ietf.org/rfc/rfc2104.txt
34225 function utf8Encode(str) {
34226 var x, y, output = '',
34230 if (str && str.length) {
34232 while ((i += 1) < l) {
34233 /* Decode utf-16 surrogate pairs */
34234 x = str.charCodeAt(i);
34235 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
34236 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
34237 x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
34240 /* Encode output as utf-8 */
34242 output += String.fromCharCode(x);
34243 } else if (x <= 0x7FF) {
34244 output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
34245 0x80 | (x & 0x3F));
34246 } else if (x <= 0xFFFF) {
34247 output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
34248 0x80 | ((x >>> 6) & 0x3F),
34249 0x80 | (x & 0x3F));
34250 } else if (x <= 0x1FFFFF) {
34251 output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
34252 0x80 | ((x >>> 12) & 0x3F),
34253 0x80 | ((x >>> 6) & 0x3F),
34254 0x80 | (x & 0x3F));
34261 function utf8Decode(str) {
34262 var i, ac, c1, c2, c3, arr = [],
34264 i = ac = c1 = c2 = c3 = 0;
34266 if (str && str.length) {
34271 c1 = str.charCodeAt(i);
34274 arr[ac] = String.fromCharCode(c1);
34276 } else if (c1 > 191 && c1 < 224) {
34277 c2 = str.charCodeAt(i + 1);
34278 arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
34281 c2 = str.charCodeAt(i + 1);
34282 c3 = str.charCodeAt(i + 2);
34283 arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
34288 return arr.join('');
34292 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
34293 * to work around bugs in some JS interpreters.
34296 function safe_add(x, y) {
34297 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
34298 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
34299 return (msw << 16) | (lsw & 0xFFFF);
34303 * Bitwise rotate a 32-bit number to the left.
34306 function bit_rol(num, cnt) {
34307 return (num << cnt) | (num >>> (32 - cnt));
34311 * Convert a raw string to a hex string
34314 function rstr2hex(input, hexcase) {
34315 var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
34319 for (; i < l; i += 1) {
34320 x = input.charCodeAt(i);
34321 output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
34327 * Encode a string as utf-16
34330 function binb2rstr(input) {
34331 var i, l = input.length * 32,
34333 for (i = 0; i < l; i += 8) {
34334 output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
34340 * Convert an array of little-endian words to a string
34343 function binl2rstr(input) {
34344 var i, l = input.length * 32,
34346 for (i = 0; i < l; i += 8) {
34347 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
34353 * Convert a raw string to an array of little-endian words
34354 * Characters >255 have their high-byte silently ignored.
34357 function rstr2binl(input) {
34358 var i, l = input.length * 8,
34359 output = Array(input.length >> 2),
34360 lo = output.length;
34361 for (i = 0; i < lo; i += 1) {
34364 for (i = 0; i < l; i += 8) {
34365 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
34371 * Convert a raw string to an array of big-endian words
34372 * Characters >255 have their high-byte silently ignored.
34375 function rstr2binb(input) {
34376 var i, l = input.length * 8,
34377 output = Array(input.length >> 2),
34378 lo = output.length;
34379 for (i = 0; i < lo; i += 1) {
34382 for (i = 0; i < l; i += 8) {
34383 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
34389 * Convert a raw string to an arbitrary string encoding
34392 function rstr2any(input, encoding) {
34393 var divisor = encoding.length,
34394 remainders = Array(),
34395 i, q, x, ld, quotient, dividend, output, full_length;
34397 /* Convert to an array of 16-bit big-endian values, forming the dividend */
34398 dividend = Array(Math.ceil(input.length / 2));
34399 ld = dividend.length;
34400 for (i = 0; i < ld; i += 1) {
34401 dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
34405 * Repeatedly perform a long division. The binary array forms the dividend,
34406 * the length of the encoding is the divisor. Once computed, the quotient
34407 * forms the dividend for the next step. We stop when the dividend is zerHashes.
34408 * All remainders are stored for later use.
34410 while (dividend.length > 0) {
34411 quotient = Array();
34413 for (i = 0; i < dividend.length; i += 1) {
34414 x = (x << 16) + dividend[i];
34415 q = Math.floor(x / divisor);
34417 if (quotient.length > 0 || q > 0) {
34418 quotient[quotient.length] = q;
34421 remainders[remainders.length] = x;
34422 dividend = quotient;
34425 /* Convert the remainders to the output string */
34427 for (i = remainders.length - 1; i >= 0; i--) {
34428 output += encoding.charAt(remainders[i]);
34431 /* Append leading zero equivalents */
34432 full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
34433 for (i = output.length; i < full_length; i += 1) {
34434 output = encoding[0] + output;
34440 * Convert a raw string to a base-64 string
34443 function rstr2b64(input, b64pad) {
34444 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34446 len = input.length,
34448 b64pad = b64pad || '=';
34449 for (i = 0; i < len; i += 3) {
34450 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34451 for (j = 0; j < 4; j += 1) {
34452 if (i * 8 + j * 6 > input.length * 8) {
34455 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34464 * @property {String} version
34473 Base64: function() {
34474 // private properties
34475 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34476 pad = '=', // default pad according with the RFC standard
34477 url = false, // URL encoding support @todo
34478 utf8 = true; // by default enable UTF-8 support encoding
34480 // public method for encoding
34481 this.encode = function(input) {
34484 len = input.length;
34487 input = (utf8) ? utf8Encode(input) : input;
34489 for (i = 0; i < len; i += 3) {
34490 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34491 for (j = 0; j < 4; j += 1) {
34492 if (i * 8 + j * 6 > len * 8) {
34495 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34502 // public method for decoding
34503 this.decode = function(input) {
34504 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
34505 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
34513 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
34516 do { // unpack four hexets into three octets using index points in b64
34517 h1 = tab.indexOf(input.charAt(i += 1));
34518 h2 = tab.indexOf(input.charAt(i += 1));
34519 h3 = tab.indexOf(input.charAt(i += 1));
34520 h4 = tab.indexOf(input.charAt(i += 1));
34522 bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
34524 o1 = bits >> 16 & 0xff;
34525 o2 = bits >> 8 & 0xff;
34530 arr[ac] = String.fromCharCode(o1);
34531 } else if (h4 === 64) {
34532 arr[ac] = String.fromCharCode(o1, o2);
34534 arr[ac] = String.fromCharCode(o1, o2, o3);
34536 } while (i < input.length);
34538 dec = arr.join('');
34539 dec = (utf8) ? utf8Decode(dec) : dec;
34544 // set custom pad string
34545 this.setPad = function(str) {
34549 // set custom tab string characters
34550 this.setTab = function(str) {
34554 this.setUTF8 = function(bool) {
34555 if (typeof bool === 'boolean') {
34563 * CRC-32 calculation
34567 * @param {String} str Input String
34570 CRC32: function(str) {
34575 str = utf8Encode(str);
34578 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
34579 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
34580 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
34581 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
34582 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
34583 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
34584 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
34585 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
34586 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
34587 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
34588 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
34589 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
34590 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
34591 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
34592 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
34593 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
34594 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
34595 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
34596 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
34597 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
34598 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
34599 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
34600 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
34601 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
34602 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
34603 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
34607 for (i = 0, iTop = str.length; i < iTop; i += 1) {
34608 y = (crc ^ str.charCodeAt(i)) & 0xFF;
34609 x = '0x' + table.substr(y * 9, 8);
34610 crc = (crc >>> 8) ^ x;
34612 // always return a positive number (that's what >>> 0 does)
34613 return (crc ^ (-1)) >>> 0;
34619 * @param {Object} [config]
34621 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
34622 * Digest Algorithm, as defined in RFC 1321.
34623 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
34624 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34625 * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
34627 MD5: function(options) {
34629 * Private config properties. You may need to tweak these to be compatible with
34630 * the server-side, but the defaults work in most cases.
34631 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34633 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34634 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34635 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34637 // privileged (public) methods
34638 this.hex = function(s) {
34639 return rstr2hex(rstr(s, utf8), hexcase);
34641 this.b64 = function(s) {
34642 return rstr2b64(rstr(s), b64pad);
34644 this.any = function(s, e) {
34645 return rstr2any(rstr(s, utf8), e);
34647 this.raw = function(s) {
34648 return rstr(s, utf8);
34650 this.hex_hmac = function(k, d) {
34651 return rstr2hex(rstr_hmac(k, d), hexcase);
34653 this.b64_hmac = function(k, d) {
34654 return rstr2b64(rstr_hmac(k, d), b64pad);
34656 this.any_hmac = function(k, d, e) {
34657 return rstr2any(rstr_hmac(k, d), e);
34660 * Perform a simple self-test to see if the VM is working
34661 * @return {String} Hexadecimal hash sample
34663 this.vm_test = function() {
34664 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34667 * Enable/disable uppercase hexadecimal returned string
34669 * @return {Object} this
34671 this.setUpperCase = function(a) {
34672 if (typeof a === 'boolean') {
34678 * Defines a base64 pad string
34679 * @param {String} Pad
34680 * @return {Object} this
34682 this.setPad = function(a) {
34683 b64pad = a || b64pad;
34687 * Defines a base64 pad string
34689 * @return {Object} [this]
34691 this.setUTF8 = function(a) {
34692 if (typeof a === 'boolean') {
34701 * Calculate the MD5 of a raw string
34705 s = (utf8) ? utf8Encode(s) : s;
34706 return binl2rstr(binl(rstr2binl(s), s.length * 8));
34710 * Calculate the HMAC-MD5, of a key and some data (raw strings)
34713 function rstr_hmac(key, data) {
34714 var bkey, ipad, opad, hash, i;
34716 key = (utf8) ? utf8Encode(key) : key;
34717 data = (utf8) ? utf8Encode(data) : data;
34718 bkey = rstr2binl(key);
34719 if (bkey.length > 16) {
34720 bkey = binl(bkey, key.length * 8);
34723 ipad = Array(16), opad = Array(16);
34724 for (i = 0; i < 16; i += 1) {
34725 ipad[i] = bkey[i] ^ 0x36363636;
34726 opad[i] = bkey[i] ^ 0x5C5C5C5C;
34728 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
34729 return binl2rstr(binl(opad.concat(hash), 512 + 128));
34733 * Calculate the MD5 of an array of little-endian words, and a bit length.
34736 function binl(x, len) {
34737 var i, olda, oldb, oldc, oldd,
34743 /* append padding */
34744 x[len >> 5] |= 0x80 << ((len) % 32);
34745 x[(((len + 64) >>> 9) << 4) + 14] = len;
34747 for (i = 0; i < x.length; i += 16) {
34753 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
34754 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
34755 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
34756 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
34757 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
34758 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
34759 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
34760 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
34761 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
34762 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
34763 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
34764 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
34765 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
34766 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
34767 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
34768 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
34770 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
34771 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
34772 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
34773 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
34774 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
34775 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
34776 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
34777 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
34778 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
34779 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
34780 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
34781 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
34782 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
34783 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
34784 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
34785 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
34787 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
34788 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
34789 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
34790 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
34791 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
34792 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
34793 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
34794 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
34795 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
34796 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
34797 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
34798 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
34799 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
34800 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
34801 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
34802 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
34804 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
34805 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
34806 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
34807 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
34808 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
34809 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
34810 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
34811 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
34812 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
34813 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
34814 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
34815 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
34816 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
34817 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
34818 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
34819 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
34821 a = safe_add(a, olda);
34822 b = safe_add(b, oldb);
34823 c = safe_add(c, oldc);
34824 d = safe_add(d, oldd);
34826 return Array(a, b, c, d);
34830 * These functions implement the four basic operations the algorithm uses.
34833 function md5_cmn(q, a, b, x, s, t) {
34834 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
34837 function md5_ff(a, b, c, d, x, s, t) {
34838 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
34841 function md5_gg(a, b, c, d, x, s, t) {
34842 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
34845 function md5_hh(a, b, c, d, x, s, t) {
34846 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
34849 function md5_ii(a, b, c, d, x, s, t) {
34850 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
34855 * @class Hashes.SHA1
34856 * @param {Object} [config]
34859 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
34860 * Version 2.2 Copyright Paul Johnston 2000 - 2009.
34861 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34862 * See http://pajhome.org.uk/crypt/md5 for details.
34864 SHA1: function(options) {
34866 * Private config properties. You may need to tweak these to be compatible with
34867 * the server-side, but the defaults work in most cases.
34868 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34870 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34871 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34872 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34875 this.hex = function(s) {
34876 return rstr2hex(rstr(s, utf8), hexcase);
34878 this.b64 = function(s) {
34879 return rstr2b64(rstr(s, utf8), b64pad);
34881 this.any = function(s, e) {
34882 return rstr2any(rstr(s, utf8), e);
34884 this.raw = function(s) {
34885 return rstr(s, utf8);
34887 this.hex_hmac = function(k, d) {
34888 return rstr2hex(rstr_hmac(k, d));
34890 this.b64_hmac = function(k, d) {
34891 return rstr2b64(rstr_hmac(k, d), b64pad);
34893 this.any_hmac = function(k, d, e) {
34894 return rstr2any(rstr_hmac(k, d), e);
34897 * Perform a simple self-test to see if the VM is working
34898 * @return {String} Hexadecimal hash sample
34901 this.vm_test = function() {
34902 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34905 * @description Enable/disable uppercase hexadecimal returned string
34907 * @return {Object} this
34910 this.setUpperCase = function(a) {
34911 if (typeof a === 'boolean') {
34917 * @description Defines a base64 pad string
34918 * @param {string} Pad
34919 * @return {Object} this
34922 this.setPad = function(a) {
34923 b64pad = a || b64pad;
34927 * @description Defines a base64 pad string
34929 * @return {Object} this
34932 this.setUTF8 = function(a) {
34933 if (typeof a === 'boolean') {
34942 * Calculate the SHA-512 of a raw string
34946 s = (utf8) ? utf8Encode(s) : s;
34947 return binb2rstr(binb(rstr2binb(s), s.length * 8));
34951 * Calculate the HMAC-SHA1 of a key and some data (raw strings)
34954 function rstr_hmac(key, data) {
34955 var bkey, ipad, opad, i, hash;
34956 key = (utf8) ? utf8Encode(key) : key;
34957 data = (utf8) ? utf8Encode(data) : data;
34958 bkey = rstr2binb(key);
34960 if (bkey.length > 16) {
34961 bkey = binb(bkey, key.length * 8);
34963 ipad = Array(16), opad = Array(16);
34964 for (i = 0; i < 16; i += 1) {
34965 ipad[i] = bkey[i] ^ 0x36363636;
34966 opad[i] = bkey[i] ^ 0x5C5C5C5C;
34968 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
34969 return binb2rstr(binb(opad.concat(hash), 512 + 160));
34973 * Calculate the SHA-1 of an array of big-endian words, and a bit length
34976 function binb(x, len) {
34977 var i, j, t, olda, oldb, oldc, oldd, olde,
34985 /* append padding */
34986 x[len >> 5] |= 0x80 << (24 - len % 32);
34987 x[((len + 64 >> 9) << 4) + 15] = len;
34989 for (i = 0; i < x.length; i += 16) {
34996 for (j = 0; j < 80; j += 1) {
35000 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
35002 t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
35003 safe_add(safe_add(e, w[j]), sha1_kt(j)));
35006 c = bit_rol(b, 30);
35011 a = safe_add(a, olda);
35012 b = safe_add(b, oldb);
35013 c = safe_add(c, oldc);
35014 d = safe_add(d, oldd);
35015 e = safe_add(e, olde);
35017 return Array(a, b, c, d, e);
35021 * Perform the appropriate triplet combination function for the current
35025 function sha1_ft(t, b, c, d) {
35027 return (b & c) | ((~b) & d);
35033 return (b & c) | (b & d) | (c & d);
35039 * Determine the appropriate additive constant for the current iteration
35042 function sha1_kt(t) {
35043 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
35044 (t < 60) ? -1894007588 : -899497514;
35048 * @class Hashes.SHA256
35051 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
35052 * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
35053 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35054 * See http://pajhome.org.uk/crypt/md5 for details.
35055 * Also http://anmar.eu.org/projects/jssha2/
35057 SHA256: function(options) {
35059 * Private properties configuration variables. You may need to tweak these to be compatible with
35060 * the server-side, but the defaults work in most cases.
35061 * @see this.setUpperCase() method
35062 * @see this.setPad() method
35064 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */
35065 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
35066 /* base-64 pad character. Default '=' for strict RFC compliance */
35067 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35068 /* enable/disable utf8 encoding */
35071 /* privileged (public) methods */
35072 this.hex = function(s) {
35073 return rstr2hex(rstr(s, utf8));
35075 this.b64 = function(s) {
35076 return rstr2b64(rstr(s, utf8), b64pad);
35078 this.any = function(s, e) {
35079 return rstr2any(rstr(s, utf8), e);
35081 this.raw = function(s) {
35082 return rstr(s, utf8);
35084 this.hex_hmac = function(k, d) {
35085 return rstr2hex(rstr_hmac(k, d));
35087 this.b64_hmac = function(k, d) {
35088 return rstr2b64(rstr_hmac(k, d), b64pad);
35090 this.any_hmac = function(k, d, e) {
35091 return rstr2any(rstr_hmac(k, d), e);
35094 * Perform a simple self-test to see if the VM is working
35095 * @return {String} Hexadecimal hash sample
35098 this.vm_test = function() {
35099 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35102 * Enable/disable uppercase hexadecimal returned string
35104 * @return {Object} this
35107 this.setUpperCase = function(a) {
35108 if (typeof a === 'boolean') {
35114 * @description Defines a base64 pad string
35115 * @param {string} Pad
35116 * @return {Object} this
35119 this.setPad = function(a) {
35120 b64pad = a || b64pad;
35124 * Defines a base64 pad string
35126 * @return {Object} this
35129 this.setUTF8 = function(a) {
35130 if (typeof a === 'boolean') {
35139 * Calculate the SHA-512 of a raw string
35142 function rstr(s, utf8) {
35143 s = (utf8) ? utf8Encode(s) : s;
35144 return binb2rstr(binb(rstr2binb(s), s.length * 8));
35148 * Calculate the HMAC-sha256 of a key and some data (raw strings)
35151 function rstr_hmac(key, data) {
35152 key = (utf8) ? utf8Encode(key) : key;
35153 data = (utf8) ? utf8Encode(data) : data;
35155 bkey = rstr2binb(key),
35159 if (bkey.length > 16) {
35160 bkey = binb(bkey, key.length * 8);
35163 for (; i < 16; i += 1) {
35164 ipad[i] = bkey[i] ^ 0x36363636;
35165 opad[i] = bkey[i] ^ 0x5C5C5C5C;
35168 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
35169 return binb2rstr(binb(opad.concat(hash), 512 + 256));
35173 * Main sha256 function, with its support functions
35176 function sha256_S(X, n) {
35177 return (X >>> n) | (X << (32 - n));
35180 function sha256_R(X, n) {
35184 function sha256_Ch(x, y, z) {
35185 return ((x & y) ^ ((~x) & z));
35188 function sha256_Maj(x, y, z) {
35189 return ((x & y) ^ (x & z) ^ (y & z));
35192 function sha256_Sigma0256(x) {
35193 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
35196 function sha256_Sigma1256(x) {
35197 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
35200 function sha256_Gamma0256(x) {
35201 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
35204 function sha256_Gamma1256(x) {
35205 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
35209 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
35210 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
35211 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
35212 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
35213 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
35214 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
35215 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
35218 function binb(m, l) {
35219 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
35220 1359893119, -1694144372, 528734635, 1541459225
35222 var W = new Array(64);
35223 var a, b, c, d, e, f, g, h;
35226 /* append padding */
35227 m[l >> 5] |= 0x80 << (24 - l % 32);
35228 m[((l + 64 >> 9) << 4) + 15] = l;
35230 for (i = 0; i < m.length; i += 16) {
35240 for (j = 0; j < 64; j += 1) {
35244 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
35245 sha256_Gamma0256(W[j - 15])), W[j - 16]);
35248 T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
35249 sha256_K[j]), W[j]);
35250 T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
35254 e = safe_add(d, T1);
35258 a = safe_add(T1, T2);
35261 HASH[0] = safe_add(a, HASH[0]);
35262 HASH[1] = safe_add(b, HASH[1]);
35263 HASH[2] = safe_add(c, HASH[2]);
35264 HASH[3] = safe_add(d, HASH[3]);
35265 HASH[4] = safe_add(e, HASH[4]);
35266 HASH[5] = safe_add(f, HASH[5]);
35267 HASH[6] = safe_add(g, HASH[6]);
35268 HASH[7] = safe_add(h, HASH[7]);
35276 * @class Hashes.SHA512
35279 * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
35280 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
35281 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35282 * See http://pajhome.org.uk/crypt/md5 for details.
35284 SHA512: function(options) {
35286 * Private properties configuration variables. You may need to tweak these to be compatible with
35287 * the server-side, but the defaults work in most cases.
35288 * @see this.setUpperCase() method
35289 * @see this.setPad() method
35291 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
35292 /* hexadecimal output case format. false - lowercase; true - uppercase */
35293 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
35294 /* base-64 pad character. Default '=' for strict RFC compliance */
35295 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35296 /* enable/disable utf8 encoding */
35299 /* privileged (public) methods */
35300 this.hex = function(s) {
35301 return rstr2hex(rstr(s));
35303 this.b64 = function(s) {
35304 return rstr2b64(rstr(s), b64pad);
35306 this.any = function(s, e) {
35307 return rstr2any(rstr(s), e);
35309 this.raw = function(s) {
35310 return rstr(s, utf8);
35312 this.hex_hmac = function(k, d) {
35313 return rstr2hex(rstr_hmac(k, d));
35315 this.b64_hmac = function(k, d) {
35316 return rstr2b64(rstr_hmac(k, d), b64pad);
35318 this.any_hmac = function(k, d, e) {
35319 return rstr2any(rstr_hmac(k, d), e);
35322 * Perform a simple self-test to see if the VM is working
35323 * @return {String} Hexadecimal hash sample
35326 this.vm_test = function() {
35327 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35330 * @description Enable/disable uppercase hexadecimal returned string
35332 * @return {Object} this
35335 this.setUpperCase = function(a) {
35336 if (typeof a === 'boolean') {
35342 * @description Defines a base64 pad string
35343 * @param {string} Pad
35344 * @return {Object} this
35347 this.setPad = function(a) {
35348 b64pad = a || b64pad;
35352 * @description Defines a base64 pad string
35354 * @return {Object} this
35357 this.setUTF8 = function(a) {
35358 if (typeof a === 'boolean') {
35364 /* private methods */
35367 * Calculate the SHA-512 of a raw string
35371 s = (utf8) ? utf8Encode(s) : s;
35372 return binb2rstr(binb(rstr2binb(s), s.length * 8));
35375 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
35378 function rstr_hmac(key, data) {
35379 key = (utf8) ? utf8Encode(key) : key;
35380 data = (utf8) ? utf8Encode(data) : data;
35383 bkey = rstr2binb(key),
35387 if (bkey.length > 32) {
35388 bkey = binb(bkey, key.length * 8);
35391 for (; i < 32; i += 1) {
35392 ipad[i] = bkey[i] ^ 0x36363636;
35393 opad[i] = bkey[i] ^ 0x5C5C5C5C;
35396 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
35397 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
35401 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
35404 function binb(x, len) {
35407 hash = new Array(16),
35408 //Initial hash values
35410 new int64(0x6a09e667, -205731576),
35411 new int64(-1150833019, -2067093701),
35412 new int64(0x3c6ef372, -23791573),
35413 new int64(-1521486534, 0x5f1d36f1),
35414 new int64(0x510e527f, -1377402159),
35415 new int64(-1694144372, 0x2b3e6c1f),
35416 new int64(0x1f83d9ab, -79577749),
35417 new int64(0x5be0cd19, 0x137e2179)
35419 T1 = new int64(0, 0),
35420 T2 = new int64(0, 0),
35421 a = new int64(0, 0),
35422 b = new int64(0, 0),
35423 c = new int64(0, 0),
35424 d = new int64(0, 0),
35425 e = new int64(0, 0),
35426 f = new int64(0, 0),
35427 g = new int64(0, 0),
35428 h = new int64(0, 0),
35429 //Temporary variables not specified by the document
35430 s0 = new int64(0, 0),
35431 s1 = new int64(0, 0),
35432 Ch = new int64(0, 0),
35433 Maj = new int64(0, 0),
35434 r1 = new int64(0, 0),
35435 r2 = new int64(0, 0),
35436 r3 = new int64(0, 0);
35438 if (sha512_k === undefined) {
35441 new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
35442 new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
35443 new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
35444 new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
35445 new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
35446 new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
35447 new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
35448 new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
35449 new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
35450 new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
35451 new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
35452 new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
35453 new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
35454 new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
35455 new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
35456 new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
35457 new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
35458 new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
35459 new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
35460 new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
35461 new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
35462 new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
35463 new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
35464 new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
35465 new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
35466 new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
35467 new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
35468 new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
35469 new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
35470 new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
35471 new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
35472 new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
35473 new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
35474 new int64(-354779690, -840897762), new int64(-176337025, -294727304),
35475 new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
35476 new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
35477 new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
35478 new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
35479 new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
35480 new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
35484 for (i = 0; i < 80; i += 1) {
35485 W[i] = new int64(0, 0);
35488 // append padding to the source string. The format is described in the FIPS.
35489 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
35490 x[((len + 128 >> 10) << 5) + 31] = len;
35492 for (i = 0; i < l; i += 32) { //32 dwords is the block size
35493 int64copy(a, H[0]);
35494 int64copy(b, H[1]);
35495 int64copy(c, H[2]);
35496 int64copy(d, H[3]);
35497 int64copy(e, H[4]);
35498 int64copy(f, H[5]);
35499 int64copy(g, H[6]);
35500 int64copy(h, H[7]);
35502 for (j = 0; j < 16; j += 1) {
35503 W[j].h = x[i + 2 * j];
35504 W[j].l = x[i + 2 * j + 1];
35507 for (j = 16; j < 80; j += 1) {
35509 int64rrot(r1, W[j - 2], 19);
35510 int64revrrot(r2, W[j - 2], 29);
35511 int64shr(r3, W[j - 2], 6);
35512 s1.l = r1.l ^ r2.l ^ r3.l;
35513 s1.h = r1.h ^ r2.h ^ r3.h;
35515 int64rrot(r1, W[j - 15], 1);
35516 int64rrot(r2, W[j - 15], 8);
35517 int64shr(r3, W[j - 15], 7);
35518 s0.l = r1.l ^ r2.l ^ r3.l;
35519 s0.h = r1.h ^ r2.h ^ r3.h;
35521 int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
35524 for (j = 0; j < 80; j += 1) {
35526 Ch.l = (e.l & f.l) ^ (~e.l & g.l);
35527 Ch.h = (e.h & f.h) ^ (~e.h & g.h);
35530 int64rrot(r1, e, 14);
35531 int64rrot(r2, e, 18);
35532 int64revrrot(r3, e, 9);
35533 s1.l = r1.l ^ r2.l ^ r3.l;
35534 s1.h = r1.h ^ r2.h ^ r3.h;
35537 int64rrot(r1, a, 28);
35538 int64revrrot(r2, a, 2);
35539 int64revrrot(r3, a, 7);
35540 s0.l = r1.l ^ r2.l ^ r3.l;
35541 s0.h = r1.h ^ r2.h ^ r3.h;
35544 Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
35545 Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
35547 int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
35548 int64add(T2, s0, Maj);
35553 int64add(e, d, T1);
35557 int64add(a, T1, T2);
35559 int64add(H[0], H[0], a);
35560 int64add(H[1], H[1], b);
35561 int64add(H[2], H[2], c);
35562 int64add(H[3], H[3], d);
35563 int64add(H[4], H[4], e);
35564 int64add(H[5], H[5], f);
35565 int64add(H[6], H[6], g);
35566 int64add(H[7], H[7], h);
35569 //represent the hash as an array of 32-bit dwords
35570 for (i = 0; i < 8; i += 1) {
35571 hash[2 * i] = H[i].h;
35572 hash[2 * i + 1] = H[i].l;
35577 //A constructor for 64-bit numbers
35579 function int64(h, l) {
35582 //this.toString = int64toString;
35585 //Copies src into dst, assuming both are 64-bit numbers
35587 function int64copy(dst, src) {
35592 //Right-rotates a 64-bit number by shift
35593 //Won't handle cases of shift>=32
35594 //The function revrrot() is for that
35596 function int64rrot(dst, x, shift) {
35597 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35598 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
35601 //Reverses the dwords of the source and then rotates right by shift.
35602 //This is equivalent to rotation by 32+shift
35604 function int64revrrot(dst, x, shift) {
35605 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
35606 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
35609 //Bitwise-shifts right a 64-bit number by shift
35610 //Won't handle shift>=32, but it's never needed in SHA512
35612 function int64shr(dst, x, shift) {
35613 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35614 dst.h = (x.h >>> shift);
35617 //Adds two 64-bit numbers
35618 //Like the original implementation, does not rely on 32-bit operations
35620 function int64add(dst, x, y) {
35621 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
35622 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
35623 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
35624 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
35625 dst.l = (w0 & 0xffff) | (w1 << 16);
35626 dst.h = (w2 & 0xffff) | (w3 << 16);
35629 //Same, except with 4 addends. Works faster than adding them one by one.
35631 function int64add4(dst, a, b, c, d) {
35632 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
35633 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
35634 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
35635 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
35636 dst.l = (w0 & 0xffff) | (w1 << 16);
35637 dst.h = (w2 & 0xffff) | (w3 << 16);
35640 //Same, except with 5 addends
35642 function int64add5(dst, a, b, c, d, e) {
35643 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
35644 w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
35645 w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
35646 w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
35647 dst.l = (w0 & 0xffff) | (w1 << 16);
35648 dst.h = (w2 & 0xffff) | (w3 << 16);
35652 * @class Hashes.RMD160
35654 * @param {Object} [config]
35656 * A JavaScript implementation of the RIPEMD-160 Algorithm
35657 * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
35658 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35659 * See http://pajhome.org.uk/crypt/md5 for details.
35660 * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
35662 RMD160: function(options) {
35664 * Private properties configuration variables. You may need to tweak these to be compatible with
35665 * the server-side, but the defaults work in most cases.
35666 * @see this.setUpperCase() method
35667 * @see this.setPad() method
35669 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
35670 /* hexadecimal output case format. false - lowercase; true - uppercase */
35671 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
35672 /* base-64 pad character. Default '=' for strict RFC compliance */
35673 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35674 /* enable/disable utf8 encoding */
35676 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
35677 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
35678 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
35679 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
35680 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
35683 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
35684 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
35685 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
35686 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
35687 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
35690 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
35691 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
35692 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
35693 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
35694 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
35697 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
35698 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
35699 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
35700 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
35701 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
35704 /* privileged (public) methods */
35705 this.hex = function(s) {
35706 return rstr2hex(rstr(s, utf8));
35708 this.b64 = function(s) {
35709 return rstr2b64(rstr(s, utf8), b64pad);
35711 this.any = function(s, e) {
35712 return rstr2any(rstr(s, utf8), e);
35714 this.raw = function(s) {
35715 return rstr(s, utf8);
35717 this.hex_hmac = function(k, d) {
35718 return rstr2hex(rstr_hmac(k, d));
35720 this.b64_hmac = function(k, d) {
35721 return rstr2b64(rstr_hmac(k, d), b64pad);
35723 this.any_hmac = function(k, d, e) {
35724 return rstr2any(rstr_hmac(k, d), e);
35727 * Perform a simple self-test to see if the VM is working
35728 * @return {String} Hexadecimal hash sample
35731 this.vm_test = function() {
35732 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35735 * @description Enable/disable uppercase hexadecimal returned string
35737 * @return {Object} this
35740 this.setUpperCase = function(a) {
35741 if (typeof a === 'boolean') {
35747 * @description Defines a base64 pad string
35748 * @param {string} Pad
35749 * @return {Object} this
35752 this.setPad = function(a) {
35753 if (typeof a !== 'undefined') {
35759 * @description Defines a base64 pad string
35761 * @return {Object} this
35764 this.setUTF8 = function(a) {
35765 if (typeof a === 'boolean') {
35771 /* private methods */
35774 * Calculate the rmd160 of a raw string
35778 s = (utf8) ? utf8Encode(s) : s;
35779 return binl2rstr(binl(rstr2binl(s), s.length * 8));
35783 * Calculate the HMAC-rmd160 of a key and some data (raw strings)
35786 function rstr_hmac(key, data) {
35787 key = (utf8) ? utf8Encode(key) : key;
35788 data = (utf8) ? utf8Encode(data) : data;
35790 bkey = rstr2binl(key),
35794 if (bkey.length > 16) {
35795 bkey = binl(bkey, key.length * 8);
35798 for (i = 0; i < 16; i += 1) {
35799 ipad[i] = bkey[i] ^ 0x36363636;
35800 opad[i] = bkey[i] ^ 0x5C5C5C5C;
35802 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
35803 return binl2rstr(binl(opad.concat(hash), 512 + 160));
35807 * Convert an array of little-endian words to a string
35810 function binl2rstr(input) {
35811 var i, output = '',
35812 l = input.length * 32;
35813 for (i = 0; i < l; i += 8) {
35814 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
35820 * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
35823 function binl(x, len) {
35830 A1, B1, C1, D1, E1,
35831 A2, B2, C2, D2, E2;
35833 /* append padding */
35834 x[len >> 5] |= 0x80 << (len % 32);
35835 x[(((len + 64) >>> 9) << 4) + 14] = len;
35838 for (i = 0; i < l; i += 16) {
35844 for (j = 0; j <= 79; j += 1) {
35845 T = safe_add(A1, rmd160_f(j, B1, C1, D1));
35846 T = safe_add(T, x[i + rmd160_r1[j]]);
35847 T = safe_add(T, rmd160_K1(j));
35848 T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
35851 D1 = bit_rol(C1, 10);
35854 T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
35855 T = safe_add(T, x[i + rmd160_r2[j]]);
35856 T = safe_add(T, rmd160_K2(j));
35857 T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
35860 D2 = bit_rol(C2, 10);
35865 T = safe_add(h1, safe_add(C1, D2));
35866 h1 = safe_add(h2, safe_add(D1, E2));
35867 h2 = safe_add(h3, safe_add(E1, A2));
35868 h3 = safe_add(h4, safe_add(A1, B2));
35869 h4 = safe_add(h0, safe_add(B1, C2));
35872 return [h0, h1, h2, h3, h4];
35875 // specific algorithm methods
35877 function rmd160_f(j, x, y, z) {
35878 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
35879 (16 <= j && j <= 31) ? (x & y) | (~x & z) :
35880 (32 <= j && j <= 47) ? (x | ~y) ^ z :
35881 (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
35882 (64 <= j && j <= 79) ? x ^ (y | ~z) :
35883 'rmd160_f: j out of range';
35886 function rmd160_K1(j) {
35887 return (0 <= j && j <= 15) ? 0x00000000 :
35888 (16 <= j && j <= 31) ? 0x5a827999 :
35889 (32 <= j && j <= 47) ? 0x6ed9eba1 :
35890 (48 <= j && j <= 63) ? 0x8f1bbcdc :
35891 (64 <= j && j <= 79) ? 0xa953fd4e :
35892 'rmd160_K1: j out of range';
35895 function rmd160_K2(j) {
35896 return (0 <= j && j <= 15) ? 0x50a28be6 :
35897 (16 <= j && j <= 31) ? 0x5c4dd124 :
35898 (32 <= j && j <= 47) ? 0x6d703ef3 :
35899 (48 <= j && j <= 63) ? 0x7a6d76e9 :
35900 (64 <= j && j <= 79) ? 0x00000000 :
35901 'rmd160_K2: j out of range';
35907 (function(window, undefined) {
35908 var freeExports = false;
35910 freeExports = exports;
35911 if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
35912 window = commonjsGlobal;
35916 if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
35917 // define as an anonymous module, so, through path mapping, it can be aliased
35918 undefined(function() {
35921 } else if (freeExports) {
35922 // in Node.js or RingoJS v0.8.0+
35923 if ('object' === 'object' && module && module.exports === freeExports) {
35924 module.exports = Hashes;
35926 // in Narwhal or RingoJS v0.7.0-
35928 freeExports.Hashes = Hashes;
35931 // in a browser or Rhino
35932 window.Hashes = Hashes;
35938 var immutable = extend$2;
35940 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
35942 function extend$2() {
35945 for (var i = 0; i < arguments.length; i++) {
35946 var source = arguments[i];
35948 for (var key in source) {
35949 if (hasOwnProperty$16.call(source, key)) {
35950 target[key] = source[key];
35958 var sha1 = new hashes.SHA1();
35962 ohauth.qsString = function(obj) {
35963 return Object.keys(obj).sort().map(function(key) {
35964 return ohauth.percentEncode(key) + '=' +
35965 ohauth.percentEncode(obj[key]);
35969 ohauth.stringQs = function(str) {
35970 return str.split('&').filter(function (pair) {
35971 return pair !== '';
35972 }).reduce(function(obj, pair){
35973 var parts = pair.split('=');
35974 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
35975 '' : decodeURIComponent(parts[1]);
35980 ohauth.rawxhr = function(method, url, data, headers, callback) {
35981 var xhr = new XMLHttpRequest(),
35982 twoHundred = /^20\d$/;
35983 xhr.onreadystatechange = function() {
35984 if (4 === xhr.readyState && 0 !== xhr.status) {
35985 if (twoHundred.test(xhr.status)) callback(null, xhr);
35986 else return callback(xhr, null);
35989 xhr.onerror = function(e) { return callback(e, null); };
35990 xhr.open(method, url, true);
35991 for (var h in headers) xhr.setRequestHeader(h, headers[h]);
35996 ohauth.xhr = function(method, url, auth, data, options, callback) {
35997 var headers = (options && options.header) || {
35998 'Content-Type': 'application/x-www-form-urlencoded'
36000 headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
36001 return ohauth.rawxhr(method, url, data, headers, callback);
36004 ohauth.nonce = function() {
36005 for (var o = ''; o.length < 6;) {
36006 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
36011 ohauth.authHeader = function(obj) {
36012 return Object.keys(obj).sort().map(function(key) {
36013 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
36017 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
36019 ohauth.percentEncode = function(s) {
36020 return encodeURIComponent(s)
36021 .replace(/\!/g, '%21').replace(/\'/g, '%27')
36022 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
36025 ohauth.baseString = function(method, url, params) {
36026 if (params.oauth_signature) delete params.oauth_signature;
36029 ohauth.percentEncode(url),
36030 ohauth.percentEncode(ohauth.qsString(params))].join('&');
36033 ohauth.signature = function(oauth_secret, token_secret, baseString) {
36034 return sha1.b64_hmac(
36035 ohauth.percentEncode(oauth_secret) + '&' +
36036 ohauth.percentEncode(token_secret),
36041 * Takes an options object for configuration (consumer_key,
36042 * consumer_secret, version, signature_method, token, token_secret)
36043 * and returns a function that generates the Authorization header
36046 * The returned function takes these parameters:
36047 * - method: GET/POST/...
36048 * - uri: full URI with protocol, port, path and query string
36049 * - extra_params: any extra parameters (that are passed in the POST data),
36050 * can be an object or a from-urlencoded string.
36052 * Returned function returns full OAuth header with "OAuth" string in it.
36055 ohauth.headerGenerator = function(options) {
36056 options = options || {};
36057 var consumer_key = options.consumer_key || '',
36058 consumer_secret = options.consumer_secret || '',
36059 signature_method = options.signature_method || 'HMAC-SHA1',
36060 version = options.version || '1.0',
36061 token = options.token || '',
36062 token_secret = options.token_secret || '';
36064 return function(method, uri, extra_params) {
36065 method = method.toUpperCase();
36066 if (typeof extra_params === 'string' && extra_params.length > 0) {
36067 extra_params = ohauth.stringQs(extra_params);
36070 var uri_parts = uri.split('?', 2),
36071 base_uri = uri_parts[0];
36073 var query_params = uri_parts.length === 2 ?
36074 ohauth.stringQs(uri_parts[1]) : {};
36076 var oauth_params = {
36077 oauth_consumer_key: consumer_key,
36078 oauth_signature_method: signature_method,
36079 oauth_version: version,
36080 oauth_timestamp: ohauth.timestamp(),
36081 oauth_nonce: ohauth.nonce()
36084 if (token) oauth_params.oauth_token = token;
36086 var all_params = immutable({}, oauth_params, query_params, extra_params),
36087 base_str = ohauth.baseString(method, base_uri, all_params);
36089 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
36091 return 'OAuth ' + ohauth.authHeader(oauth_params);
36095 var ohauth_1 = ohauth;
36097 var resolveUrl = createCommonjsModule(function (module, exports) {
36098 // Copyright 2014 Simon Lydell
36099 // X11 (“MIT”) Licensed. (See LICENSE.)
36101 void (function(root, factory) {
36102 if (typeof undefined === "function" && undefined.amd) {
36103 undefined(factory);
36105 module.exports = factory();
36107 }(commonjsGlobal, function() {
36109 function resolveUrl(/* ...urls */) {
36110 var numUrls = arguments.length;
36112 if (numUrls === 0) {
36113 throw new Error("resolveUrl requires at least one argument; got none.")
36116 var base = document.createElement("base");
36117 base.href = arguments[0];
36119 if (numUrls === 1) {
36123 var head = document.getElementsByTagName("head")[0];
36124 head.insertBefore(base, head.firstChild);
36126 var a = document.createElement("a");
36129 for (var index = 1; index < numUrls; index++) {
36130 a.href = arguments[index];
36132 base.href = resolved;
36135 head.removeChild(base);
36145 var assign$1 = make_assign();
36146 var create$2 = make_create();
36147 var trim = make_trim();
36148 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
36160 isFunction: isFunction$2,
36161 isObject: isObject$3,
36165 function make_assign() {
36166 if (Object.assign) {
36167 return Object.assign
36169 return function shimAssign(obj, props1, props2, etc) {
36170 for (var i = 1; i < arguments.length; i++) {
36171 each$1(Object(arguments[i]), function(val, key) {
36180 function make_create() {
36181 if (Object.create) {
36182 return function create(obj, assignProps1, assignProps2, etc) {
36183 var assignArgsList = slice$8(arguments, 1);
36184 return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
36187 function F() {} // eslint-disable-line no-inner-declarations
36188 return function create(obj, assignProps1, assignProps2, etc) {
36189 var assignArgsList = slice$8(arguments, 1);
36191 return assign$1.apply(this, [new F()].concat(assignArgsList))
36196 function make_trim() {
36197 if (String.prototype.trim) {
36198 return function trim(str) {
36199 return String.prototype.trim.call(str)
36202 return function trim(str) {
36203 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
36208 function bind$1(obj, fn) {
36209 return function() {
36210 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
36214 function slice$8(arr, index) {
36215 return Array.prototype.slice.call(arr, index || 0)
36218 function each$1(obj, fn) {
36219 pluck$1(obj, function(val, key) {
36225 function map$5(obj, fn) {
36226 var res = (isList$1(obj) ? [] : {});
36227 pluck$1(obj, function(v, k) {
36234 function pluck$1(obj, fn) {
36235 if (isList$1(obj)) {
36236 for (var i=0; i<obj.length; i++) {
36237 if (fn(obj[i], i)) {
36242 for (var key in obj) {
36243 if (obj.hasOwnProperty(key)) {
36244 if (fn(obj[key], key)) {
36252 function isList$1(val) {
36253 return (val != null && typeof val != 'function' && typeof val.length == 'number')
36256 function isFunction$2(val) {
36257 return val && {}.toString.call(val) === '[object Function]'
36260 function isObject$3(val) {
36261 return val && {}.toString.call(val) === '[object Object]'
36264 var slice$7 = util.slice;
36265 var pluck = util.pluck;
36266 var each = util.each;
36267 var bind = util.bind;
36268 var create$1 = util.create;
36269 var isList = util.isList;
36270 var isFunction$1 = util.isFunction;
36271 var isObject$2 = util.isObject;
36273 var storeEngine = {
36274 createStore: createStore
36281 // get returns the value of the given key. If that value
36282 // is undefined, it returns optionalDefaultValue instead.
36283 get: function(key, optionalDefaultValue) {
36284 var data = this.storage.read(this._namespacePrefix + key);
36285 return this._deserialize(data, optionalDefaultValue)
36288 // set will store the given value at key and returns value.
36289 // Calling set with value === undefined is equivalent to calling remove.
36290 set: function(key, value) {
36291 if (value === undefined) {
36292 return this.remove(key)
36294 this.storage.write(this._namespacePrefix + key, this._serialize(value));
36298 // remove deletes the key and value stored at the given key.
36299 remove: function(key) {
36300 this.storage.remove(this._namespacePrefix + key);
36303 // each will call the given callback once for each key-value pair
36305 each: function(callback) {
36307 this.storage.each(function(val, namespacedKey) {
36308 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
36312 // clearAll will remove all the stored key-value pairs in this store.
36313 clearAll: function() {
36314 this.storage.clearAll();
36317 // additional functionality that can't live in plugins
36318 // ---------------------------------------------------
36320 // hasNamespace returns true if this store instance has the given namespace.
36321 hasNamespace: function(namespace) {
36322 return (this._namespacePrefix == '__storejs_'+namespace+'_')
36325 // createStore creates a store.js instance with the first
36326 // functioning storage in the list of storage candidates,
36327 // and applies the the given mixins to the instance.
36328 createStore: function() {
36329 return createStore.apply(this, arguments)
36332 addPlugin: function(plugin) {
36333 this._addPlugin(plugin);
36336 namespace: function(namespace) {
36337 return createStore(this.storage, this.plugins, namespace)
36342 var _console = (typeof console == 'undefined' ? null : console);
36343 if (!_console) { return }
36344 var fn = (_console.warn ? _console.warn : _console.log);
36345 fn.apply(_console, arguments);
36348 function createStore(storages, plugins, namespace) {
36352 if (storages && !isList(storages)) {
36353 storages = [storages];
36355 if (plugins && !isList(plugins)) {
36356 plugins = [plugins];
36359 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
36360 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
36361 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
36362 if (!legalNamespaces.test(namespace)) {
36363 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
36366 var _privateStoreProps = {
36367 _namespacePrefix: namespacePrefix,
36368 _namespaceRegexp: namespaceRegexp,
36370 _testStorage: function(storage) {
36372 var testStr = '__storejs__test__';
36373 storage.write(testStr, testStr);
36374 var ok = (storage.read(testStr) === testStr);
36375 storage.remove(testStr);
36382 _assignPluginFnProp: function(pluginFnProp, propName) {
36383 var oldFn = this[propName];
36384 this[propName] = function pluginFn() {
36385 var args = slice$7(arguments, 0);
36388 // super_fn calls the old function which was overwritten by
36390 function super_fn() {
36391 if (!oldFn) { return }
36392 each(arguments, function(arg, i) {
36395 return oldFn.apply(self, args)
36398 // Give mixing function access to super_fn by prefixing all mixin function
36399 // arguments with super_fn.
36400 var newFnArgs = [super_fn].concat(args);
36402 return pluginFnProp.apply(self, newFnArgs)
36406 _serialize: function(obj) {
36407 return JSON.stringify(obj)
36410 _deserialize: function(strVal, defaultVal) {
36411 if (!strVal) { return defaultVal }
36412 // It is possible that a raw string value has been previously stored
36413 // in a storage without using store.js, meaning it will be a raw
36414 // string value instead of a JSON serialized string. By defaulting
36415 // to the raw string value in case of a JSON parse error, we allow
36416 // for past stored values to be forwards-compatible with store.js
36418 try { val = JSON.parse(strVal); }
36419 catch(e) { val = strVal; }
36421 return (val !== undefined ? val : defaultVal)
36424 _addStorage: function(storage) {
36425 if (this.enabled) { return }
36426 if (this._testStorage(storage)) {
36427 this.storage = storage;
36428 this.enabled = true;
36432 _addPlugin: function(plugin) {
36435 // If the plugin is an array, then add all plugins in the array.
36436 // This allows for a plugin to depend on other plugins.
36437 if (isList(plugin)) {
36438 each(plugin, function(plugin) {
36439 self._addPlugin(plugin);
36444 // Keep track of all plugins we've seen so far, so that we
36445 // don't add any of them twice.
36446 var seenPlugin = pluck(this.plugins, function(seenPlugin) {
36447 return (plugin === seenPlugin)
36452 this.plugins.push(plugin);
36454 // Check that the plugin is properly formed
36455 if (!isFunction$1(plugin)) {
36456 throw new Error('Plugins must be function values that return objects')
36459 var pluginProperties = plugin.call(this);
36460 if (!isObject$2(pluginProperties)) {
36461 throw new Error('Plugins must return an object of function properties')
36464 // Add the plugin function properties to this store instance.
36465 each(pluginProperties, function(pluginFnProp, propName) {
36466 if (!isFunction$1(pluginFnProp)) {
36467 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
36469 self._assignPluginFnProp(pluginFnProp, propName);
36473 // Put deprecated properties in the private API, so as to not expose it to accidential
36474 // discovery through inspection of the store object.
36476 // Deprecated: addStorage
36477 addStorage: function(storage) {
36478 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
36479 this._addStorage(storage);
36483 var store = create$1(_privateStoreProps, storeAPI, {
36487 each(store, function(prop, propName) {
36488 if (isFunction$1(prop)) {
36489 store.raw[propName] = bind(store, prop);
36492 each(storages, function(storage) {
36493 store._addStorage(storage);
36495 each(plugins, function(plugin) {
36496 store._addPlugin(plugin);
36501 var Global$1 = util.Global;
36503 var localStorage_1 = {
36504 name: 'localStorage',
36509 clearAll: clearAll,
36512 function localStorage$1() {
36513 return Global$1.localStorage
36516 function read(key) {
36517 return localStorage$1().getItem(key)
36520 function write(key, data) {
36521 return localStorage$1().setItem(key, data)
36524 function each$2(fn) {
36525 for (var i = localStorage$1().length - 1; i >= 0; i--) {
36526 var key = localStorage$1().key(i);
36527 fn(read(key), key);
36531 function remove$2(key) {
36532 return localStorage$1().removeItem(key)
36535 function clearAll() {
36536 return localStorage$1().clear()
36539 // oldFF-globalStorage provides storage for Firefox
36540 // versions 6 and 7, where no localStorage, etc
36544 var Global$2 = util.Global;
36546 var oldFFGlobalStorage = {
36547 name: 'oldFF-globalStorage',
36552 clearAll: clearAll$1,
36555 var globalStorage = Global$2.globalStorage;
36557 function read$1(key) {
36558 return globalStorage[key]
36561 function write$1(key, data) {
36562 globalStorage[key] = data;
36565 function each$3(fn) {
36566 for (var i = globalStorage.length - 1; i >= 0; i--) {
36567 var key = globalStorage.key(i);
36568 fn(globalStorage[key], key);
36572 function remove$3(key) {
36573 return globalStorage.removeItem(key)
36576 function clearAll$1() {
36577 each$3(function(key, _) {
36578 delete globalStorage[key];
36582 // oldIE-userDataStorage provides storage for Internet Explorer
36583 // versions 6 and 7, where no localStorage, sessionStorage, etc
36587 var Global$3 = util.Global;
36589 var oldIEUserDataStorage = {
36590 name: 'oldIE-userDataStorage',
36595 clearAll: clearAll$2,
36598 var storageName = 'storejs';
36599 var doc = Global$3.document;
36600 var _withStorageEl = _makeIEStorageElFunction();
36601 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
36603 function write$2(unfixedKey, data) {
36604 if (disable) { return }
36605 var fixedKey = fixKey(unfixedKey);
36606 _withStorageEl(function(storageEl) {
36607 storageEl.setAttribute(fixedKey, data);
36608 storageEl.save(storageName);
36612 function read$2(unfixedKey) {
36613 if (disable) { return }
36614 var fixedKey = fixKey(unfixedKey);
36616 _withStorageEl(function(storageEl) {
36617 res = storageEl.getAttribute(fixedKey);
36622 function each$4(callback) {
36623 _withStorageEl(function(storageEl) {
36624 var attributes = storageEl.XMLDocument.documentElement.attributes;
36625 for (var i=attributes.length-1; i>=0; i--) {
36626 var attr = attributes[i];
36627 callback(storageEl.getAttribute(attr.name), attr.name);
36632 function remove$4(unfixedKey) {
36633 var fixedKey = fixKey(unfixedKey);
36634 _withStorageEl(function(storageEl) {
36635 storageEl.removeAttribute(fixedKey);
36636 storageEl.save(storageName);
36640 function clearAll$2() {
36641 _withStorageEl(function(storageEl) {
36642 var attributes = storageEl.XMLDocument.documentElement.attributes;
36643 storageEl.load(storageName);
36644 for (var i=attributes.length-1; i>=0; i--) {
36645 storageEl.removeAttribute(attributes[i].name);
36647 storageEl.save(storageName);
36654 // In IE7, keys cannot start with a digit or contain certain chars.
36655 // See https://github.com/marcuswestin/store.js/issues/40
36656 // See https://github.com/marcuswestin/store.js/issues/83
36657 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
36658 function fixKey(key) {
36659 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
36662 function _makeIEStorageElFunction() {
36663 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
36666 var scriptTag = 'script',
36671 // Since #userData storage applies only to specific paths, we need to
36672 // somehow link our data to a specific path. We choose /favicon.ico
36673 // as a pretty safe option, since all browsers already make a request to
36674 // this URL anyway and being a 404 will not hurt us here. We wrap an
36675 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
36676 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
36677 // since the iframe access rules appear to allow direct access and
36678 // manipulation of the document element, even for a 404 page. This
36679 // document can be used instead of the current document (which would
36680 // have been limited to the current path) to perform #userData storage.
36682 /* global ActiveXObject */
36683 storageContainer = new ActiveXObject('htmlfile');
36684 storageContainer.open();
36685 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
36686 storageContainer.close();
36687 storageOwner = storageContainer.w.frames[0].document;
36688 storageEl = storageOwner.createElement('div');
36690 // somehow ActiveXObject instantiation failed (perhaps some special
36691 // security settings or otherwse), fall back to per-path storage
36692 storageEl = doc.createElement('div');
36693 storageOwner = doc.body;
36696 return function(storeFunction) {
36697 var args = [].slice.call(arguments, 0);
36698 args.unshift(storageEl);
36699 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
36700 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
36701 storageOwner.appendChild(storageEl);
36702 storageEl.addBehavior('#default#userData');
36703 storageEl.load(storageName);
36704 storeFunction.apply(this, args);
36705 storageOwner.removeChild(storageEl);
36710 // cookieStorage is useful Safari private browser mode, where localStorage
36711 // doesn't work but cookies do. This implementation is adopted from
36712 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
36715 var Global$4 = util.Global;
36716 var trim$1 = util.trim;
36718 var cookieStorage = {
36719 name: 'cookieStorage',
36724 clearAll: clearAll$3,
36727 var doc$1 = Global$4.document;
36729 function read$3(key) {
36730 if (!key || !_has(key)) { return null }
36731 var regexpStr = "(?:^|.*;\\s*)" +
36732 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
36733 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
36734 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
36737 function each$5(callback) {
36738 var cookies = doc$1.cookie.split(/; ?/g);
36739 for (var i = cookies.length - 1; i >= 0; i--) {
36740 if (!trim$1(cookies[i])) {
36743 var kvp = cookies[i].split('=');
36744 var key = unescape(kvp[0]);
36745 var val = unescape(kvp[1]);
36746 callback(val, key);
36750 function write$3(key, data) {
36751 if(!key) { return }
36752 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
36755 function remove$5(key) {
36756 if (!key || !_has(key)) {
36759 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
36762 function clearAll$3() {
36763 each$5(function(_, key) {
36768 function _has(key) {
36769 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
36772 var Global$5 = util.Global;
36774 var sessionStorage_1 = {
36775 name: 'sessionStorage',
36780 clearAll: clearAll$4
36783 function sessionStorage() {
36784 return Global$5.sessionStorage
36787 function read$4(key) {
36788 return sessionStorage().getItem(key)
36791 function write$4(key, data) {
36792 return sessionStorage().setItem(key, data)
36795 function each$6(fn) {
36796 for (var i = sessionStorage().length - 1; i >= 0; i--) {
36797 var key = sessionStorage().key(i);
36798 fn(read$4(key), key);
36802 function remove$6(key) {
36803 return sessionStorage().removeItem(key)
36806 function clearAll$4() {
36807 return sessionStorage().clear()
36810 // memoryStorage is a useful last fallback to ensure that the store
36811 // is functions (meaning store.get(), store.set(), etc will all function).
36812 // However, stored values will not persist when the browser navigates to
36813 // a new page or reloads the current page.
36815 var memoryStorage_1 = {
36816 name: 'memoryStorage',
36821 clearAll: clearAll$5,
36824 var memoryStorage = {};
36826 function read$5(key) {
36827 return memoryStorage[key]
36830 function write$5(key, data) {
36831 memoryStorage[key] = data;
36834 function each$7(callback) {
36835 for (var key in memoryStorage) {
36836 if (memoryStorage.hasOwnProperty(key)) {
36837 callback(memoryStorage[key], key);
36842 function remove$7(key) {
36843 delete memoryStorage[key];
36846 function clearAll$5(key) {
36847 memoryStorage = {};
36851 // Listed in order of usage preference
36853 oldFFGlobalStorage,
36854 oldIEUserDataStorage,
36860 /* eslint-disable */
36865 // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
36866 // See http://www.JSON.org/js.html
36867 // This code should be minified before deployment.
36868 // See http://javascript.crockford.com/jsmin.html
36870 // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
36873 // This file creates a global JSON object containing two methods: stringify
36874 // and parse. This file provides the ES5 JSON capability to ES3 systems.
36875 // If a project might run on IE8 or earlier, then this file should be included.
36876 // This file does nothing on ES5 systems.
36878 // JSON.stringify(value, replacer, space)
36879 // value any JavaScript value, usually an object or array.
36880 // replacer an optional parameter that determines how object
36881 // values are stringified for objects. It can be a
36882 // function or an array of strings.
36883 // space an optional parameter that specifies the indentation
36884 // of nested structures. If it is omitted, the text will
36885 // be packed without extra whitespace. If it is a number,
36886 // it will specify the number of spaces to indent at each
36887 // level. If it is a string (such as "\t" or " "),
36888 // it contains the characters used to indent at each level.
36889 // This method produces a JSON text from a JavaScript value.
36890 // When an object value is found, if the object contains a toJSON
36891 // method, its toJSON method will be called and the result will be
36892 // stringified. A toJSON method does not serialize: it returns the
36893 // value represented by the name/value pair that should be serialized,
36894 // or undefined if nothing should be serialized. The toJSON method
36895 // will be passed the key associated with the value, and this will be
36896 // bound to the value.
36898 // For example, this would serialize Dates as ISO strings.
36900 // Date.prototype.toJSON = function (key) {
36902 // // Format integers to have at least two digits.
36907 // return this.getUTCFullYear() + "-" +
36908 // f(this.getUTCMonth() + 1) + "-" +
36909 // f(this.getUTCDate()) + "T" +
36910 // f(this.getUTCHours()) + ":" +
36911 // f(this.getUTCMinutes()) + ":" +
36912 // f(this.getUTCSeconds()) + "Z";
36915 // You can provide an optional replacer method. It will be passed the
36916 // key and value of each member, with this bound to the containing
36917 // object. The value that is returned from your method will be
36918 // serialized. If your method returns undefined, then the member will
36919 // be excluded from the serialization.
36921 // If the replacer parameter is an array of strings, then it will be
36922 // used to select the members to be serialized. It filters the results
36923 // such that only members with keys listed in the replacer array are
36926 // Values that do not have JSON representations, such as undefined or
36927 // functions, will not be serialized. Such values in objects will be
36928 // dropped; in arrays they will be replaced with null. You can use
36929 // a replacer function to replace those with JSON values.
36931 // JSON.stringify(undefined) returns undefined.
36933 // The optional space parameter produces a stringification of the
36934 // value that is filled with line breaks and indentation to make it
36937 // If the space parameter is a non-empty string, then that string will
36938 // be used for indentation. If the space parameter is a number, then
36939 // the indentation will be that many spaces.
36943 // text = JSON.stringify(["e", {pluribus: "unum"}]);
36944 // // text is '["e",{"pluribus":"unum"}]'
36946 // text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
36947 // // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
36949 // text = JSON.stringify([new Date()], function (key, value) {
36950 // return this[key] instanceof Date
36951 // ? "Date(" + this[key] + ")"
36954 // // text is '["Date(---current time---)"]'
36956 // JSON.parse(text, reviver)
36957 // This method parses a JSON text to produce an object or array.
36958 // It can throw a SyntaxError exception.
36960 // The optional reviver parameter is a function that can filter and
36961 // transform the results. It receives each of the keys and values,
36962 // and its return value is used instead of the original value.
36963 // If it returns what it received, then the structure is not modified.
36964 // If it returns undefined then the member is deleted.
36968 // // Parse the text. Values that look like ISO date strings will
36969 // // be converted to Date objects.
36971 // myData = JSON.parse(text, function (key, value) {
36973 // if (typeof value === "string") {
36975 // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
36977 // return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
36984 // myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
36986 // if (typeof value === "string" &&
36987 // value.slice(0, 5) === "Date(" &&
36988 // value.slice(-1) === ")") {
36989 // d = new Date(value.slice(5, -1));
36997 // This is a reference implementation. You are free to copy, modify, or
37005 JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
37006 getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
37007 lastIndex, length, parse, prototype, push, replace, slice, stringify,
37008 test, toJSON, toString, valueOf
37012 // Create a JSON object only if one does not already exist. We create the
37013 // methods in a closure to avoid creating global variables.
37015 if (typeof JSON !== "object") {
37022 var rx_one = /^[\],:{}\s]*$/;
37023 var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
37024 var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
37025 var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
37026 var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
37027 var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
37030 // Format integers to have at least two digits.
37036 function this_value() {
37037 return this.valueOf();
37040 if (typeof Date.prototype.toJSON !== "function") {
37042 Date.prototype.toJSON = function () {
37044 return isFinite(this.valueOf())
37045 ? this.getUTCFullYear() + "-" +
37046 f(this.getUTCMonth() + 1) + "-" +
37047 f(this.getUTCDate()) + "T" +
37048 f(this.getUTCHours()) + ":" +
37049 f(this.getUTCMinutes()) + ":" +
37050 f(this.getUTCSeconds()) + "Z"
37054 Boolean.prototype.toJSON = this_value;
37055 Number.prototype.toJSON = this_value;
37056 String.prototype.toJSON = this_value;
37065 function quote(string) {
37067 // If the string contains no control characters, no quote characters, and no
37068 // backslash characters, then we can safely slap some quotes around it.
37069 // Otherwise we must also replace the offending characters with safe escape
37072 rx_escapable.lastIndex = 0;
37073 return rx_escapable.test(string)
37074 ? "\"" + string.replace(rx_escapable, function (a) {
37076 return typeof c === "string"
37078 : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
37080 : "\"" + string + "\"";
37084 function str(key, holder) {
37086 // Produce a string from holder[key].
37088 var i; // The loop counter.
37089 var k; // The member key.
37090 var v; // The member value.
37094 var value = holder[key];
37096 // If the value has a toJSON method, call it to obtain a replacement value.
37098 if (value && typeof value === "object" &&
37099 typeof value.toJSON === "function") {
37100 value = value.toJSON(key);
37103 // If we were called with a replacer function, then call the replacer to
37104 // obtain a replacement value.
37106 if (typeof rep === "function") {
37107 value = rep.call(holder, key, value);
37110 // What happens next depends on the value's type.
37112 switch (typeof value) {
37114 return quote(value);
37118 // JSON numbers must be finite. Encode non-finite numbers as null.
37120 return isFinite(value)
37127 // If the value is a boolean or null, convert it to a string. Note:
37128 // typeof null does not produce "null". The case is included here in
37129 // the remote chance that this gets fixed someday.
37131 return String(value);
37133 // If the type is "object", we might be dealing with an object or an array or
37138 // Due to a specification blunder in ECMAScript, typeof null is "object",
37139 // so watch out for that case.
37145 // Make an array to hold the partial results of stringifying this object value.
37150 // Is the value an array?
37152 if (Object.prototype.toString.apply(value) === "[object Array]") {
37154 // The value is an array. Stringify every element. Use null as a placeholder
37155 // for non-JSON values.
37157 length = value.length;
37158 for (i = 0; i < length; i += 1) {
37159 partial[i] = str(i, value) || "null";
37162 // Join all of the elements together, separated with commas, and wrap them in
37165 v = partial.length === 0
37168 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
37169 : "[" + partial.join(",") + "]";
37174 // If the replacer is an array, use it to select the members to be stringified.
37176 if (rep && typeof rep === "object") {
37177 length = rep.length;
37178 for (i = 0; i < length; i += 1) {
37179 if (typeof rep[i] === "string") {
37183 partial.push(quote(k) + (
37193 // Otherwise, iterate through all of the keys in the object.
37196 if (Object.prototype.hasOwnProperty.call(value, k)) {
37199 partial.push(quote(k) + (
37209 // Join all of the member texts together, separated with commas,
37210 // and wrap them in braces.
37212 v = partial.length === 0
37215 ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
37216 : "{" + partial.join(",") + "}";
37222 // If the JSON object does not yet have a stringify method, give it one.
37224 if (typeof JSON.stringify !== "function") {
37225 meta = { // table of character substitutions
37234 JSON.stringify = function (value, replacer, space) {
37236 // The stringify method takes a value and an optional replacer, and an optional
37237 // space parameter, and returns a JSON text. The replacer can be a function
37238 // that can replace values, or an array of strings that will select the keys.
37239 // A default replacer method can be provided. Use of the space parameter can
37240 // produce text that is more easily readable.
37246 // If the space parameter is a number, make an indent string containing that
37249 if (typeof space === "number") {
37250 for (i = 0; i < space; i += 1) {
37254 // If the space parameter is a string, it will be used as the indent string.
37256 } else if (typeof space === "string") {
37260 // If there is a replacer, it must be a function or an array.
37261 // Otherwise, throw an error.
37264 if (replacer && typeof replacer !== "function" &&
37265 (typeof replacer !== "object" ||
37266 typeof replacer.length !== "number")) {
37267 throw new Error("JSON.stringify");
37270 // Make a fake root object containing our value under the key of "".
37271 // Return the result of stringifying the value.
37273 return str("", {"": value});
37278 // If the JSON object does not yet have a parse method, give it one.
37280 if (typeof JSON.parse !== "function") {
37281 JSON.parse = function (text, reviver) {
37283 // The parse method takes a text and an optional reviver function, and returns
37284 // a JavaScript value if the text is a valid JSON text.
37288 function walk(holder, key) {
37290 // The walk method is used to recursively walk the resulting structure so
37291 // that modifications can be made.
37295 var value = holder[key];
37296 if (value && typeof value === "object") {
37298 if (Object.prototype.hasOwnProperty.call(value, k)) {
37299 v = walk(value, k);
37300 if (v !== undefined) {
37308 return reviver.call(holder, key, value);
37312 // Parsing happens in four stages. In the first stage, we replace certain
37313 // Unicode characters with escape sequences. JavaScript handles many characters
37314 // incorrectly, either silently deleting them, or treating them as line endings.
37316 text = String(text);
37317 rx_dangerous.lastIndex = 0;
37318 if (rx_dangerous.test(text)) {
37319 text = text.replace(rx_dangerous, function (a) {
37321 ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
37325 // In the second stage, we run the text against regular expressions that look
37326 // for non-JSON patterns. We are especially concerned with "()" and "new"
37327 // because they can cause invocation, and "=" because it can cause mutation.
37328 // But just to be safe, we want to reject all unexpected forms.
37330 // We split the second stage into 4 regexp operations in order to work around
37331 // crippling inefficiencies in IE's and Safari's regexp engines. First we
37332 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
37333 // replace all simple value tokens with "]" characters. Third, we delete all
37334 // open brackets that follow a colon or comma or that begin the text. Finally,
37335 // we look to see that the remaining characters are only whitespace or "]" or
37336 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
37341 .replace(rx_two, "@")
37342 .replace(rx_three, "]")
37343 .replace(rx_four, "")
37347 // In the third stage we use the eval function to compile the text into a
37348 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
37349 // in JavaScript: it can begin a block or an object literal. We wrap the text
37350 // in parens to eliminate the ambiguity.
37352 j = eval("(" + text + ")");
37354 // In the optional fourth stage, we recursively walk the new structure, passing
37355 // each name/value pair to a reviver function for possible transformation.
37357 return (typeof reviver === "function")
37358 ? walk({"": j}, "")
37362 // If the text is not JSON parseable, then a SyntaxError is thrown.
37364 throw new SyntaxError("JSON.parse");
37369 var json2 = json2Plugin;
37371 function json2Plugin() {
37376 var plugins = [json2];
37378 var store_legacy = storeEngine.createStore(all$3, plugins);
37382 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
37383 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
37384 // does not support custom headers, which this uses everywhere.
37385 var osmAuth = function(o) {
37389 // authenticated users will also have a request token secret, but it's
37390 // not used in transactions with the server
37391 oauth.authenticated = function() {
37392 return !!(token('oauth_token') && token('oauth_token_secret'));
37395 oauth.logout = function() {
37396 token('oauth_token', '');
37397 token('oauth_token_secret', '');
37398 token('oauth_request_token_secret', '');
37402 // TODO: detect lack of click event
37403 oauth.authenticate = function(callback) {
37404 if (oauth.authenticated()) return callback();
37408 // ## Getting a request token
37409 var params = timenonce(getAuth(o)),
37410 url = o.url + '/oauth/request_token';
37412 params.oauth_signature = ohauth_1.signature(
37413 o.oauth_secret, '',
37414 ohauth_1.baseString('POST', url, params));
37416 if (!o.singlepage) {
37417 // Create a 600x550 popup window in the center of the screen
37418 var w = 600, h = 550,
37420 ['width', w], ['height', h],
37421 ['left', screen.width / 2 - w / 2],
37422 ['top', screen.height / 2 - h / 2]].map(function(x) {
37423 return x.join('=');
37425 popup = window.open('about:blank', 'oauth_window', settings);
37428 // Request a request token. When this is complete, the popup
37429 // window is redirected to OSM's authorization page.
37430 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
37433 function reqTokenDone(err, xhr) {
37435 if (err) return callback(err);
37436 var resp = ohauth_1.stringQs(xhr.response);
37437 token('oauth_request_token_secret', resp.oauth_token_secret);
37438 var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
37439 oauth_token: resp.oauth_token,
37440 oauth_callback: resolveUrl(o.landing)
37443 if (o.singlepage) {
37444 location.href = authorize_url;
37446 popup.location = authorize_url;
37450 // Called by a function in a landing page, in the popup window. The
37451 // window closes itself.
37452 window.authComplete = function(token) {
37453 var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
37454 get_access_token(oauth_token.oauth_token);
37455 delete window.authComplete;
37458 // ## Getting an request token
37460 // At this point we have an `oauth_token`, brought in from a function
37461 // call on a landing page popup.
37462 function get_access_token(oauth_token) {
37463 var url = o.url + '/oauth/access_token',
37464 params = timenonce(getAuth(o)),
37465 request_token_secret = token('oauth_request_token_secret');
37466 params.oauth_token = oauth_token;
37467 params.oauth_signature = ohauth_1.signature(
37469 request_token_secret,
37470 ohauth_1.baseString('POST', url, params));
37472 // ## Getting an access token
37474 // The final token required for authentication. At this point
37475 // we have a `request token secret`
37476 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37480 function accessTokenDone(err, xhr) {
37482 if (err) return callback(err);
37483 var access_token = ohauth_1.stringQs(xhr.response);
37484 token('oauth_token', access_token.oauth_token);
37485 token('oauth_token_secret', access_token.oauth_token_secret);
37486 callback(null, oauth);
37490 oauth.bootstrapToken = function(oauth_token, callback) {
37491 // ## Getting an request token
37492 // At this point we have an `oauth_token`, brought in from a function
37493 // call on a landing page popup.
37494 function get_access_token(oauth_token) {
37495 var url = o.url + '/oauth/access_token',
37496 params = timenonce(getAuth(o)),
37497 request_token_secret = token('oauth_request_token_secret');
37498 params.oauth_token = oauth_token;
37499 params.oauth_signature = ohauth_1.signature(
37501 request_token_secret,
37502 ohauth_1.baseString('POST', url, params));
37504 // ## Getting an access token
37505 // The final token required for authentication. At this point
37506 // we have a `request token secret`
37507 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37511 function accessTokenDone(err, xhr) {
37513 if (err) return callback(err);
37514 var access_token = ohauth_1.stringQs(xhr.response);
37515 token('oauth_token', access_token.oauth_token);
37516 token('oauth_token_secret', access_token.oauth_token_secret);
37517 callback(null, oauth);
37520 get_access_token(oauth_token);
37525 // A single XMLHttpRequest wrapper that does authenticated calls if the
37526 // user has logged in.
37527 oauth.xhr = function(options, callback) {
37528 if (!oauth.authenticated()) {
37530 return oauth.authenticate(run);
37532 callback('not authenticated', null);
37540 var params = timenonce(getAuth(o)),
37541 oauth_token_secret = token('oauth_token_secret'),
37542 url = (options.prefix !== false) ? o.url + options.path : options.path,
37543 url_parts = url.replace(/#.*$/, '').split('?', 2),
37544 base_url = url_parts[0],
37545 query = (url_parts.length === 2) ? url_parts[1] : '';
37547 // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
37548 if ((!options.options || !options.options.header ||
37549 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
37551 params = immutable(params, ohauth_1.stringQs(options.content));
37554 params.oauth_token = token('oauth_token');
37555 params.oauth_signature = ohauth_1.signature(
37557 oauth_token_secret,
37558 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
37561 return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
37564 function done(err, xhr) {
37565 if (err) return callback(err);
37566 else if (xhr.responseXML) return callback(err, xhr.responseXML);
37567 else return callback(err, xhr.response);
37571 // pre-authorize this object, if we can just get a token and token_secret
37573 oauth.preauth = function(c) {
37575 if (c.oauth_token) token('oauth_token', c.oauth_token);
37576 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
37580 oauth.options = function(_) {
37581 if (!arguments.length) return o;
37584 o.url = o.url || 'https://www.openstreetmap.org';
37585 o.landing = o.landing || 'land.html';
37586 o.singlepage = o.singlepage || false;
37588 // Optional loading and loading-done functions for nice UI feedback.
37589 // by default, no-ops
37590 o.loading = o.loading || function() {};
37591 o.done = o.done || function() {};
37593 return oauth.preauth(o);
37596 // 'stamp' an authentication object from `getAuth()`
37597 // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
37599 function timenonce(o) {
37600 o.oauth_timestamp = ohauth_1.timestamp();
37601 o.oauth_nonce = ohauth_1.nonce();
37605 // get/set tokens. These are prefixed with the base URL so that `osm-auth`
37606 // can be used with multiple APIs and the keys in `localStorage`
37610 if (store_legacy.enabled) {
37611 token = function (x, y) {
37612 if (arguments.length === 1) return store_legacy.get(o.url + x);
37613 else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
37617 token = function (x, y) {
37618 if (arguments.length === 1) return storage[o.url + x];
37619 else if (arguments.length === 2) return storage[o.url + x] = y;
37623 // Get an authentication object. If you just add and remove properties
37624 // from a single object, you'll need to use `delete` to make sure that
37625 // it doesn't contain undesired properties for authentication
37626 function getAuth(o) {
37628 oauth_consumer_key: o.oauth_consumer_key,
37629 oauth_signature_method: 'HMAC-SHA1'
37633 // potentially pre-authorize
37639 var JXON = new (function () {
37641 sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
37642 aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
37644 function parseText (sValue) {
37645 if (rIsNull.test(sValue)) { return null; }
37646 if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
37647 if (isFinite(sValue)) { return parseFloat(sValue); }
37648 if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
37652 function EmptyTree () { }
37653 EmptyTree.prototype.toString = function () { return 'null'; };
37654 EmptyTree.prototype.valueOf = function () { return null; };
37656 function objectify (vValue) {
37657 return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
37660 function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
37662 nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
37663 bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
37666 sProp, vContent, nLength = 0, sCollectedTxt = '',
37667 vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
37670 for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
37671 oNode = oParentNode.childNodes.item(nItem);
37672 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
37673 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
37674 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
37678 var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
37680 if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
37682 for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
37683 sProp = aCache[nElId].nodeName.toLowerCase();
37684 vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
37685 if (vResult.hasOwnProperty(sProp)) {
37686 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
37687 vResult[sProp].push(vContent);
37689 vResult[sProp] = vContent;
37696 nAttrLen = oParentNode.attributes.length,
37697 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
37699 for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
37700 oAttrib = oParentNode.attributes.item(nAttrib);
37701 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
37705 if (bFreeze) { Object.freeze(oAttrParent); }
37706 vResult[sAttributesProp] = oAttrParent;
37707 nLength -= nAttrLen - 1;
37711 if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
37712 vResult[sValueProp] = vBuiltVal;
37713 } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
37714 vResult = vBuiltVal;
37717 if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
37719 aCache.length = nLevelStart;
37724 function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
37725 var vValue, oChild;
37727 if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
37728 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
37729 } else if (oParentObj.constructor === Date) {
37730 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
37733 for (var sName in oParentObj) {
37734 vValue = oParentObj[sName];
37735 if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
37736 if (sName === sValueProp) {
37737 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
37738 } else if (sName === sAttributesProp) { /* verbosity level is 3 */
37739 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
37740 } else if (sName.charAt(0) === sAttrPref) {
37741 oParentEl.setAttribute(sName.slice(1), vValue);
37742 } else if (vValue.constructor === Array) {
37743 for (var nItem = 0; nItem < vValue.length; nItem++) {
37744 oChild = oXMLDoc.createElement(sName);
37745 loadObjTree(oXMLDoc, oChild, vValue[nItem]);
37746 oParentEl.appendChild(oChild);
37749 oChild = oXMLDoc.createElement(sName);
37750 if (vValue instanceof Object) {
37751 loadObjTree(oXMLDoc, oChild, vValue);
37752 } else if (vValue !== null && vValue !== true) {
37753 oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
37755 oParentEl.appendChild(oChild);
37760 this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
37761 var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
37762 return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
37765 this.unbuild = function (oObjTree) {
37766 var oNewDoc = document.implementation.createDocument('', '', null);
37767 loadObjTree(oNewDoc, oNewDoc, oObjTree);
37771 this.stringify = function (oObjTree) {
37772 return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
37776 // var myObject = JXON.build(doc);
37777 // we got our javascript object! try: alert(JSON.stringify(myObject));
37779 // var newDoc = JXON.unbuild(myObject);
37780 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
37782 var dispatch$2 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
37783 var urlroot = 'https://www.openstreetmap.org';
37784 var blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
37785 var inflight$1 = {};
37786 var loadedTiles = {};
37787 var entityCache = {};
37788 var tileZoom$1 = 16;
37789 var oauth = osmAuth({
37791 oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
37792 oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
37793 loading: authLoading,
37796 var rateLimitError;
37797 var userChangesets;
37802 function authLoading() {
37803 dispatch$2.call('authLoading');
37807 function authDone() {
37808 dispatch$2.call('authDone');
37812 function abortRequest$1(i) {
37819 function getLoc(attrs) {
37820 var lon = attrs.lon && attrs.lon.value,
37821 lat = attrs.lat && attrs.lat.value;
37822 return [parseFloat(lon), parseFloat(lat)];
37826 function getNodes(obj) {
37827 var elems = obj.getElementsByTagName('nd'),
37828 nodes = new Array(elems.length);
37829 for (var i = 0, l = elems.length; i < l; i++) {
37830 nodes[i] = 'n' + elems[i].attributes.ref.value;
37836 function getTags(obj) {
37837 var elems = obj.getElementsByTagName('tag'),
37839 for (var i = 0, l = elems.length; i < l; i++) {
37840 var attrs = elems[i].attributes;
37841 tags[attrs.k.value] = attrs.v.value;
37848 function getMembers(obj) {
37849 var elems = obj.getElementsByTagName('member'),
37850 members = new Array(elems.length);
37851 for (var i = 0, l = elems.length; i < l; i++) {
37852 var attrs = elems[i].attributes;
37854 id: attrs.type.value[0] + attrs.ref.value,
37855 type: attrs.type.value,
37856 role: attrs.role.value
37863 function getVisible(attrs) {
37864 return (!attrs.visible || attrs.visible.value !== 'false');
37869 node: function nodeData(obj, uid) {
37870 var attrs = obj.attributes;
37871 return new osmNode({
37873 visible: getVisible(attrs),
37874 version: attrs.version.value,
37875 changeset: attrs.changeset && attrs.changeset.value,
37876 timestamp: attrs.timestamp && attrs.timestamp.value,
37877 user: attrs.user && attrs.user.value,
37878 uid: attrs.uid && attrs.uid.value,
37879 loc: getLoc(attrs),
37884 way: function wayData(obj, uid) {
37885 var attrs = obj.attributes;
37886 return new osmWay({
37888 visible: getVisible(attrs),
37889 version: attrs.version.value,
37890 changeset: attrs.changeset && attrs.changeset.value,
37891 timestamp: attrs.timestamp && attrs.timestamp.value,
37892 user: attrs.user && attrs.user.value,
37893 uid: attrs.uid && attrs.uid.value,
37894 tags: getTags(obj),
37895 nodes: getNodes(obj),
37899 relation: function relationData(obj, uid) {
37900 var attrs = obj.attributes;
37901 return new osmRelation({
37903 visible: getVisible(attrs),
37904 version: attrs.version.value,
37905 changeset: attrs.changeset && attrs.changeset.value,
37906 timestamp: attrs.timestamp && attrs.timestamp.value,
37907 user: attrs.user && attrs.user.value,
37908 uid: attrs.uid && attrs.uid.value,
37909 tags: getTags(obj),
37910 members: getMembers(obj)
37916 function parse$1(xml, callback, options) {
37917 options = assignIn$1({ cache: true }, options);
37918 if (!xml || !xml.childNodes) return;
37920 var root = xml.childNodes[0],
37921 children = root.childNodes;
37923 function parseChild(child) {
37924 var parser = parsers[child.nodeName];
37926 var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
37927 if (options.cache && entityCache[uid]) {
37930 return parser(child, uid);
37934 utilIdleWorker(children, parseChild, callback);
37941 utilRebind(this, dispatch$2, 'on');
37945 reset: function() {
37946 userChangesets = undefined;
37947 userDetails = undefined;
37948 rateLimitError = undefined;
37949 forEach(inflight$1, abortRequest$1);
37957 changesetURL: function(changesetId) {
37958 return urlroot + '/changeset/' + changesetId;
37962 changesetsURL: function(center, zoom) {
37963 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
37964 return urlroot + '/history#map=' +
37965 Math.floor(zoom) + '/' +
37966 center[1].toFixed(precision) + '/' +
37967 center[0].toFixed(precision);
37971 entityURL: function(entity) {
37972 return urlroot + '/' + entity.type + '/' + entity.osmId();
37976 historyURL: function(entity) {
37977 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
37981 userURL: function(username) {
37982 return urlroot + '/user/' + username;
37986 loadFromAPI: function(path, callback, options) {
37987 options = assignIn$1({ cache: true }, options);
37990 function done(err, xml) {
37991 var isAuthenticated = that.authenticated();
37993 // 400 Bad Request, 401 Unauthorized, 403 Forbidden
37994 // Logout and retry the request..
37995 if (isAuthenticated && err &&
37996 (err.status === 400 || err.status === 401 || err.status === 403)) {
37998 that.loadFromAPI(path, callback);
38000 // else, no retry..
38002 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
38003 // Set the rateLimitError flag and trigger a warning..
38004 if (!isAuthenticated && !rateLimitError && err &&
38005 (err.status === 509 || err.status === 429)) {
38006 rateLimitError = err;
38007 dispatch$2.call('change');
38011 if (err) return callback(err, null);
38012 parse$1(xml, function (entities) {
38013 if (options.cache) {
38014 for (var i in entities) {
38015 entityCache[entities[i].id] = true;
38018 callback(null, entities);
38024 if (this.authenticated()) {
38025 return oauth.xhr({ method: 'GET', path: path }, done);
38027 var url = urlroot + path;
38028 return d3_xml(url).get(done);
38033 loadEntity: function(id, callback) {
38034 var type = osmEntity$$1.id.type(id),
38035 osmID = osmEntity$$1.id.toOSM(id),
38036 options = { cache: false };
38039 '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
38040 function(err, entities) {
38041 if (callback) callback(err, { data: entities });
38048 loadEntityVersion: function(id, version, callback) {
38049 var type = osmEntity$$1.id.type(id),
38050 osmID = osmEntity$$1.id.toOSM(id),
38051 options = { cache: false };
38054 '/api/0.6/' + type + '/' + osmID + '/' + version,
38055 function(err, entities) {
38056 if (callback) callback(err, { data: entities });
38063 loadMultiple: function(ids, callback) {
38066 forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
38067 var type = k + 's',
38068 osmIDs = map$4(v, osmEntity$$1.id.toOSM),
38069 options = { cache: false };
38071 forEach(chunk(osmIDs, 150), function(arr) {
38073 '/api/0.6/' + type + '?' + type + '=' + arr.join(),
38074 function(err, entities) {
38075 if (callback) callback(err, { data: entities });
38084 authenticated: function() {
38085 return oauth.authenticated();
38089 putChangeset: function(changeset, changes, callback) {
38091 // Create the changeset..
38094 path: '/api/0.6/changeset/create',
38095 options: { header: { 'Content-Type': 'text/xml' } },
38096 content: JXON.stringify(changeset.asJXON())
38097 }, createdChangeset);
38100 function createdChangeset(err, changeset_id) {
38101 if (err) return callback(err);
38102 changeset = changeset.update({ id: changeset_id });
38104 // Upload the changeset..
38107 path: '/api/0.6/changeset/' + changeset_id + '/upload',
38108 options: { header: { 'Content-Type': 'text/xml' } },
38109 content: JXON.stringify(changeset.osmChangeJXON(changes))
38110 }, uploadedChangeset);
38114 function uploadedChangeset(err) {
38115 if (err) return callback(err);
38117 // Upload was successful, safe to call the callback.
38118 // Add delay to allow for postgres replication #1646 #2678
38119 window.setTimeout(function() {
38120 callback(null, changeset);
38123 // Still attempt to close changeset, but ignore response because #2667
38126 path: '/api/0.6/changeset/' + changeset.id + '/close',
38127 options: { header: { 'Content-Type': 'text/xml' } }
38128 }, function() { return true; });
38133 userDetails: function(callback) {
38135 callback(undefined, userDetails);
38139 function done(err, user_details) {
38140 if (err) return callback(err);
38142 var u = user_details.getElementsByTagName('user')[0],
38143 img = u.getElementsByTagName('img'),
38146 if (img && img[0] && img[0].getAttribute('href')) {
38147 image_url = img[0].getAttribute('href');
38150 var changesets = u.getElementsByTagName('changesets'),
38151 changesets_count = 0;
38153 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
38154 changesets_count = changesets[0].getAttribute('count');
38158 id: u.attributes.id.value,
38159 display_name: u.attributes.display_name.value,
38160 image_url: image_url,
38161 changesets_count: changesets_count
38164 callback(undefined, userDetails);
38167 oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
38171 userChangesets: function(callback) {
38172 if (userChangesets) {
38173 callback(undefined, userChangesets);
38177 this.userDetails(function(err, user) {
38183 function done(err, changesets) {
38187 userChangesets = Array.prototype.map.call(
38188 changesets.getElementsByTagName('changeset'),
38189 function (changeset) {
38190 return { tags: getTags(changeset) };
38192 ).filter(function (changeset) {
38193 var comment = changeset.tags.comment;
38194 return comment && comment !== '';
38196 callback(undefined, userChangesets);
38200 oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
38205 status: function(callback) {
38206 function done(xml) {
38207 // update blacklists
38208 var elements = xml.getElementsByTagName('blacklist'),
38210 for (var i = 0; i < elements.length; i++) {
38211 var regex = elements[i].getAttribute('regex'); // needs unencode?
38213 regexes.push(regex);
38216 if (regexes.length) {
38217 blacklists = regexes;
38221 if (rateLimitError) {
38222 callback(rateLimitError, 'rateLimited');
38224 var apiStatus = xml.getElementsByTagName('status'),
38225 val = apiStatus[0].getAttribute('api');
38227 callback(undefined, val);
38231 d3_xml(urlroot + '/api/capabilities').get()
38233 .on('error', callback);
38237 imageryBlacklists: function() {
38242 tileZoom: function(_) {
38243 if (!arguments.length) return tileZoom$1;
38249 loadTiles: function(projection, dimensions, callback) {
38253 s = projection.scale() * 2 * Math.PI,
38254 z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
38255 ts = 256 * Math.pow(2, z - tileZoom$1),
38257 s / 2 - projection.translate()[0],
38258 s / 2 - projection.translate()[1]
38261 var tiles = d3geoTile()
38262 .scaleExtent([tileZoom$1, tileZoom$1])
38265 .translate(projection.translate())()
38266 .map(function(tile) {
38267 var x = tile[0] * ts - origin[0],
38268 y = tile[1] * ts - origin[1];
38271 id: tile.toString(),
38272 extent: geoExtent$$1(
38273 projection.invert([x, y + ts]),
38274 projection.invert([x + ts, y]))
38278 filter(inflight$1, function(v, i) {
38279 var wanted = find$1(tiles, function(tile) {
38280 return i === tile.id;
38282 if (!wanted) delete inflight$1[i];
38284 }).map(abortRequest$1);
38286 tiles.forEach(function(tile) {
38289 if (loadedTiles[id] || inflight$1[id]) return;
38291 if (isEmpty(inflight$1)) {
38292 dispatch$2.call('loading');
38295 inflight$1[id] = that.loadFromAPI(
38296 '/api/0.6/map?bbox=' + tile.extent.toParam(),
38297 function(err, parsed) {
38298 delete inflight$1[id];
38300 loadedTiles[id] = true;
38304 callback(err, assignIn$1({ data: parsed }, tile));
38307 if (isEmpty(inflight$1)) {
38308 dispatch$2.call('loaded');
38316 switch: function(options) {
38317 urlroot = options.urlroot;
38319 oauth.options(assignIn$1({
38321 loading: authLoading,
38325 dispatch$2.call('change');
38327 this.userChangesets(function() {}); // eagerly load user details/changesets
38332 toggle: function(_) {
38338 loadedTiles: function(_) {
38339 if (!arguments.length) return loadedTiles;
38345 logout: function() {
38346 userChangesets = undefined;
38347 userDetails = undefined;
38349 dispatch$2.call('change');
38354 authenticate: function(callback) {
38356 userChangesets = undefined;
38357 userDetails = undefined;
38359 function done(err, res) {
38360 rateLimitError = undefined;
38361 dispatch$2.call('change');
38362 if (callback) callback(err, res);
38363 that.userChangesets(function() {}); // eagerly load user details/changesets
38366 return oauth.authenticate(done);
38370 var apibase$2 = 'https://taginfo.openstreetmap.org/api/4/';
38371 var inflight$2 = {};
38372 var popularKeys = {};
38373 var taginfoCache = {};
38375 point: 'count_nodes',
38376 vertex: 'count_nodes',
38377 area: 'count_ways',
38380 var tag_sort_members = {
38381 point: 'count_node_members',
38382 vertex: 'count_node_members',
38383 area: 'count_way_members',
38384 line: 'count_way_members',
38385 relation: 'count_relation_members'
38387 var tag_filters = {
38393 var tag_members_fractions = {
38394 point: 'count_node_members_fraction',
38395 vertex: 'count_node_members_fraction',
38396 area: 'count_way_members_fraction',
38397 line: 'count_way_members_fraction',
38398 relation: 'count_relation_members_fraction'
38402 function sets(params, n, o) {
38403 if (params.geometry && o[params.geometry]) {
38404 params[n] = o[params.geometry];
38410 function setFilter(params) {
38411 return sets(params, 'filter', tag_filters);
38415 function setSort(params) {
38416 return sets(params, 'sortname', tag_sorts);
38420 function setSortMembers(params) {
38421 return sets(params, 'sortname', tag_sort_members);
38425 function clean(params) {
38426 return omit(params, ['geometry', 'debounce']);
38430 function filterKeys(type) {
38431 var count_type = type ? 'count_' + type : 'count_all';
38432 return function(d) {
38433 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
38438 function filterMultikeys(prefix) {
38439 return function(d) {
38440 // d.key begins with prefix, and d.key contains no additional ':'s
38441 var re = new RegExp('^' + prefix + '(.*)$');
38442 var matches = d.key.match(re) || [];
38443 return (matches.length === 2 && matches[1].indexOf(':') === -1);
38448 function filterValues(allowUpperCase) {
38449 return function(d) {
38450 if (d.value.match(/[;,]/) !== null) return false; // exclude some punctuation
38451 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false; // exclude uppercase letters
38452 return parseFloat(d.fraction) > 0.0 || d.in_wiki;
38457 function filterRoles(geometry) {
38458 return function(d) {
38459 if (d.role === '') return false; // exclude empty role
38460 if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
38461 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
38466 function valKey(d) {
38474 function valKeyDescription(d) {
38477 title: d.description || d.value
38482 function roleKey(d) {
38490 // sort keys with ':' lower than keys without ':'
38491 function sortKeys(a, b) {
38492 return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
38493 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
38498 var debouncedRequest = debounce$1(request, 500, { leading: false });
38500 function request(url, params, exactMatch, callback, loaded) {
38501 if (inflight$2[url]) return;
38503 if (checkCache(url, params, exactMatch, callback)) return;
38505 inflight$2[url] = d3_json(url, function (err, data) {
38506 delete inflight$2[url];
38512 function checkCache(url, params, exactMatch, callback) {
38513 var rp = params.rp || 25,
38514 testQuery = params.query || '',
38518 var hit = taginfoCache[testUrl];
38520 // exact match, or shorter match yielding fewer than max results (rp)
38521 if (hit && (url === testUrl || hit.length < rp)) {
38522 callback(null, hit);
38526 // don't try to shorten the query
38527 if (exactMatch || !testQuery.length) return false;
38529 // do shorten the query to see if we already have a cached result
38530 // that has returned fewer than max results (rp)
38531 testQuery = testQuery.slice(0, -1);
38532 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
38533 } while (testQuery.length >= 0);
38539 var serviceTaginfo = {
38546 // Fetch popular keys. We'll exclude these from `values`
38547 // lookups because they stress taginfo, and they aren't likely
38548 // to yield meaningful autocomplete results.. see #3955
38549 var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
38550 this.keys(params, function(err, data) {
38552 data.forEach(function(d) {
38553 if (d.value === 'opening_hours') return; // exception
38554 popularKeys[d.value] = true;
38560 reset: function() {
38561 forEach(inflight$2, function(req) { req.abort(); });
38566 keys: function(params, callback) {
38567 var doRequest = params.debounce ? debouncedRequest : request;
38568 params = clean(setSort(params));
38569 params = assignIn$1({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38571 var url = apibase$2 + 'keys/all?' + utilQsString(params);
38572 doRequest(url, params, false, callback, function(err, d) {
38576 var f = filterKeys(params.filter);
38577 var result = d.data.filter(f).sort(sortKeys).map(valKey);
38578 taginfoCache[url] = result;
38579 callback(null, result);
38585 multikeys: function(params, callback) {
38586 var doRequest = params.debounce ? debouncedRequest : request;
38587 params = clean(setSort(params));
38588 params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38589 var prefix = params.query;
38591 var url = apibase$2 + 'keys/all?' + utilQsString(params);
38592 doRequest(url, params, true, callback, function(err, d) {
38596 var f = filterMultikeys(prefix);
38597 var result = d.data.filter(f).map(valKey);
38598 taginfoCache[url] = result;
38599 callback(null, result);
38605 values: function(params, callback) {
38606 // Exclude popular keys from values lookups.. see #3955
38607 var key = params.key;
38608 if (key && popularKeys[key]) {
38609 callback(null, []);
38613 var doRequest = params.debounce ? debouncedRequest : request;
38614 params = clean(setSort(setFilter(params)));
38615 params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38617 var url = apibase$2 + 'key/values?' + utilQsString(params);
38618 doRequest(url, params, false, callback, function(err, d) {
38622 // In most cases we prefer taginfo value results with lowercase letters.
38623 // A few OSM keys expect values to contain uppercase values (see #3377).
38624 // This is not an exhaustive list (e.g. `name` also has uppercase values)
38625 // but these are the fields where taginfo value lookup is most useful.
38626 var re = /network|taxon|genus|species|brand|grape_variety|_hours|_times/;
38627 var allowUpperCase = (params.key.match(re) !== null);
38628 var f = filterValues(allowUpperCase);
38630 var result = d.data.filter(f).map(valKeyDescription);
38631 taginfoCache[url] = result;
38632 callback(null, result);
38638 roles: function(params, callback) {
38639 var doRequest = params.debounce ? debouncedRequest : request;
38640 var geometry = params.geometry;
38641 params = clean(setSortMembers(params));
38642 params = assignIn$1({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
38644 var url = apibase$2 + 'relation/roles?' + utilQsString(params);
38645 doRequest(url, params, true, callback, function(err, d) {
38649 var f = filterRoles(geometry);
38650 var result = d.data.filter(f).map(roleKey);
38651 taginfoCache[url] = result;
38652 callback(null, result);
38658 docs: function(params, callback) {
38659 var doRequest = params.debounce ? debouncedRequest : request;
38660 params = clean(setSort(params));
38662 var path = 'key/wiki_pages?';
38663 if (params.value) path = 'tag/wiki_pages?';
38664 else if (params.rtype) path = 'relation/wiki_pages?';
38666 var url = apibase$2 + path + utilQsString(params);
38667 doRequest(url, params, true, callback, function(err, d) {
38671 taginfoCache[url] = d.data;
38672 callback(null, d.data);
38678 apibase: function(_) {
38679 if (!arguments.length) return apibase$2;
38686 var jsonpCache = {};
38687 window.jsonpCache = jsonpCache;
38689 function jsonpRequest(url, callback) {
38691 if (window.JSONP_FIX) {
38692 if (window.JSONP_DELAY === 0) {
38693 callback(window.JSONP_FIX);
38695 setTimeout(function() {
38696 callback(window.JSONP_FIX);
38697 }, window.JSONP_DELAY || 0);
38703 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
38705 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
38709 function create(url) {
38710 var e = url.match(/callback=(\w+)/),
38711 c = e ? e[1] : rand();
38712 jsonpCache[c] = function(data) {
38714 delete jsonpCache[c];
38717 return 'jsonpCache.' + c;
38720 var cb = create(url),
38721 script = d3_select('head')
38723 .attr('type', 'text/javascript')
38724 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
38727 var endpoint = 'https://www.wikidata.org/w/api.php?';
38729 var serviceWikidata = {
38731 init: function() {},
38732 reset: function() {},
38735 // Given a Wikipedia language and article title, return an array of
38736 // corresponding Wikidata entities.
38737 itemsByTitle: function(lang, title, callback) {
38743 lang = lang || 'en';
38744 jsonpRequest(endpoint + utilQsString({
38745 action: 'wbgetentities',
38747 sites: lang.replace(/-/g, '_') + 'wiki',
38749 languages: 'en', // shrink response by filtering to one language
38750 callback: '{callback}'
38751 }), function(data) {
38752 if (!data || data.error) {
38755 callback(title, data.entities || {});
38762 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
38764 var serviceWikipedia = {
38766 init: function() {},
38767 reset: function() {},
38770 search: function(lang, query, callback) {
38776 lang = lang || 'en';
38777 jsonpRequest(endpoint$1.replace('en', lang) +
38782 srinfo: 'suggestion',
38784 callback: '{callback}',
38786 }), function(data) {
38787 if (!data || !data.query || !data.query.search || data.error) {
38790 var results = data.query.search.map(function(d) { return d.title; });
38791 callback(query, results);
38798 suggestions: function(lang, query, callback) {
38804 lang = lang || 'en';
38805 jsonpRequest(endpoint$1.replace('en', lang) +
38807 action: 'opensearch',
38811 callback: '{callback}',
38813 }), function(data) {
38814 if (!data || data.error) {
38817 callback(data[0], data[1] || []);
38824 translations: function(lang, title, callback) {
38830 jsonpRequest(endpoint$1.replace('en', lang) +
38835 callback: '{callback}',
38838 }), function(data) {
38839 if (!data || !data.query || !data.query.pages || data.error) {
38842 var list = data.query.pages[Object.keys(data.query.pages)[0]],
38844 if (list && list.langlinks) {
38845 list.langlinks.forEach(function(d) {
38846 translations[d.lang] = d['*'];
38849 callback(translations);
38858 mapillary: serviceMapillary,
38859 geocoder: serviceNominatim,
38861 taginfo: serviceTaginfo,
38862 wikidata: serviceWikidata,
38863 wikipedia: serviceWikipedia
38866 function svgMapillaryImages(projection, context, dispatch) {
38867 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
38869 minViewfieldZoom = 17,
38870 layer = d3_select(null),
38875 if (svgMapillaryImages.initialized) return; // run once
38876 svgMapillaryImages.enabled = false;
38877 svgMapillaryImages.initialized = true;
38881 function getMapillary() {
38882 if (services.mapillary && !_mapillary) {
38883 _mapillary = services.mapillary;
38884 _mapillary.event.on('loadedImages', throttledRedraw);
38885 } else if (!services.mapillary && _mapillary) {
38893 function showLayer() {
38894 var mapillary = getMapillary();
38895 if (!mapillary) return;
38897 mapillary.loadViewer(context);
38901 .style('opacity', 0)
38904 .style('opacity', 1)
38905 .on('end', function () { dispatch.call('change'); });
38909 function hideLayer() {
38910 var mapillary = getMapillary();
38912 mapillary.hideViewer();
38915 throttledRedraw.cancel();
38920 .style('opacity', 0)
38921 .on('end', editOff);
38925 function editOn() {
38926 layer.style('display', 'block');
38930 function editOff() {
38931 layer.selectAll('.viewfield-group').remove();
38932 layer.style('display', 'none');
38936 function click(d) {
38937 var mapillary = getMapillary();
38938 if (!mapillary) return;
38940 context.map().centerEase(d.loc);
38943 .selectedImage(d.key, true)
38944 .updateViewer(d.key, context)
38949 function transform(d) {
38950 var t = svgPointTransform(projection)(d);
38951 if (d.ca) t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
38956 function update() {
38957 var mapillary = getMapillary(),
38958 data = (mapillary ? mapillary.images(projection) : []),
38959 imageKey = mapillary ? mapillary.selectedImage() : null;
38961 var markers = layer.selectAll('.viewfield-group')
38962 .data(data, function(d) { return d.key; });
38967 var enter = markers.enter()
38969 .attr('class', 'viewfield-group')
38970 .classed('selected', function(d) { return d.key === imageKey; })
38971 .on('click', click);
38975 .attr('transform', transform);
38978 var viewfields = markers.selectAll('.viewfield')
38979 .data(~~context.map().zoom() >= minViewfieldZoom ? [0] : []);
38986 .attr('class', 'viewfield')
38987 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
38988 .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
38990 markers.selectAll('circle')
39000 function drawImages(selection$$1) {
39001 var enabled = svgMapillaryImages.enabled,
39002 mapillary = getMapillary();
39004 layer = selection$$1.selectAll('.layer-mapillary-images')
39005 .data(mapillary ? [0] : []);
39010 layer = layer.enter()
39012 .attr('class', 'layer-mapillary-images')
39013 .style('display', enabled ? 'block' : 'none')
39017 if (mapillary && ~~context.map().zoom() >= minZoom) {
39020 mapillary.loadImages(projection);
39028 drawImages.enabled = function(_) {
39029 if (!arguments.length) return svgMapillaryImages.enabled;
39030 svgMapillaryImages.enabled = _;
39031 if (svgMapillaryImages.enabled) {
39036 dispatch.call('change');
39041 drawImages.supported = function() {
39042 return !!getMapillary();
39050 function svgMapillarySigns(projection, context, dispatch) {
39051 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
39053 layer = d3_select(null),
39058 if (svgMapillarySigns.initialized) return; // run once
39059 svgMapillarySigns.enabled = false;
39060 svgMapillarySigns.initialized = true;
39064 function getMapillary() {
39065 if (services.mapillary && !_mapillary) {
39066 _mapillary = services.mapillary;
39067 _mapillary.event.on('loadedSigns', throttledRedraw);
39068 } else if (!services.mapillary && _mapillary) {
39075 function showLayer() {
39080 function hideLayer() {
39081 throttledRedraw.cancel();
39086 function editOn() {
39087 layer.style('display', 'block');
39091 function editOff() {
39092 layer.selectAll('.icon-sign').remove();
39093 layer.style('display', 'none');
39097 function click(d) {
39098 var mapillary = getMapillary();
39099 if (!mapillary) return;
39101 context.map().centerEase(d.loc);
39103 var selected = mapillary.selectedImage(),
39106 // Pick one of the images the sign was detected in,
39107 // preference given to an image already selected.
39108 d.detections.forEach(function(detection) {
39109 if (!imageKey || selected === detection.image_key) {
39110 imageKey = detection.image_key;
39115 .selectedImage(imageKey, true)
39116 .updateViewer(imageKey, context)
39121 function update() {
39122 var mapillary = getMapillary(),
39123 data = (mapillary ? mapillary.signs(projection) : []),
39124 imageKey = mapillary ? mapillary.selectedImage() : null;
39126 var signs = layer.selectAll('.icon-sign')
39127 .data(data, function(d) { return d.key; });
39132 var enter = signs.enter()
39133 .append('foreignObject')
39134 .attr('class', 'icon-sign')
39135 .attr('width', '24px') // for Firefox
39136 .attr('height', '24px') // for Firefox
39137 .classed('selected', function(d) {
39138 return some(d.detections, function(detection) {
39139 return detection.image_key === imageKey;
39142 .on('click', click);
39145 .append('xhtml:body')
39146 .attr('class', 'icon-sign-body')
39147 .html(mapillary.signHTML);
39151 .attr('x', function(d) { return projection(d.loc)[0] - 12; }) // offset by -12px to
39152 .attr('y', function(d) { return projection(d.loc)[1] - 12; }); // center signs on loc
39156 function drawSigns(selection$$1) {
39157 var enabled = svgMapillarySigns.enabled,
39158 mapillary = getMapillary();
39160 layer = selection$$1.selectAll('.layer-mapillary-signs')
39161 .data(mapillary ? [0] : []);
39166 layer = layer.enter()
39168 .attr('class', 'layer-mapillary-signs')
39169 .style('display', enabled ? 'block' : 'none')
39173 if (mapillary && ~~context.map().zoom() >= minZoom) {
39176 mapillary.loadSigns(context, projection);
39184 drawSigns.enabled = function(_) {
39185 if (!arguments.length) return svgMapillarySigns.enabled;
39186 svgMapillarySigns.enabled = _;
39187 if (svgMapillarySigns.enabled) {
39192 dispatch.call('change');
39197 drawSigns.supported = function() {
39198 var mapillary = getMapillary();
39199 return (mapillary && mapillary.signsSupported());
39207 function svgOsm(projection, context, dispatch) {
39208 var enabled = true;
39211 function drawOsm(selection) {
39212 selection.selectAll('.layer-osm')
39213 .data(['areas', 'lines', 'hit', 'halo', 'label'])
39216 .attr('class', function(d) { return 'layer-osm layer-' + d; });
39220 function showLayer() {
39221 var layer = context.surface().selectAll('.data-layer-osm');
39225 .classed('disabled', false)
39226 .style('opacity', 0)
39229 .style('opacity', 1)
39230 .on('end interrupt', function () {
39231 dispatch.call('change');
39236 function hideLayer() {
39237 var layer = context.surface().selectAll('.data-layer-osm');
39243 .style('opacity', 0)
39244 .on('end interrupt', function () {
39245 layer.classed('disabled', true);
39246 dispatch.call('change');
39251 drawOsm.enabled = function(_) {
39252 if (!arguments.length) return enabled;
39261 dispatch.call('change');
39269 function refresh(selection, node) {
39270 var cr = node.getBoundingClientRect();
39271 var prop = [cr.width, cr.height];
39272 selection.property('__dimensions__', prop);
39276 function utilGetDimensions(selection, force) {
39277 if (!selection || selection.empty()) {
39280 var node = selection.node(),
39281 cached = selection.property('__dimensions__');
39282 return (!cached || force) ? refresh(selection, node) : cached;
39286 function utilSetDimensions(selection, dimensions) {
39287 if (!selection || selection.empty()) {
39290 var node = selection.node();
39291 if (dimensions === null) {
39292 refresh(selection, node);
39296 .property('__dimensions__', [dimensions[0], dimensions[1]])
39297 .attr('width', dimensions[0])
39298 .attr('height', dimensions[1]);
39301 function svgLayers(projection, context) {
39302 var dispatch$$1 = dispatch('change'),
39303 svg = d3_select(null),
39305 { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
39306 { id: 'gpx', layer: svgGpx(projection, context, dispatch$$1) },
39307 { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$$1) },
39308 { id: 'mapillary-signs', layer: svgMapillarySigns(projection, context, dispatch$$1) },
39309 { id: 'debug', layer: svgDebug(projection, context, dispatch$$1) }
39313 function drawLayers(selection$$1) {
39314 svg = selection$$1.selectAll('.surface')
39319 .attr('class', 'surface')
39322 var defs = svg.selectAll('.surface-defs')
39327 .attr('class', 'surface-defs');
39329 var groups = svg.selectAll('.data-layer')
39337 .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
39339 .each(function(d) { d3_select(this).call(d.layer); });
39343 drawLayers.all = function() {
39348 drawLayers.layer = function(id) {
39349 var obj = find$1(layers, function(o) {return o.id === id;});
39350 return obj && obj.layer;
39354 drawLayers.only = function(what) {
39355 var arr = [].concat(what);
39356 drawLayers.remove(difference(map$4(layers, 'id'), arr));
39361 drawLayers.remove = function(what) {
39362 var arr = [].concat(what);
39363 arr.forEach(function(id) {
39364 layers = reject(layers, function(o) {return o.id === id;});
39366 dispatch$$1.call('change');
39371 drawLayers.add = function(what) {
39372 var arr = [].concat(what);
39373 arr.forEach(function(obj) {
39374 if ('id' in obj && 'layer' in obj) {
39378 dispatch$$1.call('change');
39383 drawLayers.dimensions = function(_) {
39384 if (!arguments.length) return utilGetDimensions(svg);
39385 utilSetDimensions(svg, _);
39390 return utilRebind(drawLayers, dispatch$$1, 'on');
39393 function svgLines$$1(projection, context) {
39394 var detected = utilDetect();
39396 var highway_stack = {
39412 function drawLines(selection, graph, entities, filter$$1) {
39415 function waystack(a, b) {
39416 var selected = context.selectedIDs(),
39417 scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0,
39418 scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
39420 if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
39421 if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
39422 return scoreA - scoreB;
39426 function drawLineGroup(selection, klass, isSelected) {
39427 var lines = selection
39430 .data(getPathData(isSelected), osmEntity$$1.key);
39435 // Optimization: call simple TagClasses only on enter selection. This
39436 // works because osmEntity.key is defined to include the entity v attribute.
39439 .attr('class', function(d) {
39440 return 'way line ' + klass + ' ' + d.id + (isSelected ? ' selected' : '') +
39441 (oldMultiPolygonOuters[d.id] ? ' old-multipolygon' : '');
39443 .call(svgTagClasses())
39446 .attr('d', getPath)
39447 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
39453 function getPathData(isSelected) {
39454 return function() {
39455 var layer = this.parentNode.__data__;
39456 var data = pathdata[layer] || [];
39457 return data.filter(function(d) {
39459 return context.selectedIDs().indexOf(d.id) !== -1;
39461 return context.selectedIDs().indexOf(d.id) === -1;
39467 var getPath = svgPath(projection, graph),
39471 oldMultiPolygonOuters = {};
39473 for (var i = 0; i < entities.length; i++) {
39474 var entity = entities[i],
39475 outer = osmSimpleMultipolygonOuterMember(entity, graph);
39477 ways.push(entity.mergeTags(outer.tags));
39478 oldMultiPolygonOuters[outer.id] = true;
39479 } else if (entity.geometry(graph) === 'line') {
39484 ways = ways.filter(getPath);
39485 pathdata = groupBy(ways, function(way) { return way.layer(); });
39487 forOwn(pathdata, function(v, k) {
39488 var arr = filter(v, function(d) { return d.isOneWay(); });
39489 onewaydata[k] = flatten(map$4(arr, svgOneWaySegments(projection, graph, 35)));
39493 var layer = selection.selectAll('.layer-lines');
39495 var layergroup = layer
39496 .selectAll('g.layergroup')
39497 .data(d3_range(-10, 11));
39499 layergroup = layergroup.enter()
39501 .attr('class', function(d) { return 'layergroup layer' + String(d); })
39502 .merge(layergroup);
39505 .selectAll('g.linegroup')
39506 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
39509 .attr('class', function(d) { return 'linegroup line-' + d; });
39512 layergroup.selectAll('g.line-shadow')
39513 .call(drawLineGroup, 'shadow', false);
39514 layergroup.selectAll('g.line-casing')
39515 .call(drawLineGroup, 'casing', false);
39516 layergroup.selectAll('g.line-stroke')
39517 .call(drawLineGroup, 'stroke', false);
39519 layergroup.selectAll('g.line-shadow-highlighted')
39520 .call(drawLineGroup, 'shadow', true);
39521 layergroup.selectAll('g.line-casing-highlighted')
39522 .call(drawLineGroup, 'casing', true);
39523 layergroup.selectAll('g.line-stroke-highlighted')
39524 .call(drawLineGroup, 'stroke', true);
39527 var onewaygroup = layergroup
39528 .selectAll('g.onewaygroup')
39531 onewaygroup = onewaygroup.enter()
39533 .attr('class', 'onewaygroup')
39534 .merge(onewaygroup);
39536 var oneways = onewaygroup
39540 function() { return onewaydata[this.parentNode.__data__] || []; },
39541 function(d) { return [d.id, d.index]; }
39547 oneways = oneways.enter()
39549 .attr('class', 'oneway')
39550 .attr('marker-mid', 'url(#oneway-marker)')
39552 .attr('d', function(d) { return d.d; });
39555 oneways.each(function() { this.parentNode.insertBefore(this, this); });
39563 function svgMidpoints$$1(projection, context) {
39565 return function drawMidpoints(selection, graph, entities, filter, extent) {
39566 var layer = selection.selectAll('.layer-hit');
39568 var mode = context.mode();
39569 if (mode && mode.id !== 'select') {
39570 layer.selectAll('g.midpoint').remove();
39574 var poly = extent.polygon(),
39577 for (var i = 0; i < entities.length; i++) {
39578 var entity = entities[i];
39580 if (entity.type !== 'way')
39582 if (!filter(entity))
39584 if (context.selectedIDs().indexOf(entity.id) < 0)
39587 var nodes = graph.childNodes(entity);
39588 for (var j = 0; j < nodes.length - 1; j++) {
39592 id = [a.id, b.id].sort().join('-');
39594 if (midpoints[id]) {
39595 midpoints[id].parents.push(entity);
39597 if (geoEuclideanDistance(projection(a.loc), projection(b.loc)) > 40) {
39598 var point = geoInterp(a.loc, b.loc, 0.5),
39601 if (extent.intersects(point)) {
39604 for (var k = 0; k < 4; k++) {
39605 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
39607 geoEuclideanDistance(projection(a.loc), projection(point)) > 20 &&
39608 geoEuclideanDistance(projection(b.loc), projection(point)) > 20)
39621 edge: [a.id, b.id],
39631 function midpointFilter(d) {
39632 if (midpoints[d.id])
39635 for (var i = 0; i < d.parents.length; i++) {
39636 if (filter(d.parents[i])) {
39646 .selectAll('g.midpoint')
39647 .filter(midpointFilter)
39648 .data(values$1(midpoints), function(d) { return d.id; });
39653 var enter = groups.enter()
39654 .insert('g', ':first-child')
39655 .attr('class', 'midpoint');
39657 enter.append('polygon')
39658 .attr('points', '-6,8 10,0 -6,-8')
39659 .attr('class', 'shadow');
39661 enter.append('polygon')
39662 .attr('points', '-3,4 5,0 -3,-4')
39663 .attr('class', 'fill');
39667 .attr('transform', function(d) {
39668 var translate = svgPointTransform(projection),
39669 a = graph.entity(d.edge[0]),
39670 b = graph.entity(d.edge[1]),
39671 angleVal = Math.round(geoAngle(a, b, projection) * (180 / Math.PI));
39672 return translate(d) + ' rotate(' + angleVal + ')';
39674 .call(svgTagClasses().tags(
39675 function(d) { return d.parents[0].tags; }
39678 // Propagate data bindings.
39679 groups.select('polygon.shadow');
39680 groups.select('polygon.fill');
39685 function svgOneWaySegments(projection$$1, graph, dt) {
39686 return function(entity) {
39692 clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream,
39693 coordinates = graph.childNodes(entity).map(function(n) {
39697 if (entity.tags.oneway === '-1') coordinates.reverse();
39700 type: 'LineString',
39701 coordinates: coordinates
39702 }, projection$$1.stream(clip({
39703 lineStart: function() {},
39704 lineEnd: function() {
39707 point: function(x, y) {
39711 var span = geoEuclideanDistance(a, b) - offset;
39714 var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
39715 dx = dt * Math.cos(angle),
39716 dy = dt * Math.sin(angle),
39717 p = [a[0] + offset * Math.cos(angle),
39718 a[1] + offset * Math.sin(angle)];
39720 var segment = 'M' + a[0] + ',' + a[1] +
39721 'L' + p[0] + ',' + p[1];
39723 for (span -= dt; span >= 0; span -= dt) {
39726 segment += 'L' + p[0] + ',' + p[1];
39729 segment += 'L' + b[0] + ',' + b[1];
39730 segments.push({id: entity.id, index: i, d: segment});
39745 function svgPath(projection$$1, graph, isArea) {
39747 // Explanation of magic numbers:
39748 // "padding" here allows space for strokes to extend beyond the viewport,
39749 // so that the stroke isn't drawn along the edge of the viewport when
39750 // the shape is clipped.
39752 // When drawing lines, pad viewport by 5px.
39753 // When drawing areas, pad viewport by 65px in each direction to allow
39754 // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
39757 padding = isArea ? 65 : 5,
39758 viewport = projection$$1.clipExtent(),
39760 [viewport[0][0] - padding, viewport[0][1] - padding],
39761 [viewport[1][0] + padding, viewport[1][1] + padding]
39763 clip = d3_geoIdentity().clipExtent(paddedExtent).stream,
39764 project = projection$$1.stream,
39765 path = d3_geoPath()
39766 .projection({stream: function(output) { return project(clip(output)); }});
39768 return function(entity) {
39769 if (entity.id in cache) {
39770 return cache[entity.id];
39772 return cache[entity.id] = path(entity.asGeoJSON(graph));
39777 function svgPoints$$1(projection, context) {
39779 function markerPath(selection, klass) {
39781 .attr('class', klass)
39782 .attr('transform', 'translate(-8, -23)')
39783 .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
39786 function sortY(a, b) {
39787 return b.loc[1] - a.loc[1];
39791 return function drawPoints(selection, graph, entities, filter$$1) {
39792 var wireframe = context.surface().classed('fill-wireframe'),
39793 points = wireframe ? [] : filter(entities, function(e) {
39794 return e.geometry(graph) === 'point';
39797 points.sort(sortY);
39799 var layer = selection.selectAll('.layer-hit');
39801 var groups = layer.selectAll('g.point')
39803 .data(points, osmEntity$$1.key);
39808 var enter = groups.enter()
39810 .attr('class', function(d) { return 'node point ' + d.id; })
39813 enter.append('path')
39814 .call(markerPath, 'shadow');
39816 enter.append('ellipse')
39821 .attr('class', 'stroke');
39823 enter.append('path')
39824 .call(markerPath, 'stroke');
39826 enter.append('use')
39827 .attr('transform', 'translate(-5, -19)')
39828 .attr('class', 'icon')
39829 .attr('width', '11px')
39830 .attr('height', '11px');
39834 .attr('transform', svgPointTransform(projection))
39835 .call(svgTagClasses());
39837 // Selecting the following implicitly
39838 // sets the data (point entity) on the element
39839 groups.select('.shadow');
39840 groups.select('.stroke');
39841 groups.select('.icon')
39842 .attr('xlink:href', function(entity) {
39843 var preset = context.presets().match(entity, graph),
39844 picon = preset && preset.icon;
39849 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
39850 return '#' + picon + (isMaki ? '-11' : '');
39856 function svgRelationMemberTags(graph) {
39857 return function(entity) {
39858 var tags = entity.tags;
39859 graph.parentRelations(entity).forEach(function(relation) {
39860 var type = relation.tags.type;
39861 if (type === 'multipolygon' || type === 'boundary') {
39862 tags = assignIn$1({}, relation.tags, tags);
39869 function svgTagClasses() {
39871 'building', 'highway', 'railway', 'waterway', 'aeroway',
39872 'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
39873 'leisure', 'military', 'place'
39876 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
39877 'razed', 'demolished', 'obliterated', 'intermittent'
39880 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
39881 'surface', 'tracktype', 'crossing', 'service', 'sport'
39883 tagClassRe = /^tag-/,
39884 tags = function(entity) { return entity.tags; };
39887 var tagClasses = function(selection$$1) {
39888 selection$$1.each(function tagClassesEach(entity) {
39889 var value = this.className,
39890 classes, primary, status;
39892 if (value.baseVal !== undefined) value = value.baseVal;
39894 classes = value.trim().split(/\s+/).filter(function(name) {
39895 return name.length && !tagClassRe.test(name);
39898 var t = tags(entity), i, k, v;
39900 // pick at most one primary classification tag..
39901 for (i = 0; i < primaries.length; i++) {
39904 if (!v || v === 'no') continue;
39907 if (statuses.indexOf(v) !== -1) { // e.g. `railway=abandoned`
39909 classes += ' tag-' + k;
39911 classes += ' tag-' + k + ' tag-' + k + '-' + v;
39917 // add at most one status tag, only if relates to primary tag..
39919 for (i = 0; i < statuses.length; i++) {
39922 if (!v || v === 'no') continue;
39924 if (v === 'yes') { // e.g. `railway=rail + abandoned=yes`
39927 else if (primary && primary === v) { // e.g. `railway=rail + abandoned=railway`
39929 } else if (!primary && primaries.indexOf(v) !== -1) { // e.g. `abandoned=railway`
39932 classes += ' tag-' + v;
39933 } // else ignore e.g. `highway=path + abandoned=railway`
39940 classes += ' tag-status tag-status-' + status;
39943 // add any secondary (structure) tags
39944 for (i = 0; i < secondaries.length; i++) {
39945 k = secondaries[i];
39947 if (!v || v === 'no') continue;
39948 classes += ' tag-' + k + ' tag-' + k + '-' + v;
39951 // For highways, look for surface tagging..
39952 if (primary === 'highway') {
39953 var paved = (t.highway !== 'track');
39956 if (k in osmPavedTags) {
39957 paved = !!osmPavedTags[k][v];
39962 classes += ' tag-unpaved';
39966 classes = classes.trim();
39968 if (classes !== value) {
39969 d3_select(this).attr('class', classes);
39975 tagClasses.tags = function(_) {
39976 if (!arguments.length) return tags;
39984 function svgTurns(projection) {
39986 return function drawTurns(selection, graph, turns) {
39988 function key(turn) {
39989 return [turn.from.node + turn.via.node + turn.to.node].join('-');
39992 function icon(turn) {
39993 var u = turn.u ? '-u' : '';
39994 if (!turn.restriction)
39995 return '#turn-yes' + u;
39996 var restriction = graph.entity(turn.restriction).tags.restriction;
39998 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
40001 var groups = selection.selectAll('.layer-hit').selectAll('g.turn')
40008 var enter = groups.enter()
40010 .attr('class', 'turn');
40013 .filter(function (turn) { return !turn.u; });
40015 nEnter.append('rect')
40016 .attr('transform', 'translate(-22, -12)')
40017 .attr('width', '44')
40018 .attr('height', '24');
40020 nEnter.append('use')
40021 .attr('transform', 'translate(-22, -12)')
40022 .attr('width', '44')
40023 .attr('height', '24');
40027 .filter(function (turn) { return turn.u; });
40029 uEnter.append('circle')
40032 uEnter.append('use')
40033 .attr('transform', 'translate(-16, -16)')
40034 .attr('width', '32')
40035 .attr('height', '32');
40042 .attr('transform', function (turn) {
40043 var v = graph.entity(turn.via.node),
40044 t = graph.entity(turn.to.node),
40045 a = geoAngle(v, t, projection),
40046 p = projection(v.loc),
40047 r = turn.u ? 0 : 60;
40049 return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' +
40050 'rotate(' + a * 180 / Math.PI + ')';
40053 groups.select('use')
40054 .attr('xlink:href', icon);
40056 groups.select('rect');
40057 groups.select('circle');
40063 function svgVertices$$1(projection, context) {
40065 // z16-, z17, z18+, tagged
40066 shadow: [6, 7.5, 7.5, 11.5],
40067 stroke: [2.5, 3.5, 3.5, 7],
40068 fill: [1, 1.5, 1.5, 1.5]
40074 function siblingAndChildVertices(ids, graph, extent) {
40077 function addChildVertices(entity) {
40078 if (!context.features().isHiddenFeature(entity, graph, entity.geometry(graph))) {
40080 if (entity.type === 'way') {
40081 for (i = 0; i < entity.nodes.length; i++) {
40082 addChildVertices(graph.entity(entity.nodes[i]));
40084 } else if (entity.type === 'relation') {
40085 for (i = 0; i < entity.members.length; i++) {
40086 var member = context.hasEntity(entity.members[i].id);
40088 addChildVertices(member);
40091 } else if (entity.intersects(extent, graph)) {
40092 vertices[entity.id] = entity;
40097 ids.forEach(function(id) {
40098 var entity = context.hasEntity(id);
40099 if (entity && entity.type === 'node') {
40100 vertices[entity.id] = entity;
40101 context.graph().parentWays(entity).forEach(function(entity) {
40102 addChildVertices(entity);
40104 } else if (entity) {
40105 addChildVertices(entity);
40113 function draw(selection, vertices, klass, graph, zoom, siblings) {
40115 function icon(entity) {
40116 if (entity.id in icons) return icons[entity.id];
40118 entity.hasInterestingTags() &&
40119 context.presets().match(entity, graph).icon;
40120 return icons[entity.id];
40123 function setClass(klass) {
40124 return function(entity) {
40125 this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
40129 function setAttributes(selection) {
40130 ['shadow','stroke','fill'].forEach(function(klass) {
40131 var rads = radiuses[klass];
40132 selection.selectAll('.' + klass)
40133 .each(function(entity) {
40134 var i = z && icon(entity),
40136 r = rads[i ? 3 : z];
40138 // slightly increase the size of unconnected endpoints #3775
40139 if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
40143 this.setAttribute('cx', c);
40144 this.setAttribute('cy', -c);
40145 this.setAttribute('r', r);
40146 if (i && klass === 'fill') {
40147 this.setAttribute('visibility', 'hidden');
40149 this.removeAttribute('visibility');
40154 selection.selectAll('use')
40157 this.removeAttribute('visibility');
40159 this.setAttribute('visibility', 'hidden');
40165 siblings = siblings || {};
40168 z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
40170 var groups = selection
40171 .data(vertices, osmEntity$$1.key);
40176 var enter = groups.enter()
40178 .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
40180 enter.append('circle')
40181 .each(setClass('shadow'));
40183 enter.append('circle')
40184 .each(setClass('stroke'));
40186 // Vertices with icons get a `use`.
40187 enter.filter(function(d) { return icon(d); })
40189 .attr('transform', 'translate(-5, -6)')
40190 .attr('xlink:href', function(d) {
40191 var picon = icon(d),
40192 isMaki = dataFeatureIcons.indexOf(picon) !== -1;
40193 return '#' + picon + (isMaki ? '-11' : '');
40195 .attr('width', '11px')
40196 .attr('height', '11px')
40197 .each(setClass('icon'));
40199 // Vertices with tags get a fill.
40200 enter.filter(function(d) { return d.hasInterestingTags(); })
40202 .each(setClass('fill'));
40206 .attr('transform', svgPointTransform(projection))
40207 .classed('sibling', function(entity) { return entity.id in siblings; })
40208 .classed('shared', function(entity) { return graph.isShared(entity); })
40209 .classed('endpoint', function(entity) { return entity.isEndpoint(graph); })
40210 .call(setAttributes);
40214 function drawVertices(selection, graph, entities, filter, extent, zoom) {
40215 var siblings = siblingAndChildVertices(context.selectedIDs(), graph, extent),
40216 wireframe = context.surface().classed('fill-wireframe'),
40219 for (var i = 0; i < entities.length; i++) {
40220 var entity = entities[i],
40221 geometry = entity.geometry(graph);
40223 if (wireframe && geometry === 'point') {
40224 vertices.push(entity);
40228 if (geometry !== 'vertex')
40231 if (entity.id in siblings ||
40232 entity.hasInterestingTags() ||
40233 entity.isEndpoint(graph) ||
40234 entity.isConnected(graph)) {
40235 vertices.push(entity);
40239 var layer = selection.selectAll('.layer-hit');
40240 layer.selectAll('g.vertex.vertex-persistent')
40242 .call(draw, vertices, 'vertex-persistent', graph, zoom, siblings);
40244 drawHover(selection, graph, extent, zoom);
40248 function drawHover(selection, graph, extent, zoom) {
40249 var hovered = hover ? siblingAndChildVertices([hover.id], graph, extent) : {};
40250 var layer = selection.selectAll('.layer-hit');
40252 layer.selectAll('g.vertex.vertex-hover')
40253 .call(draw, values$1(hovered), 'vertex-hover', graph, zoom);
40257 drawVertices.drawHover = function(selection, graph, target, extent, zoom) {
40258 if (target === hover) return;
40260 drawHover(selection, graph, extent, zoom);
40263 return drawVertices;
40266 function behaviorEdit(context) {
40270 .minzoom(context.minEditableZoom());
40274 edit.off = function() {
40284 The hover behavior adds the `.hover` class on mouseover to all elements to which
40285 the identical datum is bound, and removes it on mouseout.
40287 The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
40288 representation may consist of several elements scattered throughout the DOM hierarchy.
40289 Only one of these elements can have the :hover pseudo-class, but all of them will
40290 have the .hover class.
40292 function behaviorHover(context) {
40293 var dispatch$$1 = dispatch('hover'),
40294 _selection = d3_select(null),
40301 function keydown() {
40302 if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
40303 _selection.selectAll('.hover')
40304 .classed('hover-suppressed', true)
40305 .classed('hover', false);
40308 .classed('hover-disabled', true);
40310 dispatch$$1.call('hover', this, null);
40316 if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
40317 _selection.selectAll('.hover-suppressed')
40318 .classed('hover-suppressed', false)
40319 .classed('hover', true);
40322 .classed('hover-disabled', false);
40324 dispatch$$1.call('hover', this, target ? target.id : null);
40329 var hover = function(selection$$1) {
40330 _selection = selection$$1;
40334 .on('mouseover.hover', mouseover)
40335 .on('mouseout.hover', mouseout)
40336 .on('mousedown.hover', mousedown);
40339 .on('keydown.hover', keydown)
40340 .on('keyup.hover', keyup);
40343 function mouseover() {
40344 if (buttonDown) return;
40345 var target = event.target;
40346 enter(target ? target.__data__ : null);
40350 function mouseout() {
40351 if (buttonDown) return;
40352 var target = event.relatedTarget;
40353 enter(target ? target.__data__ : null);
40357 function mousedown() {
40360 .on('mouseup.hover', mouseup, true);
40364 function mouseup() {
40365 buttonDown = false;
40367 .on('mouseup.hover', null, true);
40371 function enter(d) {
40372 if (d === target) return;
40375 _selection.selectAll('.hover')
40376 .classed('hover', false);
40377 _selection.selectAll('.hover-suppressed')
40378 .classed('hover-suppressed', false);
40380 if (target instanceof osmEntity$$1 && target.id !== newId) {
40382 // If drawing a way, don't hover on a node that was just placed. #3974
40383 var mode = context.mode() && context.mode().id;
40384 if ((mode === 'draw-line' || mode === 'draw-area') && !newId && target.type === 'node') {
40389 var selector$$1 = '.' + target.id;
40391 if (target.type === 'relation') {
40392 target.members.forEach(function(member) {
40393 selector$$1 += ', .' + member.id;
40397 var suppressed = altDisables && event && event.altKey;
40399 _selection.selectAll(selector$$1)
40400 .classed(suppressed ? 'hover-suppressed' : 'hover', true);
40402 dispatch$$1.call('hover', this, !suppressed && target.id);
40405 dispatch$$1.call('hover', this, null);
40412 hover.off = function(selection$$1) {
40413 selection$$1.selectAll('.hover')
40414 .classed('hover', false);
40415 selection$$1.selectAll('.hover-suppressed')
40416 .classed('hover-suppressed', false);
40418 .classed('hover-disabled', false);
40422 .on('mouseover.hover', null)
40423 .on('mouseout.hover', null)
40424 .on('mousedown.hover', null);
40427 .on('keydown.hover', null)
40428 .on('keyup.hover', null);
40432 hover.altDisables = function(_) {
40433 if (!arguments.length) return altDisables;
40439 return utilRebind(hover, dispatch$$1, 'on');
40442 function behaviorTail() {
40446 tooltipSize = [0, 0],
40447 selectionSize = [0, 0];
40450 function tail(selection$$1) {
40454 .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
40456 container = d3_select(document.body)
40458 .style('display', 'none')
40459 .attr('class', 'tail tooltip-inner');
40461 container.append('div')
40465 .on('mousemove.tail', mousemove)
40466 .on('mouseenter.tail', mouseenter)
40467 .on('mouseleave.tail', mouseleave);
40470 .on('mousemove.tail', mousemove);
40472 tooltipSize = utilGetDimensions(container);
40473 selectionSize = utilGetDimensions(selection$$1);
40477 container.style('display', 'block');
40478 tooltipSize = utilGetDimensions(container);
40482 function mousemove() {
40483 if (container.style('display') === 'none') show();
40484 var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
40485 -tooltipSize[0] - xmargin : xmargin;
40486 container.classed('left', xoffset > 0);
40487 utilSetTransform(container, event.clientX + xoffset, event.clientY);
40491 function mouseleave() {
40492 if (event.relatedTarget !== container.node()) {
40493 container.style('display', 'none');
40498 function mouseenter() {
40499 if (event.relatedTarget !== container.node()) {
40506 tail.off = function(selection$$1) {
40510 .on('mousemove.tail', null)
40514 .on('mousemove.tail', null)
40515 .on('mouseenter.tail', null)
40516 .on('mouseleave.tail', null);
40519 .on('resize.tail', null);
40523 tail.text = function(_) {
40524 if (!arguments.length) return text;
40533 var usedTails = {};
40534 var disableSpace = false;
40535 var lastSpace = null;
40538 function behaviorDraw(context) {
40539 var dispatch$$1 = dispatch('move', 'click', 'clickWay',
40540 'clickNode', 'undo', 'cancel', 'finish'),
40541 keybinding = d3keybinding('draw'),
40542 hover = behaviorHover(context)
40544 .on('hover', context.ui().sidebar.hover),
40545 tail = behaviorTail(),
40546 edit = behaviorEdit(context),
40547 closeTolerance = 4,
40549 mouseLeave = false,
40554 if (event.altKey) return {};
40556 if (event.type === 'keydown') {
40557 return (lastMouse && lastMouse.target.__data__) || {};
40559 return event.target.__data__ || {};
40564 function mousedown() {
40567 var p = context.container().node();
40568 return touchId !== null ? d3_touches(p).filter(function(p) {
40569 return p.identifier === touchId;
40570 })[0] : d3_mouse(p);
40573 var element = d3_select(this),
40574 touchId = event.touches ? event.changedTouches[0].identifier : null,
40578 element.on('mousemove.draw', null);
40580 d3_select(window).on('mouseup.draw', function() {
40581 var t2 = +new Date(),
40583 dist = geoEuclideanDistance(p1, p2);
40585 element.on('mousemove.draw', mousemove);
40586 d3_select(window).on('mouseup.draw', null);
40588 if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
40589 // Prevent a quick second click
40590 d3_select(window).on('click.draw-block', function() {
40591 event.stopPropagation();
40594 context.map().dblclickEnable(false);
40596 window.setTimeout(function() {
40597 context.map().dblclickEnable(true);
40598 d3_select(window).on('click.draw-block', null);
40607 function mousemove() {
40609 dispatch$$1.call('move', this, datum());
40613 function mouseenter() {
40614 mouseLeave = false;
40618 function mouseleave() {
40625 if (d.type === 'way') {
40626 var dims = context.map().dimensions(),
40627 mouse = context.mouse(),
40629 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
40630 mouse[1] > pad && mouse[1] < dims[1] - pad;
40633 var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection),
40634 edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
40635 dispatch$$1.call('clickWay', this, choice.loc, edge);
40637 dispatch$$1.call('click', this, context.map().mouseCoordinates());
40640 } else if (d.type === 'node') {
40641 dispatch$$1.call('clickNode', this, d);
40644 dispatch$$1.call('click', this, context.map().mouseCoordinates());
40650 event.preventDefault();
40651 event.stopPropagation();
40653 var currSpace = context.mouse();
40654 if (disableSpace && lastSpace) {
40655 var dist = geoEuclideanDistance(lastSpace, currSpace);
40656 if (dist > tolerance) {
40657 disableSpace = false;
40661 if (disableSpace || mouseLeave || !lastMouse) return;
40663 // user must move mouse or release space bar to allow another click
40664 lastSpace = currSpace;
40665 disableSpace = true;
40667 d3_select(window).on('keyup.space-block', function() {
40668 event.preventDefault();
40669 event.stopPropagation();
40670 disableSpace = false;
40671 d3_select(window).on('keyup.space-block', null);
40678 function backspace() {
40679 event.preventDefault();
40680 dispatch$$1.call('undo');
40685 event.preventDefault();
40686 dispatch$$1.call('cancel');
40691 event.preventDefault();
40692 dispatch$$1.call('finish');
40696 function draw(selection$$1) {
40697 context.install(hover);
40698 context.install(edit);
40700 if (!context.inIntro() && !usedTails[tail.text()]) {
40701 context.install(tail);
40705 .on('⌫', backspace)
40709 .on('space', space)
40710 .on('⌥space', space);
40713 .on('mouseenter.draw', mouseenter)
40714 .on('mouseleave.draw', mouseleave)
40715 .on('mousedown.draw', mousedown)
40716 .on('mousemove.draw', mousemove);
40718 d3_select(document)
40725 draw.off = function(selection$$1) {
40726 context.ui().sidebar.hover.cancel();
40727 context.uninstall(hover);
40728 context.uninstall(edit);
40730 if (!context.inIntro() && !usedTails[tail.text()]) {
40731 context.uninstall(tail);
40732 usedTails[tail.text()] = true;
40736 .on('mouseenter.draw', null)
40737 .on('mouseleave.draw', null)
40738 .on('mousedown.draw', null)
40739 .on('mousemove.draw', null);
40742 .on('mouseup.draw', null);
40743 // note: keyup.space-block, click.draw-block should remain
40745 d3_select(document)
40746 .call(keybinding.off);
40750 draw.tail = function(_) {
40756 return utilRebind(draw, dispatch$$1, 'on');
40759 function behaviorAddWay(context) {
40760 var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
40761 draw = behaviorDraw(context);
40763 var addWay = function(surface) {
40764 draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
40765 .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
40766 .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
40767 .on('cancel', addWay.cancel)
40768 .on('finish', addWay.cancel);
40771 .dblclickEnable(false);
40773 surface.call(draw);
40777 addWay.off = function(surface) {
40778 surface.call(draw.off);
40782 addWay.cancel = function() {
40783 window.setTimeout(function() {
40784 context.map().dblclickEnable(true);
40787 context.enter(modeBrowse(context));
40791 addWay.tail = function(text) {
40797 return utilRebind(addWay, dispatch$$1, 'on');
40800 function behaviorBreathe() {
40801 var duration = 800,
40803 selector$$1 = '.selected.shadow, .selected .shadow',
40804 selected = d3_select(null),
40811 function ratchetyInterpolator(a, b, steps, units) {
40814 var sample = quantize()
40816 .range(d3_quantize(d3_interpolateNumber(a, b), steps));
40818 return function(t) {
40819 return String(sample(t)) + (units || '');
40824 function reset(selection$$1) {
40826 .style('stroke-opacity', null)
40827 .style('stroke-width', null)
40828 .style('fill-opacity', null)
40833 function setAnimationParams(transition, fromTo) {
40834 var toFrom = (fromTo === 'from' ? 'to' : 'from');
40837 .styleTween('stroke-opacity', function(d) {
40838 return ratchetyInterpolator(
40839 params[d.id][toFrom].opacity,
40840 params[d.id][fromTo].opacity,
40844 .styleTween('stroke-width', function(d) {
40845 return ratchetyInterpolator(
40846 params[d.id][toFrom].width,
40847 params[d.id][fromTo].width,
40852 .styleTween('fill-opacity', function(d) {
40853 return ratchetyInterpolator(
40854 params[d.id][toFrom].opacity,
40855 params[d.id][fromTo].opacity,
40859 .styleTween('r', function(d) {
40860 return ratchetyInterpolator(
40861 params[d.id][toFrom].width,
40862 params[d.id][fromTo].width,
40870 function calcAnimationParams(selection$$1) {
40873 .each(function(d) {
40874 var s = d3_select(this),
40875 tag = s.node().tagName,
40876 p = {'from': {}, 'to': {}},
40879 // determine base opacity and width
40880 if (tag === 'circle') {
40881 opacity = parseFloat(s.style('fill-opacity') || 0.5);
40882 width = parseFloat(s.style('r') || 15.5);
40884 opacity = parseFloat(s.style('stroke-opacity') || 0.7);
40885 width = parseFloat(s.style('stroke-width') || 10);
40888 // calculate from/to interpolation params..
40890 p.from.opacity = opacity * 0.6;
40891 p.to.opacity = opacity * 1.25;
40892 p.from.width = width * 0.7;
40893 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
40899 function run(surface, fromTo) {
40900 var toFrom = (fromTo === 'from' ? 'to' : 'from'),
40901 currSelected = surface.selectAll(selector$$1),
40902 currClassed = surface.attr('class');
40904 if (done || currSelected.empty()) {
40905 selected.call(reset);
40909 if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
40910 selected.call(reset);
40911 classed = currClassed;
40912 selected = currSelected.call(calcAnimationParams);
40917 .duration(duration)
40918 .call(setAnimationParams, fromTo)
40919 .on('end', function() {
40920 surface.call(run, toFrom);
40925 var breathe = function(surface) {
40927 timer$$1 = timer(function() {
40928 // wait for elements to actually become selected
40929 if (surface.selectAll(selector$$1).empty()) {
40933 surface.call(run, 'from');
40940 breathe.off = function() {
40954 function behaviorCopy(context) {
40955 var keybinding = d3keybinding('copy');
40958 function groupEntities(ids, graph) {
40959 var entities = ids.map(function (id) { return graph.entity(id); });
40960 return assignIn$1({relation: [], way: [], node: []},
40961 groupBy(entities, function(entity) { return entity.type; }));
40965 function getDescendants(id, graph, descendants) {
40966 var entity = graph.entity(id),
40969 descendants = descendants || {};
40971 if (entity.type === 'relation') {
40972 children = map$4(entity.members, 'id');
40973 } else if (entity.type === 'way') {
40974 children = entity.nodes;
40979 for (i = 0; i < children.length; i++) {
40980 if (!descendants[children[i]]) {
40981 descendants[children[i]] = true;
40982 descendants = getDescendants(children[i], graph, descendants);
40986 return descendants;
40990 function doCopy() {
40991 event.preventDefault();
40993 var graph = context.graph(),
40994 selected = groupEntities(context.selectedIDs(), graph),
40999 for (i = 0; i < selected.relation.length; i++) {
41000 entity = selected.relation[i];
41001 if (!skip[entity.id] && entity.isComplete(graph)) {
41002 canCopy.push(entity.id);
41003 skip = getDescendants(entity.id, graph, skip);
41006 for (i = 0; i < selected.way.length; i++) {
41007 entity = selected.way[i];
41008 if (!skip[entity.id]) {
41009 canCopy.push(entity.id);
41010 skip = getDescendants(entity.id, graph, skip);
41013 for (i = 0; i < selected.node.length; i++) {
41014 entity = selected.node[i];
41015 if (!skip[entity.id]) {
41016 canCopy.push(entity.id);
41020 context.copyIDs(canCopy);
41025 keybinding.on(uiCmd('⌘C'), doCopy);
41026 d3_select(document).call(keybinding);
41031 copy.off = function() {
41032 d3_select(document).call(keybinding.off);
41040 `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
41042 * The `origin` function is expected to return an [x, y] tuple rather than an
41044 * The events are `start`, `move`, and `end`.
41045 (https://github.com/mbostock/d3/issues/563)
41046 * The `start` event is not dispatched until the first cursor movement occurs.
41047 (https://github.com/mbostock/d3/pull/368)
41048 * The `move` event has a `point` and `delta` [x, y] tuple properties rather
41049 than `x`, `y`, `dx`, and `dy` properties.
41050 * The `end` event is not dispatched if no movement occurs.
41051 * An `off` function is available that unbinds the drag's internal event handlers.
41054 function behaviorDrag() {
41055 var event$$1 = dispatch('start', 'move', 'end'),
41059 event_, target, surface;
41062 var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect'),
41063 d3_event_userSelectSuppress = function() {
41064 var selection$$1 = selection(),
41065 select = selection$$1.style(d3_event_userSelectProperty);
41066 selection$$1.style(d3_event_userSelectProperty, 'none');
41067 return function() {
41068 selection$$1.style(d3_event_userSelectProperty, select);
41073 function d3_eventCancel() {
41074 event.stopPropagation();
41075 event.preventDefault();
41079 function eventOf(thiz, argumentz) {
41080 return function(e1) {
41082 customEvent(e1, event$$1.apply, event$$1, [e1.type, thiz, argumentz]);
41087 function dragstart() {
41089 event_ = eventOf(target, arguments);
41091 var eventTarget = event.target,
41092 touchId = event.touches ? event.changedTouches[0].identifier : null,
41096 selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
41099 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
41100 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
41103 offset = origin.apply(target, arguments);
41104 offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
41109 if (touchId === null) {
41110 event.stopPropagation();
41115 var p = surface || target.parentNode;
41116 return touchId !== null ? d3_touches(p).filter(function(p) {
41117 return p.identifier === touchId;
41118 })[0] : d3_mouse(p);
41122 function dragmove() {
41124 dx = p[0] - origin_[0],
41125 dy = p[1] - origin_[1];
41127 if (dx === 0 && dy === 0)
41132 event_({ type: 'start' });
41140 point: [p[0] + offset[0], p[1] + offset[1]],
41146 function dragend() {
41148 event_({ type: 'end' });
41151 if (event.target === eventTarget) {
41153 .on('click.drag', click, true);
41158 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
41159 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
41168 .on('click.drag', null);
41173 function drag(selection$$1) {
41174 var matchesSelector = utilPrefixDOMProperty('matchesSelector'),
41175 delegate = dragstart;
41178 delegate = function() {
41180 target = event.target;
41181 for (; target && target !== root; target = target.parentNode) {
41182 if (target[matchesSelector](selector$$1) &&
41183 (!filter || filter(target.__data__))) {
41184 return dragstart.call(target, target.__data__);
41191 .on('mousedown.drag' + selector$$1, delegate)
41192 .on('touchstart.drag' + selector$$1, delegate);
41196 drag.off = function(selection$$1) {
41198 .on('mousedown.drag' + selector$$1, null)
41199 .on('touchstart.drag' + selector$$1, null);
41203 drag.selector = function(_) {
41204 if (!arguments.length) return selector$$1;
41210 drag.filter = function(_) {
41211 if (!arguments.length) return origin;
41217 drag.origin = function (_) {
41218 if (!arguments.length) return origin;
41224 drag.cancel = function() {
41226 .on('mousemove.drag', null)
41227 .on('mouseup.drag', null);
41232 drag.target = function() {
41233 if (!arguments.length) return target;
41234 target = arguments[0];
41235 event_ = eventOf(target, Array.prototype.slice.call(arguments, 1));
41240 drag.surface = function() {
41241 if (!arguments.length) return surface;
41242 surface = arguments[0];
41247 return utilRebind(drag, event$$1, 'on');
41250 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
41252 var origWay = context.entity(wayId),
41253 isArea = context.geometry(wayId) === 'area',
41255 annotation = t((origWay.isDegenerate() ?
41256 'operations.start.annotation.' :
41257 'operations.continue.annotation.') + context.geometry(wayId)),
41258 draw = behaviorDraw(context),
41265 // initialize the temporary drawing entities
41267 startIndex = typeof index === 'undefined' ? origWay.nodes.length - 1 : 0;
41268 start = osmNode({ id: 'nStart', loc: context.entity(origWay.nodes[startIndex]).loc });
41269 end = osmNode({ id: 'nEnd', loc: context.map().mouseCoordinates() });
41270 segment = osmWay({ id: 'wTemp',
41271 nodes: typeof index === 'undefined' ? [start.id, end.id] : [end.id, start.id],
41272 tags: clone(origWay.tags)
41275 end = osmNode({ loc: context.map().mouseCoordinates() });
41278 // Push an annotated state for undo to return back to.
41279 // We must make sure to remove this edit later.
41280 context.perform(actionNoop(), annotation);
41283 // Add the temporary drawing entities to the graph.
41284 // We must make sure to remove this edit later.
41285 context.perform(AddDrawEntities());
41289 function move(datum) {
41292 if (datum.type === 'node' && datum.id !== end.id) {
41295 } else if (datum.type === 'way') {
41296 var dims = context.map().dimensions(),
41297 mouse = context.mouse(),
41299 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
41300 mouse[1] > pad && mouse[1] < dims[1] - pad;
41303 loc = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc;
41308 loc = context.map().mouseCoordinates();
41311 context.replace(actionMoveNode(end.id, loc));
41312 end = context.entity(end.id);
41316 function undone() {
41317 // Undo popped the history back to the initial annotated no-op edit.
41318 // Remove initial no-op edit and whatever edit happened immediately before it.
41322 if (context.hasEntity(wayId)) {
41323 context.enter(mode);
41325 context.enter(modeBrowse(context));
41330 function setActiveElements() {
41331 var active = isArea ? [wayId, end.id] : [segment.id, start.id, end.id];
41332 context.surface().selectAll(utilEntitySelector(active))
41333 .classed('active', true);
41337 var drawWay = function(surface) {
41338 draw.on('move', move)
41339 .on('click', drawWay.add)
41340 .on('clickWay', drawWay.addWay)
41341 .on('clickNode', drawWay.addNode)
41342 .on('undo', context.undo)
41343 .on('cancel', drawWay.cancel)
41344 .on('finish', drawWay.finish);
41347 .dblclickEnable(false)
41348 .on('drawn.draw', setActiveElements);
41350 setActiveElements();
41352 surface.call(draw);
41355 .on('undone.draw', undone);
41359 drawWay.off = function(surface) {
41360 // Drawing was interrupted unexpectedly.
41361 // This can happen if the user changes modes,
41362 // clicks geolocate button, a hashchange event occurs, etc.
41364 context.pop(tempEdits);
41365 while (context.graph() !== startGraph) {
41371 .on('drawn.draw', null);
41373 surface.call(draw.off)
41374 .selectAll('.active')
41375 .classed('active', false);
41378 .on('undone.draw', null);
41382 function AddDrawEntities() {
41383 return function(graph) {
41385 // For area drawing, there is no need for a temporary node.
41386 // `end` gets inserted into the way as the penultimate node.
41389 .replace(origWay.addNode(end.id));
41391 // For line drawing, add a temporary start, end, and segment to the graph.
41392 // This allows us to class the new segment as `active`, but still
41393 // connect it back to parts of the way that have already been drawn.
41403 function ReplaceDrawEntities(newNode) {
41404 return function(graph) {
41406 // For area drawing, we didn't create a temporary node.
41407 // `newNode` gets inserted into the _original_ way as the penultimate node.
41409 .replace(origWay.addNode(newNode.id))
41412 // For line drawing, add the `newNode` to the way at specified index,
41413 // and remove the temporary start, end, and segment.
41415 .replace(origWay.addNode(newNode.id, index))
41424 // Accept the current position of the temporary node and continue drawing.
41425 drawWay.add = function(loc) {
41426 // prevent duplicate nodes
41427 var last = context.hasEntity(origWay.nodes[origWay.nodes.length - (isArea ? 2 : 1)]);
41428 if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
41430 context.pop(tempEdits);
41438 var newNode = osmNode({loc: loc});
41440 actionAddEntity(newNode),
41441 ReplaceDrawEntities(newNode),
41447 context.enter(mode);
41451 // Connect the way to an existing way.
41452 drawWay.addWay = function(loc, edge) {
41454 context.pop(tempEdits);
41458 actionAddMidpoint({ loc: loc, edge: edge}, end),
41462 var previousEdge = startIndex ?
41463 [origWay.nodes[startIndex], origWay.nodes[startIndex - 1]] :
41464 [origWay.nodes[0], origWay.nodes[1]];
41466 // Avoid creating duplicate segments
41467 if (geoEdgeEqual(edge, previousEdge))
41470 context.pop(tempEdits);
41472 var newNode = osmNode({ loc: loc });
41474 actionAddMidpoint({ loc: loc, edge: edge}, newNode),
41475 ReplaceDrawEntities(newNode),
41481 context.enter(mode);
41485 // Connect the way to an existing node and continue drawing.
41486 drawWay.addNode = function(node) {
41487 // Avoid creating duplicate segments
41488 if (origWay.areAdjacent(node.id, origWay.nodes[origWay.nodes.length - 1])) return;
41490 // Clicks should not occur on the drawing node, however a space keypress can
41491 // sometimes grab that node's datum (before it gets classed as `active`?) #4016
41492 if (node.id === end.id) {
41493 drawWay.add(node.loc);
41497 context.pop(tempEdits);
41500 ReplaceDrawEntities(node),
41505 context.enter(mode);
41509 // Finish the draw operation, removing the temporary edits.
41510 // If the way has enough nodes to be valid, it's selected.
41511 // Otherwise, delete everything and return to browse mode.
41512 drawWay.finish = function() {
41513 context.pop(tempEdits);
41516 var way = context.hasEntity(wayId);
41517 if (!way || way.isDegenerate()) {
41522 window.setTimeout(function() {
41523 context.map().dblclickEnable(true);
41526 context.enter(modeSelect(context, [wayId]).newFeature(true));
41530 // Cancel the draw operation, delete everything, and return to browse mode.
41531 drawWay.cancel = function() {
41532 context.pop(tempEdits);
41535 while (context.graph() !== startGraph) {
41539 window.setTimeout(function() {
41540 context.map().dblclickEnable(true);
41543 context.enter(modeBrowse(context));
41547 drawWay.tail = function(text) {
41556 function behaviorHash(context) {
41557 var s0 = null, // cached window.location.hash
41558 lat = 90 - 1e-8; // allowable latitude range
41561 var parser = function(map, s) {
41562 var q = utilStringQs(s);
41563 var args = (q.map || '').split('/').map(Number);
41565 if (args.length < 3 || args.some(isNaN)) {
41566 return true; // replace bogus hash
41568 } else if (s !== formatter(map).slice(1)) { // hash has changed
41569 var mode = context.mode(),
41570 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
41573 // Don't allow the hash location to change too much while drawing
41574 // This can happen if the user accidently hit the back button. #3996
41575 if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
41576 context.enter(modeBrowse(context));
41579 map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
41584 var formatter = function(map) {
41585 var center = map.center(),
41587 precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
41588 q = omit(utilStringQs(window.location.hash.substring(1)),
41589 ['comment', 'hashtags', 'walkthrough']
41594 var selected = context.selectedIDs().filter(function(id) {
41595 return !context.entity(id).isNew();
41597 if (selected.length) {
41598 newParams.id = selected.join(',');
41601 newParams.map = zoom.toFixed(2) +
41602 '/' + center[1].toFixed(precision) +
41603 '/' + center[0].toFixed(precision);
41605 return '#' + utilQsString(assign(q, newParams), true);
41609 function update() {
41610 if (context.inIntro()) return;
41611 var s1 = formatter(context.map());
41613 window.location.replace(s0 = s1); // don't recenter the map!
41618 var throttledUpdate = throttle(update, 500);
41621 function hashchange() {
41622 if (window.location.hash === s0) return; // ignore spurious hashchange events
41623 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
41624 update(); // replace bogus hash
41631 .on('move.hash', throttledUpdate);
41634 .on('enter.hash', throttledUpdate);
41637 .on('hashchange.hash', hashchange);
41639 if (window.location.hash) {
41641 var q = utilStringQs(window.location.hash.substring(1));
41644 context.zoomToEntity(q.id.split(',')[0], !q.map);
41648 context.storage('comment', q.comment);
41649 context.storage('commentDate', Date.now());
41653 context.storage('hashtags', q.hashtags);
41656 if (q.walkthrough === 'true') {
41657 hash.startWalkthrough = true;
41663 hash.hadHash = true;
41669 hash.off = function() {
41670 throttledUpdate.cancel();
41673 .on('move.hash', null);
41676 .on('enter.hash', null);
41679 .on('hashchange.hash', null);
41681 window.location.hash = '';
41688 function behaviorLasso(context) {
41690 var behavior = function(selection$$1) {
41694 function mousedown() {
41695 var button = 0; // left
41696 if (event.button === button && event.shiftKey === true) {
41700 .on('mousemove.lasso', mousemove)
41701 .on('mouseup.lasso', mouseup);
41703 event.stopPropagation();
41708 function mousemove() {
41710 lasso = uiLasso(context);
41711 context.surface().call(lasso);
41714 lasso.p(context.mouse());
41718 function normalize(a, b) {
41720 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
41721 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
41725 function lassoed() {
41726 if (!lasso) return [];
41728 var graph = context.graph(),
41729 bounds = lasso.extent().map(context.projection.invert),
41730 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
41732 return map$4(context.intersects(extent).filter(function(entity) {
41733 return entity.type === 'node' &&
41734 geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
41735 !context.features().isHidden(entity, graph, entity.geometry(graph));
41740 function mouseup() {
41742 .on('mousemove.lasso', null)
41743 .on('mouseup.lasso', null);
41745 if (!lasso) return;
41747 var ids = lassoed();
41751 context.enter(modeSelect(context, ids));
41756 .on('mousedown.lasso', mousedown);
41760 behavior.off = function(selection$$1) {
41761 selection$$1.on('mousedown.lasso', null);
41768 /* Creates a keybinding behavior for an operation */
41769 function behaviorOperation() {
41770 var which, keybinding;
41773 function drawIcon(selection$$1) {
41774 var button = selection$$1
41776 .attr('class', 'operation-icon')
41778 .attr('class', 'radial-menu-item radial-menu-item-' + which.id)
41779 .attr('transform', 'translate(10,10)')
41780 .classed('disabled', which.disabled());
41788 .attr('transform', 'translate(-7,-7)')
41789 .attr('width', '14')
41790 .attr('height', '14')
41791 .attr('xlink:href', '#operation-' + which.id);
41793 return selection$$1;
41797 var behavior = function () {
41798 if (which && which.available()) {
41799 keybinding = d3keybinding('behavior.key.' + which.id);
41800 keybinding.on(which.keys, function() {
41801 event.preventDefault();
41802 var disabled = which.disabled();
41809 .attr('class', 'operation-tip')
41810 .text(which.tooltip);
41817 .attr('class', 'operation-tip')
41818 .text(which.annotation() || which.title);
41823 d3_select(document).call(keybinding);
41829 behavior.off = function() {
41831 d3_select(document).call(keybinding.off);
41836 behavior.which = function (_) {
41837 if (!arguments.length) return which;
41847 * The base implementation of `_.invert` and `_.invertBy` which inverts
41848 * `object` with values transformed by `iteratee` and set by `setter`.
41851 * @param {Object} object The object to iterate over.
41852 * @param {Function} setter The function to set `accumulator` values.
41853 * @param {Function} iteratee The iteratee to transform values.
41854 * @param {Object} accumulator The initial inverted object.
41855 * @returns {Function} Returns `accumulator`.
41857 function baseInverter(object, setter, iteratee, accumulator) {
41858 baseForOwn(object, function(value, key, object) {
41859 setter(accumulator, iteratee(value), key, object);
41861 return accumulator;
41865 * Creates a function like `_.invertBy`.
41868 * @param {Function} setter The function to set accumulator values.
41869 * @param {Function} toIteratee The function to resolve iteratees.
41870 * @returns {Function} Returns the new inverter function.
41872 function createInverter(setter, toIteratee) {
41873 return function(object, iteratee) {
41874 return baseInverter(object, setter, toIteratee(iteratee), {});
41879 * Creates an object composed of the inverted keys and values of `object`.
41880 * If `object` contains duplicate values, subsequent values overwrite
41881 * property assignments of previous values.
41887 * @param {Object} object The object to invert.
41888 * @returns {Object} Returns the new inverted object.
41891 * var object = { 'a': 1, 'b': 2, 'c': 1 };
41893 * _.invert(object);
41894 * // => { '1': 'c', '2': 'b' }
41896 var invert = createInverter(function(result, value, key) {
41897 result[value] = key;
41898 }, constant$13(identity$8));
41901 * Creates an object with the same keys as `object` and values generated
41902 * by running each own enumerable string keyed property of `object` thru
41903 * `iteratee`. The iteratee is invoked with three arguments:
41904 * (value, key, object).
41910 * @param {Object} object The object to iterate over.
41911 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
41912 * @returns {Object} Returns the new mapped object.
41917 * 'fred': { 'user': 'fred', 'age': 40 },
41918 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
41921 * _.mapValues(users, function(o) { return o.age; });
41922 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
41924 * // The `_.property` iteratee shorthand.
41925 * _.mapValues(users, 'age');
41926 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
41928 function mapValues(object, iteratee) {
41930 iteratee = baseIteratee(iteratee, 3);
41932 baseForOwn(object, function(value, key, object) {
41933 baseAssignValue(result, key, iteratee(value, key, object));
41938 function behaviorPaste(context) {
41939 var keybinding = d3keybinding('paste');
41942 function doPaste() {
41943 event.preventDefault();
41945 var baseGraph = context.graph(),
41946 mouse = context.mouse(),
41947 projection = context.projection,
41948 viewport = geoExtent$$1(projection.clipExtent()).polygon();
41950 if (!geoPointInPolygon(mouse, viewport)) return;
41952 var extent = geoExtent$$1(),
41953 oldIDs = context.copyIDs(),
41954 oldGraph = context.copyGraph(),
41957 if (!oldIDs.length) return;
41959 var action = actionCopyEntities(oldIDs, oldGraph);
41960 context.perform(action);
41962 var copies = action.copies();
41963 var originals = invert(mapValues(copies, 'id'));
41964 for (var id in copies) {
41965 var oldEntity = oldGraph.entity(id),
41966 newEntity = copies[id];
41968 extent._extend(oldEntity.extent(oldGraph));
41970 // Exclude child nodes from newIDs if their parent way was also copied.
41971 var parents = context.graph().parentWays(newEntity),
41972 parentCopied = false;
41973 for (var i = 0; i < parents.length; i++) {
41974 if (originals[parents[i].id]) {
41975 parentCopied = true;
41980 if (!parentCopied) {
41981 newIDs.push(newEntity.id);
41985 // Put pasted objects where mouse pointer is..
41986 var center = projection(extent.center()),
41987 delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
41989 context.perform(actionMove(newIDs, delta, projection));
41990 context.enter(modeMove$$1(context, newIDs, baseGraph));
41995 keybinding.on(uiCmd('⌘V'), doPaste);
41996 d3_select(document).call(keybinding);
42001 paste.off = function() {
42002 d3_select(document).call(keybinding.off);
42009 function behaviorSelect(context) {
42010 var lastMouse = null,
42011 suppressMenu = true,
42017 return d3_mouse(context.container().node());
42021 function keydown() {
42023 if (e && e.shiftKey) {
42025 .classed('behavior-multiselect', true);
42028 if (e && e.keyCode === 93) { // context menu
42029 e.preventDefault();
42030 e.stopPropagation();
42037 if (!e || !e.shiftKey) {
42039 .classed('behavior-multiselect', false);
42043 if (e && e.keyCode === 93) { // context menu
42044 e.preventDefault();
42045 e.stopPropagation();
42051 function mousedown() {
42052 if (!p1) p1 = point();
42054 .on('mouseup.select', mouseup, true);
42056 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
42057 suppressMenu = !isShowAlways;
42061 function mousemove() {
42062 if (event) lastMouse = event;
42066 function mouseup() {
42071 function contextmenu() {
42073 e.preventDefault();
42074 e.stopPropagation();
42076 if (!+e.clientX && !+e.clientY) {
42078 e.sourceEvent = lastMouse;
42084 if (!p1) p1 = point();
42085 suppressMenu = false;
42092 .on('mouseup.select', null, true);
42096 dist = geoEuclideanDistance(p1, p2);
42099 if (dist > tolerance) {
42103 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node(),
42104 isShowAlways = +context.storage('edit-menu-show-always') === 1,
42105 datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__),
42106 mode = context.mode();
42109 if (datum && datum.type === 'midpoint') {
42110 datum = datum.parents[0];
42113 if (!(datum instanceof osmEntity$$1)) {
42114 // clicked nothing..
42115 if (!isMultiselect && mode.id !== 'browse') {
42116 context.enter(modeBrowse(context));
42120 // clicked an entity..
42121 var selectedIDs = context.selectedIDs();
42123 if (!isMultiselect) {
42124 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
42125 // multiple things already selected, just show the menu...
42126 mode.suppressMenu(false).reselect();
42128 // select a single thing..
42129 context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
42133 if (selectedIDs.indexOf(datum.id) !== -1) {
42134 // clicked entity is already in the selectedIDs list..
42135 if (!suppressMenu && !isShowAlways) {
42136 // don't deselect clicked entity, just show the menu.
42137 mode.suppressMenu(false).reselect();
42139 // deselect clicked entity, then reenter select mode or return to browse mode..
42140 selectedIDs = without(selectedIDs, datum.id);
42141 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
42144 // clicked entity is not in the selected list, add it..
42145 selectedIDs = selectedIDs.concat([datum.id]);
42146 context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
42151 // reset for next time..
42152 suppressMenu = true;
42156 var behavior = function(selection$$1) {
42158 suppressMenu = true;
42162 .on('keydown.select', keydown)
42163 .on('keyup.select', keyup)
42164 .on('contextmenu.select-window', function() {
42165 // Edge and IE really like to show the contextmenu on the
42166 // menubar when user presses a keyboard menu button
42167 // even after we've already preventdefaulted the key event.
42169 if (+e.clientX === 0 && +e.clientY === 0) {
42170 event.preventDefault();
42171 event.stopPropagation();
42176 .on('mousedown.select', mousedown)
42177 .on('mousemove.select', mousemove)
42178 .on('contextmenu.select', contextmenu);
42180 if (event && event.shiftKey) {
42182 .classed('behavior-multiselect', true);
42187 behavior.off = function(selection$$1) {
42189 .on('keydown.select', null)
42190 .on('keyup.select', null)
42191 .on('contextmenu.select-window', null)
42192 .on('mouseup.select', null, true);
42195 .on('mousedown.select', null)
42196 .on('mousemove.select', null)
42197 .on('contextmenu.select', null);
42200 .classed('behavior-multiselect', false);
42207 function modeAddArea$$1(context) {
42211 title: t('modes.add_area.title'),
42212 description: t('modes.add_area.description'),
42216 var behavior = behaviorAddWay(context)
42217 .tail(t('modes.add_area.tail'))
42218 .on('start', start)
42219 .on('startFromWay', startFromWay)
42220 .on('startFromNode', startFromNode),
42221 defaultTags = { area: 'yes' };
42224 function actionClose(wayId) {
42225 return function (graph) {
42226 return graph.replace(graph.entity(wayId).close());
42231 function start(loc) {
42232 var startGraph = context.graph(),
42233 node = osmNode({ loc: loc }),
42234 way = osmWay({ tags: defaultTags });
42237 actionAddEntity(node),
42238 actionAddEntity(way),
42239 actionAddVertex(way.id, node.id),
42240 actionClose(way.id)
42243 context.enter(modeDrawArea(context, way.id, startGraph));
42247 function startFromWay(loc, edge) {
42248 var startGraph = context.graph(),
42249 node = osmNode({ loc: loc }),
42250 way = osmWay({ tags: defaultTags });
42253 actionAddEntity(node),
42254 actionAddEntity(way),
42255 actionAddVertex(way.id, node.id),
42256 actionClose(way.id),
42257 actionAddMidpoint({ loc: loc, edge: edge }, node)
42260 context.enter(modeDrawArea(context, way.id, startGraph));
42264 function startFromNode(node) {
42265 var startGraph = context.graph(),
42266 way = osmWay({ tags: defaultTags });
42269 actionAddEntity(way),
42270 actionAddVertex(way.id, node.id),
42271 actionClose(way.id)
42274 context.enter(modeDrawArea(context, way.id, startGraph));
42278 mode.enter = function() {
42279 context.install(behavior);
42283 mode.exit = function() {
42284 context.uninstall(behavior);
42291 function modeAddLine$$1(context) {
42295 title: t('modes.add_line.title'),
42296 description: t('modes.add_line.description'),
42300 var behavior = behaviorAddWay(context)
42301 .tail(t('modes.add_line.tail'))
42302 .on('start', start)
42303 .on('startFromWay', startFromWay)
42304 .on('startFromNode', startFromNode);
42307 function start(loc) {
42308 var startGraph = context.graph(),
42309 node = osmNode({ loc: loc }),
42313 actionAddEntity(node),
42314 actionAddEntity(way),
42315 actionAddVertex(way.id, node.id)
42318 context.enter(modeDrawLine(context, way.id, startGraph));
42322 function startFromWay(loc, edge) {
42323 var startGraph = context.graph(),
42324 node = osmNode({ loc: loc }),
42328 actionAddEntity(node),
42329 actionAddEntity(way),
42330 actionAddVertex(way.id, node.id),
42331 actionAddMidpoint({ loc: loc, edge: edge }, node)
42334 context.enter(modeDrawLine(context, way.id, startGraph));
42338 function startFromNode(node) {
42339 var startGraph = context.graph(),
42343 actionAddEntity(way),
42344 actionAddVertex(way.id, node.id)
42347 context.enter(modeDrawLine(context, way.id, startGraph));
42351 mode.enter = function() {
42352 context.install(behavior);
42356 mode.exit = function() {
42357 context.uninstall(behavior);
42363 function modeAddPoint$$1(context) {
42367 title: t('modes.add_point.title'),
42368 description: t('modes.add_point.description'),
42372 var behavior = behaviorDraw(context)
42373 .tail(t('modes.add_point.tail'))
42375 .on('clickWay', addWay)
42376 .on('clickNode', addNode)
42377 .on('cancel', cancel)
42378 .on('finish', cancel);
42381 function add(loc) {
42382 var node = osmNode({ loc: loc });
42385 actionAddEntity(node),
42386 t('operations.add.annotation.point')
42390 modeSelect(context, [node.id]).newFeature(true)
42395 function addWay(loc) {
42400 function addNode(node) {
42405 function cancel() {
42406 context.enter(modeBrowse(context));
42410 mode.enter = function() {
42411 context.install(behavior);
42415 mode.exit = function() {
42416 context.uninstall(behavior);
42423 function modeDragNode$$1(context) {
42435 hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover),
42436 edit = behaviorEdit(context);
42439 function vecSub(a, b) {
42440 return [a[0] - b[0], a[1] - b[1]];
42443 function edge(point, size) {
42444 var pad = [80, 20, 50, 20], // top, right, bottom, left
42448 if (point[0] > size[0] - pad[1])
42450 if (point[0] < pad[3])
42452 if (point[1] > size[1] - pad[2])
42454 if (point[1] < pad[0])
42465 function startNudge(entity, nudge) {
42466 if (nudgeInterval) window.clearInterval(nudgeInterval);
42467 nudgeInterval = window.setInterval(function() {
42468 context.pan(nudge);
42469 doMove(entity, nudge);
42474 function stopNudge() {
42475 if (nudgeInterval) {
42476 window.clearInterval(nudgeInterval);
42477 nudgeInterval = null;
42482 function moveAnnotation(entity) {
42483 return t('operations.move.annotation.' + entity.geometry(context.graph()));
42487 function connectAnnotation(entity) {
42488 return t('operations.connect.annotation.' + entity.geometry(context.graph()));
42492 function origin(entity) {
42493 return context.projection(entity.loc);
42497 function start(entity) {
42498 wasMidpoint = entity.type === 'midpoint';
42500 isCancelled = event.sourceEvent.shiftKey ||
42501 context.features().hasHiddenConnections(entity, context.graph());
42504 return behavior.cancel();
42508 var midpoint = entity;
42509 entity = osmNode();
42510 context.perform(actionAddMidpoint(midpoint, entity));
42512 var vertex = context.surface().selectAll('.' + entity.id);
42513 behavior.target(vertex.node(), entity);
42516 context.perform(actionNoop());
42519 // activeIDs generate no pointer events. This prevents the node or vertex
42520 // being dragged from trying to connect to itself or its parent element.
42521 activeIDs = map$4(context.graph().parentWays(entity), 'id');
42522 activeIDs.push(entity.id);
42523 setActiveElements();
42525 context.enter(mode);
42530 var event$$1 = event && event.sourceEvent;
42531 if (!event$$1 || event$$1.altKey) {
42534 return event$$1.target.__data__ || {};
42539 function doMove(entity, nudge) {
42540 nudge = nudge || [0, 0];
42542 var currPoint = (event && event.point) || context.projection(lastLoc),
42543 currMouse = vecSub(currPoint, nudge),
42544 loc = context.projection.invert(currMouse),
42547 if (!nudgeInterval) {
42548 if (d.type === 'node' && d.id !== entity.id) {
42550 } else if (d.type === 'way' && !d3_select(event.sourceEvent.target).classed('fill')) {
42551 loc = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection).loc;
42556 actionMoveNode(entity.id, loc),
42557 moveAnnotation(entity)
42564 function move(entity) {
42565 if (isCancelled) return;
42566 event.sourceEvent.stopPropagation();
42567 lastLoc = context.projection.invert(event.point);
42570 var nudge = edge(event.point, context.map().dimensions());
42572 startNudge(entity, nudge);
42579 function end(entity) {
42580 if (isCancelled) return;
42584 if (d.type === 'way') {
42585 var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection);
42587 actionAddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
42588 connectAnnotation(d)
42591 } else if (d.type === 'node' && d.id !== entity.id) {
42593 actionConnect([d.id, entity.id]),
42594 connectAnnotation(d)
42597 } else if (wasMidpoint) {
42600 t('operations.add.annotation.vertex')
42606 moveAnnotation(entity)
42610 var reselection = selectedIDs.filter(function(id) {
42611 return context.graph().hasEntity(id);
42614 if (reselection.length) {
42615 context.enter(modeSelect(context, reselection));
42617 context.enter(modeBrowse(context));
42622 function cancel() {
42624 context.enter(modeBrowse(context));
42628 function setActiveElements() {
42629 context.surface().selectAll(utilEntitySelector(activeIDs))
42630 .classed('active', true);
42634 var behavior = behaviorDrag()
42635 .selector('g.node, g.point, g.midpoint')
42636 .surface(d3_select('#map').node())
42638 .on('start', start)
42643 mode.enter = function() {
42644 context.install(hover);
42645 context.install(edit);
42648 .on('undone.drag-node', cancel);
42651 .on('drawn.drag-node', setActiveElements);
42653 setActiveElements();
42657 mode.exit = function() {
42658 context.ui().sidebar.hover.cancel();
42659 context.uninstall(hover);
42660 context.uninstall(edit);
42663 .on('undone.drag-node', null);
42666 .on('drawn.drag-node', null);
42669 .selectAll('.active')
42670 .classed('active', false);
42676 mode.selectedIDs = function(_) {
42677 if (!arguments.length) return selectedIDs;
42683 mode.behavior = behavior;
42689 function modeBrowse(context) {
42693 title: t('modes.browse.title'),
42694 description: t('modes.browse.description')
42698 behaviorPaste(context),
42699 behaviorHover(context).on('hover', context.ui().sidebar.hover),
42700 behaviorSelect(context),
42701 behaviorLasso(context),
42702 modeDragNode$$1(context).behavior
42706 mode.enter = function() {
42707 behaviors.forEach(function(behavior) {
42708 context.install(behavior);
42711 // Get focus on the body.
42712 if (document.activeElement && document.activeElement.blur) {
42713 document.activeElement.blur();
42717 context.ui().sidebar.show(sidebar);
42719 context.ui().sidebar.select(null);
42724 mode.exit = function() {
42725 context.ui().sidebar.hover.cancel();
42726 behaviors.forEach(function(behavior) {
42727 context.uninstall(behavior);
42731 context.ui().sidebar.hide();
42736 mode.sidebar = function(_) {
42737 if (!arguments.length) return sidebar;
42746 function modeDrawArea(context, wayId, startGraph) {
42755 mode.enter = function() {
42756 var way = context.entity(wayId);
42758 behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
42759 .tail(t('modes.draw_area.tail'));
42761 var addNode = behavior.addNode;
42763 behavior.addNode = function(node) {
42764 var length = way.nodes.length,
42765 penultimate = length > 2 ? way.nodes[length - 2] : null;
42767 if (node.id === way.first() || node.id === penultimate) {
42774 context.install(behavior);
42778 mode.exit = function() {
42779 context.uninstall(behavior);
42783 mode.selectedIDs = function() {
42791 function modeDrawLine(context, wayId, startGraph, affix) {
42800 mode.enter = function() {
42801 var way = context.entity(wayId),
42802 index = (affix === 'prefix') ? 0 : undefined,
42803 headId = (affix === 'prefix') ? way.first() : way.last();
42805 behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
42806 .tail(t('modes.draw_line.tail'));
42808 var addNode = behavior.addNode;
42810 behavior.addNode = function(node) {
42811 if (node.id === headId) {
42818 context.install(behavior);
42822 mode.exit = function() {
42823 context.uninstall(behavior);
42827 mode.selectedIDs = function() {
42835 function operationCircularize(selectedIDs, context) {
42836 var entityId = selectedIDs[0],
42837 entity = context.entity(entityId),
42838 extent = entity.extent(context.graph()),
42839 geometry = context.geometry(entityId),
42840 action = actionCircularize(entityId, context.projection);
42843 var operation = function() {
42844 context.perform(action, operation.annotation());
42848 operation.available = function() {
42849 return selectedIDs.length === 1 &&
42850 entity.type === 'way' &&
42851 uniq(entity.nodes).length > 1;
42855 operation.disabled = function() {
42857 if (extent.percentContainedIn(context.extent()) < 0.8) {
42858 reason = 'too_large';
42859 } else if (context.hasHiddenConnections(entityId)) {
42860 reason = 'connected_to_hidden';
42862 return action.disabled(context.graph()) || reason;
42866 operation.tooltip = function() {
42867 var disable = operation.disabled();
42869 t('operations.circularize.' + disable) :
42870 t('operations.circularize.description.' + geometry);
42874 operation.annotation = function() {
42875 return t('operations.circularize.annotation.' + geometry);
42879 operation.id = 'circularize';
42880 operation.keys = [t('operations.circularize.key')];
42881 operation.title = t('operations.circularize.title');
42882 operation.behavior = behaviorOperation(context).which(operation);
42887 function operationContinue(selectedIDs, context) {
42888 var graph = context.graph(),
42889 entities = selectedIDs.map(function(id) { return graph.entity(id); }),
42890 geometries = assignIn$1({ line: [], vertex: [] },
42891 groupBy(entities, function(entity) { return entity.geometry(graph); })),
42892 vertex = geometries.vertex[0];
42895 function candidateWays() {
42896 return graph.parentWays(vertex).filter(function(parent) {
42897 return parent.geometry(graph) === 'line' &&
42898 !parent.isClosed() &&
42899 parent.affix(vertex.id) &&
42900 (geometries.line.length === 0 || geometries.line[0] === parent);
42905 var operation = function() {
42906 var candidate = candidateWays()[0];
42908 modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
42913 operation.available = function() {
42914 return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
42915 !context.features().hasHiddenConnections(vertex, context.graph());
42919 operation.disabled = function() {
42920 var candidates = candidateWays();
42921 if (candidates.length === 0)
42922 return 'not_eligible';
42923 if (candidates.length > 1)
42928 operation.tooltip = function() {
42929 var disable = operation.disabled();
42931 t('operations.continue.' + disable) :
42932 t('operations.continue.description');
42936 operation.annotation = function() {
42937 return t('operations.continue.annotation.line');
42941 operation.id = 'continue';
42942 operation.keys = [t('operations.continue.key')];
42943 operation.title = t('operations.continue.title');
42944 operation.behavior = behaviorOperation(context).which(operation);
42949 function operationDelete(selectedIDs, context) {
42950 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
42951 action = actionDeleteMultiple(selectedIDs),
42952 extent = selectedIDs.reduce(function(extent, id) {
42953 return extent.extend(context.entity(id).extent(context.graph()));
42954 }, geoExtent$$1());
42957 var operation = function() {
42958 var nextSelectedID;
42960 if (selectedIDs.length === 1) {
42961 var id = selectedIDs[0],
42962 entity = context.entity(id),
42963 geometry = context.geometry(id),
42964 parents = context.graph().parentWays(entity),
42965 parent = parents[0];
42967 // Select the next closest node in the way.
42968 if (geometry === 'vertex' && parent.nodes.length > 2) {
42969 var nodes = parent.nodes,
42970 i = nodes.indexOf(id);
42974 } else if (i === nodes.length - 1) {
42977 var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
42978 b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
42979 i = a < b ? i - 1 : i + 1;
42982 nextSelectedID = nodes[i];
42986 context.perform(action, operation.annotation());
42988 if (nextSelectedID && context.hasEntity(nextSelectedID)) {
42989 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
42991 context.enter(modeBrowse(context));
42997 operation.available = function() {
43002 operation.disabled = function() {
43004 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43005 reason = 'too_large';
43006 } else if (some(selectedIDs, context.hasHiddenConnections)) {
43007 reason = 'connected_to_hidden';
43008 } else if (some(selectedIDs, protectedMember)) {
43009 reason = 'part_of_relation';
43010 } else if (some(selectedIDs, incompleteRelation)) {
43011 reason = 'incomplete_relation';
43015 function incompleteRelation(id) {
43016 var entity = context.entity(id);
43017 return entity.type === 'relation' && !entity.isComplete(context.graph());
43020 function protectedMember(id) {
43021 var entity = context.entity(id);
43022 if (entity.type !== 'way') return false;
43024 var parents = context.graph().parentRelations(entity);
43025 for (var i = 0; i < parents.length; i++) {
43026 var parent = parents[i],
43027 type = parent.tags.type,
43028 role = parent.memberById(id).role || 'outer';
43029 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
43039 operation.tooltip = function() {
43040 var disable = operation.disabled();
43042 t('operations.delete.' + disable + '.' + multi) :
43043 t('operations.delete.description' + '.' + multi);
43047 operation.annotation = function() {
43048 return selectedIDs.length === 1 ?
43049 t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
43050 t('operations.delete.annotation.multiple', { n: selectedIDs.length });
43054 operation.id = 'delete';
43055 operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
43056 operation.title = t('operations.delete.title');
43057 operation.behavior = behaviorOperation(context).which(operation);
43062 function operationDisconnect(selectedIDs, context) {
43063 var vertices = filter(selectedIDs, function(entityId) {
43064 return context.geometry(entityId) === 'vertex';
43067 var entityId = vertices[0],
43068 action = actionDisconnect(entityId);
43070 if (selectedIDs.length > 1) {
43071 action.limitWays(without(selectedIDs, entityId));
43075 var operation = function() {
43076 context.perform(action, operation.annotation());
43080 operation.available = function() {
43081 return vertices.length === 1;
43085 operation.disabled = function() {
43087 if (some(selectedIDs, context.hasHiddenConnections)) {
43088 reason = 'connected_to_hidden';
43090 return action.disabled(context.graph()) || reason;
43094 operation.tooltip = function() {
43095 var disable = operation.disabled();
43097 t('operations.disconnect.' + disable) :
43098 t('operations.disconnect.description');
43102 operation.annotation = function() {
43103 return t('operations.disconnect.annotation');
43107 operation.id = 'disconnect';
43108 operation.keys = [t('operations.disconnect.key')];
43109 operation.title = t('operations.disconnect.title');
43110 operation.behavior = behaviorOperation(context).which(operation);
43115 function operationMerge(selectedIDs, context) {
43117 function updatePresetTags(newGraph, ids) {
43119 newEntity = newGraph.hasEntity(id);
43121 if (!newEntity) return;
43123 var newPreset = context.presets().match(newEntity, newGraph);
43125 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
43129 var join = actionJoin(selectedIDs),
43130 merge = actionMerge(selectedIDs),
43131 mergePolygon = actionMergePolygon(selectedIDs);
43134 var operation = function() {
43135 var origGraph = context.graph(),
43138 if (!join.disabled(origGraph)) {
43140 } else if (!merge.disabled(origGraph)) {
43143 action = mergePolygon;
43146 context.perform(action, operation.annotation());
43148 var ids = selectedIDs.filter(function(id) {
43149 var entity = context.hasEntity(id);
43150 return entity && entity.type !== 'node';
43153 // if we merged tags, rematch preset to update tags if necessary (#3851)
43154 if (action === merge) {
43155 updatePresetTags(context.graph(), ids);
43158 context.enter(modeSelect(context, ids));
43162 operation.available = function() {
43163 return selectedIDs.length >= 2;
43167 operation.disabled = function() {
43168 return join.disabled(context.graph()) &&
43169 merge.disabled(context.graph()) &&
43170 mergePolygon.disabled(context.graph());
43174 operation.tooltip = function() {
43175 var j = join.disabled(context.graph()),
43176 m = merge.disabled(context.graph()),
43177 p = mergePolygon.disabled(context.graph());
43179 if (j === 'restriction' && m && p) {
43180 return t('operations.merge.restriction',
43181 { relation: context.presets().item('type/restriction').name() });
43184 if (p === 'incomplete_relation' && j && m) {
43185 return t('operations.merge.incomplete_relation');
43189 return t('operations.merge.' + j);
43192 return t('operations.merge.description');
43196 operation.annotation = function() {
43197 return t('operations.merge.annotation', { n: selectedIDs.length });
43201 operation.id = 'merge';
43202 operation.keys = [t('operations.merge.key')];
43203 operation.title = t('operations.merge.title');
43204 operation.behavior = behaviorOperation(context).which(operation);
43209 function operationMove(selectedIDs, context) {
43210 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43211 extent = selectedIDs.reduce(function(extent, id) {
43212 return extent.extend(context.entity(id).extent(context.graph()));
43213 }, geoExtent$$1());
43216 var operation = function() {
43217 context.enter(modeMove$$1(context, selectedIDs));
43221 operation.available = function() {
43222 return selectedIDs.length > 1 ||
43223 context.entity(selectedIDs[0]).type !== 'node';
43227 operation.disabled = function() {
43229 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43230 reason = 'too_large';
43231 } else if (some(selectedIDs, context.hasHiddenConnections)) {
43232 reason = 'connected_to_hidden';
43233 } else if (some(selectedIDs, incompleteRelation)) {
43234 reason = 'incomplete_relation';
43238 function incompleteRelation(id) {
43239 var entity = context.entity(id);
43240 return entity.type === 'relation' && !entity.isComplete(context.graph());
43245 operation.tooltip = function() {
43246 var disable = operation.disabled();
43248 t('operations.move.' + disable + '.' + multi) :
43249 t('operations.move.description.' + multi);
43253 operation.annotation = function() {
43254 return selectedIDs.length === 1 ?
43255 t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
43256 t('operations.move.annotation.multiple');
43260 operation.id = 'move';
43261 operation.keys = [t('operations.move.key')];
43262 operation.title = t('operations.move.title');
43263 operation.behavior = behaviorOperation(context).which(operation);
43268 function operationOrthogonalize(selectedIDs, context) {
43269 var entityId = selectedIDs[0],
43270 entity = context.entity(entityId),
43271 extent = entity.extent(context.graph()),
43272 geometry = context.geometry(entityId),
43273 action = actionOrthogonalize(entityId, context.projection);
43276 var operation = function() {
43277 context.perform(action, operation.annotation());
43281 operation.available = function() {
43282 return selectedIDs.length === 1 &&
43283 entity.type === 'way' &&
43284 entity.isClosed() &&
43285 uniq(entity.nodes).length > 2;
43289 operation.disabled = function() {
43291 if (extent.percentContainedIn(context.extent()) < 0.8) {
43292 reason = 'too_large';
43293 } else if (context.hasHiddenConnections(entityId)) {
43294 reason = 'connected_to_hidden';
43296 return action.disabled(context.graph()) || reason;
43300 operation.tooltip = function() {
43301 var disable = operation.disabled();
43303 t('operations.orthogonalize.' + disable) :
43304 t('operations.orthogonalize.description.' + geometry);
43308 operation.annotation = function() {
43309 return t('operations.orthogonalize.annotation.' + geometry);
43313 operation.id = 'orthogonalize';
43314 operation.keys = [t('operations.orthogonalize.key')];
43315 operation.title = t('operations.orthogonalize.title');
43316 operation.behavior = behaviorOperation(context).which(operation);
43322 * This method is like `_.uniq` except that it accepts `iteratee` which is
43323 * invoked for each element in `array` to generate the criterion by which
43324 * uniqueness is computed. The order of result values is determined by the
43325 * order they occur in the array. The iteratee is invoked with one argument:
43332 * @param {Array} array The array to inspect.
43333 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43334 * @returns {Array} Returns the new duplicate free array.
43337 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
43340 * // The `_.property` iteratee shorthand.
43341 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
43342 * // => [{ 'x': 1 }, { 'x': 2 }]
43344 function uniqBy(array, iteratee) {
43345 return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
43348 function operationReflectShort(selectedIDs, context) {
43349 return operationReflect(selectedIDs, context, 'short');
43353 function operationReflectLong(selectedIDs, context) {
43354 return operationReflect(selectedIDs, context, 'long');
43358 function operationReflect(selectedIDs, context, axis) {
43359 axis = axis || 'long';
43360 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43361 extent = selectedIDs.reduce(function(extent, id) {
43362 return extent.extend(context.entity(id).extent(context.graph()));
43363 }, geoExtent$$1());
43366 var operation = function() {
43367 var action = actionReflect(selectedIDs, context.projection)
43368 .useLongAxis(Boolean(axis === 'long'));
43369 context.perform(action, operation.annotation());
43373 operation.available = function() {
43374 var nodes = utilGetAllNodes(selectedIDs, context.graph());
43375 return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
43379 operation.disabled = function() {
43381 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43382 reason = 'too_large';
43383 } else if (some(selectedIDs, context.hasHiddenConnections)) {
43384 reason = 'connected_to_hidden';
43385 } else if (some(selectedIDs, incompleteRelation)) {
43386 reason = 'incomplete_relation';
43390 function incompleteRelation(id) {
43391 var entity = context.entity(id);
43392 return entity.type === 'relation' && !entity.isComplete(context.graph());
43397 operation.tooltip = function() {
43398 var disable = operation.disabled();
43400 t('operations.reflect.' + disable + '.' + multi) :
43401 t('operations.reflect.description.' + axis + '.' + multi);
43405 operation.annotation = function() {
43406 return t('operations.reflect.annotation.' + axis + '.' + multi);
43410 operation.id = 'reflect-' + axis;
43411 operation.keys = [t('operations.reflect.key.' + axis)];
43412 operation.title = t('operations.reflect.title.' + axis);
43413 operation.behavior = behaviorOperation(context).which(operation);
43418 function operationReverse(selectedIDs, context) {
43419 var entityId = selectedIDs[0];
43421 var operation = function() {
43422 context.perform(actionReverse(entityId), operation.annotation());
43426 operation.available = function() {
43427 return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
43431 operation.disabled = function() {
43436 operation.tooltip = function() {
43437 return t('operations.reverse.description');
43441 operation.annotation = function() {
43442 return t('operations.reverse.annotation');
43446 operation.id = 'reverse';
43447 operation.keys = [t('operations.reverse.key')];
43448 operation.title = t('operations.reverse.title');
43449 operation.behavior = behaviorOperation(context).which(operation);
43454 function operationRotate(selectedIDs, context) {
43455 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43456 extent = selectedIDs.reduce(function(extent, id) {
43457 return extent.extend(context.entity(id).extent(context.graph()));
43458 }, geoExtent$$1());
43461 var operation = function() {
43462 context.enter(modeRotate$$1(context, selectedIDs));
43466 operation.available = function() {
43467 var nodes = utilGetAllNodes(selectedIDs, context.graph());
43468 return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
43472 operation.disabled = function() {
43474 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43475 reason = 'too_large';
43476 } else if (some(selectedIDs, context.hasHiddenConnections)) {
43477 reason = 'connected_to_hidden';
43478 } else if (some(selectedIDs, incompleteRelation)) {
43479 reason = 'incomplete_relation';
43483 function incompleteRelation(id) {
43484 var entity = context.entity(id);
43485 return entity.type === 'relation' && !entity.isComplete(context.graph());
43490 operation.tooltip = function() {
43491 var disable = operation.disabled();
43493 t('operations.rotate.' + disable + '.' + multi) :
43494 t('operations.rotate.description.' + multi);
43498 operation.annotation = function() {
43499 return selectedIDs.length === 1 ?
43500 t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
43501 t('operations.rotate.annotation.multiple');
43505 operation.id = 'rotate';
43506 operation.keys = [t('operations.rotate.key')];
43507 operation.title = t('operations.rotate.title');
43508 operation.behavior = behaviorOperation(context).which(operation);
43513 function operationSplit(selectedIDs, context) {
43514 var vertices = filter(selectedIDs, function(entityId) {
43515 return context.geometry(entityId) === 'vertex';
43518 var entityId = vertices[0],
43519 action = actionSplit(entityId),
43522 if (vertices.length === 1) {
43523 if (selectedIDs.length > 1) {
43524 action.limitWays(without(selectedIDs, entityId));
43526 ways = action.ways(context.graph());
43530 var operation = function() {
43531 var difference = context.perform(action, operation.annotation());
43532 context.enter(modeSelect(context, difference.extantIDs()));
43536 operation.available = function() {
43537 return vertices.length === 1;
43541 operation.disabled = function() {
43543 if (some(selectedIDs, context.hasHiddenConnections)) {
43544 reason = 'connected_to_hidden';
43546 return action.disabled(context.graph()) || reason;
43550 operation.tooltip = function() {
43551 var disable = operation.disabled();
43553 return t('operations.split.' + disable);
43555 if (ways.length === 1) {
43556 return t('operations.split.description.' + context.geometry(ways[0].id));
43558 return t('operations.split.description.multiple');
43563 operation.annotation = function() {
43564 return ways.length === 1 ?
43565 t('operations.split.annotation.' + context.geometry(ways[0].id)) :
43566 t('operations.split.annotation.multiple', { n: ways.length });
43570 operation.id = 'split';
43571 operation.keys = [t('operations.split.key')];
43572 operation.title = t('operations.split.title');
43573 operation.behavior = behaviorOperation(context).which(operation);
43578 function operationStraighten(selectedIDs, context) {
43579 var entityId = selectedIDs[0],
43580 action = actionStraighten(entityId, context.projection);
43583 function operation() {
43584 context.perform(action, operation.annotation());
43588 operation.available = function() {
43589 var entity = context.entity(entityId);
43590 return selectedIDs.length === 1 &&
43591 entity.type === 'way' &&
43592 !entity.isClosed() &&
43593 uniq(entity.nodes).length > 2;
43597 operation.disabled = function() {
43599 if (context.hasHiddenConnections(entityId)) {
43600 reason = 'connected_to_hidden';
43602 return action.disabled(context.graph()) || reason;
43606 operation.tooltip = function() {
43607 var disable = operation.disabled();
43609 t('operations.straighten.' + disable) :
43610 t('operations.straighten.description');
43614 operation.annotation = function() {
43615 return t('operations.straighten.annotation');
43619 operation.id = 'straighten';
43620 operation.keys = [t('operations.straighten.key')];
43621 operation.title = t('operations.straighten.title');
43622 operation.behavior = behaviorOperation(context).which(operation);
43629 var Operations = Object.freeze({
43630 operationCircularize: operationCircularize,
43631 operationContinue: operationContinue,
43632 operationDelete: operationDelete,
43633 operationDisconnect: operationDisconnect,
43634 operationMerge: operationMerge,
43635 operationMove: operationMove,
43636 operationOrthogonalize: operationOrthogonalize,
43637 operationReflectShort: operationReflectShort,
43638 operationReflectLong: operationReflectLong,
43639 operationReverse: operationReverse,
43640 operationRotate: operationRotate,
43641 operationSplit: operationSplit,
43642 operationStraighten: operationStraighten
43645 function modeMove$$1(context, entityIDs, baseGraph) {
43651 var keybinding = d3keybinding('move'),
43653 behaviorEdit(context),
43654 operationCircularize(entityIDs, context).behavior,
43655 operationDelete(entityIDs, context).behavior,
43656 operationOrthogonalize(entityIDs, context).behavior,
43657 operationReflectLong(entityIDs, context).behavior,
43658 operationReflectShort(entityIDs, context).behavior,
43659 operationRotate(entityIDs, context).behavior
43661 annotation = entityIDs.length === 1 ?
43662 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
43663 t('operations.move.annotation.multiple'),
43670 function vecSub(a, b) {
43671 return [a[0] - b[0], a[1] - b[1]];
43675 function edge(point, size) {
43676 var pad = [80, 20, 50, 20], // top, right, bottom, left
43680 if (point[0] > size[0] - pad[1])
43682 if (point[0] < pad[3])
43684 if (point[1] > size[1] - pad[2])
43686 if (point[1] < pad[0])
43697 function doMove(nudge) {
43698 nudge = nudge || [0, 0];
43701 if (prevGraph !== context.graph()) {
43703 origin = context.map().mouseCoordinates();
43704 fn = context.perform;
43706 fn = context.overwrite;
43709 var currMouse = context.mouse(),
43710 origMouse = context.projection(origin),
43711 delta = vecSub(vecSub(currMouse, origMouse), nudge);
43713 fn(actionMove(entityIDs, delta, context.projection, cache), annotation);
43714 prevGraph = context.graph();
43718 function startNudge(nudge) {
43719 if (nudgeInterval) window.clearInterval(nudgeInterval);
43720 nudgeInterval = window.setInterval(function() {
43721 context.pan(nudge);
43727 function stopNudge() {
43728 if (nudgeInterval) {
43729 window.clearInterval(nudgeInterval);
43730 nudgeInterval = null;
43737 var nudge = edge(context.mouse(), context.map().dimensions());
43746 function finish() {
43747 event.stopPropagation();
43748 context.enter(modeSelect(context, entityIDs));
43753 function cancel() {
43755 while (context.graph() !== baseGraph) context.pop();
43756 context.enter(modeBrowse(context));
43759 context.enter(modeSelect(context, entityIDs));
43765 function undone() {
43766 context.enter(modeBrowse(context));
43770 mode.enter = function() {
43771 origin = context.map().mouseCoordinates();
43775 behaviors.forEach(function(behavior) {
43776 context.install(behavior);
43780 .on('mousemove.move', move)
43781 .on('click.move', finish);
43784 .on('undone.move', undone);
43790 d3_select(document)
43795 mode.exit = function() {
43798 behaviors.forEach(function(behavior) {
43799 context.uninstall(behavior);
43803 .on('mousemove.move', null)
43804 .on('click.move', null);
43807 .on('undone.move', null);
43816 function modeRotate$$1(context, entityIDs) {
43822 var keybinding = d3keybinding('rotate'),
43824 behaviorEdit(context),
43825 operationCircularize(entityIDs, context).behavior,
43826 operationDelete(entityIDs, context).behavior,
43827 operationMove(entityIDs, context).behavior,
43828 operationOrthogonalize(entityIDs, context).behavior,
43829 operationReflectLong(entityIDs, context).behavior,
43830 operationReflectShort(entityIDs, context).behavior
43832 annotation = entityIDs.length === 1 ?
43833 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
43834 t('operations.rotate.annotation.multiple'),
43841 function doRotate() {
43843 if (context.graph() !== prevGraph) {
43844 fn = context.perform;
43846 fn = context.replace;
43849 // projection changed, recalculate pivot
43850 var projection = context.projection;
43851 var currTransform = projection.transform();
43852 if (!prevTransform ||
43853 currTransform.k !== prevTransform.k ||
43854 currTransform.x !== prevTransform.x ||
43855 currTransform.y !== prevTransform.y) {
43857 var nodes = utilGetAllNodes(entityIDs, context.graph()),
43858 points = nodes.map(function(n) { return projection(n.loc); });
43860 if (points.length === 1) { // degenerate case
43862 } else if (points.length === 2) {
43863 pivot = geoInterp(points[0], points[1], 0.5);
43865 pivot = d3_polygonCentroid(d3_polygonHull(points));
43867 prevAngle = undefined;
43871 var currMouse = context.mouse(),
43872 currAngle = Math.atan2(currMouse[1] - pivot[1], currMouse[0] - pivot[0]);
43874 if (typeof prevAngle === 'undefined') prevAngle = currAngle;
43875 var delta = currAngle - prevAngle;
43877 fn(actionRotate(entityIDs, pivot, delta, projection), annotation);
43879 prevTransform = currTransform;
43880 prevAngle = currAngle;
43881 prevGraph = context.graph();
43885 function finish() {
43886 event.stopPropagation();
43887 context.enter(modeSelect(context, entityIDs));
43891 function cancel() {
43893 context.enter(modeSelect(context, entityIDs));
43897 function undone() {
43898 context.enter(modeBrowse(context));
43902 mode.enter = function() {
43903 behaviors.forEach(function(behavior) {
43904 context.install(behavior);
43908 .on('mousemove.rotate', doRotate)
43909 .on('click.rotate', finish);
43912 .on('undone.rotate', undone);
43918 d3_select(document)
43923 mode.exit = function() {
43924 behaviors.forEach(function(behavior) {
43925 context.uninstall(behavior);
43929 .on('mousemove.rotate', null)
43930 .on('click.rotate', null);
43933 .on('undone.rotate', null);
43942 function modeSave$$1(context) {
43947 var keybinding = d3keybinding('select');
43949 var commit = uiCommit(context)
43950 .on('cancel', cancel)
43954 function cancel() {
43955 context.enter(modeBrowse(context));
43959 function save(changeset, tryAgain) {
43961 var osm = context.connection(),
43962 loading = uiLoading(context).message(t('save.uploading')).blocking(true),
43963 history = context.history(),
43964 origChanges = history.changes(actionDiscardTags(history.difference())),
43965 localGraph = context.graph(),
43966 remoteGraph = coreGraph$$1(history.base(), true),
43967 modified = filter(history.difference().summary(), {changeType: 'modified'}),
43968 toCheck = map$4(map$4(modified, 'entity'), 'id'),
43969 toLoad = withChildNodes(toCheck, localGraph),
43976 history.perform(actionNoop()); // checkpoint
43979 context.container().call(loading);
43981 if (toCheck.length) {
43982 osm.loadMultiple(toLoad, loaded);
43988 function withChildNodes(ids, graph) {
43989 return uniq(reduce(ids, function(result, id) {
43990 var entity = graph.entity(id);
43991 if (entity.type === 'way') {
43993 var cn = graph.childNodes(entity);
43994 result.push.apply(result, map$4(filter(cn, 'version'), 'id'));
43996 /* eslint-disable no-console */
43997 if (typeof console !== 'undefined') console.error(err);
43998 /* eslint-enable no-console */
44006 // Reload modified entities into an alternate graph and check for conflicts..
44007 function loaded(err, result) {
44008 if (errors.length) return;
44012 msg: err.responseText,
44013 details: [ t('save.status_code', { code: err.status }) ]
44019 forEach(result.data, function(entity) {
44020 remoteGraph.replace(entity);
44021 toLoad = without(toLoad, entity.id);
44023 // Because loadMultiple doesn't download /full like loadEntity,
44024 // need to also load children that aren't already being checked..
44025 if (!entity.visible) return;
44026 if (entity.type === 'way') {
44027 loadMore.push.apply(loadMore,
44028 difference(entity.nodes, toCheck, toLoad, loadMore));
44029 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
44030 loadMore.push.apply(loadMore,
44031 difference(map$4(entity.members, 'id'), toCheck, toLoad, loadMore));
44035 if (loadMore.length) {
44036 toLoad.push.apply(toLoad, loadMore);
44037 osm.loadMultiple(loadMore, loaded);
44040 if (!toLoad.length) {
44047 function checkConflicts() {
44048 function choice(id, text, action) {
44049 return { id: id, text: text, action: function() { history.replace(action); } };
44051 function formatUser(d) {
44052 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
44054 function entityName(entity) {
44055 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
44058 function compareVersions(local, remote) {
44059 if (local.version !== remote.version) return false;
44061 if (local.type === 'way') {
44062 var children = union(local.nodes, remote.nodes);
44064 for (var i = 0; i < children.length; i++) {
44065 var a = localGraph.hasEntity(children[i]),
44066 b = remoteGraph.hasEntity(children[i]);
44068 if (a && b && a.version !== b.version) return false;
44075 forEach(toCheck, function(id) {
44076 var local = localGraph.entity(id),
44077 remote = remoteGraph.entity(id);
44079 if (compareVersions(local, remote)) return;
44081 var action = actionMergeRemoteChanges,
44082 merge = action(id, localGraph, remoteGraph, formatUser);
44084 history.replace(merge);
44086 var mergeConflicts = merge.conflicts();
44087 if (!mergeConflicts.length) return; // merged safely
44089 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local'),
44090 forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote'),
44091 keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore')),
44092 keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
44096 name: entityName(local),
44097 details: mergeConflicts,
44100 choice(id, keepMine, forceLocal),
44101 choice(id, keepTheirs, forceRemote)
44110 function upload() {
44111 if (conflicts.length) {
44112 conflicts.sort(function(a,b) { return b.id.localeCompare(a.id); });
44114 } else if (errors.length) {
44117 var changes = history.changes(actionDiscardTags(history.difference()));
44118 if (changes.modified.length || changes.created.length || changes.deleted.length) {
44119 osm.putChangeset(changeset, changes, uploadCallback);
44120 } else { // changes were insignificant or reverted by user
44121 d3_select('.inspector-wrap *').remove();
44130 function uploadCallback(err, changeset) {
44133 msg: err.responseText,
44134 details: [ t('save.status_code', { code: err.status }) ]
44138 history.clearSaved();
44139 success(changeset);
44140 // Add delay to allow for postgres replication #1646 #2678
44141 window.setTimeout(function() {
44142 d3_select('.inspector-wrap *').remove();
44150 function showConflicts() {
44151 var selection$$1 = context.container()
44152 .select('#sidebar')
44154 .attr('class','sidebar-component');
44158 selection$$1.call(uiConflicts(context)
44160 .origChanges(origChanges)
44161 .on('cancel', function() {
44163 selection$$1.remove();
44165 .on('save', function() {
44166 for (var i = 0; i < conflicts.length; i++) {
44167 if (conflicts[i].chosen === 1) { // user chose "keep theirs"
44168 var entity = context.hasEntity(conflicts[i].id);
44169 if (entity && entity.type === 'way') {
44170 var children = uniq(entity.nodes);
44171 for (var j = 0; j < children.length; j++) {
44172 history.replace(actionRevert(children[j]));
44175 history.replace(actionRevert(conflicts[i].id));
44179 selection$$1.remove();
44180 save(changeset, true);
44186 function showErrors() {
44187 var selection$$1 = uiConfirm(context.container());
44193 .select('.modal-section.header')
44195 .text(t('save.error'));
44197 addErrors(selection$$1, errors);
44198 selection$$1.okButton();
44202 function addErrors(selection$$1, data) {
44203 var message = selection$$1
44204 .select('.modal-section.message-text');
44206 var items = message
44207 .selectAll('.error-container')
44210 var enter = items.enter()
44212 .attr('class', 'error-container');
44216 .attr('class', 'error-description')
44218 .classed('hide-toggle', true)
44219 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
44220 .on('click', function() {
44221 var error = d3_select(this),
44222 detail = d3_select(this.nextElementSibling),
44223 exp = error.classed('expanded');
44225 detail.style('display', exp ? 'none' : 'block');
44226 error.classed('expanded', !exp);
44228 event.preventDefault();
44231 var details = enter
44233 .attr('class', 'error-detail-container')
44234 .style('display', 'none');
44238 .attr('class', 'error-detail-list')
44240 .data(function(d) { return d.details || []; })
44243 .attr('class', 'error-detail-item')
44244 .text(function(d) { return d; });
44253 function success(changeset) {
44255 context.enter(modeBrowse(context)
44256 .sidebar(uiSuccess(context)
44257 .changeset(changeset)
44258 .on('cancel', function() {
44259 context.ui().sidebar.hide();
44266 mode.enter = function() {
44268 context.ui().sidebar.show(commit);
44272 .on('⎋', cancel, true);
44274 d3_select(document)
44277 context.container().selectAll('#content')
44278 .attr('class', 'inactive');
44280 var osm = context.connection();
44283 if (osm.authenticated()) {
44286 osm.authenticate(function(err) {
44297 mode.exit = function() {
44300 context.container().selectAll('#content')
44301 .attr('class', 'active');
44303 context.ui().sidebar.hide();
44309 /* Built-in method references for those with the same name as other `lodash` methods. */
44310 var nativeMin$1 = Math.min;
44313 * The base implementation of methods like `_.intersection`, without support
44314 * for iteratee shorthands, that accepts an array of arrays to inspect.
44317 * @param {Array} arrays The arrays to inspect.
44318 * @param {Function} [iteratee] The iteratee invoked per element.
44319 * @param {Function} [comparator] The comparator invoked per element.
44320 * @returns {Array} Returns the new array of shared values.
44322 function baseIntersection(arrays, iteratee, comparator) {
44323 var includes = comparator ? arrayIncludesWith : arrayIncludes,
44324 length = arrays[0].length,
44325 othLength = arrays.length,
44326 othIndex = othLength,
44327 caches = Array(othLength),
44328 maxLength = Infinity,
44331 while (othIndex--) {
44332 var array = arrays[othIndex];
44333 if (othIndex && iteratee) {
44334 array = arrayMap(array, baseUnary(iteratee));
44336 maxLength = nativeMin$1(array.length, maxLength);
44337 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
44338 ? new SetCache(othIndex && array)
44347 while (++index < length && result.length < maxLength) {
44348 var value = array[index],
44349 computed = iteratee ? iteratee(value) : value;
44351 value = (comparator || value !== 0) ? value : 0;
44353 ? cacheHas(seen, computed)
44354 : includes(result, computed, comparator)
44356 othIndex = othLength;
44357 while (--othIndex) {
44358 var cache = caches[othIndex];
44360 ? cacheHas(cache, computed)
44361 : includes(arrays[othIndex], computed, comparator))
44367 seen.push(computed);
44369 result.push(value);
44376 * Casts `value` to an empty array if it's not an array like object.
44379 * @param {*} value The value to inspect.
44380 * @returns {Array|Object} Returns the cast array-like object.
44382 function castArrayLikeObject(value) {
44383 return isArrayLikeObject(value) ? value : [];
44387 * Creates an array of unique values that are included in all given arrays
44388 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
44389 * for equality comparisons. The order and references of result values are
44390 * determined by the first array.
44396 * @param {...Array} [arrays] The arrays to inspect.
44397 * @returns {Array} Returns the new array of intersecting values.
44400 * _.intersection([2, 1], [2, 3]);
44403 var intersection = baseRest(function(arrays) {
44404 var mapped = arrayMap(arrays, castArrayLikeObject);
44405 return (mapped.length && mapped[0] === arrays[0])
44406 ? baseIntersection(mapped)
44410 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
44411 // For example, ⌘Z -> Ctrl+Z
44412 var uiCmd = function (code) {
44413 var detected = utilDetect();
44415 if (detected.os === 'mac') {
44419 if (detected.os === 'win') {
44420 if (code === '⌘⇧Z') return 'Ctrl+Y';
44432 for (var i = 0; i < code.length; i++) {
44433 if (code[i] in replacements) {
44434 result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
44444 // return a display-focused string for a given keyboard code
44445 uiCmd.display = function(code) {
44446 if (code.length !== 1) return code;
44448 var detected = utilDetect();
44449 var mac = (detected.os === 'mac');
44450 var replacements = {
44451 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd') : t('shortcuts.key.ctrl'),
44452 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift') : t('shortcuts.key.shift'),
44453 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
44454 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl') : t('shortcuts.key.ctrl'),
44455 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
44456 '⌦': mac ? '⌦ ' + t('shortcuts.key.del') : t('shortcuts.key.del'),
44457 '↖': mac ? '↖ ' + t('shortcuts.key.pgup') : t('shortcuts.key.pgup'),
44458 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn') : t('shortcuts.key.pgdn'),
44459 '⇞': mac ? '⇞ ' + t('shortcuts.key.home') : t('shortcuts.key.home'),
44460 '⇟': mac ? '⇟ ' + t('shortcuts.key.end') : t('shortcuts.key.end'),
44461 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
44462 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc') : t('shortcuts.key.esc'),
44465 return replacements[code] || code;
44468 // deprecation warning - Radial Menu to be removed in iD v3
44472 function modeSelect(context, selectedIDs) {
44478 var keybinding = d3keybinding('select'),
44481 behaviorCopy(context),
44482 behaviorPaste(context),
44483 behaviorBreathe(context),
44484 behaviorHover(context),
44485 behaviorSelect(context),
44486 behaviorLasso(context),
44487 modeDragNode$$1(context).selectedIDs(selectedIDs).behavior
44491 newFeature = false,
44492 suppressMenu = true,
44496 var wrap = context.container()
44497 .select('.inspector-wrap');
44500 function singular() {
44501 if (selectedIDs.length === 1) {
44502 return context.hasEntity(selectedIDs[0]);
44507 function checkSelectedIDs() {
44509 if (Array.isArray(selectedIDs)) {
44510 ids = selectedIDs.filter(function(id) {
44511 return context.hasEntity(id);
44518 context.enter(modeBrowse(context));
44520 return !!ids.length;
44524 // find the common parent ways for nextVertex, previousVertex
44525 function commonParents() {
44526 var graph = context.graph(),
44527 commonParents = [];
44529 for (var i = 0; i < selectedIDs.length; i++) {
44530 var entity = context.hasEntity(selectedIDs[i]);
44531 if (!entity || entity.geometry(graph) !== 'vertex') {
44532 return []; // selection includes some not vertexes
44535 var currParents = map$4(graph.parentWays(entity), 'id');
44536 if (!commonParents.length) {
44537 commonParents = currParents;
44541 commonParents = intersection(commonParents, currParents);
44542 if (!commonParents.length) {
44547 return commonParents;
44551 function singularParent() {
44552 var parents = commonParents();
44553 if (!parents || parents.length === 0) {
44554 relatedParent = null;
44558 // relatedParent is used when we visit a vertex with multiple
44559 // parents, and we want to remember which parent line we started on.
44561 if (parents.length === 1) {
44562 relatedParent = parents[0]; // remember this parent for later
44563 return relatedParent;
44566 if (parents.indexOf(relatedParent) !== -1) {
44567 return relatedParent; // prefer the previously seen parent
44574 function closeMenu() {
44576 context.surface().call(editMenu.close);
44581 function positionMenu() {
44582 if (!editMenu) { return; }
44584 var entity = singular();
44585 if (entity && context.geometry(entity.id) === 'relation') {
44586 suppressMenu = true;
44588 var point = context.mouse(),
44589 viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
44591 if (point && geoPointInPolygon(point, viewport)) {
44592 editMenu.center(point);
44594 suppressMenu = true;
44600 function showMenu() {
44603 context.surface().call(editMenu);
44608 function toggleMenu() {
44609 // deprecation warning - Radial Menu to be removed in iD v3
44610 if (d3_select('.edit-menu, .radial-menu').empty()) {
44619 mode.selectedIDs = function() {
44620 return selectedIDs;
44624 mode.reselect = function() {
44625 if (!checkSelectedIDs()) return;
44627 var surfaceNode = context.surface().node();
44628 if (surfaceNode.focus) { // FF doesn't support it
44629 surfaceNode.focus();
44633 if (!suppressMenu) {
44639 mode.newFeature = function(_) {
44640 if (!arguments.length) return newFeature;
44646 mode.suppressMenu = function(_) {
44647 if (!arguments.length) return suppressMenu;
44653 mode.follow = function(_) {
44654 if (!arguments.length) return follow;
44660 mode.enter = function() {
44662 function update() {
44664 checkSelectedIDs();
44668 function dblclick() {
44669 var target = d3_select(event.target),
44670 datum = target.datum();
44672 if (datum instanceof osmWay && !target.classed('fill')) {
44673 var choice = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection),
44674 prev = datum.nodes[choice.index - 1],
44675 next = datum.nodes[choice.index];
44678 actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
44679 t('operations.add.annotation.vertex')
44682 event.preventDefault();
44683 event.stopPropagation();
44685 } else if (datum.type === 'midpoint') {
44687 actionAddMidpoint({loc: datum.loc, edge: datum.edge}, osmNode()),
44688 t('operations.add.annotation.vertex'));
44690 event.preventDefault();
44691 event.stopPropagation();
44696 function selectElements(drawn) {
44697 if (!checkSelectedIDs()) return;
44699 var surface = context.surface(),
44700 entity = singular();
44702 if (entity && context.geometry(entity.id) === 'relation') {
44703 suppressMenu = true;
44707 surface.selectAll('.related')
44708 .classed('related', false);
44711 if (relatedParent) {
44712 surface.selectAll(utilEntitySelector([relatedParent]))
44713 .classed('related', true);
44716 var selection$$1 = context.surface()
44717 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
44719 if (selection$$1.empty()) {
44720 // Return to browse mode if selected DOM elements have
44721 // disappeared because the user moved them out of view..
44722 var source = event && event.type === 'zoom' && event.sourceEvent;
44723 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
44724 context.enter(modeBrowse(context));
44728 .classed('selected', true);
44734 context.enter(modeBrowse(context));
44738 function firstVertex() {
44739 event.preventDefault();
44740 var parent = singularParent();
44742 var way = context.entity(parent);
44744 modeSelect(context, [way.first()]).follow(true)
44750 function lastVertex() {
44751 event.preventDefault();
44752 var parent = singularParent();
44754 var way = context.entity(parent);
44756 modeSelect(context, [way.last()]).follow(true)
44762 function previousVertex() {
44763 event.preventDefault();
44764 var parent = singularParent();
44765 if (!parent) return;
44767 var way = context.entity(parent),
44768 length = way.nodes.length,
44769 curr = way.nodes.indexOf(selectedIDs[0]),
44774 } else if (way.isClosed()) {
44775 index = length - 2;
44778 if (index !== -1) {
44780 modeSelect(context, [way.nodes[index]]).follow(true)
44786 function nextVertex() {
44787 event.preventDefault();
44788 var parent = singularParent();
44789 if (!parent) return;
44791 var way = context.entity(parent),
44792 length = way.nodes.length,
44793 curr = way.nodes.indexOf(selectedIDs[0]),
44796 if (curr < length - 1) {
44798 } else if (way.isClosed()) {
44802 if (index !== -1) {
44804 modeSelect(context, [way.nodes[index]]).follow(true)
44810 function nextParent() {
44811 event.preventDefault();
44812 var parents = uniq(commonParents());
44813 if (!parents || parents.length < 2) return;
44815 var index = parents.indexOf(relatedParent);
44816 if (index < 0 || index > parents.length - 2) {
44817 relatedParent = parents[0];
44819 relatedParent = parents[index + 1];
44822 var surface = context.surface();
44823 surface.selectAll('.related')
44824 .classed('related', false);
44826 if (relatedParent) {
44827 surface.selectAll(utilEntitySelector([relatedParent]))
44828 .classed('related', true);
44833 if (!checkSelectedIDs()) return;
44835 var operations = without(values$1(Operations), operationDelete)
44836 .map(function(o) { return o(selectedIDs, context); })
44837 .filter(function(o) { return o.available(); });
44839 // deprecation warning - Radial Menu to be removed in iD v3
44840 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
44841 if (isRadialMenu) {
44842 operations = operations.slice(0,7);
44843 operations.unshift(operationDelete(selectedIDs, context));
44845 operations.push(operationDelete(selectedIDs, context));
44848 operations.forEach(function(operation) {
44849 if (operation.behavior) {
44850 behaviors.push(operation.behavior);
44854 behaviors.forEach(function(behavior) {
44855 context.install(behavior);
44859 .on(['[', 'pgup'], previousVertex)
44860 .on([']', 'pgdown'], nextVertex)
44861 .on(['{', uiCmd('⌘['), 'home'], firstVertex)
44862 .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
44863 .on(['\\', 'pause'], nextParent)
44864 .on('⎋', esc, true)
44865 .on('space', toggleMenu);
44867 d3_select(document)
44871 // deprecation warning - Radial Menu to be removed in iD v3
44872 editMenu = isRadialMenu
44873 ? uiRadialMenu(context, operations)
44874 : uiEditMenu(context, operations);
44876 context.ui().sidebar
44877 .select(singular() ? singular().id : null, newFeature);
44880 .on('undone.select', update)
44881 .on('redone.select', update);
44884 .on('move.select', closeMenu)
44885 .on('drawn.select', selectElements);
44888 .on('dblclick.select', dblclick);
44893 if (selectedIDs.length > 1) {
44894 var entities = uiSelectionList(context, selectedIDs);
44895 context.ui().sidebar.show(entities);
44899 var extent = geoExtent$$1(),
44900 graph = context.graph();
44901 selectedIDs.forEach(function(id) {
44902 var entity = context.entity(id);
44903 extent._extend(entity.extent(graph));
44906 var loc = extent.center();
44907 context.map().centerEase(loc);
44908 } else if (singular() && singular().type === 'way') {
44909 context.map().pan([0,0]); // full redraw, to adjust z-sorting #2914
44912 timeout = window.setTimeout(function() {
44914 if (!suppressMenu) {
44917 }, 270); /* after any centerEase completes */
44922 mode.exit = function() {
44923 if (timeout) window.clearTimeout(timeout);
44925 if (inspector) wrap.call(inspector.close);
44927 behaviors.forEach(function(behavior) {
44928 context.uninstall(behavior);
44933 editMenu = undefined;
44936 .on('undone.select', null)
44937 .on('redone.select', null);
44939 var surface = context.surface();
44942 .on('dblclick.select', null);
44945 .selectAll('.selected')
44946 .classed('selected', false);
44949 .selectAll('.related')
44950 .classed('related', false);
44952 context.map().on('drawn.select', null);
44953 context.ui().sidebar.hide();
44960 function uiAccount(context) {
44961 var osm = context.connection();
44964 function update(selection$$1) {
44967 if (!osm.authenticated()) {
44968 selection$$1.selectAll('#userLink, #logoutLink')
44969 .classed('hide', true);
44973 osm.userDetails(function(err, details) {
44974 var userLink = selection$$1.select('#userLink'),
44975 logoutLink = selection$$1.select('#logoutLink');
44978 logoutLink.html('');
44982 selection$$1.selectAll('#userLink, #logoutLink')
44983 .classed('hide', false);
44986 userLink.append('a')
44987 .attr('href', osm.userURL(details.display_name))
44988 .attr('target', '_blank');
44990 // Add thumbnail or dont
44991 if (details.image_url) {
44992 userLink.append('img')
44993 .attr('class', 'icon pre-text user-icon')
44994 .attr('src', details.image_url);
44997 .call(svgIcon('#icon-avatar', 'pre-text light'));
45001 userLink.append('span')
45002 .attr('class', 'label')
45003 .text(details.display_name);
45005 logoutLink.append('a')
45006 .attr('class', 'logout')
45009 .on('click.logout', function() {
45010 event.preventDefault();
45017 return function(selection$$1) {
45018 selection$$1.append('li')
45019 .attr('id', 'logoutLink')
45020 .classed('hide', true);
45022 selection$$1.append('li')
45023 .attr('id', 'userLink')
45024 .classed('hide', true);
45027 osm.on('change.account', function() { update(selection$$1); });
45028 update(selection$$1);
45033 function uiAttribution(context) {
45037 function attribution(data, klass) {
45038 var div = selection$$1.selectAll('.' + klass)
45043 .attr('class', klass)
45047 var background = div.selectAll('.attribution')
45048 .data(data, function(d) { return d.name(); });
45053 background = background.enter()
45055 .attr('class', 'attribution')
45056 .each(function(d) {
45057 if (d.terms_html) {
45059 .html(d.terms_html);
45065 selection$$1 = d3_select(this)
45067 .attr('href', d.terms_url)
45068 .attr('target', '_blank');
45070 selection$$1 = d3_select(this);
45074 var id_safe = d.id.replace('.', '<TX_DOT>');
45075 var terms_text = t('imagery.' + id_safe + '.attribution.text',
45076 { default: d.terms_text || d.id || d.name() }
45079 if (d.icon && !d.overlay) {
45082 .attr('class', 'source-image')
45083 .attr('src', d.icon);
45088 .attr('class', 'attribution-text')
45091 .merge(background);
45094 var copyright = background.selectAll('.copyright-notice')
45095 .data(function(d) {
45096 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
45097 return notice ? [notice] : [];
45103 copyright = copyright.enter()
45105 .attr('class', 'copyright-notice')
45113 function update() {
45114 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
45115 attribution(context.background().overlayLayerSources().filter(function (s) {
45116 return s.validZoom(context.map().zoom());
45117 }), 'overlay-layer-attribution');
45121 return function(select) {
45122 selection$$1 = select;
45124 context.background()
45125 .on('change.attribution', update);
45128 .on('move.attribution', throttle(update, 400, {leading: false}));
45134 function localeDateString(s) {
45135 if (!s) return null;
45136 var d = new Date(s);
45137 if (isNaN(d.getTime())) return null;
45138 return d.toLocaleDateString();
45141 function vintageRange(vintage) {
45143 if (vintage.start || vintage.end) {
45144 s = (vintage.start || '?');
45145 if (vintage.start !== vintage.end) {
45146 s += ' - ' + (vintage.end || '?');
45153 function rendererBackgroundSource(data) {
45154 var source = clone(data),
45156 name = source.name,
45157 description = source.description,
45158 best = !!source.best,
45159 template = source.template;
45161 source.scaleExtent = data.scaleExtent || [0, 20];
45162 source.overzoom = data.overzoom !== false;
45165 source.offset = function(_) {
45166 if (!arguments.length) return offset;
45172 source.nudge = function(_, zoomlevel) {
45173 offset[0] += _[0] / Math.pow(2, zoomlevel);
45174 offset[1] += _[1] / Math.pow(2, zoomlevel);
45179 source.name = function() {
45180 var id_safe = source.id.replace('.', '<TX_DOT>');
45181 return t('imagery.' + id_safe + '.name', { default: name });
45185 source.description = function() {
45186 var id_safe = source.id.replace('.', '<TX_DOT>');
45187 return t('imagery.' + id_safe + '.description', { default: description });
45191 source.best = function() {
45196 source.area = function() {
45197 if (!data.polygon) return Number.MAX_VALUE; // worldwide
45198 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
45199 return isNaN(area) ? 0 : area;
45203 source.imageryUsed = function() {
45204 return name || source.id;
45208 source.template = function(_) {
45209 if (!arguments.length) return template;
45210 if (source.id === 'custom') template = _;
45215 source.url = function(coord) {
45217 .replace('{x}', coord[0])
45218 .replace('{y}', coord[1])
45219 // TMS-flipped y coordinate
45220 .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
45221 .replace(/\{z(oom)?\}/, coord[2])
45222 .replace(/\{switch:([^}]+)\}/, function(s, r) {
45223 var subdomains = r.split(',');
45224 return subdomains[(coord[0] + coord[1]) % subdomains.length];
45226 .replace('{u}', function() {
45228 for (var zoom = coord[2]; zoom > 0; zoom--) {
45230 var mask = 1 << (zoom - 1);
45231 if ((coord[0] & mask) !== 0) b++;
45232 if ((coord[1] & mask) !== 0) b += 2;
45240 source.intersects = function(extent) {
45241 extent = extent.polygon();
45242 return !data.polygon || data.polygon.some(function(polygon) {
45243 return geoPolygonIntersectsPolygon(polygon, extent, true);
45248 source.validZoom = function(z) {
45249 return source.scaleExtent[0] <= z &&
45250 (source.overzoom || source.scaleExtent[1] > z);
45254 source.isLocatorOverlay = function() {
45255 return source.id === 'mapbox_locator_overlay';
45259 source.copyrightNotices = function() {};
45262 source.getMetadata = function(center, tileCoord, callback) {
45264 start: localeDateString(source.startDate),
45265 end: localeDateString(source.endDate)
45267 vintage.range = vintageRange(vintage);
45269 var metadata = { vintage: vintage };
45270 callback(null, metadata);
45278 rendererBackgroundSource.Bing = function(data, dispatch) {
45279 // http://msdn.microsoft.com/en-us/library/ff701716.aspx
45280 // http://msdn.microsoft.com/en-us/library/ff701701.aspx
45282 data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
45284 var bing = rendererBackgroundSource(data),
45285 key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
45286 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
45287 key + '&jsonp={callback}',
45292 jsonpRequest(url, function(json) {
45293 providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
45295 attribution: provider.attribution,
45296 areas: provider.coverageAreas.map(function(area) {
45298 zoom: [area.zoomMin, area.zoomMax],
45299 extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
45304 dispatch.call('change');
45308 bing.copyrightNotices = function(zoom, extent) {
45309 zoom = Math.min(zoom, 21);
45310 return providers.filter(function(provider) {
45311 return some(provider.areas, function(area) {
45312 return extent.intersects(area.extent) &&
45313 area.zoom[0] <= zoom &&
45314 area.zoom[1] >= zoom;
45316 }).map(function(provider) {
45317 return provider.attribution;
45322 bing.getMetadata = function(center, tileCoord, callback) {
45323 var tileId = tileCoord.slice(0, 3).join('/'),
45324 zoom = Math.min(tileCoord[2], 21),
45325 centerPoint = center[1] + ',' + center[0], // lat,lng
45326 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
45327 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
45329 if (inflight[tileId]) return;
45331 if (!cache[tileId]) {
45332 cache[tileId] = {};
45334 if (cache[tileId] && cache[tileId].metadata) {
45335 return callback(null, cache[tileId].metadata);
45338 inflight[tileId] = true;
45339 jsonpRequest(url, function(result) {
45340 delete inflight[tileId];
45342 var err = (!result && 'Unknown Error') || result.errorDetails;
45344 return callback(err);
45347 start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
45348 end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
45350 vintage.range = vintageRange(vintage);
45352 var metadata = { vintage: vintage };
45353 cache[tileId].metadata = metadata;
45354 return callback(null, metadata);
45360 bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
45368 rendererBackgroundSource.Esri = function(data) {
45370 // don't request blank tiles, instead overzoom real tiles - #4327
45371 // deprecated technique, but it works (for now)
45372 if (data.template.match(/blankTile/) === null) {
45373 data.template = data.template + '?blankTile=false';
45376 var esri = rendererBackgroundSource(data),
45380 esri.getMetadata = function(center, tileCoord, callback) {
45381 var tileId = tileCoord.slice(0, 3).join('/'),
45382 zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
45383 centerPoint = center[0] + ',' + center[1], // long, lat (as it should be)
45384 unknown = t('info_panels.background.unknown'),
45389 if (inflight[tileId]) return;
45402 metadataLayer = 99;
45405 // build up query using the layer appropriate to the current zoom
45406 var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
45408 if (!cache[tileId]) {
45409 cache[tileId] = {};
45411 if (cache[tileId] && cache[tileId].metadata) {
45412 return callback(null, cache[tileId].metadata);
45415 // accurate metadata is only available >= 13
45416 if (metadataLayer === 99) {
45425 description: unknown,
45426 resolution: unknown,
45430 callback(null, metadata);
45433 inflight[tileId] = true;
45434 jsonpRequest(url, function(result) {
45435 delete inflight[tileId];
45439 err = 'Unknown Error';
45440 } else if (result.features && result.features.length < 1) {
45441 err = 'No Results';
45442 } else if (result.error && result.error.message) {
45443 err = result.error.message;
45447 return callback(err);
45449 // pass through the discrete capture date from metadata
45450 var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
45452 start: captureDate,
45458 source: clean(result.features[0].attributes.NICE_NAME),
45459 description: clean(result.features[0].attributes.NICE_DESC),
45460 resolution: clean(result.features[0].attributes.SRC_RES),
45461 accuracy: clean(result.features[0].attributes.SRC_ACC)
45464 // append units - meters
45465 if (isFinite(metadata.resolution)) {
45466 metadata.resolution += ' m';
45468 if (isFinite(metadata.accuracy)) {
45469 metadata.accuracy += ' m';
45472 cache[tileId].metadata = metadata;
45473 return callback(null, metadata);
45479 function clean(val) {
45480 return String(val).trim() || unknown;
45488 rendererBackgroundSource.None = function() {
45489 var source = rendererBackgroundSource({ id: 'none', template: '' });
45492 source.name = function() {
45493 return t('background.none');
45497 source.imageryUsed = function() {
45502 source.area = function() {
45503 return -1; // sources in background pane are sorted by area
45511 rendererBackgroundSource.Custom = function(template) {
45512 var source = rendererBackgroundSource({ id: 'custom', template: template });
45515 source.name = function() {
45516 return t('background.custom');
45520 source.imageryUsed = function() {
45521 return 'Custom (' + source.template() + ')';
45525 source.area = function() {
45526 return -2; // sources in background pane are sorted by area
45533 function rendererTileLayer(context) {
45534 var tileSize = 256,
45535 geotile = d3geoTile(),
45540 transformProp = utilPrefixCSSProperty('Transform'),
45544 // blacklist overlay tiles around Null Island..
45545 function nearNullIsland(x, y, z) {
45547 var center = Math.pow(2, z - 1),
45548 width = Math.pow(2, z - 6),
45549 min = center - (width / 2),
45550 max = center + (width / 2) - 1;
45551 return x >= min && x <= max && y >= min && y <= max;
45557 function tileSizeAtZoom(d, z) {
45558 var epsilon = 0.002;
45559 return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + epsilon;
45563 function atZoom(t$$1, distance) {
45564 var power = Math.pow(2, distance);
45566 Math.floor(t$$1[0] * power),
45567 Math.floor(t$$1[1] * power),
45573 function lookUp(d) {
45574 for (var up = -1; up > -d[2]; up--) {
45575 var tile = atZoom(d, up);
45576 if (cache[source.url(tile)] !== false) {
45583 function uniqueBy(a, n) {
45584 var o = [], seen = {};
45585 for (var i = 0; i < a.length; i++) {
45586 if (seen[a[i][n]] === undefined) {
45588 seen[a[i][n]] = true;
45595 function addSource(d) {
45596 d.push(source.url(d));
45601 // Update tiles based on current state of `projection`.
45602 function background(selection$$1) {
45603 z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
45608 source.offset()[0] * Math.pow(2, z),
45609 source.offset()[1] * Math.pow(2, z)
45612 pixelOffset = [0, 0];
45616 projection.translate()[0] + pixelOffset[0],
45617 projection.translate()[1] + pixelOffset[1]
45621 .scale(projection.scale() * 2 * Math.PI)
45622 .translate(translate);
45625 projection.scale() * Math.PI - translate[0],
45626 projection.scale() * Math.PI - translate[1]
45629 render(selection$$1);
45633 // Derive the tiles onscreen, remove those offscreen and position them.
45634 // Important that this part not depend on `projection` because it's
45635 // rentered when tiles load/error (see #644).
45636 function render(selection$$1) {
45637 if (!source) return;
45639 var showDebug = context.getDebug('tile') && !source.overlay;
45641 if (source.validZoom(z)) {
45642 geotile().forEach(function(d) {
45644 if (d[3] === '') return;
45645 if (typeof d[3] !== 'string') return; // Workaround for #2295
45647 if (cache[d[3]] === false && lookUp(d)) {
45648 requests.push(addSource(lookUp(d)));
45652 requests = uniqueBy(requests, 3).filter(function(r) {
45653 if (!!source.overlay && nearNullIsland(r[0], r[1], r[2])) {
45656 // don't re-request tiles which have failed in the past
45657 return cache[r[3]] !== false;
45663 cache[d[3]] = true;
45667 .classed('tile-loaded', true);
45668 render(selection$$1);
45671 function error(d) {
45672 cache[d[3]] = false;
45677 render(selection$$1);
45680 function imageTransform(d) {
45681 var _ts = tileSize * Math.pow(2, z - d[2]);
45682 var scale = tileSizeAtZoom(d, z);
45683 return 'translate(' +
45684 ((d[0] * _ts) - tileOrigin[0]) + 'px,' +
45685 ((d[1] * _ts) - tileOrigin[1]) + 'px) ' +
45686 'scale(' + scale + ',' + scale + ')';
45689 function tileCenter(d) {
45690 var _ts = tileSize * Math.pow(2, z - d[2]);
45692 ((d[0] * _ts) - tileOrigin[0] + (_ts / 2)),
45693 ((d[1] * _ts) - tileOrigin[1] + (_ts / 2))
45697 function debugTransform(d) {
45698 var coord = tileCenter(d);
45699 return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
45703 // Pick a representative tile near the center of the viewport
45704 // (This is useful for sampling the imagery vintage)
45705 var dims = geotile.size(),
45706 mapCenter = [dims[0] / 2, dims[1] / 2],
45707 minDist = Math.max(dims[0], dims[1]),
45710 requests.forEach(function(d) {
45711 var c = tileCenter(d);
45712 var dist = geoEuclideanDistance(c, mapCenter);
45713 if (dist < minDist) {
45720 var image = selection$$1.selectAll('img')
45721 .data(requests, function(d) { return d[3]; });
45724 .style(transformProp, imageTransform)
45725 .classed('tile-removing', true)
45726 .classed('tile-center', false)
45728 var tile = d3_select(this);
45729 window.setTimeout(function() {
45730 if (tile.classed('tile-removing')) {
45738 .attr('class', 'tile')
45739 .attr('src', function(d) { return d[3]; })
45740 .on('error', error)
45743 .style(transformProp, imageTransform)
45744 .classed('tile-debug', showDebug)
45745 .classed('tile-removing', false)
45746 .classed('tile-center', function(d) { return d === nearCenter; });
45750 var debug = selection$$1.selectAll('.tile-label-debug')
45751 .data(showDebug ? requests : [], function(d) { return d[3]; });
45757 var debugEnter = debug.enter()
45759 .attr('class', 'tile-label-debug');
45763 .attr('class', 'tile-label-debug-coord');
45767 .attr('class', 'tile-label-debug-vintage');
45769 debug = debug.merge(debugEnter);
45772 .style(transformProp, debugTransform);
45775 .selectAll('.tile-label-debug-coord')
45776 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
45779 .selectAll('.tile-label-debug-vintage')
45780 .each(function(d) {
45781 var span = d3_select(this);
45782 var center = context.projection.invert(tileCenter(d));
45783 source.getMetadata(center, d, function(err, result) {
45784 span.text((result && result.vintage && result.vintage.range) ||
45785 t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
45794 background.projection = function(_) {
45795 if (!arguments.length) return projection;
45801 background.dimensions = function(_) {
45802 if (!arguments.length) return geotile.size();
45808 background.source = function(_) {
45809 if (!arguments.length) return source;
45812 geotile.scaleExtent(source.scaleExtent);
45820 function rendererBackground(context) {
45821 var dispatch$$1 = dispatch('change'),
45822 baseLayer = rendererTileLayer(context).projection(context.projection),
45823 overlayLayers = [],
45827 function background(selection$$1) {
45828 var base = selection$$1.selectAll('.layer-background')
45832 .insert('div', '.layer-data')
45833 .attr('class', 'layer layer-background')
45837 var overlays = selection$$1.selectAll('.layer-overlay')
45838 .data(overlayLayers, function(d) { return d.source().name(); });
45844 .insert('div', '.layer-data')
45845 .attr('class', 'layer layer-overlay')
45847 .each(function(layer) { d3_select(this).call(layer); });
45851 background.updateImagery = function() {
45852 if (context.inIntro()) return;
45854 var b = background.baseLayerSource(),
45856 .filter(function (d) { return !d.source().isLocatorOverlay(); })
45857 .map(function (d) { return d.source().id; })
45859 meters = geoOffsetToMeters(b.offset()),
45861 x = +meters[0].toFixed(2),
45862 y = +meters[1].toFixed(2),
45863 q = utilStringQs(window.location.hash.substring(1));
45866 if (id === 'custom') {
45867 id = 'custom:' + b.template();
45873 delete q.background;
45882 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
45883 q.offset = x + ',' + y;
45888 if (!window.mocha) {
45889 window.location.replace('#' + utilQsString(q, true));
45892 var imageryUsed = [b.imageryUsed()];
45895 .filter(function (d) { return !d.source().isLocatorOverlay(); })
45896 .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
45898 var gpx = context.layers().layer('gpx');
45899 if (gpx && gpx.enabled() && gpx.hasGpx()) {
45900 imageryUsed.push('Local GPX');
45903 var mapillary_images = context.layers().layer('mapillary-images');
45904 if (mapillary_images && mapillary_images.enabled()) {
45905 imageryUsed.push('Mapillary Images');
45908 var mapillary_signs = context.layers().layer('mapillary-signs');
45909 if (mapillary_signs && mapillary_signs.enabled()) {
45910 imageryUsed.push('Mapillary Signs');
45913 context.history().imageryUsed(imageryUsed);
45917 background.sources = function(extent) {
45918 return backgroundSources.filter(function(source) {
45919 return source.intersects(extent);
45924 background.dimensions = function(_) {
45926 baseLayer.dimensions(_);
45928 overlayLayers.forEach(function(layer) {
45929 layer.dimensions(_);
45934 background.baseLayerSource = function(d) {
45935 if (!arguments.length) return baseLayer.source();
45937 // test source against OSM imagery blacklists..
45938 var osm = context.connection();
45939 if (!osm) return background;
45941 var blacklists = context.connection().imageryBlacklists();
45943 var template = d.template(),
45948 for (i = 0; i < blacklists.length; i++) {
45950 regex = new RegExp(blacklists[i]);
45951 fail = regex.test(template);
45959 // ensure at least one test was run.
45961 regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
45962 fail = regex.test(template);
45965 baseLayer.source(!fail ? d : background.findSource('none'));
45966 dispatch$$1.call('change');
45967 background.updateImagery();
45972 background.findSource = function(id) {
45973 return find$1(backgroundSources, function(d) {
45974 return d.id && d.id === id;
45979 background.bing = function() {
45980 background.baseLayerSource(background.findSource('Bing'));
45984 background.showsLayer = function(d) {
45985 return d.id === baseLayer.source().id ||
45986 overlayLayers.some(function(layer) { return d.id === layer.source().id; });
45990 background.overlayLayerSources = function() {
45991 return overlayLayers.map(function (l) { return l.source(); });
45995 background.toggleOverlayLayer = function(d) {
45998 for (var i = 0; i < overlayLayers.length; i++) {
45999 layer = overlayLayers[i];
46000 if (layer.source() === d) {
46001 overlayLayers.splice(i, 1);
46002 dispatch$$1.call('change');
46003 background.updateImagery();
46008 layer = rendererTileLayer(context)
46010 .projection(context.projection)
46011 .dimensions(baseLayer.dimensions());
46013 overlayLayers.push(layer);
46014 dispatch$$1.call('change');
46015 background.updateImagery();
46019 background.nudge = function(d, zoom) {
46020 baseLayer.source().nudge(d, zoom);
46021 dispatch$$1.call('change');
46022 background.updateImagery();
46027 background.offset = function(d) {
46028 if (!arguments.length) return baseLayer.source().offset();
46029 baseLayer.source().offset(d);
46030 dispatch$$1.call('change');
46031 background.updateImagery();
46036 background.init = function() {
46037 function parseMap(qmap) {
46038 if (!qmap) return false;
46039 var args = qmap.split('/').map(Number);
46040 if (args.length < 3 || args.some(isNaN)) return false;
46041 return geoExtent$$1([args[2], args[1]]);
46044 var dataImagery = data.imagery || [],
46045 q = utilStringQs(window.location.hash.substring(1)),
46046 requested = q.background || q.layer,
46047 extent = parseMap(q.map),
46051 // Add all the available imagery sources
46052 backgroundSources = dataImagery.map(function(source) {
46053 if (source.type === 'bing') {
46054 return rendererBackgroundSource.Bing(source, dispatch$$1);
46055 } else if (source.id === 'EsriWorldImagery') {
46056 return rendererBackgroundSource.Esri(source);
46058 return rendererBackgroundSource(source);
46062 first = backgroundSources.length && backgroundSources[0];
46065 backgroundSources.unshift(rendererBackgroundSource.None());
46068 var template = context.storage('background-custom-template') || '';
46069 var custom = rendererBackgroundSource.Custom(template);
46070 backgroundSources.unshift(custom);
46073 // Decide which background layer to display
46074 if (!requested && extent) {
46075 best = find$1(this.sources(extent), function(s) { return s.best(); });
46077 if (requested && requested.indexOf('custom:') === 0) {
46078 template = requested.replace(/^custom:/, '');
46079 background.baseLayerSource(custom.template(template));
46080 context.storage('background-custom-template', template);
46082 background.baseLayerSource(
46083 background.findSource(requested) ||
46085 background.findSource('Bing') ||
46087 background.findSource('none')
46091 var locator = find$1(backgroundSources, function(d) {
46092 return d.overlay && d.default;
46096 background.toggleOverlayLayer(locator);
46099 var overlays = (q.overlays || '').split(',');
46100 overlays.forEach(function(overlay) {
46101 overlay = background.findSource(overlay);
46103 background.toggleOverlayLayer(overlay);
46108 var gpx = context.layers().layer('gpx');
46115 var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
46116 return !isNaN(n) && n;
46119 if (offset.length === 2) {
46120 background.offset(geoMetersToOffset(offset));
46126 return utilRebind(background, dispatch$$1, 'on');
46129 function rendererFeatures(context) {
46130 var traffic_roads = {
46132 'motorway_link': true,
46134 'trunk_link': true,
46136 'primary_link': true,
46138 'secondary_link': true,
46140 'tertiary_link': true,
46141 'residential': true,
46142 'unclassified': true,
46143 'living_street': true
46146 var service_roads = {
46158 'pedestrian': true,
46162 var past_futures = {
46164 'construction': true,
46166 'dismantled': true,
46169 'demolished': true,
46170 'obliterated': true
46173 var dispatch$$1 = dispatch('change', 'redraw'),
46182 function update() {
46183 _hidden = features.hidden();
46184 dispatch$$1.call('change');
46185 dispatch$$1.call('redraw');
46189 function defineFeature(k, filter, max) {
46193 enabled: true, // whether the user wants it enabled..
46195 currentMax: (max || Infinity),
46196 defaultMax: (max || Infinity),
46197 enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
46198 disable: function() { this.enabled = false; this.currentMax = 0; },
46199 hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
46200 autoHidden: function() { return this.hidden() && this.currentMax > 0; }
46205 defineFeature('points', function isPoint(entity, resolver, geometry) {
46206 return geometry === 'point';
46209 defineFeature('traffic_roads', function isTrafficRoad(entity) {
46210 return traffic_roads[entity.tags.highway];
46213 defineFeature('service_roads', function isServiceRoad(entity) {
46214 return service_roads[entity.tags.highway];
46217 defineFeature('paths', function isPath(entity) {
46218 return paths[entity.tags.highway];
46221 defineFeature('buildings', function isBuilding(entity) {
46223 !!entity.tags['building:part'] ||
46224 (!!entity.tags.building && entity.tags.building !== 'no') ||
46225 entity.tags.amenity === 'shelter' ||
46226 entity.tags.parking === 'multi-storey' ||
46227 entity.tags.parking === 'sheds' ||
46228 entity.tags.parking === 'carports' ||
46229 entity.tags.parking === 'garage_boxes'
46233 defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
46234 return geometry === 'area' &&
46235 !_features.buildings.filter(entity) &&
46236 !_features.water.filter(entity);
46239 defineFeature('boundaries', function isBoundary(entity) {
46240 return !!entity.tags.boundary;
46243 defineFeature('water', function isWater(entity) {
46245 !!entity.tags.waterway ||
46246 entity.tags.natural === 'water' ||
46247 entity.tags.natural === 'coastline' ||
46248 entity.tags.natural === 'bay' ||
46249 entity.tags.landuse === 'pond' ||
46250 entity.tags.landuse === 'basin' ||
46251 entity.tags.landuse === 'reservoir' ||
46252 entity.tags.landuse === 'salt_pond'
46256 defineFeature('rail', function isRail(entity) {
46258 !!entity.tags.railway ||
46259 entity.tags.landuse === 'railway'
46261 traffic_roads[entity.tags.highway] ||
46262 service_roads[entity.tags.highway] ||
46263 paths[entity.tags.highway]
46267 defineFeature('power', function isPower(entity) {
46268 return !!entity.tags.power;
46271 // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
46272 defineFeature('past_future', function isPastFuture(entity) {
46274 traffic_roads[entity.tags.highway] ||
46275 service_roads[entity.tags.highway] ||
46276 paths[entity.tags.highway]
46277 ) { return false; }
46279 var strings = Object.keys(entity.tags);
46281 for (var i = 0; i < strings.length; i++) {
46282 var s = strings[i];
46283 if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
46288 // Lines or areas that don't match another feature filter.
46289 // IMPORTANT: The 'others' feature must be the last one defined,
46290 // so that code in getMatches can skip this test if `hasMatch = true`
46291 defineFeature('others', function isOther(entity, resolver, geometry) {
46292 return (geometry === 'line' || geometry === 'area');
46296 function features() {}
46299 features.features = function() {
46304 features.keys = function() {
46309 features.enabled = function(k) {
46310 if (!arguments.length) {
46311 return _keys.filter(function(k) { return _features[k].enabled; });
46313 return _features[k] && _features[k].enabled;
46317 features.disabled = function(k) {
46318 if (!arguments.length) {
46319 return _keys.filter(function(k) { return !_features[k].enabled; });
46321 return _features[k] && !_features[k].enabled;
46325 features.hidden = function(k) {
46326 if (!arguments.length) {
46327 return _keys.filter(function(k) { return _features[k].hidden(); });
46329 return _features[k] && _features[k].hidden();
46333 features.autoHidden = function(k) {
46334 if (!arguments.length) {
46335 return _keys.filter(function(k) { return _features[k].autoHidden(); });
46337 return _features[k] && _features[k].autoHidden();
46341 features.enable = function(k) {
46342 if (_features[k] && !_features[k].enabled) {
46343 _features[k].enable();
46349 features.disable = function(k) {
46350 if (_features[k] && _features[k].enabled) {
46351 _features[k].disable();
46357 features.toggle = function(k) {
46358 if (_features[k]) {
46359 (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
46365 features.resetStats = function() {
46366 for (var i = 0; i < _keys.length; i++) {
46367 _features[_keys[i]].count = 0;
46369 dispatch$$1.call('change');
46373 features.gatherStats = function(d, resolver, dimensions) {
46374 var needsRedraw = false,
46375 type = groupBy(d, function(ent) { return ent.type; }),
46376 entities = [].concat(type.relation || [], type.way || [], type.node || []),
46377 currHidden, geometry, matches, i, j;
46379 for (i = 0; i < _keys.length; i++) {
46380 _features[_keys[i]].count = 0;
46383 // adjust the threshold for point/building culling based on viewport size..
46384 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
46385 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
46387 for (i = 0; i < entities.length; i++) {
46388 geometry = entities[i].geometry(resolver);
46389 if (!(geometry === 'vertex' || geometry === 'relation')) {
46390 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
46391 for (j = 0; j < matches.length; j++) {
46392 _features[matches[j]].count++;
46397 currHidden = features.hidden();
46398 if (currHidden !== _hidden) {
46399 _hidden = currHidden;
46400 needsRedraw = true;
46401 dispatch$$1.call('change');
46404 return needsRedraw;
46408 features.stats = function() {
46409 for (var i = 0; i < _keys.length; i++) {
46410 _stats[_keys[i]] = _features[_keys[i]].count;
46417 features.clear = function(d) {
46418 for (var i = 0; i < d.length; i++) {
46419 features.clearEntity(d[i]);
46424 features.clearEntity = function(entity) {
46425 delete _cache[osmEntity$$1.key(entity)];
46429 features.reset = function() {
46434 features.getMatches = function(entity, resolver, geometry) {
46435 if (geometry === 'vertex' || geometry === 'relation') return {};
46437 var ent = osmEntity$$1.key(entity);
46438 if (!_cache[ent]) {
46442 if (!_cache[ent].matches) {
46446 for (var i = 0; i < _keys.length; i++) {
46447 if (_keys[i] === 'others') {
46448 if (hasMatch) continue;
46450 // Multipolygon members:
46452 // 1. is a way that hasn't matched other 'interesting' feature rules,
46453 // 2. and it belongs to a single parent multipolygon relation
46454 // ...then match whatever feature rules the parent multipolygon has matched.
46455 // see #2548, #2887
46458 // For this to work, getMatches must be called on relations before ways.
46460 if (entity.type === 'way') {
46461 var parents = features.getParents(entity, resolver, geometry);
46462 if (parents.length === 1 && parents[0].isMultipolygon()) {
46463 var pkey = osmEntity$$1.key(parents[0]);
46464 if (_cache[pkey] && _cache[pkey].matches) {
46465 matches = clone(_cache[pkey].matches);
46472 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
46473 matches[_keys[i]] = hasMatch = true;
46476 _cache[ent].matches = matches;
46479 return _cache[ent].matches;
46483 features.getParents = function(entity, resolver, geometry) {
46484 if (geometry === 'point') return [];
46486 var ent = osmEntity$$1.key(entity);
46487 if (!_cache[ent]) {
46491 if (!_cache[ent].parents) {
46493 if (geometry === 'vertex') {
46494 parents = resolver.parentWays(entity);
46495 } else { // 'line', 'area', 'relation'
46496 parents = resolver.parentRelations(entity);
46498 _cache[ent].parents = parents;
46500 return _cache[ent].parents;
46504 features.isHiddenFeature = function(entity, resolver, geometry) {
46505 if (!_hidden.length) return false;
46506 if (!entity.version) return false;
46508 var matches = features.getMatches(entity, resolver, geometry);
46510 for (var i = 0; i < _hidden.length; i++) {
46511 if (matches[_hidden[i]]) return true;
46517 features.isHiddenChild = function(entity, resolver, geometry) {
46518 if (!_hidden.length) return false;
46519 if (!entity.version || geometry === 'point') return false;
46521 var parents = features.getParents(entity, resolver, geometry);
46522 if (!parents.length) return false;
46524 for (var i = 0; i < parents.length; i++) {
46525 if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
46533 features.hasHiddenConnections = function(entity, resolver) {
46534 if (!_hidden.length) return false;
46535 var childNodes, connections;
46537 if (entity.type === 'midpoint') {
46538 childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
46541 childNodes = entity.nodes ? resolver.childNodes(entity) : [];
46542 connections = features.getParents(entity, resolver, entity.geometry(resolver));
46545 // gather ways connected to child nodes..
46546 connections = reduce(childNodes, function(result, e) {
46547 return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
46550 return connections.length ? some(connections, function(e) {
46551 return features.isHidden(e, resolver, e.geometry(resolver));
46556 features.isHidden = function(entity, resolver, geometry) {
46557 if (!_hidden.length) return false;
46558 if (!entity.version) return false;
46560 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
46561 return fn(entity, resolver, geometry);
46565 features.filter = function(d, resolver) {
46566 if (!_hidden.length) return d;
46569 for (var i = 0; i < d.length; i++) {
46571 if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
46572 result.push(entity);
46579 return utilRebind(features, dispatch$$1, 'on');
46582 function utilBindOnce(target, type, listener, capture) {
46583 var typeOnce = type + '.once';
46585 target.on(typeOnce, null);
46586 listener.apply(this, arguments);
46588 target.on(typeOnce, one, capture);
46592 function rendererMap(context) {
46594 var dimensions = [1, 1],
46595 dispatch$$1 = dispatch('move', 'drawn'),
46596 projection = context.projection,
46597 curtainProjection = context.curtainProjection,
46598 dblclickEnabled = true,
46599 redrawEnabled = true,
46600 transformStart = projection.transform(),
46602 transformed = false,
46604 drawLayers = svgLayers(projection, context),
46605 drawPoints = svgPoints$$1(projection, context),
46606 drawVertices = svgVertices$$1(projection, context),
46607 drawLines = svgLines$$1(projection, context),
46608 drawAreas = svgAreas$$1(projection, context),
46609 drawMidpoints = svgMidpoints$$1(projection, context),
46610 drawLabels = svgLabels(projection, context),
46611 supersurface = d3_select(null),
46612 wrapper = d3_select(null),
46613 surface = d3_select(null),
46617 var zoom = d3_zoom()
46618 .scaleExtent([ztok(2), ztok(24)])
46619 .interpolate(d3_interpolate)
46620 .filter(zoomEventFilter)
46621 .on('zoom', zoomPan);
46623 var _selection = d3_select(null);
46624 var isRedrawScheduled = false;
46625 var pendingRedrawCall;
46627 function scheduleRedraw() {
46628 // Only schedule the redraw if one has not already been set.
46629 if (isRedrawScheduled) return;
46630 isRedrawScheduled = true;
46632 var args = arguments;
46633 pendingRedrawCall = requestIdleCallback(function () {
46634 // Reset the boolean so future redraws can be set.
46635 isRedrawScheduled = false;
46636 redraw.apply(that, args);
46637 }, { timeout: 1400 });
46640 function cancelPendingRedraw() {
46641 isRedrawScheduled = false;
46642 window.cancelIdleCallback(pendingRedrawCall);
46645 function map(selection$$1) {
46647 _selection = selection$$1;
46650 .on('change.map', immediateRedraw);
46652 var osm = context.connection();
46654 osm.on('change.map', immediateRedraw);
46658 .on('change.map', immediateRedraw)
46659 .on('undone.map redone.map', function(stack) {
46660 var mode = context.mode().id;
46661 if (mode !== 'browse' && mode !== 'select') return;
46663 var followSelected = false;
46664 if (Array.isArray(stack.selectedIDs)) {
46665 followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
46667 modeSelect(context, stack.selectedIDs).follow(followSelected)
46670 if (!followSelected && stack.transform) {
46671 map.transformEase(stack.transform);
46675 context.background()
46676 .on('change.map', immediateRedraw);
46679 .on('redraw.map', immediateRedraw);
46682 .on('change.map', function() {
46683 context.background().updateImagery();
46688 .on('dblclick.map', dblClick)
46690 .call(zoom.transform, projection.transform());
46692 supersurface = selection$$1.append('div')
46693 .attr('id', 'supersurface')
46694 .call(utilSetTransform, 0, 0);
46696 // Need a wrapper div because Opera can't cope with an absolutely positioned
46697 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
46698 wrapper = supersurface
46700 .attr('class', 'layer layer-data');
46702 map.surface = surface = wrapper
46704 .selectAll('.surface')
46705 .attr('id', 'surface');
46708 .call(drawLabels.observe)
46709 .on('mousedown.zoom', function() {
46710 if (event.button === 2) {
46711 event.stopPropagation();
46714 .on('mouseup.zoom', function() {
46715 if (resetTransform()) immediateRedraw();
46717 .on('mousemove.map', function() {
46720 .on('mouseover.vertices', function() {
46721 if (map.editable() && !transformed) {
46722 var hover = event.target.__data__;
46723 surface.selectAll('.data-layer-osm')
46724 .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
46725 dispatch$$1.call('drawn', this, {full: false});
46728 .on('mouseout.vertices', function() {
46729 if (map.editable() && !transformed) {
46730 var hover = event.relatedTarget && event.relatedTarget.__data__;
46731 surface.selectAll('.data-layer-osm')
46732 .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
46733 dispatch$$1.call('drawn', this, {full: false});
46738 .call(context.background());
46740 context.on('enter.map', function() {
46741 if (map.editable() && !transformed) {
46742 var all = context.intersects(map.extent()),
46743 filter = utilFunctor(true),
46744 graph = context.graph();
46746 all = context.features().filter(all, graph);
46747 surface.selectAll('.data-layer-osm')
46748 .call(drawVertices, graph, all, filter, map.extent(), map.zoom())
46749 .call(drawMidpoints, graph, all, filter, map.trimmedExtent());
46750 dispatch$$1.call('drawn', this, {full: false});
46754 map.dimensions(utilGetDimensions(selection$$1));
46758 function zoomEventFilter() {
46759 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
46760 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
46761 // This can happen if a previous `mousedown` occurred without a `mouseup`.
46762 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
46763 // so that d3-zoom won't stop propagation of new `mousedown` events.
46764 if (event.type === 'mousedown') {
46765 var hasOrphan = false;
46766 var listeners = window.__on;
46767 for (var i = 0; i < listeners.length; i++) {
46768 var listener = listeners[i];
46769 if (listener.name === 'zoom' && listener.type === 'mouseup') {
46775 var event$$1 = window.CustomEvent;
46777 event$$1 = new event$$1('mouseup');
46779 event$$1 = window.document.createEvent('Event');
46780 event$$1.initEvent('mouseup', false, false);
46782 // Event needs to be dispatched with an event.view property.
46783 event$$1.view = window;
46784 window.dispatchEvent(event$$1);
46788 return event.button !== 2; // ignore right clicks
46793 return 256 * Math.pow(2, z);
46797 return Math.max(Math.log(k) / Math.LN2 - 8, 0);
46800 function pxCenter() {
46801 return [dimensions[0] / 2, dimensions[1] / 2];
46805 function drawVector(difference, extent) {
46806 var graph = context.graph(),
46807 features = context.features(),
46808 all = context.intersects(map.extent()),
46812 var complete = difference.complete(map.extent());
46813 data = compact(values$1(complete));
46814 filter = function(d) { return d.id in complete; };
46815 features.clear(data);
46818 // force a full redraw if gatherStats detects that a feature
46819 // should be auto-hidden (e.g. points or buildings)..
46820 if (features.gatherStats(all, graph, dimensions)) {
46821 extent = undefined;
46825 data = context.intersects(map.extent().intersection(extent));
46826 var set = set$2(map$4(data, 'id'));
46827 filter = function(d) { return set.has(d.id); };
46831 filter = utilFunctor(true);
46835 data = features.filter(data, graph);
46837 surface.selectAll('.data-layer-osm')
46838 .call(drawVertices, graph, data, filter, map.extent(), map.zoom())
46839 .call(drawLines, graph, data, filter)
46840 .call(drawAreas, graph, data, filter)
46841 .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
46842 .call(drawLabels, graph, data, filter, dimensions, !difference && !extent)
46843 .call(drawPoints, graph, data, filter);
46845 dispatch$$1.call('drawn', this, {full: true});
46849 function editOff() {
46850 context.features().resetStats();
46851 surface.selectAll('.layer-osm *').remove();
46852 context.enter(modeBrowse(context));
46853 dispatch$$1.call('drawn', this, {full: true});
46857 function dblClick() {
46858 if (!dblclickEnabled) {
46859 event.preventDefault();
46860 event.stopImmediatePropagation();
46865 function zoomPan(manualEvent) {
46866 var event$$1 = (manualEvent || event),
46867 source = event$$1.sourceEvent,
46868 eventTransform = event$$1.transform;
46870 if (transformStart.x === eventTransform.x &&
46871 transformStart.y === eventTransform.y &&
46872 transformStart.k === eventTransform.k) {
46873 return; // no change
46876 // Normalize mousewheel - #3029
46877 // If wheel delta is provided in LINE units, recalculate it in PIXEL units
46878 // We are essentially redoing the calculations that occur here:
46879 // https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
46880 // See this for more info:
46881 // https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
46882 if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
46883 // pick sensible scroll amount if user scrolling fast or slow..
46884 var lines = Math.abs(source.deltaY),
46885 scroll = lines > 2 ? 40 : lines * 10;
46887 var t0 = transformed ? transformLast : transformStart,
46888 p0 = mouse(source),
46889 p1 = t0.invert(p0),
46890 k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500),
46891 x2 = p0[0] - p1[0] * k2,
46892 y2 = p0[1] - p1[1] * k2;
46894 eventTransform = identity$7.translate(x2,y2).scale(k2);
46895 _selection.node().__zoom = eventTransform;
46898 if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
46899 surface.interrupt();
46900 uiFlash().text(t('cannot_zoom'));
46901 setZoom(context.minEditableZoom(), true);
46903 dispatch$$1.call('move', this, map);
46907 projection.transform(eventTransform);
46909 var scale = eventTransform.k / transformStart.k,
46910 tX = (eventTransform.x / scale - transformStart.x) * scale,
46911 tY = (eventTransform.y / scale - transformStart.y) * scale;
46913 if (context.inIntro()) {
46914 curtainProjection.transform({
46915 x: eventTransform.x - tX,
46916 y: eventTransform.y - tY,
46917 k: eventTransform.k
46921 mousemove = event$$1;
46922 transformed = true;
46923 transformLast = eventTransform;
46924 utilSetTransform(supersurface, tX, tY, scale);
46927 dispatch$$1.call('move', this, map);
46931 function resetTransform() {
46932 if (!transformed) return false;
46934 // deprecation warning - Radial Menu to be removed in iD v3
46935 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
46936 utilSetTransform(supersurface, 0, 0);
46937 transformed = false;
46938 if (context.inIntro()) {
46939 curtainProjection.transform(projection.transform());
46945 function redraw(difference, extent) {
46946 if (surface.empty() || !redrawEnabled) return;
46948 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
46949 // It would result in artifacts where differenced entities are redrawn with
46950 // one transform and unchanged entities with another.
46951 if (resetTransform()) {
46952 difference = extent = undefined;
46955 var z = String(~~map.zoom());
46956 if (surface.attr('data-zoom') !== z) {
46957 surface.attr('data-zoom', z)
46958 .classed('low-zoom', z <= 16);
46962 supersurface.call(context.background());
46969 if (map.editable()) {
46970 context.loadTiles(projection, dimensions);
46971 drawVector(difference, extent);
46976 transformStart = projection.transform();
46983 var immediateRedraw = function(difference, extent) {
46984 if (!difference && !extent) cancelPendingRedraw();
46985 redraw(difference, extent);
46989 function pointLocation(p) {
46990 var translate = projection.translate(),
46991 scale = projection.scale() * 2 * Math.PI;
46992 return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
46996 function locationPoint(l) {
46997 var translate = projection.translate(),
46998 scale = projection.scale() * 2 * Math.PI;
46999 return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
47003 map.mouse = function() {
47004 var event$$1 = mousemove || event;
47007 while ((s = event$$1.sourceEvent)) { event$$1 = s; }
47008 return mouse(event$$1);
47014 map.mouseCoordinates = function() {
47015 return projection.invert(map.mouse());
47019 map.dblclickEnable = function(_) {
47020 if (!arguments.length) return dblclickEnabled;
47021 dblclickEnabled = _;
47026 map.redrawEnable = function(_) {
47027 if (!arguments.length) return redrawEnabled;
47033 function setTransform(t2, duration, force) {
47034 var t$$1 = projection.transform();
47035 if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
47042 .duration(duration)
47043 .on('start', function() { map.startEase(); })
47044 .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
47046 projection.transform(t2);
47047 transformStart = t2;
47048 _selection.call(zoom.transform, transformStart);
47053 function setZoom(z2, force, duration) {
47054 if (z2 === map.zoom() && !force) {
47058 var k = projection.scale(),
47059 k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
47060 center = pxCenter(),
47061 l = pointLocation(center);
47063 projection.scale(k2);
47065 var t$$1 = projection.translate();
47066 l = locationPoint(l);
47068 t$$1[0] += center[0] - l[0];
47069 t$$1[1] += center[1] - l[1];
47072 projection.scale(k); // reset scale
47075 .duration(duration)
47076 .on('start', function() { map.startEase(); })
47077 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
47079 projection.translate(t$$1);
47080 transformStart = projection.transform();
47081 _selection.call(zoom.transform, transformStart);
47088 function setCenter(loc2, duration) {
47089 var c = map.center();
47090 if (loc2[0] === c[0] && loc2[1] === c[1]) {
47094 var t$$1 = projection.translate(),
47095 k = projection.scale(),
47097 ll = projection(loc2);
47099 t$$1[0] = t$$1[0] - ll[0] + pxC[0];
47100 t$$1[1] = t$$1[1] - ll[1] + pxC[1];
47105 .duration(duration)
47106 .on('start', function() { map.startEase(); })
47107 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
47109 projection.translate(t$$1);
47110 transformStart = projection.transform();
47111 _selection.call(zoom.transform, transformStart);
47118 map.pan = function(delta, duration) {
47119 var t$$1 = projection.translate(),
47120 k = projection.scale();
47122 t$$1[0] += delta[0];
47123 t$$1[1] += delta[1];
47128 .duration(duration)
47129 .on('start', function() { map.startEase(); })
47130 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
47132 projection.translate(t$$1);
47133 transformStart = projection.transform();
47134 _selection.call(zoom.transform, transformStart);
47135 dispatch$$1.call('move', this, map);
47143 map.dimensions = function(_) {
47144 if (!arguments.length) return dimensions;
47145 var center = map.center();
47147 drawLayers.dimensions(dimensions);
47148 context.background().dimensions(dimensions);
47149 projection.clipExtent([[0, 0], dimensions]);
47150 mouse = utilFastMouse(supersurface.node());
47158 function zoomIn(delta) {
47159 setZoom(~~map.zoom() + delta, true, 250);
47162 function zoomOut(delta) {
47163 setZoom(~~map.zoom() - delta, true, 250);
47166 map.zoomIn = function() { zoomIn(1); };
47167 map.zoomInFurther = function() { zoomIn(4); };
47169 map.zoomOut = function() { zoomOut(1); };
47170 map.zoomOutFurther = function() { zoomOut(4); };
47173 map.center = function(loc2) {
47174 if (!arguments.length) {
47175 return projection.invert(pxCenter());
47178 if (setCenter(loc2)) {
47179 dispatch$$1.call('move', this, map);
47187 map.zoom = function(z2) {
47188 if (!arguments.length) {
47189 return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
47192 if (z2 < minzoom) {
47193 surface.interrupt();
47194 uiFlash().text(t('cannot_zoom'));
47195 z2 = context.minEditableZoom();
47199 dispatch$$1.call('move', this, map);
47207 map.zoomTo = function(entity, zoomLimits) {
47208 var extent = entity.extent(context.graph());
47209 if (!isFinite(extent.area())) return;
47211 var z2 = map.trimmedExtentZoom(extent);
47212 zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
47213 map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
47217 map.centerZoom = function(loc2, z2) {
47218 var centered = setCenter(loc2),
47219 zoomed = setZoom(z2);
47221 if (centered || zoomed) {
47222 dispatch$$1.call('move', this, map);
47230 map.centerEase = function(loc2, duration) {
47231 duration = duration || 250;
47232 setCenter(loc2, duration);
47237 map.zoomEase = function(z2, duration) {
47238 duration = duration || 250;
47239 setZoom(z2, false, duration);
47244 map.transformEase = function(t2, duration) {
47245 duration = duration || 250;
47246 setTransform(t2, duration, false);
47251 map.startEase = function() {
47252 utilBindOnce(surface, 'mousedown.ease', function() {
47259 map.cancelEase = function() {
47260 _selection.interrupt();
47265 map.extent = function(_) {
47266 if (!arguments.length) {
47267 return new geoExtent$$1(projection.invert([0, dimensions[1]]),
47268 projection.invert([dimensions[0], 0]));
47270 var extent = geoExtent$$1(_);
47271 map.centerZoom(extent.center(), map.extentZoom(extent));
47276 map.trimmedExtent = function(_) {
47277 if (!arguments.length) {
47278 var headerY = 60, footerY = 30, pad = 10;
47279 return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
47280 projection.invert([dimensions[0] - pad, headerY + pad]));
47282 var extent = geoExtent$$1(_);
47283 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
47288 function calcZoom(extent, dim) {
47289 var tl = projection([extent[0][0], extent[1][1]]),
47290 br = projection([extent[1][0], extent[0][1]]);
47292 // Calculate maximum zoom that fits extent
47293 var hFactor = (br[0] - tl[0]) / dim[0],
47294 vFactor = (br[1] - tl[1]) / dim[1],
47295 hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
47296 vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
47297 newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
47303 map.extentZoom = function(_) {
47304 return calcZoom(geoExtent$$1(_), dimensions);
47308 map.trimmedExtentZoom = function(_) {
47309 var trimY = 120, trimX = 40,
47310 trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
47311 return calcZoom(geoExtent$$1(_), trimmed);
47315 map.editable = function() {
47316 var osmLayer = surface.selectAll('.data-layer-osm');
47317 if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
47319 return map.zoom() >= context.minEditableZoom();
47323 map.minzoom = function(_) {
47324 if (!arguments.length) return minzoom;
47330 map.layers = drawLayers;
47333 return utilRebind(map, dispatch$$1, 'on');
47336 var TAU = 2 * Math.PI;
47337 function ztok(z) { return 256 * Math.pow(2, z) / TAU; }
47338 function ktoz(k) { return Math.log(k * TAU) / Math.LN2 - 8; }
47339 function vecSub(a, b) { return [ a[0] - b[0], a[1] - b[1] ]; }
47340 function vecScale(a, b) { return [ a[0] * b, a[1] * b ]; }
47343 function uiMapInMap(context) {
47346 function map_in_map(selection$$1) {
47347 var backgroundLayer = rendererTileLayer(context),
47348 overlayLayers = {},
47349 projection$$1 = geoRawMercator(),
47350 gpxLayer = svgGpx(projection$$1, context).showLabels(false),
47351 debugLayer = svgDebug(projection$$1, context),
47353 .scaleExtent([ztok(0.5), ztok(24)])
47354 .on('start', zoomStarted)
47355 .on('zoom', zoomed)
47356 .on('end', zoomEnded),
47357 isTransformed = false,
47359 skipEvents = false,
47361 zDiff = 6, // by default, minimap renders at (main zoom - 6)
47362 wrap = d3_select(null),
47363 tiles = d3_select(null),
47364 viewport = d3_select(null),
47365 tStart, // transform at start of gesture
47366 tCurr, // transform at most recent event
47370 function zoomStarted() {
47371 if (skipEvents) return;
47372 tStart = tCurr = projection$$1.transform();
47377 function zoomed() {
47378 if (skipEvents) return;
47380 var x = event.transform.x,
47381 y = event.transform.y,
47382 k = event.transform.k,
47383 isZooming = (k !== tStart.k),
47384 isPanning = (x !== tStart.x || y !== tStart.y);
47386 if (!isZooming && !isPanning) {
47387 return; // no change
47390 // lock in either zooming or panning, don't allow both in minimap.
47392 gesture = isZooming ? 'zoom' : 'pan';
47395 var tMini = projection$$1.transform(),
47398 if (gesture === 'zoom') {
47399 var dMini = utilGetDimensions(wrap),
47400 cMini = vecScale(dMini, 0.5);
47401 scale = k / tMini.k;
47402 tX = (cMini[0] / scale - cMini[0]) * scale;
47403 tY = (cMini[1] / scale - cMini[1]) * scale;
47411 utilSetTransform(tiles, tX, tY, scale);
47412 utilSetTransform(viewport, 0, 0, scale);
47413 isTransformed = true;
47414 tCurr = identity$7.translate(x, y).scale(k);
47416 var zMain = ktoz(context.projection.scale()),
47419 zDiff = zMain - zMini;
47425 function zoomEnded() {
47426 if (skipEvents) return;
47427 if (gesture !== 'pan') return;
47429 updateProjection();
47431 var dMini = utilGetDimensions(wrap),
47432 cMini = vecScale(dMini, 0.5);
47433 context.map().center(projection$$1.invert(cMini)); // recenter main map..
47437 function updateProjection() {
47438 var loc = context.map().center(),
47439 dMini = utilGetDimensions(wrap),
47440 cMini = vecScale(dMini, 0.5),
47441 tMain = context.projection.transform(),
47442 zMain = ktoz(tMain.k),
47443 zMini = Math.max(zMain - zDiff, 0.5),
47444 kMini = ztok(zMini);
47447 .translate([tMain.x, tMain.y])
47450 var point = projection$$1(loc),
47451 mouse = (gesture === 'pan') ? vecSub([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0],
47452 xMini = cMini[0] - point[0] + tMain.x + mouse[0],
47453 yMini = cMini[1] - point[1] + tMain.y + mouse[1];
47456 .translate([xMini, yMini])
47457 .clipExtent([[0, 0], dMini]);
47459 tCurr = projection$$1.transform();
47461 if (isTransformed) {
47462 utilSetTransform(tiles, 0, 0);
47463 utilSetTransform(viewport, 0, 0);
47464 isTransformed = false;
47468 .scaleExtent([ztok(0.5), ztok(zMain - 3)]);
47471 wrap.call(zoom.transform, tCurr);
47472 skipEvents = false;
47476 function redraw() {
47477 clearTimeout(timeoutId);
47478 if (isHidden) return;
47480 updateProjection();
47482 var dMini = utilGetDimensions(wrap),
47483 zMini = ktoz(projection$$1.scale());
47485 // setup tile container
47487 .selectAll('.map-in-map-tiles')
47490 tiles = tiles.enter()
47492 .attr('class', 'map-in-map-tiles')
47495 // redraw background
47497 .source(context.background().baseLayerSource())
47498 .projection(projection$$1)
47499 .dimensions(dMini);
47501 var background = tiles
47502 .selectAll('.map-in-map-background')
47507 .attr('class', 'map-in-map-background')
47509 .call(backgroundLayer);
47513 var overlaySources = context.background().overlayLayerSources();
47514 var activeOverlayLayers = [];
47515 for (var i = 0; i < overlaySources.length; i++) {
47516 if (overlaySources[i].validZoom(zMini)) {
47517 if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
47518 activeOverlayLayers.push(overlayLayers[i]
47519 .source(overlaySources[i])
47520 .projection(projection$$1)
47521 .dimensions(dMini));
47525 var overlay = tiles
47526 .selectAll('.map-in-map-overlay')
47529 overlay = overlay.enter()
47531 .attr('class', 'map-in-map-overlay')
47535 var overlays = overlay
47537 .data(activeOverlayLayers, function(d) { return d.source().name(); });
47542 overlays = overlays.enter()
47545 .each(function(layer) { d3_select(this).call(layer); });
47548 var dataLayers = tiles
47549 .selectAll('.map-in-map-data')
47555 dataLayers = dataLayers.enter()
47557 .attr('class', 'map-in-map-data')
47563 // redraw viewport bounding box
47564 if (gesture !== 'pan') {
47565 var getPath = d3_geoPath(projection$$1),
47566 bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
47568 viewport = wrap.selectAll('.map-in-map-viewport')
47571 viewport = viewport.enter()
47573 .attr('class', 'map-in-map-viewport')
47577 var path = viewport.selectAll('.map-in-map-bbox')
47582 .attr('class', 'map-in-map-bbox')
47584 .attr('d', getPath)
47585 .classed('thick', function(d) { return getPath.area(d) < 30; });
47590 function queueRedraw() {
47591 clearTimeout(timeoutId);
47592 timeoutId = setTimeout(function() { redraw(); }, 750);
47596 function toggle() {
47597 if (event) event.preventDefault();
47599 isHidden = !isHidden;
47601 var label = d3_select('.minimap-toggle');
47602 label.classed('active', !isHidden)
47603 .select('input').property('checked', !isHidden);
47607 .style('display', 'block')
47608 .style('opacity', '1')
47611 .style('opacity', '0')
47612 .on('end', function() {
47613 selection$$1.selectAll('.map-in-map')
47614 .style('display', 'none');
47618 .style('display', 'block')
47619 .style('opacity', '0')
47622 .style('opacity', '1')
47623 .on('end', function() {
47630 uiMapInMap.toggle = toggle;
47632 wrap = selection$$1.selectAll('.map-in-map')
47635 wrap = wrap.enter()
47637 .attr('class', 'map-in-map')
47638 .style('display', (isHidden ? 'none' : 'block'))
47640 .on('dblclick.zoom', null)
47644 .on('drawn.map-in-map', function(drawn) {
47645 if (drawn.full === true) {
47652 var keybinding = d3keybinding('map-in-map')
47653 .on(t('background.minimap.key'), toggle);
47655 d3_select(document)
47662 function uiTooltipHtml(text, key, heading) {
47666 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
47669 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
47672 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
47673 '<span class="keyhint">' + key + '</span></div>';
47679 function uiBackground(context) {
47680 var key = t('background.key'),
47681 detected = utilDetect(),
47682 opacities = [1, 0.75, 0.5, 0.25],
47684 ['right', [0.5, 0]],
47685 ['top', [0, -0.5]],
47686 ['left', [-0.5, 0]],
47687 ['bottom', [0, 0.5]]],
47688 opacityDefault = (context.storage('background-opacity') !== null) ?
47689 (+context.storage('background-opacity')) : 1.0,
47690 customSource = context.background().findSource('custom'),
47693 // Can be 0 from <1.3.0 use or due to issue #1923.
47694 if (opacityDefault === 0) opacityDefault = 1.0;
47697 function background(selection$$1) {
47699 function sortSources(a, b) {
47700 return a.best() && !b.best() ? -1
47701 : b.best() && !a.best() ? 1
47702 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
47706 function setOpacity(d) {
47707 var bg = context.container().selectAll('.layer-background')
47709 .style('opacity', d)
47710 .attr('data-opacity', d);
47712 if (!detected.opera) {
47713 utilSetTransform(bg, 0, 0);
47716 opacityList.selectAll('li')
47717 .classed('active', function(_) { return _ === d; });
47719 context.storage('background-opacity', d);
47723 function setTooltips(selection$$1) {
47724 selection$$1.each(function(d, i, nodes) {
47725 var item = d3_select(this).select('label'),
47726 span = item.select('span'),
47727 placement = (i < nodes.length / 2) ? 'bottom' : 'top',
47728 description = d.description(),
47729 isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
47731 if (d === previous) {
47732 item.call(tooltip()
47733 .placement(placement)
47735 .title(function() {
47736 var tip = '<div>' + t('background.switch') + '</div>';
47737 return uiTooltipHtml(tip, uiCmd('⌘' + key));
47740 } else if (description || isOverflowing) {
47741 item.call(tooltip()
47742 .placement(placement)
47743 .title(description || d.name())
47746 item.call(tooltip().destroy);
47752 function selectLayer() {
47753 function active(d) {
47754 return context.background().showsLayer(d);
47757 content.selectAll('.layer')
47758 .classed('active', active)
47759 .classed('switch', function(d) { return d === previous; })
47761 .selectAll('input')
47762 .property('checked', active);
47766 function clickSetSource(d) {
47767 if (d.id === 'custom' && !d.template()) {
47768 return editCustom();
47771 event.preventDefault();
47772 previous = context.background().baseLayerSource();
47773 context.background().baseLayerSource(d);
47775 document.activeElement.blur();
47779 function editCustom() {
47780 event.preventDefault();
47781 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
47782 var template = window.prompt(
47783 t('background.custom_prompt', { example: example }),
47784 customSource.template() || example
47788 context.storage('background-custom-template', template);
47789 customSource.template(template);
47790 clickSetSource(customSource);
47797 function clickSetOverlay(d) {
47798 event.preventDefault();
47799 context.background().toggleOverlayLayer(d);
47801 document.activeElement.blur();
47805 function drawList(layerList, type, change, filter) {
47806 var sources = context.background()
47807 .sources(context.map().extent())
47810 var layerLinks = layerList.selectAll('li.layer')
47811 .data(sources, function(d) { return d.name(); });
47816 var enter = layerLinks.enter()
47818 .attr('class', 'layer')
47819 .classed('layer-custom', function(d) { return d.id === 'custom'; })
47820 .classed('best', function(d) { return d.best(); });
47822 enter.filter(function(d) { return d.id === 'custom'; })
47824 .attr('class', 'layer-browse')
47826 .title(t('background.custom_button'))
47827 .placement((textDirection === 'rtl') ? 'right' : 'left'))
47828 .on('click', editCustom)
47829 .call(svgIcon('#icon-search'));
47831 enter.filter(function(d) { return d.best(); })
47833 .attr('class', 'best')
47835 .title(t('background.best_imagery'))
47836 .placement((textDirection === 'rtl') ? 'right' : 'left'))
47845 .attr('type', type)
47846 .attr('name', 'layers')
47847 .on('change', change);
47851 .text(function(d) { return d.name(); });
47854 layerList.selectAll('li.layer')
47856 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
47860 function update() {
47861 backgroundList.call(drawList, 'radio', clickSetSource, function(d) { return !d.overlay; });
47862 overlayList.call(drawList, 'checkbox', clickSetOverlay, function(d) { return d.overlay; });
47869 function updateOffsetVal() {
47870 var meters = geoOffsetToMeters(context.background().offset()),
47871 x = +meters[0].toFixed(2),
47872 y = +meters[1].toFixed(2);
47874 d3_selectAll('.nudge-inner-rect')
47876 .classed('error', false)
47877 .property('value', x + ', ' + y);
47879 d3_selectAll('.nudge-reset')
47880 .classed('disabled', function() {
47881 return (x === 0 && y === 0);
47886 function resetOffset() {
47887 if (event.button !== 0) return;
47888 context.background().offset([0, 0]);
47893 function nudge(d) {
47894 context.background().nudge(d, context.map().zoom());
47899 function buttonOffset(d) {
47900 if (event.button !== 0) return;
47901 var timeout = window.setTimeout(function() {
47902 interval = window.setInterval(nudge.bind(null, d), 100);
47906 function doneNudge() {
47907 window.clearTimeout(timeout);
47908 window.clearInterval(interval);
47910 .on('mouseup.buttonoffset', null, true)
47911 .on('mousedown.buttonoffset', null, true);
47915 .on('mouseup.buttonoffset', doneNudge, true)
47916 .on('mousedown.buttonoffset', doneNudge, true);
47922 function inputOffset() {
47923 if (event.button !== 0) return;
47924 var input = d3_select(this);
47925 var d = input.node().value;
47927 if (d === '') return resetOffset();
47929 d = d.replace(/;/g, ',').split(',').map(function(n) {
47930 // if n is NaN, it will always get mapped to false.
47931 return !isNaN(n) && n;
47934 if (d.length !== 2 || !d[0] || !d[1]) {
47935 input.classed('error', true);
47939 context.background().offset(geoMetersToOffset(d));
47944 function dragOffset() {
47945 if (event.button !== 0) return;
47946 var origin = [event.clientX, event.clientY];
47948 context.container()
47950 .attr('class', 'nudge-surface');
47953 .on('mousemove.offset', function() {
47954 var latest = [event.clientX, event.clientY];
47956 -(origin[0] - latest[0]) / 4,
47957 -(origin[1] - latest[1]) / 4
47963 .on('mouseup.offset', function() {
47964 if (event.button !== 0) return;
47965 d3_selectAll('.nudge-surface')
47969 .on('mousemove.offset', null)
47970 .on('mouseup.offset', null);
47973 event.preventDefault();
47982 function toggle() {
47984 event.preventDefault();
47986 tooltipBehavior.hide(button);
47987 setVisible(!button.classed('active'));
47991 function quickSwitch() {
47993 event.stopImmediatePropagation();
47994 event.preventDefault();
47997 clickSetSource(previous);
48002 function setVisible(show) {
48003 if (show !== shown) {
48004 button.classed('active', show);
48009 .on('mousedown.background-inside', function() {
48010 event.stopPropagation();
48014 .style('display', 'block')
48015 .style('right', '-300px')
48018 .style('right', '0px');
48020 content.selectAll('.layer')
48021 .call(setTooltips);
48025 .style('display', 'block')
48026 .style('right', '0px')
48029 .style('right', '-300px')
48030 .on('end', function() {
48031 d3_select(this).style('display', 'none');
48035 .on('mousedown.background-inside', null);
48041 var content = selection$$1
48043 .attr('class', 'fillL map-overlay col3 content hide'),
48044 tooltipBehavior = tooltip()
48045 .placement((textDirection === 'rtl') ? 'right' : 'left')
48047 .title(uiTooltipHtml(t('background.description'), key)),
48048 button = selection$$1
48050 .attr('tabindex', -1)
48051 .on('click', toggle)
48052 .call(svgIcon('#icon-layers', 'light'))
48053 .call(tooltipBehavior),
48057 /* opacity switcher */
48059 var opawrap = content
48061 .attr('class', 'opacity-options-wrapper');
48065 .text(t('background.title'));
48067 var opacityList = opawrap
48069 .attr('class', 'opacity-options');
48071 opacityList.selectAll('div.opacity')
48075 .attr('data-original-title', function(d) {
48076 return t('background.percent_brightness', { opacity: (d * 100) });
48078 .on('click.set-opacity', setOpacity)
48079 .html('<div class="select-box"></div>')
48081 .placement((textDirection === 'rtl') ? 'right' : 'left'))
48083 .attr('class', 'opacity')
48084 .style('opacity', function(d) { return 1.25 - d; });
48087 /* background list */
48089 var backgroundList = content
48091 .attr('class', 'layer-list')
48092 .attr('dir', 'auto');
48096 .attr('class', 'imagery-faq')
48098 .attr('target', '_blank')
48099 .attr('tabindex', -1)
48100 .call(svgIcon('#icon-out-link', 'inline'))
48101 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
48103 .text(t('background.imagery_source_faq'));
48108 var overlayList = content
48110 .attr('class', 'layer-list');
48112 var controls = content
48114 .attr('class', 'controls-list');
48117 /* minimap toggle */
48119 var minimapLabel = controls
48123 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
48128 .classed('minimap-toggle', true)
48130 .attr('type', 'checkbox')
48131 .on('change', function() {
48132 uiMapInMap.toggle();
48133 event.preventDefault();
48138 .text(t('background.minimap.description'));
48141 /* imagery offset controls */
48143 var adjustments = content
48145 .attr('class', 'adjustments');
48149 .text(t('background.fix_misalignment'))
48151 .classed('hide-toggle', true)
48152 .classed('expanded', false)
48153 .on('click', function() {
48154 if (event.button !== 0) return;
48155 var exp = d3_select(this).classed('expanded');
48156 nudgeContainer.style('display', exp ? 'none' : 'block');
48157 d3_select(this).classed('expanded', !exp);
48158 event.preventDefault();
48161 var nudgeContainer = adjustments
48163 .attr('class', 'nudge-container cf')
48164 .style('display', 'none');
48168 .attr('class', 'nudge-instructions')
48169 .text(t('background.offset'));
48171 var nudgeRect = nudgeContainer
48173 .attr('class', 'nudge-outer-rect')
48174 .on('mousedown', dragOffset);
48178 .attr('class', 'nudge-inner-rect')
48180 .on('change', inputOffset)
48181 .on('mousedown', function() {
48182 if (event.button !== 0) return;
48183 event.stopPropagation();
48188 .selectAll('button')
48189 .data(directions).enter()
48191 .attr('class', function(d) { return d[0] + ' nudge'; })
48192 .on('mousedown', function(d) {
48193 if (event.button !== 0) return;
48194 buttonOffset(d[1]);
48199 .attr('title', t('background.reset'))
48200 .attr('class', 'nudge-reset disabled')
48201 .on('click', resetOffset)
48203 (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
48207 .on('move.background-update', debounce$1(utilCallWhenIdle(update), 1000));
48209 context.background()
48210 .on('change.background-update', update);
48214 setOpacity(opacityDefault);
48216 var keybinding = d3keybinding('background')
48218 .on(uiCmd('⌘' + key), quickSwitch)
48219 .on([t('map_data.key'), t('help.key')], hide);
48221 d3_select(document)
48224 context.surface().on('mousedown.background-outside', hide);
48225 context.container().on('mousedown.background-outside', hide);
48231 function uiContributors(context) {
48232 var osm = context.connection(),
48233 debouncedUpdate = debounce$1(function() { update(); }, 1000),
48236 wrap = d3_select(null);
48239 function update() {
48243 entities = context.intersects(context.map().extent());
48245 entities.forEach(function(entity) {
48246 if (entity && entity.user) users[entity.user] = true;
48249 var u = Object.keys(users),
48250 subset = u.slice(0, u.length > limit ? limit - 1 : limit);
48253 .call(svgIcon('#icon-nearby', 'pre-text light'));
48255 var userList = d3_select(document.createElement('span'));
48257 userList.selectAll()
48261 .attr('class', 'user-link')
48262 .attr('href', function(d) { return osm.userURL(d); })
48263 .attr('target', '_blank')
48264 .attr('tabindex', -1)
48267 if (u.length > limit) {
48268 var count = d3_select(document.createElement('span'));
48271 .attr('target', '_blank')
48272 .attr('tabindex', -1)
48273 .attr('href', function() {
48274 return osm.changesetsURL(context.map().center(), context.map().zoom());
48276 .text(u.length - limit + 1);
48278 wrap.append('span')
48279 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
48282 wrap.append('span')
48283 .html(t('contributors.list', { users: userList.html() }));
48290 .style('opacity', 0);
48292 } else if (hidden) {
48295 .style('opacity', 1);
48300 return function(selection$$1) {
48302 wrap = selection$$1;
48305 osm.on('loaded.contributors', debouncedUpdate);
48306 context.map().on('move.contributors', debouncedUpdate);
48310 function uiFeatureInfo(context) {
48311 function update(selection$$1) {
48312 var features = context.features(),
48313 stats = features.stats(),
48315 hiddenList = compact(map$4(features.hidden(), function(k) {
48318 return String(stats[k]) + ' ' + t('feature.' + k + '.description');
48322 selection$$1.html('');
48324 if (hiddenList.length) {
48325 var tooltipBehavior = tooltip()
48328 .title(function() {
48329 return uiTooltipHtml(hiddenList.join('<br/>'));
48332 var warning = selection$$1.append('a')
48334 .attr('tabindex', -1)
48335 .html(t('feature_info.hidden_warning', { count: count }))
48336 .call(tooltipBehavior)
48337 .on('click', function() {
48338 tooltipBehavior.hide(warning);
48339 // open map data panel?
48340 event.preventDefault();
48345 .classed('hide', !hiddenList.length);
48349 return function(selection$$1) {
48350 update(selection$$1);
48352 context.features().on('change.feature_info', function() {
48353 update(selection$$1);
48358 function uiFullScreen(context) {
48359 var element = context.container().node(),
48360 keybinding = d3keybinding('full-screen');
48364 function getFullScreenFn() {
48365 if (element.requestFullscreen) {
48366 return element.requestFullscreen;
48367 } else if (element.msRequestFullscreen) {
48368 return element.msRequestFullscreen;
48369 } else if (element.mozRequestFullScreen) {
48370 return element.mozRequestFullScreen;
48371 } else if (element.webkitRequestFullscreen) {
48372 return element.webkitRequestFullscreen;
48377 function getExitFullScreenFn() {
48378 if (document.exitFullscreen) {
48379 return document.exitFullscreen;
48380 } else if (document.msExitFullscreen) {
48381 return document.msExitFullscreen;
48382 } else if (document.mozCancelFullScreen) {
48383 return document.mozCancelFullScreen;
48384 } else if (document.webkitExitFullscreen) {
48385 return document.webkitExitFullscreen;
48390 function isFullScreen() {
48391 return document.fullscreenElement ||
48392 document.mozFullScreenElement ||
48393 document.webkitFullscreenElement ||
48394 document.msFullscreenElement;
48398 function isSupported() {
48399 return !!getFullScreenFn();
48403 function fullScreen() {
48404 event.preventDefault();
48405 if (!isFullScreen()) {
48406 // button.classed('active', true);
48407 getFullScreenFn().apply(element);
48409 // button.classed('active', false);
48410 getExitFullScreenFn().apply(document);
48415 return function() { // selection) {
48416 if (!isSupported())
48419 // button = selection.append('button')
48420 // .attr('title', t('full_screen'))
48421 // .attr('tabindex', -1)
48422 // .on('click', fullScreen)
48425 // button.append('span')
48426 // .attr('class', 'icon full-screen');
48428 var detected = utilDetect();
48429 var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
48430 keybinding.on(keys, fullScreen);
48432 d3_select(document)
48437 function uiModal(selection$$1, blocking) {
48438 var keybinding = d3keybinding('modal');
48439 var previous = selection$$1.select('div.modal');
48440 var animate = previous.empty();
48442 previous.transition()
48444 .style('opacity', 0)
48447 var shaded = selection$$1
48449 .attr('class', 'shaded')
48450 .style('opacity', 0);
48452 shaded.close = function() {
48456 .style('opacity',0)
48462 .style('top','0px');
48470 .attr('class', 'modal fillL col6');
48473 shaded.on('click.remove-modal', function() {
48474 if (event.target === this) {
48479 modal.append('button')
48480 .attr('class', 'close')
48481 .on('click', shaded.close)
48482 .call(svgIcon('#icon-close'));
48485 .on('⌫', shaded.close)
48486 .on('⎋', shaded.close);
48488 d3_select(document)
48494 .attr('class', 'content');
48497 shaded.transition().style('opacity', 1);
48499 shaded.style('opacity', 1);
48506 function uiLoading(context) {
48512 var loading = function(selection) {
48513 modalSelection = uiModal(selection, blocking);
48515 var loadertext = modalSelection.select('.content')
48516 .classed('loading-modal', true)
48518 .attr('class', 'modal-section fillL');
48522 .attr('class', 'loader')
48523 .attr('src', context.imagePath('loader-white.gif'));
48529 modalSelection.select('button.close')
48530 .attr('class', 'hide');
48536 loading.message = function(_) {
48537 if (!arguments.length) return message;
48543 loading.blocking = function(_) {
48544 if (!arguments.length) return blocking;
48550 loading.close = function() {
48551 modalSelection.remove();
48558 function uiGeolocate(context) {
48559 var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
48560 locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
48565 if (context.inIntro()) return;
48566 context.enter(modeBrowse(context));
48567 context.container().call(locating);
48568 navigator.geolocation.getCurrentPosition(success, error, geoOptions);
48570 // This timeout ensures that we still call finish() even if
48571 // the user declines to share their location in Firefox
48572 timeoutId = setTimeout(finish, 10000 /* 10sec */ );
48576 function success(position) {
48577 var map = context.map(),
48578 extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
48579 .padByMeters(position.coords.accuracy);
48581 map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
48591 function finish() {
48592 locating.close(); // unblock ui
48593 if (timeoutId) { clearTimeout(timeoutId); }
48594 timeoutId = undefined;
48598 return function(selection) {
48599 if (!navigator.geolocation) return;
48603 .attr('tabindex', -1)
48604 .attr('title', t('geolocate.title'))
48605 .on('click', click)
48606 .call(svgIcon('#icon-geolocate', 'light'))
48608 .placement((textDirection === 'rtl') ? 'right' : 'left'));
48612 var marked = createCommonjsModule(function (module, exports) {
48614 * marked - a markdown parser
48615 * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
48616 * https://github.com/chjj/marked
48622 * Block-Level Grammar
48627 code: /^( {4}[^\n]+\n*)+/,
48629 hr: /^( *[-*_]){3,} *(?:\n+|$)/,
48630 heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
48632 lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
48633 blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
48634 list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
48635 html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
48636 def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
48638 paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
48642 block.bullet = /(?:[*+-]|\d+\.)/;
48643 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
48644 block.item = replace(block.item, 'gm')
48645 (/bull/g, block.bullet)
48648 block.list = replace(block.list)
48649 (/bull/g, block.bullet)
48650 ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
48651 ('def', '\\n+(?=' + block.def.source + ')')
48654 block.blockquote = replace(block.blockquote)
48658 block._tag = '(?!(?:'
48659 + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
48660 + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
48661 + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
48663 block.html = replace(block.html)
48664 ('comment', /<!--[\s\S]*?-->/)
48665 ('closed', /<(tag)[\s\S]+?<\/\1>/)
48666 ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
48667 (/tag/g, block._tag)
48670 block.paragraph = replace(block.paragraph)
48672 ('heading', block.heading)
48673 ('lheading', block.lheading)
48674 ('blockquote', block.blockquote)
48675 ('tag', '<' + block._tag)
48680 * Normal Block Grammar
48683 block.normal = merge({}, block);
48686 * GFM Block Grammar
48689 block.gfm = merge({}, block.normal, {
48690 fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
48692 heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
48695 block.gfm.paragraph = replace(block.paragraph)
48697 + block.gfm.fences.source.replace('\\1', '\\2') + '|'
48698 + block.list.source.replace('\\1', '\\3') + '|')
48702 * GFM + Tables Block Grammar
48705 block.tables = merge({}, block.gfm, {
48706 nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
48707 table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
48714 function Lexer(options) {
48716 this.tokens.links = {};
48717 this.options = options || marked.defaults;
48718 this.rules = block.normal;
48720 if (this.options.gfm) {
48721 if (this.options.tables) {
48722 this.rules = block.tables;
48724 this.rules = block.gfm;
48730 * Expose Block Rules
48733 Lexer.rules = block;
48736 * Static Lex Method
48739 Lexer.lex = function(src, options) {
48740 var lexer = new Lexer(options);
48741 return lexer.lex(src);
48748 Lexer.prototype.lex = function(src) {
48750 .replace(/\r\n|\r/g, '\n')
48751 .replace(/\t/g, ' ')
48752 .replace(/\u00a0/g, ' ')
48753 .replace(/\u2424/g, '\n');
48755 return this.token(src, true);
48762 Lexer.prototype.token = function(src, top, bq) {
48763 var src = src.replace(/^ +$/gm, '')
48776 if (cap = this.rules.newline.exec(src)) {
48777 src = src.substring(cap[0].length);
48778 if (cap[0].length > 1) {
48786 if (cap = this.rules.code.exec(src)) {
48787 src = src.substring(cap[0].length);
48788 cap = cap[0].replace(/^ {4}/gm, '');
48791 text: !this.options.pedantic
48792 ? cap.replace(/\n+$/, '')
48799 if (cap = this.rules.fences.exec(src)) {
48800 src = src.substring(cap[0].length);
48810 if (cap = this.rules.heading.exec(src)) {
48811 src = src.substring(cap[0].length);
48814 depth: cap[1].length,
48820 // table no leading pipe (gfm)
48821 if (top && (cap = this.rules.nptable.exec(src))) {
48822 src = src.substring(cap[0].length);
48826 header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48827 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48828 cells: cap[3].replace(/\n$/, '').split('\n')
48831 for (i = 0; i < item.align.length; i++) {
48832 if (/^ *-+: *$/.test(item.align[i])) {
48833 item.align[i] = 'right';
48834 } else if (/^ *:-+: *$/.test(item.align[i])) {
48835 item.align[i] = 'center';
48836 } else if (/^ *:-+ *$/.test(item.align[i])) {
48837 item.align[i] = 'left';
48839 item.align[i] = null;
48843 for (i = 0; i < item.cells.length; i++) {
48844 item.cells[i] = item.cells[i].split(/ *\| */);
48847 this.tokens.push(item);
48853 if (cap = this.rules.lheading.exec(src)) {
48854 src = src.substring(cap[0].length);
48857 depth: cap[2] === '=' ? 1 : 2,
48864 if (cap = this.rules.hr.exec(src)) {
48865 src = src.substring(cap[0].length);
48873 if (cap = this.rules.blockquote.exec(src)) {
48874 src = src.substring(cap[0].length);
48877 type: 'blockquote_start'
48880 cap = cap[0].replace(/^ *> ?/gm, '');
48882 // Pass `top` to keep the current
48883 // "toplevel" state. This is exactly
48884 // how markdown.pl works.
48885 this.token(cap, top, true);
48888 type: 'blockquote_end'
48895 if (cap = this.rules.list.exec(src)) {
48896 src = src.substring(cap[0].length);
48900 type: 'list_start',
48901 ordered: bull.length > 1
48904 // Get each top-level item.
48905 cap = cap[0].match(this.rules.item);
48911 for (; i < l; i++) {
48914 // Remove the list item's bullet
48915 // so it is seen as the next token.
48916 space = item.length;
48917 item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48919 // Outdent whatever the
48920 // list item contains. Hacky.
48921 if (~item.indexOf('\n ')) {
48922 space -= item.length;
48923 item = !this.options.pedantic
48924 ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48925 : item.replace(/^ {1,4}/gm, '');
48928 // Determine whether the next list item belongs here.
48929 // Backpedal if it does not belong in this list.
48930 if (this.options.smartLists && i !== l - 1) {
48931 b = block.bullet.exec(cap[i + 1])[0];
48932 if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48933 src = cap.slice(i + 1).join('\n') + src;
48938 // Determine whether item is loose or not.
48939 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48940 // for discount behavior.
48941 loose = next || /\n\n(?!\s*$)/.test(item);
48943 next = item.charAt(item.length - 1) === '\n';
48944 if (!loose) loose = next;
48949 ? 'loose_item_start'
48950 : 'list_item_start'
48954 this.token(item, false, bq);
48957 type: 'list_item_end'
48969 if (cap = this.rules.html.exec(src)) {
48970 src = src.substring(cap[0].length);
48972 type: this.options.sanitize
48975 pre: !this.options.sanitizer
48976 && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48983 if ((!bq && top) && (cap = this.rules.def.exec(src))) {
48984 src = src.substring(cap[0].length);
48985 this.tokens.links[cap[1].toLowerCase()] = {
48993 if (top && (cap = this.rules.table.exec(src))) {
48994 src = src.substring(cap[0].length);
48998 header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48999 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
49000 cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
49003 for (i = 0; i < item.align.length; i++) {
49004 if (/^ *-+: *$/.test(item.align[i])) {
49005 item.align[i] = 'right';
49006 } else if (/^ *:-+: *$/.test(item.align[i])) {
49007 item.align[i] = 'center';
49008 } else if (/^ *:-+ *$/.test(item.align[i])) {
49009 item.align[i] = 'left';
49011 item.align[i] = null;
49015 for (i = 0; i < item.cells.length; i++) {
49016 item.cells[i] = item.cells[i]
49017 .replace(/^ *\| *| *\| *$/g, '')
49021 this.tokens.push(item);
49026 // top-level paragraph
49027 if (top && (cap = this.rules.paragraph.exec(src))) {
49028 src = src.substring(cap[0].length);
49031 text: cap[1].charAt(cap[1].length - 1) === '\n'
49032 ? cap[1].slice(0, -1)
49039 if (cap = this.rules.text.exec(src)) {
49040 // Top-level should never reach here.
49041 src = src.substring(cap[0].length);
49051 Error('Infinite loop on byte: ' + src.charCodeAt(0));
49055 return this.tokens;
49059 * Inline-Level Grammar
49063 escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
49064 autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
49066 tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
49067 link: /^!?\[(inside)\]\(href\)/,
49068 reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
49069 nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
49070 strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
49071 em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
49072 code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
49073 br: /^ {2,}\n(?!\s*$)/,
49075 text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
49078 inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
49079 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
49081 inline.link = replace(inline.link)
49082 ('inside', inline._inside)
49083 ('href', inline._href)
49086 inline.reflink = replace(inline.reflink)
49087 ('inside', inline._inside)
49091 * Normal Inline Grammar
49094 inline.normal = merge({}, inline);
49097 * Pedantic Inline Grammar
49100 inline.pedantic = merge({}, inline.normal, {
49101 strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
49102 em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
49106 * GFM Inline Grammar
49109 inline.gfm = merge({}, inline.normal, {
49110 escape: replace(inline.escape)('])', '~|])')(),
49111 url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
49112 del: /^~~(?=\S)([\s\S]*?\S)~~/,
49113 text: replace(inline.text)
49115 ('|', '|https?://|')
49120 * GFM + Line Breaks Inline Grammar
49123 inline.breaks = merge({}, inline.gfm, {
49124 br: replace(inline.br)('{2,}', '*')(),
49125 text: replace(inline.gfm.text)('{2,}', '*')()
49129 * Inline Lexer & Compiler
49132 function InlineLexer(links, options) {
49133 this.options = options || marked.defaults;
49134 this.links = links;
49135 this.rules = inline.normal;
49136 this.renderer = this.options.renderer || new Renderer;
49137 this.renderer.options = this.options;
49141 Error('Tokens array requires a `links` property.');
49144 if (this.options.gfm) {
49145 if (this.options.breaks) {
49146 this.rules = inline.breaks;
49148 this.rules = inline.gfm;
49150 } else if (this.options.pedantic) {
49151 this.rules = inline.pedantic;
49156 * Expose Inline Rules
49159 InlineLexer.rules = inline;
49162 * Static Lexing/Compiling Method
49165 InlineLexer.output = function(src, links, options) {
49166 var inline = new InlineLexer(links, options);
49167 return inline.output(src);
49174 InlineLexer.prototype.output = function(src) {
49183 if (cap = this.rules.escape.exec(src)) {
49184 src = src.substring(cap[0].length);
49190 if (cap = this.rules.autolink.exec(src)) {
49191 src = src.substring(cap[0].length);
49192 if (cap[2] === '@') {
49193 text = cap[1].charAt(6) === ':'
49194 ? this.mangle(cap[1].substring(7))
49195 : this.mangle(cap[1]);
49196 href = this.mangle('mailto:') + text;
49198 text = escape(cap[1]);
49201 out += this.renderer.link(href, null, text);
49206 if (!this.inLink && (cap = this.rules.url.exec(src))) {
49207 src = src.substring(cap[0].length);
49208 text = escape(cap[1]);
49210 out += this.renderer.link(href, null, text);
49215 if (cap = this.rules.tag.exec(src)) {
49216 if (!this.inLink && /^<a /i.test(cap[0])) {
49217 this.inLink = true;
49218 } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
49219 this.inLink = false;
49221 src = src.substring(cap[0].length);
49222 out += this.options.sanitize
49223 ? this.options.sanitizer
49224 ? this.options.sanitizer(cap[0])
49231 if (cap = this.rules.link.exec(src)) {
49232 src = src.substring(cap[0].length);
49233 this.inLink = true;
49234 out += this.outputLink(cap, {
49238 this.inLink = false;
49243 if ((cap = this.rules.reflink.exec(src))
49244 || (cap = this.rules.nolink.exec(src))) {
49245 src = src.substring(cap[0].length);
49246 link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
49247 link = this.links[link.toLowerCase()];
49248 if (!link || !link.href) {
49249 out += cap[0].charAt(0);
49250 src = cap[0].substring(1) + src;
49253 this.inLink = true;
49254 out += this.outputLink(cap, link);
49255 this.inLink = false;
49260 if (cap = this.rules.strong.exec(src)) {
49261 src = src.substring(cap[0].length);
49262 out += this.renderer.strong(this.output(cap[2] || cap[1]));
49267 if (cap = this.rules.em.exec(src)) {
49268 src = src.substring(cap[0].length);
49269 out += this.renderer.em(this.output(cap[2] || cap[1]));
49274 if (cap = this.rules.code.exec(src)) {
49275 src = src.substring(cap[0].length);
49276 out += this.renderer.codespan(escape(cap[2], true));
49281 if (cap = this.rules.br.exec(src)) {
49282 src = src.substring(cap[0].length);
49283 out += this.renderer.br();
49288 if (cap = this.rules.del.exec(src)) {
49289 src = src.substring(cap[0].length);
49290 out += this.renderer.del(this.output(cap[1]));
49295 if (cap = this.rules.text.exec(src)) {
49296 src = src.substring(cap[0].length);
49297 out += this.renderer.text(escape(this.smartypants(cap[0])));
49303 Error('Infinite loop on byte: ' + src.charCodeAt(0));
49314 InlineLexer.prototype.outputLink = function(cap, link) {
49315 var href = escape(link.href)
49316 , title = link.title ? escape(link.title) : null;
49318 return cap[0].charAt(0) !== '!'
49319 ? this.renderer.link(href, title, this.output(cap[1]))
49320 : this.renderer.image(href, title, escape(cap[1]));
49324 * Smartypants Transformations
49327 InlineLexer.prototype.smartypants = function(text) {
49328 if (!this.options.smartypants) return text;
49331 .replace(/---/g, '\u2014')
49333 .replace(/--/g, '\u2013')
49335 .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
49336 // closing singles & apostrophes
49337 .replace(/'/g, '\u2019')
49339 .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
49341 .replace(/"/g, '\u201d')
49343 .replace(/\.{3}/g, '\u2026');
49350 InlineLexer.prototype.mangle = function(text) {
49351 if (!this.options.mangle) return text;
49357 for (; i < l; i++) {
49358 ch = text.charCodeAt(i);
49359 if (Math.random() > 0.5) {
49360 ch = 'x' + ch.toString(16);
49362 out += '&#' + ch + ';';
49372 function Renderer(options) {
49373 this.options = options || {};
49376 Renderer.prototype.code = function(code, lang, escaped) {
49377 if (this.options.highlight) {
49378 var out = this.options.highlight(code, lang);
49379 if (out != null && out !== code) {
49386 return '<pre><code>'
49387 + (escaped ? code : escape(code, true))
49388 + '\n</code></pre>';
49391 return '<pre><code class="'
49392 + this.options.langPrefix
49393 + escape(lang, true)
49395 + (escaped ? code : escape(code, true))
49396 + '\n</code></pre>\n';
49399 Renderer.prototype.blockquote = function(quote) {
49400 return '<blockquote>\n' + quote + '</blockquote>\n';
49403 Renderer.prototype.html = function(html) {
49407 Renderer.prototype.heading = function(text, level, raw) {
49411 + this.options.headerPrefix
49412 + raw.toLowerCase().replace(/[^\w]+/g, '-')
49420 Renderer.prototype.hr = function() {
49421 return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
49424 Renderer.prototype.list = function(body, ordered) {
49425 var type = ordered ? 'ol' : 'ul';
49426 return '<' + type + '>\n' + body + '</' + type + '>\n';
49429 Renderer.prototype.listitem = function(text) {
49430 return '<li>' + text + '</li>\n';
49433 Renderer.prototype.paragraph = function(text) {
49434 return '<p>' + text + '</p>\n';
49437 Renderer.prototype.table = function(header, body) {
49448 Renderer.prototype.tablerow = function(content) {
49449 return '<tr>\n' + content + '</tr>\n';
49452 Renderer.prototype.tablecell = function(content, flags) {
49453 var type = flags.header ? 'th' : 'td';
49454 var tag = flags.align
49455 ? '<' + type + ' style="text-align:' + flags.align + '">'
49456 : '<' + type + '>';
49457 return tag + content + '</' + type + '>\n';
49460 // span level renderer
49461 Renderer.prototype.strong = function(text) {
49462 return '<strong>' + text + '</strong>';
49465 Renderer.prototype.em = function(text) {
49466 return '<em>' + text + '</em>';
49469 Renderer.prototype.codespan = function(text) {
49470 return '<code>' + text + '</code>';
49473 Renderer.prototype.br = function() {
49474 return this.options.xhtml ? '<br/>' : '<br>';
49477 Renderer.prototype.del = function(text) {
49478 return '<del>' + text + '</del>';
49481 Renderer.prototype.link = function(href, title, text) {
49482 if (this.options.sanitize) {
49484 var prot = decodeURIComponent(unescape(href))
49485 .replace(/[^\w:]/g, '')
49490 if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
49494 var out = '<a href="' + href + '"';
49496 out += ' title="' + title + '"';
49498 out += '>' + text + '</a>';
49502 Renderer.prototype.image = function(href, title, text) {
49503 var out = '<img src="' + href + '" alt="' + text + '"';
49505 out += ' title="' + title + '"';
49507 out += this.options.xhtml ? '/>' : '>';
49511 Renderer.prototype.text = function(text) {
49516 * Parsing & Compiling
49519 function Parser(options) {
49522 this.options = options || marked.defaults;
49523 this.options.renderer = this.options.renderer || new Renderer;
49524 this.renderer = this.options.renderer;
49525 this.renderer.options = this.options;
49529 * Static Parse Method
49532 Parser.parse = function(src, options, renderer) {
49533 var parser = new Parser(options, renderer);
49534 return parser.parse(src);
49541 Parser.prototype.parse = function(src) {
49542 this.inline = new InlineLexer(src.links, this.options, this.renderer);
49543 this.tokens = src.reverse();
49546 while (this.next()) {
49557 Parser.prototype.next = function() {
49558 return this.token = this.tokens.pop();
49562 * Preview Next Token
49565 Parser.prototype.peek = function() {
49566 return this.tokens[this.tokens.length - 1] || 0;
49570 * Parse Text Tokens
49573 Parser.prototype.parseText = function() {
49574 var body = this.token.text;
49576 while (this.peek().type === 'text') {
49577 body += '\n' + this.next().text;
49580 return this.inline.output(body);
49584 * Parse Current Token
49587 Parser.prototype.tok = function() {
49588 switch (this.token.type) {
49593 return this.renderer.hr();
49596 return this.renderer.heading(
49597 this.inline.output(this.token.text),
49602 return this.renderer.code(this.token.text,
49604 this.token.escaped);
49617 for (i = 0; i < this.token.header.length; i++) {
49618 flags = { header: true, align: this.token.align[i] };
49619 cell += this.renderer.tablecell(
49620 this.inline.output(this.token.header[i]),
49621 { header: true, align: this.token.align[i] }
49624 header += this.renderer.tablerow(cell);
49626 for (i = 0; i < this.token.cells.length; i++) {
49627 row = this.token.cells[i];
49630 for (j = 0; j < row.length; j++) {
49631 cell += this.renderer.tablecell(
49632 this.inline.output(row[j]),
49633 { header: false, align: this.token.align[j] }
49637 body += this.renderer.tablerow(cell);
49639 return this.renderer.table(header, body);
49641 case 'blockquote_start': {
49644 while (this.next().type !== 'blockquote_end') {
49645 body += this.tok();
49648 return this.renderer.blockquote(body);
49650 case 'list_start': {
49652 , ordered = this.token.ordered;
49654 while (this.next().type !== 'list_end') {
49655 body += this.tok();
49658 return this.renderer.list(body, ordered);
49660 case 'list_item_start': {
49663 while (this.next().type !== 'list_item_end') {
49664 body += this.token.type === 'text'
49669 return this.renderer.listitem(body);
49671 case 'loose_item_start': {
49674 while (this.next().type !== 'list_item_end') {
49675 body += this.tok();
49678 return this.renderer.listitem(body);
49681 var html = !this.token.pre && !this.options.pedantic
49682 ? this.inline.output(this.token.text)
49684 return this.renderer.html(html);
49686 case 'paragraph': {
49687 return this.renderer.paragraph(this.inline.output(this.token.text));
49690 return this.renderer.paragraph(this.parseText());
49699 function escape(html, encode) {
49701 .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
49702 .replace(/</g, '<')
49703 .replace(/>/g, '>')
49704 .replace(/"/g, '"')
49705 .replace(/'/g, ''');
49708 function unescape(html) {
49709 // explicitly match decimal, hex, and named HTML entities
49710 return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
49711 n = n.toLowerCase();
49712 if (n === 'colon') return ':';
49713 if (n.charAt(0) === '#') {
49714 return n.charAt(1) === 'x'
49715 ? String.fromCharCode(parseInt(n.substring(2), 16))
49716 : String.fromCharCode(+n.substring(1));
49722 function replace(regex, opt) {
49723 regex = regex.source;
49725 return function self(name, val) {
49726 if (!name) return new RegExp(regex, opt);
49727 val = val.source || val;
49728 val = val.replace(/(^|[^\[])\^/g, '$1');
49729 regex = regex.replace(name, val);
49737 function merge(obj) {
49742 for (; i < arguments.length; i++) {
49743 target = arguments[i];
49744 for (key in target) {
49745 if (Object.prototype.hasOwnProperty.call(target, key)) {
49746 obj[key] = target[key];
49759 function marked(src, opt, callback) {
49760 if (callback || typeof opt === 'function') {
49766 opt = merge({}, marked.defaults, opt || {});
49768 var highlight = opt.highlight
49774 tokens = Lexer.lex(src, opt);
49776 return callback(e);
49779 pending = tokens.length;
49781 var done = function(err) {
49783 opt.highlight = highlight;
49784 return callback(err);
49790 out = Parser.parse(tokens, opt);
49795 opt.highlight = highlight;
49799 : callback(null, out);
49802 if (!highlight || highlight.length < 3) {
49806 delete opt.highlight;
49808 if (!pending) return done();
49810 for (; i < tokens.length; i++) {
49812 if (token.type !== 'code') {
49813 return --pending || done();
49815 return highlight(token.text, token.lang, function(err, code) {
49816 if (err) return done(err);
49817 if (code == null || code === token.text) {
49818 return --pending || done();
49821 token.escaped = true;
49822 --pending || done();
49830 if (opt) opt = merge({}, marked.defaults, opt);
49831 return Parser.parse(Lexer.lex(src, opt), opt);
49833 e.message += '\nPlease report this to https://github.com/chjj/marked.';
49834 if ((opt || marked.defaults).silent) {
49835 return '<p>An error occured:</p><pre>'
49836 + escape(e.message + '', true)
49848 marked.setOptions = function(opt) {
49849 merge(marked.defaults, opt);
49853 marked.defaults = {
49864 langPrefix: 'lang-',
49865 smartypants: false,
49867 renderer: new Renderer,
49875 marked.Parser = Parser;
49876 marked.parser = Parser.parse;
49878 marked.Renderer = Renderer;
49880 marked.Lexer = Lexer;
49881 marked.lexer = Lexer.lex;
49883 marked.InlineLexer = InlineLexer;
49884 marked.inlineLexer = InlineLexer.output;
49886 marked.parse = marked;
49889 module.exports = marked;
49892 }).call(function() {
49893 return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
49897 function pointBox(loc, context) {
49898 var rect = context.surfaceRect();
49899 var point = context.curtainProjection(loc);
49901 left: point[0] + rect.left - 40,
49902 top: point[1] + rect.top - 60,
49909 function pad$1(locOrBox, padding, context) {
49911 if (locOrBox instanceof Array) {
49912 var rect = context.surfaceRect();
49913 var point = context.curtainProjection(locOrBox);
49915 left: point[0] + rect.left,
49916 top: point[1] + rect.top
49923 left: box.left - padding,
49924 top: box.top - padding,
49925 width: (box.width || 0) + 2 * padding,
49926 height: (box.width || 0) + 2 * padding
49931 function icon(name, svgklass) {
49932 return '<svg class="icon ' + (svgklass || '') + '">' +
49933 '<use xlink:href="' + name + '"></use></svg>';
49937 function slugify(text) {
49938 return text.toString().toLowerCase()
49939 .replace(/\s+/g, '-') // Replace spaces with -
49940 .replace(/[^\w\-]+/g, '') // Remove all non-word chars
49941 .replace(/\-\-+/g, '-') // Replace multiple - with single -
49942 .replace(/^-+/, '') // Trim - from start of text
49943 .replace(/-+$/, ''); // Trim - from end of text
49947 // console warning for missing walkthrough names
49948 var missingStrings = {};
49949 function checkKey(key, text) {
49950 if (t(key, { default: undefined}) === undefined) {
49951 if (missingStrings.hasOwnProperty(key)) return; // warn once
49952 missingStrings[key] = text;
49953 var missing = key + ': ' + text;
49954 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49959 function localize(obj) {
49962 // Assign name if entity has one..
49963 var name = obj.tags && obj.tags.name;
49965 key = 'intro.graph.name.' + slugify(name);
49966 obj.tags.name = t(key, { default: name });
49967 checkKey(key, name);
49970 // Assign street name if entity has one..
49971 var street = obj.tags && obj.tags['addr:street'];
49973 key = 'intro.graph.name.' + slugify(street);
49974 obj.tags['addr:street'] = t(key, { default: street });
49975 checkKey(key, street);
49977 // Add address details common across walkthrough..
49979 'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49980 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49982 addrTags.forEach(function(k) {
49983 var key = 'intro.graph.' + k,
49985 val = obj.tags && obj.tags[tag],
49986 str = t(key, { default: val });
49989 if (str.match(/^<.*>$/) !== null) {
49990 delete obj.tags[tag];
49992 obj.tags[tag] = str;
50002 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
50003 function isMostlySquare(points) {
50004 // note: uses 15 here instead of the 12 from actionOrthogonalize because
50005 // actionOrthogonalize can actually straighten some larger angles as it iterates
50006 var threshold = 15, // degrees within right or straight
50007 lowerBound = Math.cos((90 - threshold) * Math.PI / 180), // near right
50008 upperBound = Math.cos(threshold * Math.PI / 180), // near straight
50011 for (var i = 0; i < points.length; i++) {
50012 mag = Math.abs(normalizedDotProduct(i, points));
50013 if (mag > lowerBound && mag < upperBound) {
50021 function normalizedDotProduct(i, points) {
50022 var a = points[(i - 1 + points.length) % points.length],
50024 c = points[(i + 1) % points.length],
50025 p = subtractPoints(a, b),
50026 q = subtractPoints(c, b);
50028 p = normalizePoint(p);
50029 q = normalizePoint(q);
50031 return p[0] * q[0] + p[1] * q[1];
50034 function subtractPoints(a, b) {
50035 return [a[0] - b[0], a[1] - b[1]];
50038 function normalizePoint(point) {
50039 var vector = [0, 0];
50040 var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
50041 if (length !== 0) {
50042 vector[0] = point[0] / length;
50043 vector[1] = point[1] / length;
50051 function selectMenuItem(operation) {
50052 var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
50053 ', .radial-menu .radial-menu-item-' + operation;
50054 return d3_select(selector$$1);
50058 function transitionTime(point1, point2) {
50059 var distance = geoSphericalDistance(point1, point2);
50060 if (distance === 0)
50062 else if (distance < 80)
50068 var dataIntroGraph = {"n1":{"id":"n1","loc":[-85.631039,41.948829]},"n10":{"id":"n10","loc":[-85.634733,41.941588]},"n100":{"id":"n100","loc":[-85.637395,41.942252]},"n1000":{"id":"n1000","loc":[-85.632699,41.944763]},"n1001":{"id":"n1001","loc":[-85.632685,41.944763]},"n1002":{"id":"n1002","loc":[-85.632673,41.944755]},"n1003":{"id":"n1003","loc":[-85.632595,41.944682]},"n1004":{"id":"n1004","loc":[-85.632576,41.944673]},"n1005":{"id":"n1005","loc":[-85.632551,41.944667]},"n1006":{"id":"n1006","loc":[-85.63253,41.944667]},"n1007":{"id":"n1007","loc":[-85.632502,41.944669]},"n1008":{"id":"n1008","loc":[-85.632483,41.944677]},"n1009":{"id":"n1009","loc":[-85.632383,41.944731]},"n101":{"id":"n101","loc":[-85.637357,41.942252]},"n1010":{"id":"n1010","loc":[-85.63349,41.944976],"tags":{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Sherwin-Williams","shop":"paint"}},"n1011":{"id":"n1011","loc":[-85.633548,41.945034],"tags":{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Unique Jewelry","shop":"jewelry"}},"n1012":{"id":"n1012","loc":[-85.633683,41.945129],"tags":{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"World Fare","shop":"gift"}},"n1013":{"id":"n1013","loc":[-85.634563,41.945469],"tags":{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Golden Finch Framing","shop":"frame"}},"n1014":{"id":"n1014","loc":[-85.634469,41.945379],"tags":{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Dollar Tree","shop":"second_hand"}},"n1015":{"id":"n1015","loc":[-85.634227,41.945159],"tags":{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"theatre","name":"Riviera Theatre"}},"n1016":{"id":"n1016","loc":[-85.634057,41.945012],"tags":{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"River City Appliance","shop":"appliance"}},"n1017":{"id":"n1017","loc":[-85.633879,41.945325],"tags":{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paparazzi Tattoo","shop":"tattoo"}},"n1018":{"id":"n1018","loc":[-85.634914,41.945839],"tags":{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"bank","name":"Southern Michigan Bank"}},"n1019":{"id":"n1019","loc":[-85.634514,41.946176]},"n102":{"id":"n102","loc":[-85.637357,41.942216]},"n1020":{"id":"n1020","loc":[-85.634087,41.946178]},"n1021":{"id":"n1021","loc":[-85.634357,41.945805]},"n1022":{"id":"n1022","loc":[-85.634389,41.945788]},"n1023":{"id":"n1023","loc":[-85.634491,41.94581]},"n1024":{"id":"n1024","loc":[-85.634513,41.945853]},"n1025":{"id":"n1025","loc":[-85.634506,41.94583]},"n1026":{"id":"n1026","loc":[-85.634762,41.946056],"tags":{"crossing":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","highway":"crossing"}},"n1029":{"id":"n1029","loc":[-85.640655,41.942057]},"n103":{"id":"n103","loc":[-85.637386,41.942054]},"n1030":{"id":"n1030","loc":[-85.640947,41.942057]},"n1031":{"id":"n1031","loc":[-85.640957,41.942593]},"n1032":{"id":"n1032","loc":[-85.630953,41.960873]},"n1033":{"id":"n1033","loc":[-85.632174,41.960679]},"n1034":{"id":"n1034","loc":[-85.638785,41.943066]},"n1035":{"id":"n1035","loc":[-85.638853,41.943065]},"n1036":{"id":"n1036","loc":[-85.638855,41.943183]},"n1037":{"id":"n1037","loc":[-85.638552,41.943189]},"n1038":{"id":"n1038","loc":[-85.63855,41.943149]},"n1039":{"id":"n1039","loc":[-85.638638,41.943068]},"n104":{"id":"n104","loc":[-85.637387,41.942125]},"n1040":{"id":"n1040","loc":[-85.638638,41.943078]},"n1041":{"id":"n1041","loc":[-85.638813,41.943163]},"n1042":{"id":"n1042","loc":[-85.638684,41.943165]},"n1043":{"id":"n1043","loc":[-85.638682,41.943105]},"n1044":{"id":"n1044","loc":[-85.638706,41.943105]},"n1045":{"id":"n1045","loc":[-85.638707,41.943117]},"n1046":{"id":"n1046","loc":[-85.638812,41.943115]},"n1047":{"id":"n1047","loc":[-85.638769,41.943407]},"n1048":{"id":"n1048","loc":[-85.638549,41.943407]},"n1049":{"id":"n1049","loc":[-85.638567,41.943555]},"n105":{"id":"n105","loc":[-85.637319,41.942125]},"n1050":{"id":"n1050","loc":[-85.638426,41.943554]},"n1051":{"id":"n1051","loc":[-85.638427,41.94346]},"n1052":{"id":"n1052","loc":[-85.638568,41.943461]},"n1053":{"id":"n1053","loc":[-85.639264,41.943415]},"n1054":{"id":"n1054","loc":[-85.639082,41.943417]},"n1055":{"id":"n1055","loc":[-85.63908,41.943331]},"n1056":{"id":"n1056","loc":[-85.639136,41.94333]},"n1057":{"id":"n1057","loc":[-85.639158,41.943312]},"n1058":{"id":"n1058","loc":[-85.639188,41.943313]},"n1059":{"id":"n1059","loc":[-85.639211,41.943331]},"n106":{"id":"n106","loc":[-85.637319,41.942137]},"n1060":{"id":"n1060","loc":[-85.639262,41.943331]},"n1061":{"id":"n1061","loc":[-85.638986,41.943515]},"n1062":{"id":"n1062","loc":[-85.63888,41.943521]},"n1063":{"id":"n1063","loc":[-85.638871,41.943436]},"n1064":{"id":"n1064","loc":[-85.638958,41.943431]},"n1065":{"id":"n1065","loc":[-85.638979,41.943443]},"n1066":{"id":"n1066","loc":[-85.63926,41.943703]},"n1067":{"id":"n1067","loc":[-85.639152,41.943704]},"n1068":{"id":"n1068","loc":[-85.639152,41.943691]},"n1069":{"id":"n1069","loc":[-85.639063,41.943691]},"n107":{"id":"n107","loc":[-85.637259,41.942137]},"n1070":{"id":"n1070","loc":[-85.639062,41.943613]},"n1071":{"id":"n1071","loc":[-85.639259,41.943611]},"n1072":{"id":"n1072","loc":[-85.639117,41.943726]},"n1073":{"id":"n1073","loc":[-85.639118,41.943767]},"n1074":{"id":"n1074","loc":[-85.639051,41.943768]},"n1075":{"id":"n1075","loc":[-85.63905,41.943727]},"n1076":{"id":"n1076","loc":[-85.638627,41.943716]},"n1077":{"id":"n1077","loc":[-85.63863,41.943634]},"n1078":{"id":"n1078","loc":[-85.63844,41.943631]},"n1079":{"id":"n1079","loc":[-85.638437,41.943729]},"n108":{"id":"n108","loc":[-85.637259,41.942126]},"n1080":{"id":"n1080","loc":[-85.638533,41.94373]},"n1081":{"id":"n1081","loc":[-85.638534,41.943715]},"n1082":{"id":"n1082","loc":[-85.638678,41.943941]},"n1083":{"id":"n1083","loc":[-85.638522,41.943944]},"n1084":{"id":"n1084","loc":[-85.63852,41.943864]},"n1085":{"id":"n1085","loc":[-85.638676,41.943861]},"n1086":{"id":"n1086","loc":[-85.638663,41.944059]},"n1087":{"id":"n1087","loc":[-85.638513,41.944061]},"n1088":{"id":"n1088","loc":[-85.638511,41.943991]},"n1089":{"id":"n1089","loc":[-85.638661,41.943989]},"n109":{"id":"n109","loc":[-85.637193,41.942126]},"n1090":{"id":"n1090","loc":[-85.63865,41.944134]},"n1091":{"id":"n1091","loc":[-85.638429,41.944144]},"n1092":{"id":"n1092","loc":[-85.638426,41.944106]},"n1093":{"id":"n1093","loc":[-85.638476,41.944104]},"n1094":{"id":"n1094","loc":[-85.638475,41.94409]},"n1095":{"id":"n1095","loc":[-85.638594,41.944084]},"n1096":{"id":"n1096","loc":[-85.638595,41.944101]},"n1097":{"id":"n1097","loc":[-85.638647,41.944099]},"n1098":{"id":"n1098","loc":[-85.63829,41.944154]},"n1099":{"id":"n1099","loc":[-85.638558,41.944155]},"n11":{"id":"n11","loc":[-85.634602,41.941523]},"n110":{"id":"n110","loc":[-85.637192,41.942053]},"n1100":{"id":"n1100","loc":[-85.638558,41.944338]},"n1101":{"id":"n1101","loc":[-85.638851,41.944408]},"n1102":{"id":"n1102","loc":[-85.637771,41.943989]},"n1103":{"id":"n1103","loc":[-85.639345,41.943964]},"n1104":{"id":"n1104","loc":[-85.638515,41.94397]},"n1105":{"id":"n1105","loc":[-85.639256,41.943928]},"n1106":{"id":"n1106","loc":[-85.639157,41.943929]},"n1107":{"id":"n1107","loc":[-85.639156,41.9439]},"n1108":{"id":"n1108","loc":[-85.639118,41.9439]},"n1109":{"id":"n1109","loc":[-85.639116,41.94382]},"n111":{"id":"n111","loc":[-85.637248,41.942053]},"n1110":{"id":"n1110","loc":[-85.639202,41.943819]},"n1111":{"id":"n1111","loc":[-85.639202,41.943837]},"n1112":{"id":"n1112","loc":[-85.639293,41.943836]},"n1113":{"id":"n1113","loc":[-85.639295,41.943898]},"n1114":{"id":"n1114","loc":[-85.639255,41.943898]},"n1115":{"id":"n1115","loc":[-85.639296,41.944083]},"n1116":{"id":"n1116","loc":[-85.639144,41.944084]},"n1117":{"id":"n1117","loc":[-85.639143,41.944026]},"n1118":{"id":"n1118","loc":[-85.639162,41.944026]},"n1119":{"id":"n1119","loc":[-85.639162,41.944]},"n112":{"id":"n112","loc":[-85.637248,41.942042]},"n1120":{"id":"n1120","loc":[-85.639295,41.943999]},"n1121":{"id":"n1121","loc":[-85.639131,41.944139]},"n1122":{"id":"n1122","loc":[-85.63901,41.94414]},"n1123":{"id":"n1123","loc":[-85.63901,41.944076]},"n1124":{"id":"n1124","loc":[-85.63913,41.944075]},"n1125":{"id":"n1125","loc":[-85.639092,41.944155]},"n1126":{"id":"n1126","loc":[-85.639093,41.944308]},"n1127":{"id":"n1127","loc":[-85.639225,41.944308]},"n1128":{"id":"n1128","loc":[-85.639225,41.94429]},"n1129":{"id":"n1129","loc":[-85.639253,41.944289]},"n113":{"id":"n113","loc":[-85.637338,41.942041]},"n1130":{"id":"n1130","loc":[-85.639253,41.944269]},"n1131":{"id":"n1131","loc":[-85.639243,41.944269]},"n1132":{"id":"n1132","loc":[-85.639243,41.944229]},"n1133":{"id":"n1133","loc":[-85.639224,41.944229]},"n1134":{"id":"n1134","loc":[-85.639224,41.944196]},"n1135":{"id":"n1135","loc":[-85.639195,41.944196]},"n1136":{"id":"n1136","loc":[-85.639195,41.944155]},"n1137":{"id":"n1137","loc":[-85.639072,41.944154]},"n1138":{"id":"n1138","loc":[-85.638865,41.944154]},"n1139":{"id":"n1139","loc":[-85.638863,41.943967]},"n114":{"id":"n114","loc":[-85.637338,41.942055]},"n1140":{"id":"n1140","loc":[-85.6386,41.942698]},"n1141":{"id":"n1141","loc":[-85.639348,41.942698]},"n1142":{"id":"n1142","loc":[-85.639377,41.944984]},"n1143":{"id":"n1143","loc":[-85.63937,41.945013]},"n1144":{"id":"n1144","loc":[-85.639357,41.945033]},"n1145":{"id":"n1145","loc":[-85.639353,41.945053]},"n1146":{"id":"n1146","loc":[-85.639352,41.945084]},"n1147":{"id":"n1147","loc":[-85.638278,41.945516]},"n1148":{"id":"n1148","loc":[-85.637505,41.945801]},"n1149":{"id":"n1149","loc":[-85.637327,41.945857]},"n115":{"id":"n115","loc":[-85.637583,41.941943]},"n1150":{"id":"n1150","loc":[-85.637168,41.945899]},"n1151":{"id":"n1151","loc":[-85.637017,41.94593]},"n1152":{"id":"n1152","loc":[-85.637185,41.945938]},"n1153":{"id":"n1153","loc":[-85.63682,41.945963]},"n1154":{"id":"n1154","loc":[-85.636639,41.945984]},"n1155":{"id":"n1155","loc":[-85.636439,41.945999]},"n1156":{"id":"n1156","loc":[-85.635801,41.945999]},"n1157":{"id":"n1157","loc":[-85.635769,41.945908]},"n1158":{"id":"n1158","loc":[-85.635953,41.946154]},"n1159":{"id":"n1159","loc":[-85.635472,41.94598]},"n116":{"id":"n116","loc":[-85.637584,41.941983]},"n1160":{"id":"n1160","loc":[-85.635409,41.945981]},"n1161":{"id":"n1161","loc":[-85.635583,41.945987]},"n1162":{"id":"n1162","loc":[-85.636452,41.945805]},"n1163":{"id":"n1163","loc":[-85.636425,41.94582]},"n1164":{"id":"n1164","loc":[-85.636396,41.945817]},"n1165":{"id":"n1165","loc":[-85.636368,41.945797]},"n1166":{"id":"n1166","loc":[-85.636346,41.945767]},"n1167":{"id":"n1167","loc":[-85.636307,41.945745]},"n1168":{"id":"n1168","loc":[-85.636194,41.94565]},"n1169":{"id":"n1169","loc":[-85.636121,41.945579]},"n117":{"id":"n117","loc":[-85.63751,41.941983]},"n1170":{"id":"n1170","loc":[-85.635995,41.945432]},"n1171":{"id":"n1171","loc":[-85.637564,41.943538]},"n1172":{"id":"n1172","loc":[-85.63756,41.943505]},"n1173":{"id":"n1173","loc":[-85.637435,41.943489]},"n1174":{"id":"n1174","loc":[-85.637093,41.943556]},"n1175":{"id":"n1175","loc":[-85.634836,41.941574]},"n1176":{"id":"n1176","loc":[-85.634692,41.9415]},"n1177":{"id":"n1177","loc":[-85.634261,41.941337]},"n1178":{"id":"n1178","loc":[-85.634208,41.940962]},"n1179":{"id":"n1179","loc":[-85.635247,41.940968]},"n118":{"id":"n118","loc":[-85.637509,41.941944]},"n1180":{"id":"n1180","loc":[-85.63514,41.941205]},"n1181":{"id":"n1181","loc":[-85.634858,41.941511]},"n1182":{"id":"n1182","loc":[-85.630725,41.943465]},"n1183":{"id":"n1183","loc":[-85.632591,41.942826]},"n1184":{"id":"n1184","loc":[-85.634487,41.941928]},"n1185":{"id":"n1185","loc":[-85.634499,41.942056]},"n1186":{"id":"n1186","loc":[-85.63433,41.943102]},"n1187":{"id":"n1187","loc":[-85.634158,41.943151]},"n1188":{"id":"n1188","loc":[-85.634107,41.94305]},"n1189":{"id":"n1189","loc":[-85.634279,41.943002]},"n119":{"id":"n119","loc":[-85.637724,41.941973]},"n1190":{"id":"n1190","loc":[-85.634362,41.943762]},"n1191":{"id":"n1191","loc":[-85.634331,41.943731]},"n1192":{"id":"n1192","loc":[-85.634396,41.943695]},"n1193":{"id":"n1193","loc":[-85.634426,41.943726]},"n1194":{"id":"n1194","loc":[-85.621569,41.956021]},"n1195":{"id":"n1195","loc":[-85.621574,41.956164]},"n1196":{"id":"n1196","loc":[-85.621489,41.956165]},"n1197":{"id":"n1197","loc":[-85.621488,41.956136]},"n1198":{"id":"n1198","loc":[-85.621372,41.956139]},"n1199":{"id":"n1199","loc":[-85.621369,41.956049]},"n12":{"id":"n12","loc":[-85.63359,41.941093]},"n120":{"id":"n120","loc":[-85.637633,41.941973]},"n1200":{"id":"n1200","loc":[-85.621493,41.956047]},"n1201":{"id":"n1201","loc":[-85.621492,41.956022]},"n1202":{"id":"n1202","loc":[-85.619744,41.953192]},"n1203":{"id":"n1203","loc":[-85.619059,41.953902]},"n1204":{"id":"n1204","loc":[-85.623984,41.95469]},"n1205":{"id":"n1205","loc":[-85.630159,41.958208]},"n1206":{"id":"n1206","loc":[-85.63002,41.958208]},"n1207":{"id":"n1207","loc":[-85.630021,41.95814]},"n1208":{"id":"n1208","loc":[-85.63,41.95814]},"n1209":{"id":"n1209","loc":[-85.63,41.958043]},"n121":{"id":"n121","loc":[-85.637633,41.941853]},"n1210":{"id":"n1210","loc":[-85.630159,41.958043]},"n1211":{"id":"n1211","loc":[-85.630304,41.957566]},"n1212":{"id":"n1212","loc":[-85.630303,41.957684]},"n1213":{"id":"n1213","loc":[-85.630073,41.957683]},"n1214":{"id":"n1214","loc":[-85.630072,41.957721]},"n1215":{"id":"n1215","loc":[-85.629993,41.95772]},"n1216":{"id":"n1216","loc":[-85.629993,41.95768]},"n1217":{"id":"n1217","loc":[-85.629968,41.95768]},"n1218":{"id":"n1218","loc":[-85.629969,41.957588]},"n1219":{"id":"n1219","loc":[-85.630219,41.95759]},"n122":{"id":"n122","loc":[-85.637724,41.941853]},"n1220":{"id":"n1220","loc":[-85.630219,41.957566]},"n1221":{"id":"n1221","loc":[-85.630717,41.957744]},"n1222":{"id":"n1222","loc":[-85.630596,41.957745]},"n1223":{"id":"n1223","loc":[-85.630598,41.957553]},"n1224":{"id":"n1224","loc":[-85.630717,41.957555]},"n1225":{"id":"n1225","loc":[-85.630609,41.957745]},"n1226":{"id":"n1226","loc":[-85.63061,41.957789]},"n1227":{"id":"n1227","loc":[-85.630327,41.957791]},"n1228":{"id":"n1228","loc":[-85.630324,41.95752]},"n1229":{"id":"n1229","loc":[-85.630325,41.95756]},"n123":{"id":"n123","loc":[-85.637773,41.941988]},"n1230":{"id":"n1230","loc":[-85.63057,41.95756]},"n1231":{"id":"n1231","loc":[-85.63069,41.958016]},"n1232":{"id":"n1232","loc":[-85.630586,41.958017]},"n1233":{"id":"n1233","loc":[-85.630584,41.957956]},"n1234":{"id":"n1234","loc":[-85.630614,41.957956]},"n1235":{"id":"n1235","loc":[-85.630611,41.957835]},"n1236":{"id":"n1236","loc":[-85.630737,41.957833]},"n1237":{"id":"n1237","loc":[-85.630739,41.957921]},"n1238":{"id":"n1238","loc":[-85.630688,41.957922]},"n1239":{"id":"n1239","loc":[-85.630719,41.958291]},"n124":{"id":"n124","loc":[-85.637773,41.942046]},"n1240":{"id":"n1240","loc":[-85.630592,41.958291]},"n1241":{"id":"n1241","loc":[-85.630593,41.958108]},"n1242":{"id":"n1242","loc":[-85.630701,41.958109]},"n1243":{"id":"n1243","loc":[-85.6307,41.958173]},"n1244":{"id":"n1244","loc":[-85.630711,41.958173]},"n1245":{"id":"n1245","loc":[-85.630711,41.958233]},"n1246":{"id":"n1246","loc":[-85.630719,41.958233]},"n1247":{"id":"n1247","loc":[-85.630523,41.958329]},"n1248":{"id":"n1248","loc":[-85.630388,41.958329]},"n1249":{"id":"n1249","loc":[-85.630387,41.958262]},"n125":{"id":"n125","loc":[-85.637693,41.942047]},"n1250":{"id":"n1250","loc":[-85.630523,41.958261]},"n1251":{"id":"n1251","loc":[-85.63072,41.958636]},"n1252":{"id":"n1252","loc":[-85.630721,41.958709]},"n1253":{"id":"n1253","loc":[-85.630503,41.958712]},"n1254":{"id":"n1254","loc":[-85.630498,41.958511]},"n1255":{"id":"n1255","loc":[-85.630635,41.95851]},"n1256":{"id":"n1256","loc":[-85.630638,41.958636]},"n1257":{"id":"n1257","loc":[-85.630437,41.958822]},"n1258":{"id":"n1258","loc":[-85.630437,41.958849]},"n1259":{"id":"n1259","loc":[-85.630393,41.958849]},"n126":{"id":"n126","loc":[-85.637692,41.941988]},"n1260":{"id":"n1260","loc":[-85.630393,41.958822]},"n1261":{"id":"n1261","loc":[-85.630605,41.959102]},"n1262":{"id":"n1262","loc":[-85.63049,41.959104]},"n1263":{"id":"n1263","loc":[-85.630487,41.958996]},"n1264":{"id":"n1264","loc":[-85.630462,41.958996]},"n1265":{"id":"n1265","loc":[-85.63046,41.958922]},"n1266":{"id":"n1266","loc":[-85.630562,41.958921]},"n1267":{"id":"n1267","loc":[-85.630564,41.958992]},"n1268":{"id":"n1268","loc":[-85.630602,41.958992]},"n1269":{"id":"n1269","loc":[-85.630126,41.957096]},"n127":{"id":"n127","loc":[-85.637604,41.941994]},"n1270":{"id":"n1270","loc":[-85.630129,41.957283]},"n1271":{"id":"n1271","loc":[-85.629993,41.957284]},"n1272":{"id":"n1272","loc":[-85.629992,41.957216]},"n1273":{"id":"n1273","loc":[-85.630015,41.957215]},"n1274":{"id":"n1274","loc":[-85.630013,41.957097]},"n1275":{"id":"n1275","loc":[-85.630211,41.956592]},"n1276":{"id":"n1276","loc":[-85.630211,41.956676]},"n1277":{"id":"n1277","loc":[-85.630162,41.956676]},"n1278":{"id":"n1278","loc":[-85.630162,41.95676]},"n1279":{"id":"n1279","loc":[-85.630037,41.956761]},"n128":{"id":"n128","loc":[-85.637604,41.942057]},"n1280":{"id":"n1280","loc":[-85.630037,41.956592]},"n1281":{"id":"n1281","loc":[-85.630309,41.95653]},"n1282":{"id":"n1282","loc":[-85.630326,41.957065]},"n1283":{"id":"n1283","loc":[-85.630118,41.957065]},"n1284":{"id":"n1284","loc":[-85.630119,41.957096]},"n1285":{"id":"n1285","loc":[-85.63067,41.957307]},"n1286":{"id":"n1286","loc":[-85.630536,41.957308]},"n1287":{"id":"n1287","loc":[-85.630533,41.957111]},"n1288":{"id":"n1288","loc":[-85.630667,41.95711]},"n1289":{"id":"n1289","loc":[-85.630676,41.956808]},"n129":{"id":"n129","loc":[-85.63748,41.942057]},"n1290":{"id":"n1290","loc":[-85.630551,41.956808]},"n1291":{"id":"n1291","loc":[-85.630552,41.956982]},"n1292":{"id":"n1292","loc":[-85.63059,41.956982]},"n1293":{"id":"n1293","loc":[-85.63059,41.957001]},"n1294":{"id":"n1294","loc":[-85.630692,41.957001]},"n1295":{"id":"n1295","loc":[-85.630692,41.956936]},"n1296":{"id":"n1296","loc":[-85.630676,41.956936]},"n1297":{"id":"n1297","loc":[-85.630496,41.956889]},"n1298":{"id":"n1298","loc":[-85.630501,41.956947]},"n1299":{"id":"n1299","loc":[-85.630377,41.956953]},"n13":{"id":"n13","loc":[-85.633643,41.941143]},"n130":{"id":"n130","loc":[-85.63748,41.941994]},"n1300":{"id":"n1300","loc":[-85.630359,41.956938]},"n1301":{"id":"n1301","loc":[-85.630359,41.956912]},"n1302":{"id":"n1302","loc":[-85.63038,41.956894]},"n1303":{"id":"n1303","loc":[-85.630679,41.956747]},"n1304":{"id":"n1304","loc":[-85.630572,41.956748]},"n1305":{"id":"n1305","loc":[-85.63057,41.956668]},"n1306":{"id":"n1306","loc":[-85.630501,41.956669]},"n1307":{"id":"n1307","loc":[-85.630499,41.95659]},"n1308":{"id":"n1308","loc":[-85.630565,41.956589]},"n1309":{"id":"n1309","loc":[-85.630564,41.956541]},"n131":{"id":"n131","loc":[-85.637431,41.941832]},"n1310":{"id":"n1310","loc":[-85.630686,41.956539]},"n1311":{"id":"n1311","loc":[-85.630688,41.956631]},"n1312":{"id":"n1312","loc":[-85.630676,41.956631]},"n1313":{"id":"n1313","loc":[-85.630686,41.956487]},"n1314":{"id":"n1314","loc":[-85.63059,41.956487]},"n1315":{"id":"n1315","loc":[-85.63059,41.956396]},"n1316":{"id":"n1316","loc":[-85.630686,41.956396]},"n1317":{"id":"n1317","loc":[-85.630643,41.9563]},"n1318":{"id":"n1318","loc":[-85.630548,41.956301]},"n1319":{"id":"n1319","loc":[-85.630545,41.956217]},"n132":{"id":"n132","loc":[-85.637432,41.94189]},"n1320":{"id":"n1320","loc":[-85.630529,41.956214]},"n1321":{"id":"n1321","loc":[-85.630521,41.956202]},"n1322":{"id":"n1322","loc":[-85.63052,41.95618]},"n1323":{"id":"n1323","loc":[-85.630527,41.956169]},"n1324":{"id":"n1324","loc":[-85.630544,41.956163]},"n1325":{"id":"n1325","loc":[-85.630543,41.956094]},"n1326":{"id":"n1326","loc":[-85.630641,41.956093]},"n1327":{"id":"n1327","loc":[-85.630642,41.956134]},"n1328":{"id":"n1328","loc":[-85.630656,41.956134]},"n1329":{"id":"n1329","loc":[-85.630657,41.956252]},"n133":{"id":"n133","loc":[-85.637412,41.94189]},"n1330":{"id":"n1330","loc":[-85.630643,41.956252]},"n1331":{"id":"n1331","loc":[-85.630409,41.956044]},"n1332":{"id":"n1332","loc":[-85.630409,41.956075]},"n1333":{"id":"n1333","loc":[-85.630195,41.956078]},"n1334":{"id":"n1334","loc":[-85.630195,41.9561]},"n1335":{"id":"n1335","loc":[-85.630088,41.956101]},"n1336":{"id":"n1336","loc":[-85.630087,41.956048]},"n1337":{"id":"n1337","loc":[-85.630345,41.956114]},"n1338":{"id":"n1338","loc":[-85.630328,41.956113]},"n1339":{"id":"n1339","loc":[-85.63034,41.956189]},"n134":{"id":"n134","loc":[-85.637413,41.941938]},"n1340":{"id":"n1340","loc":[-85.630355,41.956185]},"n1341":{"id":"n1341","loc":[-85.630311,41.956117]},"n1342":{"id":"n1342","loc":[-85.630297,41.956125]},"n1343":{"id":"n1343","loc":[-85.630287,41.956136]},"n1344":{"id":"n1344","loc":[-85.630283,41.956149]},"n1345":{"id":"n1345","loc":[-85.630285,41.956162]},"n1346":{"id":"n1346","loc":[-85.630293,41.956174]},"n1347":{"id":"n1347","loc":[-85.630306,41.956183]},"n1348":{"id":"n1348","loc":[-85.630322,41.956188]},"n1349":{"id":"n1349","loc":[-85.630368,41.956179]},"n135":{"id":"n135","loc":[-85.637342,41.941939]},"n1350":{"id":"n1350","loc":[-85.630378,41.95617]},"n1351":{"id":"n1351","loc":[-85.630384,41.956159]},"n1352":{"id":"n1352","loc":[-85.630385,41.956147]},"n1353":{"id":"n1353","loc":[-85.630381,41.956136]},"n1354":{"id":"n1354","loc":[-85.630372,41.956126]},"n1355":{"id":"n1355","loc":[-85.63036,41.956118]},"n1356":{"id":"n1356","loc":[-85.630776,41.956041]},"n1357":{"id":"n1357","loc":[-85.630195,41.956036]},"n1358":{"id":"n1358","loc":[-85.630137,41.956037]},"n1359":{"id":"n1359","loc":[-85.630136,41.956006]},"n136":{"id":"n136","loc":[-85.637342,41.941914]},"n1360":{"id":"n1360","loc":[-85.630194,41.956005]},"n1361":{"id":"n1361","loc":[-85.629864,41.956039]},"n1362":{"id":"n1362","loc":[-85.629864,41.955862]},"n1363":{"id":"n1363","loc":[-85.629541,41.958291]},"n1364":{"id":"n1364","loc":[-85.629419,41.958292]},"n1365":{"id":"n1365","loc":[-85.629417,41.958168]},"n1366":{"id":"n1366","loc":[-85.629445,41.958168]},"n1367":{"id":"n1367","loc":[-85.629444,41.958109]},"n1368":{"id":"n1368","loc":[-85.629537,41.958108]},"n1369":{"id":"n1369","loc":[-85.629351,41.958136]},"n137":{"id":"n137","loc":[-85.637212,41.941916]},"n1370":{"id":"n1370","loc":[-85.629352,41.958202]},"n1371":{"id":"n1371","loc":[-85.629365,41.958202]},"n1372":{"id":"n1372","loc":[-85.629365,41.958223]},"n1373":{"id":"n1373","loc":[-85.629291,41.958224]},"n1374":{"id":"n1374","loc":[-85.62929,41.958137]},"n1375":{"id":"n1375","loc":[-85.629443,41.958073]},"n1376":{"id":"n1376","loc":[-85.629252,41.958075]},"n1377":{"id":"n1377","loc":[-85.629253,41.95827]},"n1378":{"id":"n1378","loc":[-85.629566,41.957585]},"n1379":{"id":"n1379","loc":[-85.629566,41.957692]},"n138":{"id":"n138","loc":[-85.637211,41.941835]},"n1380":{"id":"n1380","loc":[-85.629281,41.957693]},"n1381":{"id":"n1381","loc":[-85.62928,41.957585]},"n1382":{"id":"n1382","loc":[-85.629004,41.957599]},"n1383":{"id":"n1383","loc":[-85.629004,41.957682]},"n1384":{"id":"n1384","loc":[-85.628902,41.957682]},"n1385":{"id":"n1385","loc":[-85.628902,41.957723]},"n1386":{"id":"n1386","loc":[-85.628731,41.957724]},"n1387":{"id":"n1387","loc":[-85.628731,41.9576]},"n1388":{"id":"n1388","loc":[-85.62836,41.957679]},"n1389":{"id":"n1389","loc":[-85.628359,41.957759]},"n139":{"id":"n139","loc":[-85.637293,41.941834]},"n1390":{"id":"n1390","loc":[-85.628062,41.957757]},"n1391":{"id":"n1391","loc":[-85.628063,41.957657]},"n1392":{"id":"n1392","loc":[-85.628198,41.957657]},"n1393":{"id":"n1393","loc":[-85.628198,41.957678]},"n1394":{"id":"n1394","loc":[-85.627775,41.958095]},"n1395":{"id":"n1395","loc":[-85.627608,41.958095]},"n1396":{"id":"n1396","loc":[-85.627606,41.957829]},"n1397":{"id":"n1397","loc":[-85.627774,41.957829]},"n1398":{"id":"n1398","loc":[-85.626816,41.957636]},"n1399":{"id":"n1399","loc":[-85.626787,41.957681]},"n14":{"id":"n14","loc":[-85.633643,41.940122]},"n140":{"id":"n140","loc":[-85.637293,41.941823]},"n1400":{"id":"n1400","loc":[-85.626673,41.95764]},"n1401":{"id":"n1401","loc":[-85.626703,41.957594]},"n1402":{"id":"n1402","loc":[-85.62694,41.95752]},"n1403":{"id":"n1403","loc":[-85.62688,41.957611]},"n1404":{"id":"n1404","loc":[-85.626798,41.957582]},"n1405":{"id":"n1405","loc":[-85.626793,41.95759]},"n1406":{"id":"n1406","loc":[-85.626657,41.95754]},"n1407":{"id":"n1407","loc":[-85.626666,41.957526]},"n1408":{"id":"n1408","loc":[-85.626584,41.957497]},"n1409":{"id":"n1409","loc":[-85.626638,41.957415]},"n141":{"id":"n141","loc":[-85.637363,41.941822]},"n1410":{"id":"n1410","loc":[-85.626731,41.957449]},"n1411":{"id":"n1411","loc":[-85.626725,41.957457]},"n1412":{"id":"n1412","loc":[-85.626843,41.9575]},"n1413":{"id":"n1413","loc":[-85.626851,41.957487]},"n1414":{"id":"n1414","loc":[-85.626579,41.957521]},"n1415":{"id":"n1415","loc":[-85.626537,41.957587]},"n1416":{"id":"n1416","loc":[-85.626427,41.957551]},"n1417":{"id":"n1417","loc":[-85.626468,41.957483]},"n1418":{"id":"n1418","loc":[-85.626592,41.957639]},"n1419":{"id":"n1419","loc":[-85.626807,41.957713]},"n142":{"id":"n142","loc":[-85.637364,41.941833]},"n1420":{"id":"n1420","loc":[-85.627129,41.957401]},"n1421":{"id":"n1421","loc":[-85.627209,41.95742]},"n1422":{"id":"n1422","loc":[-85.627302,41.957435]},"n1423":{"id":"n1423","loc":[-85.629566,41.957048]},"n1424":{"id":"n1424","loc":[-85.629568,41.957215]},"n1425":{"id":"n1425","loc":[-85.629383,41.957216]},"n1426":{"id":"n1426","loc":[-85.629384,41.95727]},"n1427":{"id":"n1427","loc":[-85.629231,41.957271]},"n1428":{"id":"n1428","loc":[-85.62923,41.957198]},"n1429":{"id":"n1429","loc":[-85.629322,41.957198]},"n143":{"id":"n143","loc":[-85.637559,41.942448]},"n1430":{"id":"n1430","loc":[-85.629321,41.957108]},"n1431":{"id":"n1431","loc":[-85.629441,41.957108]},"n1432":{"id":"n1432","loc":[-85.62944,41.957049]},"n1433":{"id":"n1433","loc":[-85.629337,41.957018]},"n1434":{"id":"n1434","loc":[-85.629366,41.957028]},"n1435":{"id":"n1435","loc":[-85.629375,41.957044]},"n1436":{"id":"n1436","loc":[-85.629354,41.957071]},"n1437":{"id":"n1437","loc":[-85.629317,41.957071]},"n1438":{"id":"n1438","loc":[-85.62929,41.957074]},"n1439":{"id":"n1439","loc":[-85.62927,41.957084]},"n144":{"id":"n144","loc":[-85.637036,41.942454]},"n1440":{"id":"n1440","loc":[-85.629232,41.957081]},"n1441":{"id":"n1441","loc":[-85.629222,41.957057]},"n1442":{"id":"n1442","loc":[-85.629259,41.957025]},"n1443":{"id":"n1443","loc":[-85.629293,41.957017]},"n1444":{"id":"n1444","loc":[-85.629251,41.957085]},"n1445":{"id":"n1445","loc":[-85.629235,41.957041]},"n1446":{"id":"n1446","loc":[-85.62937,41.95706]},"n1447":{"id":"n1447","loc":[-85.629531,41.956909]},"n1448":{"id":"n1448","loc":[-85.629408,41.956909]},"n1449":{"id":"n1449","loc":[-85.629402,41.956681]},"n145":{"id":"n145","loc":[-85.636692,41.942828]},"n1450":{"id":"n1450","loc":[-85.62953,41.956681]},"n1451":{"id":"n1451","loc":[-85.629402,41.956728]},"n1452":{"id":"n1452","loc":[-85.629408,41.956845]},"n1453":{"id":"n1453","loc":[-85.629385,41.956845]},"n1454":{"id":"n1454","loc":[-85.629384,41.956728]},"n1455":{"id":"n1455","loc":[-85.629063,41.956973]},"n1456":{"id":"n1456","loc":[-85.629064,41.957009]},"n1457":{"id":"n1457","loc":[-85.62902,41.957009]},"n1458":{"id":"n1458","loc":[-85.629019,41.956973]},"n1459":{"id":"n1459","loc":[-85.629136,41.956633]},"n146":{"id":"n146","loc":[-85.635929,41.942826]},"n1460":{"id":"n1460","loc":[-85.629084,41.956632]},"n1461":{"id":"n1461","loc":[-85.629084,41.956605]},"n1462":{"id":"n1462","loc":[-85.629136,41.956605]},"n1463":{"id":"n1463","loc":[-85.629153,41.956657]},"n1464":{"id":"n1464","loc":[-85.627914,41.956661]},"n1465":{"id":"n1465","loc":[-85.630096,41.956101]},"n1466":{"id":"n1466","loc":[-85.630097,41.95612]},"n1467":{"id":"n1467","loc":[-85.630011,41.956121]},"n1468":{"id":"n1468","loc":[-85.630015,41.956374]},"n1469":{"id":"n1469","loc":[-85.629148,41.95626]},"n147":{"id":"n147","loc":[-85.636433,41.942828]},"n1470":{"id":"n1470","loc":[-85.629527,41.956591]},"n1471":{"id":"n1471","loc":[-85.629405,41.956591]},"n1472":{"id":"n1472","loc":[-85.629405,41.956459]},"n1473":{"id":"n1473","loc":[-85.629369,41.956459]},"n1474":{"id":"n1474","loc":[-85.629369,41.956424]},"n1475":{"id":"n1475","loc":[-85.629413,41.956424]},"n1476":{"id":"n1476","loc":[-85.629414,41.956326]},"n1477":{"id":"n1477","loc":[-85.629522,41.956326]},"n1478":{"id":"n1478","loc":[-85.629522,41.956487]},"n1479":{"id":"n1479","loc":[-85.629527,41.956487]},"n148":{"id":"n148","loc":[-85.636435,41.942864],"tags":{"entrance":"yes"}},"n1480":{"id":"n1480","loc":[-85.629414,41.95634]},"n1481":{"id":"n1481","loc":[-85.629149,41.956338]},"n1482":{"id":"n1482","loc":[-85.62931,41.956531]},"n1483":{"id":"n1483","loc":[-85.629291,41.95655]},"n1484":{"id":"n1484","loc":[-85.629255,41.95655]},"n1485":{"id":"n1485","loc":[-85.629236,41.956533]},"n1486":{"id":"n1486","loc":[-85.629237,41.956461]},"n1487":{"id":"n1487","loc":[-85.629257,41.956445]},"n1488":{"id":"n1488","loc":[-85.629257,41.956428]},"n1489":{"id":"n1489","loc":[-85.629287,41.956428]},"n149":{"id":"n149","loc":[-85.637235,41.942622]},"n1490":{"id":"n1490","loc":[-85.629287,41.956445]},"n1491":{"id":"n1491","loc":[-85.62931,41.95646]},"n1492":{"id":"n1492","loc":[-85.629049,41.956425]},"n1493":{"id":"n1493","loc":[-85.628907,41.956427]},"n1494":{"id":"n1494","loc":[-85.628907,41.956455]},"n1495":{"id":"n1495","loc":[-85.628841,41.956455]},"n1496":{"id":"n1496","loc":[-85.62884,41.956424]},"n1497":{"id":"n1497","loc":[-85.628764,41.956425]},"n1498":{"id":"n1498","loc":[-85.628762,41.956323]},"n1499":{"id":"n1499","loc":[-85.628808,41.956323]},"n15":{"id":"n15","loc":[-85.633477,41.940187]},"n150":{"id":"n150","loc":[-85.637247,41.943116]},"n1500":{"id":"n1500","loc":[-85.628808,41.956314]},"n1501":{"id":"n1501","loc":[-85.628911,41.956313]},"n1502":{"id":"n1502","loc":[-85.628911,41.956322]},"n1503":{"id":"n1503","loc":[-85.62896,41.956322]},"n1504":{"id":"n1504","loc":[-85.62896,41.956348]},"n1505":{"id":"n1505","loc":[-85.629047,41.956347]},"n1506":{"id":"n1506","loc":[-85.628893,41.957263]},"n1507":{"id":"n1507","loc":[-85.628788,41.957264]},"n1508":{"id":"n1508","loc":[-85.628786,41.95711]},"n1509":{"id":"n1509","loc":[-85.628894,41.957109]},"n151":{"id":"n151","loc":[-85.637564,41.943116]},"n1510":{"id":"n1510","loc":[-85.628893,41.957075]},"n1511":{"id":"n1511","loc":[-85.628965,41.957075]},"n1512":{"id":"n1512","loc":[-85.628965,41.957111]},"n1513":{"id":"n1513","loc":[-85.629035,41.95711]},"n1514":{"id":"n1514","loc":[-85.629036,41.957209]},"n1515":{"id":"n1515","loc":[-85.628893,41.95721]},"n1516":{"id":"n1516","loc":[-85.631348,41.95773]},"n1517":{"id":"n1517","loc":[-85.631101,41.957732]},"n1518":{"id":"n1518","loc":[-85.631099,41.957558]},"n1519":{"id":"n1519","loc":[-85.63123,41.957557]},"n152":{"id":"n152","loc":[-85.637552,41.942619]},"n1520":{"id":"n1520","loc":[-85.631231,41.957618]},"n1521":{"id":"n1521","loc":[-85.63129,41.957618]},"n1522":{"id":"n1522","loc":[-85.63129,41.957651]},"n1523":{"id":"n1523","loc":[-85.631346,41.957651]},"n1524":{"id":"n1524","loc":[-85.631366,41.95802]},"n1525":{"id":"n1525","loc":[-85.631141,41.958021]},"n1526":{"id":"n1526","loc":[-85.63114,41.957943]},"n1527":{"id":"n1527","loc":[-85.631167,41.957943]},"n1528":{"id":"n1528","loc":[-85.631166,41.957808]},"n1529":{"id":"n1529","loc":[-85.631301,41.957807]},"n153":{"id":"n153","loc":[-85.63763,41.942528]},"n1530":{"id":"n1530","loc":[-85.631302,41.95789]},"n1531":{"id":"n1531","loc":[-85.631364,41.95789]},"n1532":{"id":"n1532","loc":[-85.631539,41.957754]},"n1533":{"id":"n1533","loc":[-85.631069,41.957756]},"n1534":{"id":"n1534","loc":[-85.631536,41.957518]},"n1535":{"id":"n1535","loc":[-85.631543,41.957995]},"n1536":{"id":"n1536","loc":[-85.631531,41.957748]},"n1537":{"id":"n1537","loc":[-85.631485,41.957748]},"n1538":{"id":"n1538","loc":[-85.631484,41.957698]},"n1539":{"id":"n1539","loc":[-85.631531,41.957698]},"n154":{"id":"n154","loc":[-85.637151,41.94253]},"n1540":{"id":"n1540","loc":[-85.631586,41.957742]},"n1541":{"id":"n1541","loc":[-85.63155,41.957742]},"n1542":{"id":"n1542","loc":[-85.631551,41.957702]},"n1543":{"id":"n1543","loc":[-85.631587,41.957702]},"n1544":{"id":"n1544","loc":[-85.631534,41.95807]},"n1545":{"id":"n1545","loc":[-85.631534,41.958097]},"n1546":{"id":"n1546","loc":[-85.631491,41.958097]},"n1547":{"id":"n1547","loc":[-85.631491,41.95807]},"n1548":{"id":"n1548","loc":[-85.631304,41.958861]},"n1549":{"id":"n1549","loc":[-85.631186,41.958862]},"n155":{"id":"n155","loc":[-85.63715,41.942424]},"n1550":{"id":"n1550","loc":[-85.631182,41.958653]},"n1551":{"id":"n1551","loc":[-85.6313,41.958651]},"n1552":{"id":"n1552","loc":[-85.631293,41.95854]},"n1553":{"id":"n1553","loc":[-85.631176,41.958539]},"n1554":{"id":"n1554","loc":[-85.631176,41.958377]},"n1555":{"id":"n1555","loc":[-85.631297,41.958377]},"n1556":{"id":"n1556","loc":[-85.631297,41.958422]},"n1557":{"id":"n1557","loc":[-85.631333,41.958422]},"n1558":{"id":"n1558","loc":[-85.631333,41.958479]},"n1559":{"id":"n1559","loc":[-85.631293,41.958479]},"n156":{"id":"n156","loc":[-85.637629,41.942422]},"n1560":{"id":"n1560","loc":[-85.631951,41.958908]},"n1561":{"id":"n1561","loc":[-85.631838,41.958909]},"n1562":{"id":"n1562","loc":[-85.631837,41.958847]},"n1563":{"id":"n1563","loc":[-85.631859,41.958847]},"n1564":{"id":"n1564","loc":[-85.631858,41.958746]},"n1565":{"id":"n1565","loc":[-85.631961,41.958745]},"n1566":{"id":"n1566","loc":[-85.631962,41.958812]},"n1567":{"id":"n1567","loc":[-85.631949,41.958813]},"n1568":{"id":"n1568","loc":[-85.631579,41.958913]},"n1569":{"id":"n1569","loc":[-85.631567,41.95864]},"n157":{"id":"n157","loc":[-85.638232,41.942477]},"n1570":{"id":"n1570","loc":[-85.631942,41.958639]},"n1571":{"id":"n1571","loc":[-85.631543,41.958594]},"n1572":{"id":"n1572","loc":[-85.631543,41.958065]},"n1573":{"id":"n1573","loc":[-85.631888,41.958546]},"n1574":{"id":"n1574","loc":[-85.631804,41.958546]},"n1575":{"id":"n1575","loc":[-85.631803,41.95841]},"n1576":{"id":"n1576","loc":[-85.631886,41.958409]},"n1577":{"id":"n1577","loc":[-85.631897,41.958125]},"n1578":{"id":"n1578","loc":[-85.631755,41.958126]},"n1579":{"id":"n1579","loc":[-85.631756,41.958174]},"n158":{"id":"n158","loc":[-85.637775,41.942483]},"n1580":{"id":"n1580","loc":[-85.63178,41.958174]},"n1581":{"id":"n1581","loc":[-85.631782,41.958272]},"n1582":{"id":"n1582","loc":[-85.631922,41.958271]},"n1583":{"id":"n1583","loc":[-85.631922,41.958244]},"n1584":{"id":"n1584","loc":[-85.631883,41.958245]},"n1585":{"id":"n1585","loc":[-85.631882,41.958175]},"n1586":{"id":"n1586","loc":[-85.631898,41.958175]},"n1587":{"id":"n1587","loc":[-85.631924,41.958032]},"n1588":{"id":"n1588","loc":[-85.631762,41.958032]},"n1589":{"id":"n1589","loc":[-85.63176,41.957827]},"n159":{"id":"n159","loc":[-85.638107,41.942512]},"n1590":{"id":"n1590","loc":[-85.631888,41.957826]},"n1591":{"id":"n1591","loc":[-85.631888,41.957892]},"n1592":{"id":"n1592","loc":[-85.631871,41.957892]},"n1593":{"id":"n1593","loc":[-85.631872,41.957949]},"n1594":{"id":"n1594","loc":[-85.631923,41.957949]},"n1595":{"id":"n1595","loc":[-85.631695,41.95795]},"n1596":{"id":"n1596","loc":[-85.631666,41.957975]},"n1597":{"id":"n1597","loc":[-85.63163,41.957975]},"n1598":{"id":"n1598","loc":[-85.6316,41.957951]},"n1599":{"id":"n1599","loc":[-85.6316,41.95785]},"n16":{"id":"n16","loc":[-85.63341,41.94032]},"n160":{"id":"n160","loc":[-85.637763,41.942514]},"n1600":{"id":"n1600","loc":[-85.63166,41.95785]},"n1601":{"id":"n1601","loc":[-85.631696,41.957873]},"n1602":{"id":"n1602","loc":[-85.631924,41.957762]},"n1603":{"id":"n1603","loc":[-85.631762,41.957762]},"n1604":{"id":"n1604","loc":[-85.631762,41.957708]},"n1605":{"id":"n1605","loc":[-85.631785,41.957708]},"n1606":{"id":"n1606","loc":[-85.631785,41.957606]},"n1607":{"id":"n1607","loc":[-85.631734,41.957606]},"n1608":{"id":"n1608","loc":[-85.631734,41.957538]},"n1609":{"id":"n1609","loc":[-85.631821,41.957538]},"n161":{"id":"n161","loc":[-85.637763,41.942445]},"n1610":{"id":"n1610","loc":[-85.631935,41.957545]},"n1611":{"id":"n1611","loc":[-85.631821,41.957544]},"n1612":{"id":"n1612","loc":[-85.631935,41.957645]},"n1613":{"id":"n1613","loc":[-85.631924,41.957645]},"n1614":{"id":"n1614","loc":[-85.627135,41.953828]},"n1615":{"id":"n1615","loc":[-85.633517,41.941353],"tags":{"man_made":"lighthouse"}},"n1616":{"id":"n1616","loc":[-85.633659,41.942041],"tags":{"amenity":"bbq"}},"n1617":{"id":"n1617","loc":[-85.63662,41.942911],"tags":{"amenity":"toilets"}},"n1618":{"id":"n1618","loc":[-85.637487,41.943876],"tags":{"amenity":"toilets"}},"n1619":{"id":"n1619","loc":[-85.634938,41.941917],"tags":{"amenity":"toilets"}},"n162":{"id":"n162","loc":[-85.638107,41.942443]},"n1620":{"id":"n1620","loc":[-85.632427,41.941678],"tags":{"amenity":"bbq"}},"n1621":{"id":"n1621","loc":[-85.638033,41.944568],"tags":{"amenity":"bbq"}},"n1622":{"id":"n1622","loc":[-85.638052,41.944522],"tags":{"amenity":"bbq"}},"n1623":{"id":"n1623","loc":[-85.635001,41.941965]},"n1624":{"id":"n1624","loc":[-85.634635,41.941884]},"n1625":{"id":"n1625","loc":[-85.634667,41.941894]},"n1626":{"id":"n1626","loc":[-85.634791,41.942011]},"n1627":{"id":"n1627","loc":[-85.634749,41.941938]},"n1628":{"id":"n1628","loc":[-85.627295,41.953946],"tags":{"barrier":"gate"}},"n1629":{"id":"n1629","loc":[-85.629076,41.954689]},"n163":{"id":"n163","loc":[-85.638813,41.942475]},"n1630":{"id":"n1630","loc":[-85.640667,41.942595]},"n1631":{"id":"n1631","loc":[-85.639455,41.94261]},"n1632":{"id":"n1632","loc":[-85.643407,41.942336]},"n1633":{"id":"n1633","loc":[-85.641845,41.941316]},"n1634":{"id":"n1634","loc":[-85.643322,41.942224]},"n1635":{"id":"n1635","loc":[-85.643301,41.942124]},"n1636":{"id":"n1636","loc":[-85.640639,41.941326]},"n1637":{"id":"n1637","loc":[-85.640614,41.940058]},"n1638":{"id":"n1638","loc":[-85.639428,41.941335]},"n1639":{"id":"n1639","loc":[-85.643078,41.941293]},"n164":{"id":"n164","loc":[-85.63883,41.942422]},"n1640":{"id":"n1640","loc":[-85.64371,41.942302]},"n1641":{"id":"n1641","loc":[-85.643056,41.94001]},"n1642":{"id":"n1642","loc":[-85.643097,41.942575],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n1643":{"id":"n1643","loc":[-85.641855,41.942586]},"n1644":{"id":"n1644","loc":[-85.643549,41.942209]},"n1645":{"id":"n1645","loc":[-85.639359,41.94007]},"n1646":{"id":"n1646","loc":[-85.642797,41.940522]},"n1647":{"id":"n1647","loc":[-85.642589,41.940523]},"n1648":{"id":"n1648","loc":[-85.642587,41.940287]},"n1649":{"id":"n1649","loc":[-85.642797,41.940286]},"n165":{"id":"n165","loc":[-85.63883,41.942508]},"n1650":{"id":"n1650","loc":[-85.642571,41.940523]},"n1651":{"id":"n1651","loc":[-85.642568,41.940286]},"n1652":{"id":"n1652","loc":[-85.642316,41.940289]},"n1653":{"id":"n1653","loc":[-85.642321,41.940436]},"n1654":{"id":"n1654","loc":[-85.642292,41.940458]},"n1655":{"id":"n1655","loc":[-85.642287,41.940483]},"n1656":{"id":"n1656","loc":[-85.642323,41.940509]},"n1657":{"id":"n1657","loc":[-85.642385,41.940511]},"n1658":{"id":"n1658","loc":[-85.642408,41.940526]},"n1659":{"id":"n1659","loc":[-85.641962,41.94109]},"n166":{"id":"n166","loc":[-85.638364,41.942508]},"n1660":{"id":"n1660","loc":[-85.642753,41.941084]},"n1661":{"id":"n1661","loc":[-85.642752,41.941004]},"n1662":{"id":"n1662","loc":[-85.642806,41.941003]},"n1663":{"id":"n1663","loc":[-85.642803,41.940731]},"n1664":{"id":"n1664","loc":[-85.642741,41.940732]},"n1665":{"id":"n1665","loc":[-85.64274,41.940645]},"n1666":{"id":"n1666","loc":[-85.641957,41.940651]},"n1667":{"id":"n1667","loc":[-85.642937,41.941241]},"n1668":{"id":"n1668","loc":[-85.641776,41.941253]},"n1669":{"id":"n1669","loc":[-85.641766,41.940598]},"n167":{"id":"n167","loc":[-85.638836,41.942167]},"n1670":{"id":"n1670","loc":[-85.64198,41.940598]},"n1671":{"id":"n1671","loc":[-85.641961,41.940137]},"n1672":{"id":"n1672","loc":[-85.642934,41.94012]},"n1673":{"id":"n1673","loc":[-85.643074,41.941173]},"n1674":{"id":"n1674","loc":[-85.642841,41.940997]},"n1675":{"id":"n1675","loc":[-85.642839,41.940721]},"n1676":{"id":"n1676","loc":[-85.643065,41.940552]},"n1677":{"id":"n1677","loc":[-85.642732,41.94124]},"n1678":{"id":"n1678","loc":[-85.641815,41.941246]},"n1679":{"id":"n1679","loc":[-85.641813,41.941132]},"n168":{"id":"n168","loc":[-85.638836,41.94229]},"n1680":{"id":"n1680","loc":[-85.641839,41.941111]},"n1681":{"id":"n1681","loc":[-85.641884,41.941098]},"n1682":{"id":"n1682","loc":[-85.642732,41.941092]},"n1683":{"id":"n1683","loc":[-85.642776,41.941302]},"n1684":{"id":"n1684","loc":[-85.632788,41.946236]},"n1685":{"id":"n1685","loc":[-85.622342,41.953127]},"n1686":{"id":"n1686","loc":[-85.641848,41.941167]},"n1687":{"id":"n1687","loc":[-85.643753,41.941503]},"n1688":{"id":"n1688","loc":[-85.643762,41.942119]},"n1689":{"id":"n1689","loc":[-85.64238,41.942262]},"n169":{"id":"n169","loc":[-85.638594,41.94229]},"n1690":{"id":"n1690","loc":[-85.642374,41.941944]},"n1691":{"id":"n1691","loc":[-85.642518,41.941943]},"n1692":{"id":"n1692","loc":[-85.642519,41.94198]},"n1693":{"id":"n1693","loc":[-85.642831,41.941977]},"n1694":{"id":"n1694","loc":[-85.642837,41.942312]},"n1695":{"id":"n1695","loc":[-85.642495,41.942315]},"n1696":{"id":"n1696","loc":[-85.642494,41.942261]},"n1697":{"id":"n1697","loc":[-85.641087,41.942433]},"n1698":{"id":"n1698","loc":[-85.641081,41.942006]},"n1699":{"id":"n1699","loc":[-85.641244,41.942005]},"n17":{"id":"n17","loc":[-85.633478,41.94081]},"n170":{"id":"n170","loc":[-85.638594,41.942422]},"n1700":{"id":"n1700","loc":[-85.64125,41.942431]},"n1701":{"id":"n1701","loc":[-85.641331,41.942968]},"n1702":{"id":"n1702","loc":[-85.641328,41.942713]},"n1703":{"id":"n1703","loc":[-85.641521,41.942712]},"n1704":{"id":"n1704","loc":[-85.641523,41.942924]},"n1705":{"id":"n1705","loc":[-85.641504,41.942924]},"n1706":{"id":"n1706","loc":[-85.641505,41.942967]},"n1707":{"id":"n1707","loc":[-85.638612,41.942408]},"n1708":{"id":"n1708","loc":[-85.638612,41.942327]},"n1709":{"id":"n1709","loc":[-85.638775,41.942327]},"n171":{"id":"n171","loc":[-85.638364,41.942356]},"n1710":{"id":"n1710","loc":[-85.638775,41.942299]},"n1711":{"id":"n1711","loc":[-85.638835,41.942298]},"n1712":{"id":"n1712","loc":[-85.638835,41.942407]},"n1713":{"id":"n1713","loc":[-85.639116,41.942444]},"n1714":{"id":"n1714","loc":[-85.639114,41.942362]},"n1715":{"id":"n1715","loc":[-85.639294,41.94236]},"n1716":{"id":"n1716","loc":[-85.639296,41.942442]},"n1717":{"id":"n1717","loc":[-85.639808,41.942385]},"n1718":{"id":"n1718","loc":[-85.639805,41.942285]},"n1719":{"id":"n1719","loc":[-85.639988,41.942283]},"n172":{"id":"n172","loc":[-85.638364,41.942167]},"n1720":{"id":"n1720","loc":[-85.63999,41.942383]},"n1721":{"id":"n1721","loc":[-85.639633,41.943023]},"n1722":{"id":"n1722","loc":[-85.639867,41.943019]},"n1723":{"id":"n1723","loc":[-85.639866,41.942964]},"n1724":{"id":"n1724","loc":[-85.639888,41.942963]},"n1725":{"id":"n1725","loc":[-85.639883,41.942779]},"n1726":{"id":"n1726","loc":[-85.639851,41.94278]},"n1727":{"id":"n1727","loc":[-85.63985,41.94274]},"n1728":{"id":"n1728","loc":[-85.639789,41.942741]},"n1729":{"id":"n1729","loc":[-85.639789,41.942753]},"n173":{"id":"n173","loc":[-85.639038,41.942463]},"n1730":{"id":"n1730","loc":[-85.639698,41.942754]},"n1731":{"id":"n1731","loc":[-85.639699,41.942788]},"n1732":{"id":"n1732","loc":[-85.639675,41.942789]},"n1733":{"id":"n1733","loc":[-85.639676,41.94283]},"n1734":{"id":"n1734","loc":[-85.639701,41.942829]},"n1735":{"id":"n1735","loc":[-85.639702,41.942869]},"n1736":{"id":"n1736","loc":[-85.639629,41.94287]},"n1737":{"id":"n1737","loc":[-85.643568,41.942946]},"n1738":{"id":"n1738","loc":[-85.643568,41.942777]},"n1739":{"id":"n1739","loc":[-85.643401,41.942777]},"n174":{"id":"n174","loc":[-85.638897,41.942464]},"n1740":{"id":"n1740","loc":[-85.643401,41.942863]},"n1741":{"id":"n1741","loc":[-85.643448,41.942863]},"n1742":{"id":"n1742","loc":[-85.643448,41.942946]},"n1743":{"id":"n1743","loc":[-85.642836,41.942981]},"n1744":{"id":"n1744","loc":[-85.642917,41.942979]},"n1745":{"id":"n1745","loc":[-85.642914,41.942904]},"n1746":{"id":"n1746","loc":[-85.642938,41.942903]},"n1747":{"id":"n1747","loc":[-85.642935,41.942813]},"n1748":{"id":"n1748","loc":[-85.642775,41.942816]},"n1749":{"id":"n1749","loc":[-85.642778,41.942906]},"n175":{"id":"n175","loc":[-85.638897,41.942423]},"n1750":{"id":"n1750","loc":[-85.642833,41.942905]},"n1751":{"id":"n1751","loc":[-85.642302,41.942886]},"n1752":{"id":"n1752","loc":[-85.642299,41.942721]},"n1753":{"id":"n1753","loc":[-85.642422,41.94272]},"n1754":{"id":"n1754","loc":[-85.642425,41.942868]},"n1755":{"id":"n1755","loc":[-85.642385,41.942869]},"n1756":{"id":"n1756","loc":[-85.642385,41.942885]},"n1757":{"id":"n1757","loc":[-85.641533,41.942939]},"n1758":{"id":"n1758","loc":[-85.64161,41.942877]},"n1759":{"id":"n1759","loc":[-85.641676,41.942922]},"n176":{"id":"n176","loc":[-85.638853,41.942423]},"n1760":{"id":"n1760","loc":[-85.6416,41.942985]},"n1761":{"id":"n1761","loc":[-85.64206,41.942802]},"n1762":{"id":"n1762","loc":[-85.642059,41.942741]},"n1763":{"id":"n1763","loc":[-85.642196,41.942741]},"n1764":{"id":"n1764","loc":[-85.642196,41.942818]},"n1765":{"id":"n1765","loc":[-85.642128,41.942819]},"n1766":{"id":"n1766","loc":[-85.642128,41.942801]},"n1767":{"id":"n1767","loc":[-85.640943,41.942934]},"n1768":{"id":"n1768","loc":[-85.641035,41.942933]},"n1769":{"id":"n1769","loc":[-85.641032,41.942797]},"n177":{"id":"n177","loc":[-85.638852,41.94237]},"n1770":{"id":"n1770","loc":[-85.640997,41.942798]},"n1771":{"id":"n1771","loc":[-85.640996,41.942764]},"n1772":{"id":"n1772","loc":[-85.640861,41.942766]},"n1773":{"id":"n1773","loc":[-85.640862,41.942848]},"n1774":{"id":"n1774","loc":[-85.640941,41.942847]},"n1775":{"id":"n1775","loc":[-85.643766,41.942226]},"n1776":{"id":"n1776","loc":[-85.643768,41.942407]},"n1777":{"id":"n1777","loc":[-85.643218,41.94177]},"n1778":{"id":"n1778","loc":[-85.64321,41.941327]},"n1779":{"id":"n1779","loc":[-85.643649,41.941323]},"n178":{"id":"n178","loc":[-85.638892,41.94237]},"n1780":{"id":"n1780","loc":[-85.643656,41.941716]},"n1781":{"id":"n1781","loc":[-85.64358,41.941717]},"n1782":{"id":"n1782","loc":[-85.64358,41.941767]},"n1783":{"id":"n1783","loc":[-85.64382,41.941495]},"n1784":{"id":"n1784","loc":[-85.643817,41.941317]},"n1785":{"id":"n1785","loc":[-85.643235,41.941833]},"n1786":{"id":"n1786","loc":[-85.64335,41.941842]},"n1787":{"id":"n1787","loc":[-85.643504,41.941903]},"n1788":{"id":"n1788","loc":[-85.643554,41.941946]},"n1789":{"id":"n1789","loc":[-85.643618,41.942015]},"n179":{"id":"n179","loc":[-85.638891,41.942334]},"n1790":{"id":"n1790","loc":[-85.64346,41.941971]},"n1791":{"id":"n1791","loc":[-85.643528,41.942468]},"n1792":{"id":"n1792","loc":[-85.643621,41.942363]},"n1793":{"id":"n1793","loc":[-85.643496,41.942297]},"n1794":{"id":"n1794","loc":[-85.643446,41.942246]},"n1795":{"id":"n1795","loc":[-85.643398,41.942177]},"n1796":{"id":"n1796","loc":[-85.643398,41.942031]},"n1797":{"id":"n1797","loc":[-85.621531,41.952693]},"n1798":{"id":"n1798","loc":[-85.643221,41.942028]},"n1799":{"id":"n1799","loc":[-85.643225,41.942276]},"n18":{"id":"n18","loc":[-85.63345,41.94071]},"n180":{"id":"n180","loc":[-85.639037,41.942334]},"n1800":{"id":"n1800","loc":[-85.643265,41.942347]},"n1801":{"id":"n1801","loc":[-85.643323,41.942413]},"n1802":{"id":"n1802","loc":[-85.643411,41.94247]},"n1803":{"id":"n1803","loc":[-85.643459,41.942435]},"n1804":{"id":"n1804","loc":[-85.643767,41.942307]},"n1805":{"id":"n1805","loc":[-85.643661,41.942293]},"n1806":{"id":"n1806","loc":[-85.643578,41.942247]},"n1807":{"id":"n1807","loc":[-85.643522,41.942125]},"n1808":{"id":"n1808","loc":[-85.643515,41.942061]},"n1809":{"id":"n1809","loc":[-85.643346,41.941924]},"n181":{"id":"n181","loc":[-85.638074,41.941839]},"n1810":{"id":"n1810","loc":[-85.643086,41.94192]},"n1811":{"id":"n1811","loc":[-85.643529,41.94217]},"n1812":{"id":"n1812","loc":[-85.643489,41.942003]},"n1813":{"id":"n1813","loc":[-85.643295,41.941919]},"n1814":{"id":"n1814","loc":[-85.643305,41.942163]},"n1815":{"id":"n1815","loc":[-85.643354,41.942285]},"n1816":{"id":"n1816","loc":[-85.643472,41.942389]},"n1817":{"id":"n1817","loc":[-85.643608,41.942271]},"n1818":{"id":"n1818","loc":[-85.643876,41.941402]},"n1819":{"id":"n1819","loc":[-85.643818,41.941369]},"n182":{"id":"n182","loc":[-85.638076,41.941942]},"n1820":{"id":"n1820","loc":[-85.643682,41.941304]},"n1821":{"id":"n1821","loc":[-85.64359,41.941286]},"n1822":{"id":"n1822","loc":[-85.643317,41.941727]},"n1823":{"id":"n1823","loc":[-85.643301,41.941286]},"n1824":{"id":"n1824","loc":[-85.643553,41.941698]},"n1825":{"id":"n1825","loc":[-85.643543,41.941286]},"n1826":{"id":"n1826","loc":[-85.636967,41.940118]},"n1827":{"id":"n1827","loc":[-85.63378,41.940114]},"n1828":{"id":"n1828","loc":[-85.637254,41.940075]},"n1829":{"id":"n1829","loc":[-85.637002,41.941355]},"n183":{"id":"n183","loc":[-85.637955,41.941944]},"n1830":{"id":"n1830","loc":[-85.643532,41.94204]},"n1831":{"id":"n1831","loc":[-85.638235,41.942615]},"n1832":{"id":"n1832","loc":[-85.637039,41.942624]},"n1833":{"id":"n1833","loc":[-85.636369,41.94266]},"n1834":{"id":"n1834","loc":[-85.63582,41.942771],"tags":{"highway":"traffic_signals","traffic_signals":"emergency"}},"n1835":{"id":"n1835","loc":[-85.634873,41.943044]},"n1836":{"id":"n1836","loc":[-85.643482,41.941976]},"n1837":{"id":"n1837","loc":[-85.64345,41.941945]},"n1838":{"id":"n1838","loc":[-85.641885,41.943851]},"n1839":{"id":"n1839","loc":[-85.641915,41.945121]},"n184":{"id":"n184","loc":[-85.637953,41.94184]},"n1840":{"id":"n1840","loc":[-85.639454,41.943871]},"n1841":{"id":"n1841","loc":[-85.639491,41.945191]},"n1842":{"id":"n1842","loc":[-85.635768,41.940113]},"n1843":{"id":"n1843","loc":[-85.638206,41.941345]},"n1844":{"id":"n1844","loc":[-85.640721,41.94513]},"n1845":{"id":"n1845","loc":[-85.643137,41.945103]},"n1846":{"id":"n1846","loc":[-85.638199,41.940079]},"n1847":{"id":"n1847","loc":[-85.640688,41.943861]},"n1848":{"id":"n1848","loc":[-85.643397,41.941924]},"n1849":{"id":"n1849","loc":[-85.643117,41.943841]},"n185":{"id":"n185","loc":[-85.637953,41.941866]},"n1850":{"id":"n1850","loc":[-85.636731,41.94263]},"n1851":{"id":"n1851","loc":[-85.63518,41.942955],"tags":{"highway":"crossing"}},"n1852":{"id":"n1852","loc":[-85.636152,41.942695]},"n1853":{"id":"n1853","loc":[-85.644202,41.941499]},"n1854":{"id":"n1854","loc":[-85.644211,41.942116]},"n1855":{"id":"n1855","loc":[-85.644233,41.942404]},"n1856":{"id":"n1856","loc":[-85.644231,41.942223]},"n1857":{"id":"n1857","loc":[-85.644133,41.941315]},"n1858":{"id":"n1858","loc":[-85.644136,41.941493]},"n1859":{"id":"n1859","loc":[-85.644345,41.942307]},"n186":{"id":"n186","loc":[-85.637873,41.941867]},"n1860":{"id":"n1860","loc":[-85.644232,41.942304]},"n1861":{"id":"n1861","loc":[-85.644134,41.941403]},"n1862":{"id":"n1862","loc":[-85.63607,41.943005],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"fire_station","name":"Three Rivers Fire Department"}},"n1863":{"id":"n1863","loc":[-85.637,41.941236]},"n1864":{"id":"n1864","loc":[-85.634476,41.941475]},"n1865":{"id":"n1865","loc":[-85.635036,41.941858]},"n1866":{"id":"n1866","loc":[-85.635362,41.941962]},"n1867":{"id":"n1867","loc":[-85.635796,41.941962]},"n1868":{"id":"n1868","loc":[-85.63295,41.943006]},"n1869":{"id":"n1869","loc":[-85.634692,41.943098]},"n187":{"id":"n187","loc":[-85.637877,41.941975]},"n1870":{"id":"n1870","loc":[-85.633128,41.940484]},"n1871":{"id":"n1871","loc":[-85.633117,41.942798]},"n1872":{"id":"n1872","loc":[-85.633303,41.942412]},"n1873":{"id":"n1873","loc":[-85.633482,41.941912]},"n1874":{"id":"n1874","loc":[-85.633455,41.941359]},"n1875":{"id":"n1875","loc":[-85.633162,41.942679]},"n1876":{"id":"n1876","loc":[-85.634274,41.943479]},"n1877":{"id":"n1877","loc":[-85.634678,41.942909]},"n1878":{"id":"n1878","loc":[-85.6339,41.941453]},"n1879":{"id":"n1879","loc":[-85.634571,41.942774]},"n188":{"id":"n188","loc":[-85.636855,41.942488]},"n1880":{"id":"n1880","loc":[-85.63419,41.941732]},"n1881":{"id":"n1881","loc":[-85.634067,41.941565]},"n1882":{"id":"n1882","loc":[-85.63436,41.942358]},"n1883":{"id":"n1883","loc":[-85.634327,41.942247]},"n1884":{"id":"n1884","loc":[-85.633391,41.941231]},"n1885":{"id":"n1885","loc":[-85.634303,41.941972]},"n1886":{"id":"n1886","loc":[-85.633541,41.940147]},"n1887":{"id":"n1887","loc":[-85.633433,41.940252]},"n1888":{"id":"n1888","loc":[-85.633402,41.940411]},"n1889":{"id":"n1889","loc":[-85.633551,41.941023]},"n189":{"id":"n189","loc":[-85.636702,41.942488]},"n1890":{"id":"n1890","loc":[-85.633719,41.941186]},"n1891":{"id":"n1891","loc":[-85.633067,41.941845]},"n1892":{"id":"n1892","loc":[-85.634902,41.942766]},"n1893":{"id":"n1893","loc":[-85.634603,41.942202]},"n1894":{"id":"n1894","loc":[-85.634858,41.942152]},"n1895":{"id":"n1895","loc":[-85.634842,41.942269]},"n1896":{"id":"n1896","loc":[-85.634907,41.942313]},"n1897":{"id":"n1897","loc":[-85.635049,41.942331]},"n1898":{"id":"n1898","loc":[-85.635101,41.942281]},"n1899":{"id":"n1899","loc":[-85.635129,41.942144]},"n19":{"id":"n19","loc":[-85.633009,41.942229]},"n190":{"id":"n190","loc":[-85.636702,41.942434]},"n1900":{"id":"n1900","loc":[-85.635531,41.942143]},"n1901":{"id":"n1901","loc":[-85.635534,41.942577]},"n1902":{"id":"n1902","loc":[-85.635158,41.942656]},"n1903":{"id":"n1903","loc":[-85.635121,41.942703]},"n1904":{"id":"n1904","loc":[-85.635087,41.941508]},"n1905":{"id":"n1905","loc":[-85.63536,41.941106]},"n1906":{"id":"n1906","loc":[-85.635442,41.941094]},"n1907":{"id":"n1907","loc":[-85.635508,41.941104]},"n1908":{"id":"n1908","loc":[-85.635569,41.941125]},"n1909":{"id":"n1909","loc":[-85.635583,41.941106]},"n191":{"id":"n191","loc":[-85.636761,41.942434]},"n1910":{"id":"n1910","loc":[-85.635555,41.940976]},"n1911":{"id":"n1911","loc":[-85.635501,41.940915]},"n1912":{"id":"n1912","loc":[-85.635392,41.940922]},"n1913":{"id":"n1913","loc":[-85.635276,41.940974]},"n1914":{"id":"n1914","loc":[-85.63517,41.941204]},"n1915":{"id":"n1915","loc":[-85.634888,41.941517]},"n1916":{"id":"n1916","loc":[-85.634897,41.941576]},"n1917":{"id":"n1917","loc":[-85.634961,41.94164]},"n1918":{"id":"n1918","loc":[-85.635028,41.941659]},"n1919":{"id":"n1919","loc":[-85.635118,41.941621]},"n192":{"id":"n192","loc":[-85.636761,41.942369]},"n1920":{"id":"n1920","loc":[-85.635085,41.941558]},"n1921":{"id":"n1921","loc":[-85.63504,41.94136]},"n1922":{"id":"n1922","loc":[-85.635221,41.941077]},"n1923":{"id":"n1923","loc":[-85.634387,41.941559]},"n1924":{"id":"n1924","loc":[-85.634351,41.941587]},"n1925":{"id":"n1925","loc":[-85.634416,41.941756]},"n1926":{"id":"n1926","loc":[-85.634461,41.941797]},"n1927":{"id":"n1927","loc":[-85.634501,41.941819]},"n1928":{"id":"n1928","loc":[-85.634597,41.941816]},"n1929":{"id":"n1929","loc":[-85.634732,41.941724]},"n193":{"id":"n193","loc":[-85.636855,41.942369]},"n1930":{"id":"n1930","loc":[-85.634672,41.941775]},"n1931":{"id":"n1931","loc":[-85.633403,41.939101]},"n1932":{"id":"n1932","loc":[-85.633297,41.939397]},"n1933":{"id":"n1933","loc":[-85.633205,41.939674]},"n1934":{"id":"n1934","loc":[-85.63322,41.939777]},"n1935":{"id":"n1935","loc":[-85.633345,41.939936]},"n1936":{"id":"n1936","loc":[-85.633376,41.940002]},"n1937":{"id":"n1937","loc":[-85.633266,41.940228]},"n1938":{"id":"n1938","loc":[-85.633236,41.940352]},"n1939":{"id":"n1939","loc":[-85.633282,41.94063]},"n194":{"id":"n194","loc":[-85.636645,41.94249]},"n1940":{"id":"n1940","loc":[-85.633364,41.940874]},"n1941":{"id":"n1941","loc":[-85.633439,41.941052]},"n1942":{"id":"n1942","loc":[-85.633582,41.941172]},"n1943":{"id":"n1943","loc":[-85.633748,41.941273]},"n1944":{"id":"n1944","loc":[-85.634317,41.941527]},"n1945":{"id":"n1945","loc":[-85.634389,41.94174]},"n1946":{"id":"n1946","loc":[-85.634441,41.941801]},"n1947":{"id":"n1947","loc":[-85.634514,41.941837]},"n1948":{"id":"n1948","loc":[-85.634485,41.942005]},"n1949":{"id":"n1949","loc":[-85.63457,41.942202]},"n195":{"id":"n195","loc":[-85.636565,41.94249]},"n1950":{"id":"n1950","loc":[-85.634869,41.942769]},"n1951":{"id":"n1951","loc":[-85.634943,41.942792]},"n1952":{"id":"n1952","loc":[-85.635139,41.942882]},"n1953":{"id":"n1953","loc":[-85.634962,41.943161]},"n1954":{"id":"n1954","loc":[-85.635002,41.943131]},"n1955":{"id":"n1955","loc":[-85.635005,41.943091]},"n1956":{"id":"n1956","loc":[-85.635216,41.943033]},"n1957":{"id":"n1957","loc":[-85.634817,41.94267]},"n1958":{"id":"n1958","loc":[-85.634614,41.942599]},"n1959":{"id":"n1959","loc":[-85.634494,41.942381]},"n196":{"id":"n196","loc":[-85.636565,41.942474]},"n1960":{"id":"n1960","loc":[-85.634486,41.9423]},"n1961":{"id":"n1961","loc":[-85.634671,41.941795]},"n1962":{"id":"n1962","loc":[-85.634595,41.941831]},"n1963":{"id":"n1963","loc":[-85.634332,41.941866]},"n1964":{"id":"n1964","loc":[-85.634207,41.941885]},"n1965":{"id":"n1965","loc":[-85.634133,41.941892]},"n1966":{"id":"n1966","loc":[-85.634131,41.942203]},"n1967":{"id":"n1967","loc":[-85.634047,41.942327]},"n1968":{"id":"n1968","loc":[-85.634219,41.942793]},"n1969":{"id":"n1969","loc":[-85.634061,41.942392]},"n197":{"id":"n197","loc":[-85.636514,41.942474]},"n1970":{"id":"n1970","loc":[-85.633989,41.942407]},"n1971":{"id":"n1971","loc":[-85.633971,41.942356]},"n1972":{"id":"n1972","loc":[-85.63361,41.942423]},"n1973":{"id":"n1973","loc":[-85.633714,41.942682]},"n1974":{"id":"n1974","loc":[-85.633698,41.942863]},"n1975":{"id":"n1975","loc":[-85.633882,41.942865]},"n1976":{"id":"n1976","loc":[-85.633941,41.943007]},"n1977":{"id":"n1977","loc":[-85.633887,41.943035]},"n1978":{"id":"n1978","loc":[-85.633768,41.942815]},"n1979":{"id":"n1979","loc":[-85.633682,41.942351]},"n198":{"id":"n198","loc":[-85.636514,41.942326]},"n1980":{"id":"n1980","loc":[-85.634037,41.942273]},"n1981":{"id":"n1981","loc":[-85.634029,41.942252]},"n1982":{"id":"n1982","loc":[-85.633673,41.942331]},"n1983":{"id":"n1983","loc":[-85.634219,41.942571]},"n1984":{"id":"n1984","loc":[-85.634252,41.942565]},"n1985":{"id":"n1985","loc":[-85.634144,41.942299]},"n1986":{"id":"n1986","loc":[-85.634115,41.942306]},"n1987":{"id":"n1987","loc":[-85.634059,41.943094]},"n1988":{"id":"n1988","loc":[-85.633944,41.942903]},"n1989":{"id":"n1989","loc":[-85.634311,41.942821]},"n199":{"id":"n199","loc":[-85.636561,41.942326]},"n1990":{"id":"n1990","loc":[-85.634351,41.94277]},"n1991":{"id":"n1991","loc":[-85.634153,41.942254]},"n1992":{"id":"n1992","loc":[-85.634092,41.94222]},"n1993":{"id":"n1993","loc":[-85.633571,41.942336]},"n1994":{"id":"n1994","loc":[-85.633513,41.942387]},"n1995":{"id":"n1995","loc":[-85.633509,41.942455]},"n1996":{"id":"n1996","loc":[-85.63363,41.942665]},"n1997":{"id":"n1997","loc":[-85.63414,41.94286]},"n1998":{"id":"n1998","loc":[-85.63397,41.942449]},"n1999":{"id":"n1999","loc":[-85.633551,41.942529]},"n2":{"id":"n2","loc":[-85.627421,41.953877]},"n20":{"id":"n20","loc":[-85.633013,41.941438]},"n200":{"id":"n200","loc":[-85.636561,41.942311]},"n2000":{"id":"n2000","loc":[-85.633741,41.942493]},"n2001":{"id":"n2001","loc":[-85.633894,41.942869]},"n2002":{"id":"n2002","loc":[-85.634132,41.941954]},"n2003":{"id":"n2003","loc":[-85.634032,41.942038]},"n2004":{"id":"n2004","loc":[-85.633765,41.942238]},"n2005":{"id":"n2005","loc":[-85.63376,41.942268]},"n2006":{"id":"n2006","loc":[-85.633768,41.942293]},"n2007":{"id":"n2007","loc":[-85.633808,41.942386]},"n2008":{"id":"n2008","loc":[-85.634946,41.941663]},"n2009":{"id":"n2009","loc":[-85.63511,41.941697]},"n201":{"id":"n201","loc":[-85.636621,41.942311]},"n2010":{"id":"n2010","loc":[-85.635337,41.94168]},"n2011":{"id":"n2011","loc":[-85.634997,41.942251]},"n2012":{"id":"n2012","loc":[-85.635013,41.942173]},"n2013":{"id":"n2013","loc":[-85.634876,41.942157]},"n2014":{"id":"n2014","loc":[-85.634859,41.942235]},"n2015":{"id":"n2015","loc":[-85.634992,41.941951]},"n2016":{"id":"n2016","loc":[-85.634952,41.941877]},"n2017":{"id":"n2017","loc":[-85.634844,41.94191]},"n2018":{"id":"n2018","loc":[-85.634884,41.941983]},"n2019":{"id":"n2019","loc":[-85.635189,41.941691]},"n202":{"id":"n202","loc":[-85.636621,41.942351]},"n2020":{"id":"n2020","loc":[-85.635089,41.941896]},"n2021":{"id":"n2021","loc":[-85.635077,41.941964]},"n2022":{"id":"n2022","loc":[-85.635058,41.942147]},"n2023":{"id":"n2023","loc":[-85.635099,41.942161]},"n2024":{"id":"n2024","loc":[-85.635099,41.942213]},"n2025":{"id":"n2025","loc":[-85.635079,41.942285]},"n2026":{"id":"n2026","loc":[-85.635047,41.942316]},"n2027":{"id":"n2027","loc":[-85.634925,41.9423]},"n2028":{"id":"n2028","loc":[-85.634911,41.942276]},"n2029":{"id":"n2029","loc":[-85.634917,41.942242]},"n203":{"id":"n203","loc":[-85.63666,41.942351]},"n2030":{"id":"n2030","loc":[-85.634698,41.941898]},"n2031":{"id":"n2031","loc":[-85.634964,41.941878]},"n2032":{"id":"n2032","loc":[-85.635025,41.941929]},"n2033":{"id":"n2033","loc":[-85.634862,41.941887]},"n2034":{"id":"n2034","loc":[-85.634811,41.94181]},"n2035":{"id":"n2035","loc":[-85.634731,41.941745]},"n2036":{"id":"n2036","loc":[-85.634933,41.94176]},"n2037":{"id":"n2037","loc":[-85.634942,41.942145]},"n2038":{"id":"n2038","loc":[-85.634944,41.942065]},"n2039":{"id":"n2039","loc":[-85.634914,41.941996]},"n204":{"id":"n204","loc":[-85.63666,41.942453]},"n2040":{"id":"n2040","loc":[-85.634981,41.941979]},"n2041":{"id":"n2041","loc":[-85.633419,41.942172]},"n2042":{"id":"n2042","loc":[-85.633509,41.941631]},"n2043":{"id":"n2043","loc":[-85.633686,41.942937]},"n2044":{"id":"n2044","loc":[-85.633371,41.942722]},"n2045":{"id":"n2045","loc":[-85.633291,41.942538]},"n2046":{"id":"n2046","loc":[-85.633902,41.940941]},"n2047":{"id":"n2047","loc":[-85.635254,41.940939]},"n2048":{"id":"n2048","loc":[-85.635686,41.940829]},"n2049":{"id":"n2049","loc":[-85.635712,41.942681]},"n205":{"id":"n205","loc":[-85.636645,41.942453]},"n2050":{"id":"n2050","loc":[-85.633721,41.942118]},"n2051":{"id":"n2051","loc":[-85.633698,41.942057]},"n2052":{"id":"n2052","loc":[-85.633591,41.942079]},"n2053":{"id":"n2053","loc":[-85.633614,41.94214]},"n2054":{"id":"n2054","loc":[-85.633968,41.941099]},"n2055":{"id":"n2055","loc":[-85.633907,41.941138]},"n2056":{"id":"n2056","loc":[-85.633968,41.941197]},"n2057":{"id":"n2057","loc":[-85.63404,41.941162]},"n2058":{"id":"n2058","loc":[-85.634839,41.941665]},"n2059":{"id":"n2059","loc":[-85.635314,41.943035]},"n206":{"id":"n206","loc":[-85.636394,41.942471]},"n2060":{"id":"n2060","loc":[-85.634919,41.943142]},"n2061":{"id":"n2061","loc":[-85.636433,41.942959],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"townhall","name":"Three Rivers City Hall"}},"n2062":{"id":"n2062","loc":[-85.637039,41.942789]},"n2063":{"id":"n2063","loc":[-85.636333,41.94279]},"n2064":{"id":"n2064","loc":[-85.634484,41.940726]},"n2065":{"id":"n2065","loc":[-85.634483,41.940603]},"n2066":{"id":"n2066","loc":[-85.634908,41.940601]},"n2067":{"id":"n2067","loc":[-85.634908,41.94053]},"n2068":{"id":"n2068","loc":[-85.634934,41.94053]},"n2069":{"id":"n2069","loc":[-85.634934,41.940496]},"n207":{"id":"n207","loc":[-85.636262,41.942472]},"n2070":{"id":"n2070","loc":[-85.63504,41.940495]},"n2071":{"id":"n2071","loc":[-85.63504,41.940531]},"n2072":{"id":"n2072","loc":[-85.635068,41.940531]},"n2073":{"id":"n2073","loc":[-85.635071,41.940794]},"n2074":{"id":"n2074","loc":[-85.635183,41.940793]},"n2075":{"id":"n2075","loc":[-85.635185,41.940916]},"n2076":{"id":"n2076","loc":[-85.634799,41.940919]},"n2077":{"id":"n2077","loc":[-85.634798,41.940798]},"n2078":{"id":"n2078","loc":[-85.634925,41.940797]},"n2079":{"id":"n2079","loc":[-85.634924,41.940724]},"n208":{"id":"n208","loc":[-85.636261,41.94233]},"n2080":{"id":"n2080","loc":[-85.637448,41.938233]},"n2081":{"id":"n2081","loc":[-85.634168,41.943279]},"n2082":{"id":"n2082","loc":[-85.635744,41.938248]},"n2083":{"id":"n2083","loc":[-85.638744,41.951211]},"n2084":{"id":"n2084","loc":[-85.636421,41.946392]},"n2085":{"id":"n2085","loc":[-85.635965,41.945809]},"n2086":{"id":"n2086","loc":[-85.635683,41.945449]},"n2087":{"id":"n2087","loc":[-85.635281,41.945025]},"n2088":{"id":"n2088","loc":[-85.632443,41.942574]},"n2089":{"id":"n2089","loc":[-85.638243,41.943674]},"n209":{"id":"n209","loc":[-85.636353,41.942329]},"n2090":{"id":"n2090","loc":[-85.638228,41.943747]},"n2091":{"id":"n2091","loc":[-85.638163,41.943797]},"n2092":{"id":"n2092","loc":[-85.638089,41.943832]},"n2093":{"id":"n2093","loc":[-85.637969,41.943841]},"n2094":{"id":"n2094","loc":[-85.637841,41.943833]},"n2095":{"id":"n2095","loc":[-85.637342,41.943734]},"n2096":{"id":"n2096","loc":[-85.637232,41.943707]},"n2097":{"id":"n2097","loc":[-85.637163,41.943668]},"n2098":{"id":"n2098","loc":[-85.637118,41.943615]},"n2099":{"id":"n2099","loc":[-85.637078,41.943494]},"n21":{"id":"n21","loc":[-85.634126,41.942228]},"n210":{"id":"n210","loc":[-85.636354,41.94239]},"n2100":{"id":"n2100","loc":[-85.632903,41.998429],"tags":{"railway":"level_crossing"}},"n2101":{"id":"n2101","loc":[-85.633616,41.943581],"tags":{"railway":"level_crossing"}},"n2102":{"id":"n2102","loc":[-85.636943,41.947311]},"n2103":{"id":"n2103","loc":[-85.6376,41.94854]},"n2104":{"id":"n2104","loc":[-85.634565,41.93631]},"n2105":{"id":"n2105","loc":[-85.629597,41.942562]},"n2106":{"id":"n2106","loc":[-85.630821,41.943077]},"n2107":{"id":"n2107","loc":[-85.627473,41.940659]},"n2108":{"id":"n2108","loc":[-85.629708,41.942872]},"n2109":{"id":"n2109","loc":[-85.634093,41.935448]},"n211":{"id":"n211","loc":[-85.636393,41.94239]},"n2110":{"id":"n2110","loc":[-85.630413,41.94366]},"n2111":{"id":"n2111","loc":[-85.630488,41.942662]},"n2112":{"id":"n2112","loc":[-85.63361,41.936749]},"n2113":{"id":"n2113","loc":[-85.630038,41.941808]},"n2114":{"id":"n2114","loc":[-85.632016,41.942922]},"n2115":{"id":"n2115","loc":[-85.631525,41.944303]},"n2116":{"id":"n2116","loc":[-85.626862,41.94022]},"n2117":{"id":"n2117","loc":[-85.629673,41.94121]},"n2118":{"id":"n2118","loc":[-85.632752,41.943101]},"n2119":{"id":"n2119","loc":[-85.631147,41.943201]},"n212":{"id":"n212","loc":[-85.63444,41.943176]},"n2120":{"id":"n2120","loc":[-85.624974,41.940579]},"n2121":{"id":"n2121","loc":[-85.629518,41.941783]},"n2122":{"id":"n2122","loc":[-85.632349,41.942699]},"n2123":{"id":"n2123","loc":[-85.628418,41.940356]},"n2124":{"id":"n2124","loc":[-85.629147,41.94129]},"n2125":{"id":"n2125","loc":[-85.631111,41.943979]},"n2126":{"id":"n2126","loc":[-85.632087,41.940013]},"n2127":{"id":"n2127","loc":[-85.634469,41.935057]},"n2128":{"id":"n2128","loc":[-85.630097,41.943449]},"n2129":{"id":"n2129","loc":[-85.6331,41.937878]},"n213":{"id":"n213","loc":[-85.63375,41.942814]},"n2130":{"id":"n2130","loc":[-85.625274,41.941114]},"n2131":{"id":"n2131","loc":[-85.632632,41.941217]},"n2132":{"id":"n2132","loc":[-85.632739,41.941926]},"n2133":{"id":"n2133","loc":[-85.631647,41.94366]},"n2134":{"id":"n2134","loc":[-85.635059,41.935456]},"n2135":{"id":"n2135","loc":[-85.631259,41.944349]},"n2136":{"id":"n2136","loc":[-85.626336,41.940811]},"n2137":{"id":"n2137","loc":[-85.631507,41.943875]},"n2138":{"id":"n2138","loc":[-85.625081,41.940859]},"n2139":{"id":"n2139","loc":[-85.625778,41.940093]},"n214":{"id":"n214","loc":[-85.633674,41.942869]},"n2140":{"id":"n2140","loc":[-85.632641,41.942436]},"n2141":{"id":"n2141","loc":[-85.628825,41.941034]},"n2142":{"id":"n2142","loc":[-85.627913,41.940292]},"n2143":{"id":"n2143","loc":[-85.628943,41.940516]},"n2144":{"id":"n2144","loc":[-85.63139,41.943941]},"n2145":{"id":"n2145","loc":[-85.630081,41.94204]},"n2146":{"id":"n2146","loc":[-85.632194,41.93963]},"n2147":{"id":"n2147","loc":[-85.632913,41.93939]},"n2148":{"id":"n2148","loc":[-85.632001,41.943492]},"n2149":{"id":"n2149","loc":[-85.63149,41.943154]},"n215":{"id":"n215","loc":[-85.633542,41.942768]},"n2150":{"id":"n2150","loc":[-85.625167,41.940117]},"n2151":{"id":"n2151","loc":[-85.63287,41.939941]},"n2152":{"id":"n2152","loc":[-85.630789,41.943732]},"n2153":{"id":"n2153","loc":[-85.632173,41.940348]},"n2154":{"id":"n2154","loc":[-85.626587,41.940113]},"n2155":{"id":"n2155","loc":[-85.62684,41.940667]},"n2156":{"id":"n2156","loc":[-85.632527,41.938904]},"n2157":{"id":"n2157","loc":[-85.624866,41.94018]},"n2158":{"id":"n2158","loc":[-85.633267,41.93872]},"n2159":{"id":"n2159","loc":[-85.62934,41.940843]},"n216":{"id":"n216","loc":[-85.633618,41.942714]},"n2160":{"id":"n2160","loc":[-85.62272,41.953817]},"n2161":{"id":"n2161","loc":[-85.622555,41.954453]},"n2162":{"id":"n2162","loc":[-85.637225,41.944128]},"n2163":{"id":"n2163","loc":[-85.622628,41.953683]},"n2164":{"id":"n2164","loc":[-85.635441,41.943989]},"n2165":{"id":"n2165","loc":[-85.622629,41.953807]},"n2166":{"id":"n2166","loc":[-85.62262,41.953807]},"n2167":{"id":"n2167","loc":[-85.62262,41.953837]},"n2168":{"id":"n2168","loc":[-85.622532,41.953838]},"n2169":{"id":"n2169","loc":[-85.637469,41.944579]},"n217":{"id":"n217","loc":[-85.634001,41.942336]},"n2170":{"id":"n2170","loc":[-85.63688,41.943935]},"n2171":{"id":"n2171","loc":[-85.638263,41.946367]},"n2172":{"id":"n2172","loc":[-85.622532,41.953807]},"n2173":{"id":"n2173","loc":[-85.622353,41.953808]},"n2174":{"id":"n2174","loc":[-85.622352,41.953685]},"n2175":{"id":"n2175","loc":[-85.622464,41.953684]},"n2176":{"id":"n2176","loc":[-85.622464,41.953648]},"n2177":{"id":"n2177","loc":[-85.637136,41.94576]},"n2178":{"id":"n2178","loc":[-85.622521,41.953648]},"n2179":{"id":"n2179","loc":[-85.637129,41.945415]},"n218":{"id":"n218","loc":[-85.633825,41.942376]},"n2180":{"id":"n2180","loc":[-85.637473,41.94607]},"n2181":{"id":"n2181","loc":[-85.622521,41.953683]},"n2182":{"id":"n2182","loc":[-85.622717,41.954104]},"n2183":{"id":"n2183","loc":[-85.637769,41.946095]},"n2184":{"id":"n2184","loc":[-85.623872,41.953515]},"n2185":{"id":"n2185","loc":[-85.623851,41.953588]},"n2186":{"id":"n2186","loc":[-85.631385,41.94433]},"n2187":{"id":"n2187","loc":[-85.623608,41.953543]},"n2188":{"id":"n2188","loc":[-85.637308,41.944882]},"n2189":{"id":"n2189","loc":[-85.634898,41.944041]},"n219":{"id":"n219","loc":[-85.633807,41.942334]},"n2190":{"id":"n2190","loc":[-85.623604,41.953442]},"n2191":{"id":"n2191","loc":[-85.623705,41.953442]},"n2192":{"id":"n2192","loc":[-85.623708,41.953493]},"n2193":{"id":"n2193","loc":[-85.624064,41.952655]},"n2194":{"id":"n2194","loc":[-85.62395,41.952654]},"n2195":{"id":"n2195","loc":[-85.623951,41.952579]},"n2196":{"id":"n2196","loc":[-85.637435,41.944342]},"n2197":{"id":"n2197","loc":[-85.624064,41.952579]},"n2198":{"id":"n2198","loc":[-85.623812,41.952648]},"n2199":{"id":"n2199","loc":[-85.623813,41.952705]},"n22":{"id":"n22","loc":[-85.633531,41.942357]},"n220":{"id":"n220","loc":[-85.633983,41.942294]},"n2200":{"id":"n2200","loc":[-85.637169,41.945098]},"n2201":{"id":"n2201","loc":[-85.623552,41.952707]},"n2202":{"id":"n2202","loc":[-85.623551,41.95263]},"n2203":{"id":"n2203","loc":[-85.623701,41.952629]},"n2204":{"id":"n2204","loc":[-85.635894,41.943719]},"n2205":{"id":"n2205","loc":[-85.637297,41.945992]},"n2206":{"id":"n2206","loc":[-85.623724,41.952648]},"n2207":{"id":"n2207","loc":[-85.623812,41.952438]},"n2208":{"id":"n2208","loc":[-85.625239,41.952197]},"n2209":{"id":"n2209","loc":[-85.625232,41.952257]},"n221":{"id":"n221","loc":[-85.634182,41.942495]},"n2210":{"id":"n2210","loc":[-85.635175,41.94408]},"n2211":{"id":"n2211","loc":[-85.636381,41.943761]},"n2212":{"id":"n2212","loc":[-85.625115,41.952249]},"n2213":{"id":"n2213","loc":[-85.638578,41.946644]},"n2214":{"id":"n2214","loc":[-85.625122,41.952189]},"n2215":{"id":"n2215","loc":[-85.625085,41.952031]},"n2216":{"id":"n2216","loc":[-85.636126,41.943713]},"n2217":{"id":"n2217","loc":[-85.635005,41.944041]},"n2218":{"id":"n2218","loc":[-85.63714,41.945328]},"n2219":{"id":"n2219","loc":[-85.634871,41.943292]},"n222":{"id":"n222","loc":[-85.634149,41.942503]},"n2220":{"id":"n2220","loc":[-85.635705,41.943799]},"n2221":{"id":"n2221","loc":[-85.634995,41.943576]},"n2222":{"id":"n2222","loc":[-85.635026,41.943829]},"n2223":{"id":"n2223","loc":[-85.632874,41.941031]},"n2224":{"id":"n2224","loc":[-85.632531,41.940233]},"n2225":{"id":"n2225","loc":[-85.634247,41.936003]},"n2226":{"id":"n2226","loc":[-85.62929,41.941127]},"n2227":{"id":"n2227","loc":[-85.630428,41.943266]},"n2228":{"id":"n2228","loc":[-85.631608,41.943425]},"n2229":{"id":"n2229","loc":[-85.632316,41.943042]},"n223":{"id":"n223","loc":[-85.634098,41.942373]},"n2230":{"id":"n2230","loc":[-85.628711,41.940744]},"n2231":{"id":"n2231","loc":[-85.627831,41.940536]},"n2232":{"id":"n2232","loc":[-85.625514,41.94052]},"n2233":{"id":"n2233","loc":[-85.631127,41.943545]},"n2234":{"id":"n2234","loc":[-85.632909,41.942531]},"n2235":{"id":"n2235","loc":[-85.632917,41.938796]},"n2236":{"id":"n2236","loc":[-85.626716,41.94044]},"n2237":{"id":"n2237","loc":[-85.630122,41.942852]},"n2238":{"id":"n2238","loc":[-85.632509,41.939674]},"n2239":{"id":"n2239","loc":[-85.634762,41.935237]},"n224":{"id":"n224","loc":[-85.634131,41.942366]},"n2240":{"id":"n2240","loc":[-85.63384,41.937025]},"n2241":{"id":"n2241","loc":[-85.629741,41.941909]},"n2242":{"id":"n2242","loc":[-85.635254,41.945001],"tags":{"railway":"level_crossing"}},"n2243":{"id":"n2243","loc":[-85.634005,41.938168]},"n2244":{"id":"n2244","loc":[-85.63393,41.938335]},"n2245":{"id":"n2245","loc":[-85.633859,41.93846]},"n2246":{"id":"n2246","loc":[-85.633663,41.938776]},"n2247":{"id":"n2247","loc":[-85.633513,41.938936]},"n2248":{"id":"n2248","loc":[-85.635295,41.943225]},"n2249":{"id":"n2249","loc":[-85.635393,41.943293]},"n225":{"id":"n225","loc":[-85.635986,41.94177]},"n2250":{"id":"n2250","loc":[-85.635645,41.94332]},"n2251":{"id":"n2251","loc":[-85.63629,41.943328]},"n2252":{"id":"n2252","loc":[-85.636554,41.943372]},"n2253":{"id":"n2253","loc":[-85.636869,41.943526]},"n2254":{"id":"n2254","loc":[-85.637099,41.943704]},"n2255":{"id":"n2255","loc":[-85.637268,41.943773]},"n2256":{"id":"n2256","loc":[-85.637483,41.943821]},"n2257":{"id":"n2257","loc":[-85.637616,41.943929]},"n2258":{"id":"n2258","loc":[-85.637752,41.944114]},"n2259":{"id":"n2259","loc":[-85.638399,41.944308]},"n226":{"id":"n226","loc":[-85.635982,41.941523]},"n2260":{"id":"n2260","loc":[-85.638573,41.944451]},"n2261":{"id":"n2261","loc":[-85.638702,41.944574]},"n2262":{"id":"n2262","loc":[-85.638718,41.944652]},"n2263":{"id":"n2263","loc":[-85.638715,41.944809]},"n2264":{"id":"n2264","loc":[-85.638766,41.944988]},"n2265":{"id":"n2265","loc":[-85.638773,41.945136]},"n2266":{"id":"n2266","loc":[-85.638705,41.945251]},"n2267":{"id":"n2267","loc":[-85.638335,41.944291]},"n2268":{"id":"n2268","loc":[-85.638474,41.944352]},"n2269":{"id":"n2269","loc":[-85.635408,41.943429]},"n227":{"id":"n227","loc":[-85.636108,41.941521]},"n2270":{"id":"n2270","loc":[-85.635271,41.943654]},"n2271":{"id":"n2271","loc":[-85.635266,41.943744]},"n2272":{"id":"n2272","loc":[-85.635271,41.943819]},"n2273":{"id":"n2273","loc":[-85.635192,41.943876]},"n2274":{"id":"n2274","loc":[-85.635129,41.943857]},"n2275":{"id":"n2275","loc":[-85.635122,41.943764]},"n2276":{"id":"n2276","loc":[-85.635124,41.943664]},"n2277":{"id":"n2277","loc":[-85.63515,41.943611]},"n2278":{"id":"n2278","loc":[-85.635106,41.943534]},"n2279":{"id":"n2279","loc":[-85.634972,41.943197]},"n228":{"id":"n228","loc":[-85.636109,41.941559]},"n2280":{"id":"n2280","loc":[-85.633978,41.938227]},"n2281":{"id":"n2281","loc":[-85.634216,41.943255]},"n2282":{"id":"n2282","loc":[-85.634434,41.943622]},"n2283":{"id":"n2283","loc":[-85.632406,41.940854]},"n2284":{"id":"n2284","loc":[-85.632488,41.941063],"tags":{"leisure":"slipway"}},"n2285":{"id":"n2285","loc":[-85.632726,41.941537]},"n2286":{"id":"n2286","loc":[-85.632639,41.94136]},"n2287":{"id":"n2287","loc":[-85.632704,41.941439]},"n2288":{"id":"n2288","loc":[-85.632289,41.940601]},"n2289":{"id":"n2289","loc":[-85.632541,41.942526]},"n229":{"id":"n229","loc":[-85.636145,41.941559]},"n2290":{"id":"n2290","loc":[-85.634058,41.943173]},"n2291":{"id":"n2291","loc":[-85.636175,41.945974]},"n2292":{"id":"n2292","loc":[-85.636528,41.945975]},"n2293":{"id":"n2293","loc":[-85.637092,41.945893]},"n2294":{"id":"n2294","loc":[-85.637881,41.945647]},"n2295":{"id":"n2295","loc":[-85.639329,41.945162]},"n2296":{"id":"n2296","loc":[-85.639323,41.945026]},"n2297":{"id":"n2297","loc":[-85.638826,41.945032]},"n2298":{"id":"n2298","loc":[-85.638817,41.944174]},"n2299":{"id":"n2299","loc":[-85.638291,41.94418]},"n23":{"id":"n23","loc":[-85.633504,41.942418]},"n230":{"id":"n230","loc":[-85.636145,41.941551]},"n2300":{"id":"n2300","loc":[-85.63828,41.943811]},"n2301":{"id":"n2301","loc":[-85.638195,41.943601]},"n2302":{"id":"n2302","loc":[-85.63719,41.943592]},"n2303":{"id":"n2303","loc":[-85.636697,41.943273]},"n2304":{"id":"n2304","loc":[-85.635375,41.943274]},"n2305":{"id":"n2305","loc":[-85.635091,41.943547]},"n2306":{"id":"n2306","loc":[-85.63442,41.944117]},"n2307":{"id":"n2307","loc":[-85.635117,41.943717]},"n2308":{"id":"n2308","loc":[-85.635601,41.945177]},"n2309":{"id":"n2309","loc":[-85.635819,41.945494]},"n231":{"id":"n231","loc":[-85.636312,41.941549]},"n2310":{"id":"n2310","loc":[-85.635303,41.944891]},"n2311":{"id":"n2311","loc":[-85.637674,41.943802]},"n2312":{"id":"n2312","loc":[-85.638263,41.944272]},"n2313":{"id":"n2313","loc":[-85.634267,41.935266]},"n2314":{"id":"n2314","loc":[-85.639788,41.945152]},"n2315":{"id":"n2315","loc":[-85.639645,41.945167]},"n2316":{"id":"n2316","loc":[-85.639362,41.945233]},"n2317":{"id":"n2317","loc":[-85.638616,41.945163]},"n2318":{"id":"n2318","loc":[-85.638514,41.944936]},"n2319":{"id":"n2319","loc":[-85.638578,41.94503]},"n232":{"id":"n232","loc":[-85.636314,41.941649]},"n2320":{"id":"n2320","loc":[-85.638578,41.945215]},"n2321":{"id":"n2321","loc":[-85.640495,41.947015]},"n2322":{"id":"n2322","loc":[-85.639577,41.946495]},"n2323":{"id":"n2323","loc":[-85.638935,41.946087]},"n2324":{"id":"n2324","loc":[-85.637535,41.94584]},"n2325":{"id":"n2325","loc":[-85.638357,41.945404]},"n2326":{"id":"n2326","loc":[-85.638051,41.94553]},"n2327":{"id":"n2327","loc":[-85.637732,41.945555]},"n2328":{"id":"n2328","loc":[-85.637657,41.945524]},"n2329":{"id":"n2329","loc":[-85.637598,41.945467]},"n233":{"id":"n233","loc":[-85.636152,41.94165]},"n2330":{"id":"n2330","loc":[-85.637669,41.945318]},"n2331":{"id":"n2331","loc":[-85.637894,41.945171]},"n2332":{"id":"n2332","loc":[-85.637923,41.945082]},"n2333":{"id":"n2333","loc":[-85.63793,41.944756]},"n2334":{"id":"n2334","loc":[-85.637976,41.944696]},"n2335":{"id":"n2335","loc":[-85.638044,41.944671]},"n2336":{"id":"n2336","loc":[-85.638129,41.944597]},"n2337":{"id":"n2337","loc":[-85.638252,41.944413]},"n2338":{"id":"n2338","loc":[-85.638092,41.945442]},"n2339":{"id":"n2339","loc":[-85.638409,41.945315]},"n234":{"id":"n234","loc":[-85.636152,41.941628]},"n2340":{"id":"n2340","loc":[-85.638325,41.944771]},"n2341":{"id":"n2341","loc":[-85.638103,41.944744]},"n2342":{"id":"n2342","loc":[-85.637976,41.944781]},"n2343":{"id":"n2343","loc":[-85.637983,41.944865]},"n2344":{"id":"n2344","loc":[-85.638063,41.945074]},"n2345":{"id":"n2345","loc":[-85.638041,41.945206]},"n2346":{"id":"n2346","loc":[-85.637907,41.945309]},"n2347":{"id":"n2347","loc":[-85.637925,41.94539]},"n2348":{"id":"n2348","loc":[-85.637998,41.94545]},"n2349":{"id":"n2349","loc":[-85.637135,41.946254]},"n235":{"id":"n235","loc":[-85.63611,41.941628]},"n2350":{"id":"n2350","loc":[-85.636837,41.946615]},"n2351":{"id":"n2351","loc":[-85.637954,41.948909]},"n2352":{"id":"n2352","loc":[-85.638382,41.949786]},"n2353":{"id":"n2353","loc":[-85.639367,41.951242]},"n2354":{"id":"n2354","loc":[-85.640554,41.951777]},"n2355":{"id":"n2355","loc":[-85.6411,41.952234]},"n2356":{"id":"n2356","loc":[-85.641742,41.952657]},"n2357":{"id":"n2357","loc":[-85.642321,41.952941]},"n2358":{"id":"n2358","loc":[-85.64277,41.953228]},"n2359":{"id":"n2359","loc":[-85.643333,41.953825]},"n236":{"id":"n236","loc":[-85.636113,41.941768]},"n2360":{"id":"n2360","loc":[-85.643579,41.954365]},"n2361":{"id":"n2361","loc":[-85.644439,41.954105]},"n2362":{"id":"n2362","loc":[-85.64506,41.954]},"n2363":{"id":"n2363","loc":[-85.645483,41.953911]},"n2364":{"id":"n2364","loc":[-85.646046,41.953853]},"n2365":{"id":"n2365","loc":[-85.646318,41.953717]},"n2366":{"id":"n2366","loc":[-85.646276,41.953414]},"n2367":{"id":"n2367","loc":[-85.631063,41.957478],"tags":{"emergency":"fire_hydrant"}},"n2368":{"id":"n2368","loc":[-85.630996,41.955857],"tags":{"emergency":"fire_hydrant"}},"n2369":{"id":"n2369","loc":[-85.630976,41.954608],"tags":{"emergency":"fire_hydrant"}},"n237":{"id":"n237","loc":[-85.635983,41.941589],"tags":{"entrance":"yes"}},"n2370":{"id":"n2370","loc":[-85.646,41.953154]},"n2371":{"id":"n2371","loc":[-85.645222,41.953193]},"n2372":{"id":"n2372","loc":[-85.644732,41.953181]},"n2373":{"id":"n2373","loc":[-85.644064,41.953298]},"n2374":{"id":"n2374","loc":[-85.643818,41.953177]},"n2375":{"id":"n2375","loc":[-85.644001,41.95284]},"n2376":{"id":"n2376","loc":[-85.628174,41.95456],"tags":{"emergency":"fire_hydrant"}},"n2377":{"id":"n2377","loc":[-85.644267,41.952591]},"n2378":{"id":"n2378","loc":[-85.644288,41.952328]},"n2379":{"id":"n2379","loc":[-85.627276,41.953987],"tags":{"emergency":"fire_hydrant"}},"n238":{"id":"n238","loc":[-85.635906,41.94159]},"n2380":{"id":"n2380","loc":[-85.644262,41.952153]},"n2381":{"id":"n2381","loc":[-85.644168,41.95204]},"n2382":{"id":"n2382","loc":[-85.64421,41.951749]},"n2383":{"id":"n2383","loc":[-85.64385,41.951586]},"n2384":{"id":"n2384","loc":[-85.62736,41.955964],"tags":{"emergency":"fire_hydrant"}},"n2385":{"id":"n2385","loc":[-85.626307,41.957198],"tags":{"emergency":"fire_hydrant"}},"n2386":{"id":"n2386","loc":[-85.643589,41.951323]},"n2387":{"id":"n2387","loc":[-85.62747,41.957509],"tags":{"emergency":"fire_hydrant"}},"n2388":{"id":"n2388","loc":[-85.628665,41.957492],"tags":{"emergency":"fire_hydrant"}},"n2389":{"id":"n2389","loc":[-85.642535,41.951031]},"n239":{"id":"n239","loc":[-85.635883,41.940182]},"n2390":{"id":"n2390","loc":[-85.642269,41.95088]},"n2391":{"id":"n2391","loc":[-85.641878,41.950814]},"n2392":{"id":"n2392","loc":[-85.641549,41.950806]},"n2393":{"id":"n2393","loc":[-85.641103,41.950549]},"n2394":{"id":"n2394","loc":[-85.630864,41.959046],"tags":{"emergency":"fire_hydrant"}},"n2395":{"id":"n2395","loc":[-85.632249,41.958969],"tags":{"emergency":"fire_hydrant"}},"n2396":{"id":"n2396","loc":[-85.641037,41.949821]},"n2397":{"id":"n2397","loc":[-85.641006,41.949433]},"n2398":{"id":"n2398","loc":[-85.632232,41.95859],"tags":{"emergency":"fire_hydrant"}},"n2399":{"id":"n2399","loc":[-85.632071,41.958345],"tags":{"emergency":"fire_hydrant"}},"n24":{"id":"n24","loc":[-85.634346,41.942792]},"n240":{"id":"n240","loc":[-85.635916,41.94264]},"n2400":{"id":"n2400","loc":[-85.632228,41.9573],"tags":{"emergency":"fire_hydrant"}},"n2401":{"id":"n2401","loc":[-85.641152,41.948257]},"n2402":{"id":"n2402","loc":[-85.641055,41.947304]},"n2403":{"id":"n2403","loc":[-85.638022,41.945897]},"n2404":{"id":"n2404","loc":[-85.638672,41.950778]},"n2405":{"id":"n2405","loc":[-85.63666,41.944492],"tags":{"name":"Memory Isle","place":"island"}},"n2406":{"id":"n2406","loc":[-85.635,41.946389],"tags":{"amenity":"post_office","name":"Three Rivers Post Office"}},"n2407":{"id":"n2407","loc":[-85.633676,41.946036]},"n2408":{"id":"n2408","loc":[-85.633736,41.946078]},"n2409":{"id":"n2409","loc":[-85.633997,41.946185]},"n241":{"id":"n241","loc":[-85.635795,41.941906]},"n2410":{"id":"n2410","loc":[-85.634448,41.945626],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2411":{"id":"n2411","loc":[-85.63456,41.945731],"tags":{"crossing":"zebra","highway":"crossing"}},"n2412":{"id":"n2412","loc":[-85.634592,41.94578]},"n2413":{"id":"n2413","loc":[-85.634607,41.945815]},"n2414":{"id":"n2414","loc":[-85.634614,41.945864]},"n2415":{"id":"n2415","loc":[-85.636066,41.946185]},"n2416":{"id":"n2416","loc":[-85.636128,41.946352]},"n2417":{"id":"n2417","loc":[-85.636142,41.946452]},"n2418":{"id":"n2418","loc":[-85.635327,41.945292]},"n2419":{"id":"n2419","loc":[-85.635648,41.94558]},"n242":{"id":"n242","loc":[-85.635909,41.941906]},"n2420":{"id":"n2420","loc":[-85.635769,41.945729]},"n2421":{"id":"n2421","loc":[-85.637349,41.945897]},"n2422":{"id":"n2422","loc":[-85.632211,41.95596],"tags":{"emergency":"fire_hydrant"}},"n2423":{"id":"n2423","loc":[-85.635942,41.94598]},"n2424":{"id":"n2424","loc":[-85.636443,41.946042]},"n2425":{"id":"n2425","loc":[-85.635819,41.946052]},"n2426":{"id":"n2426","loc":[-85.636669,41.946025]},"n2427":{"id":"n2427","loc":[-85.636832,41.946005]},"n2428":{"id":"n2428","loc":[-85.637039,41.945968]},"n2429":{"id":"n2429","loc":[-85.636291,41.946046]},"n243":{"id":"n243","loc":[-85.636359,41.941904]},"n2430":{"id":"n2430","loc":[-85.634005,41.943367]},"n2431":{"id":"n2431","loc":[-85.633366,41.943724]},"n2432":{"id":"n2432","loc":[-85.634617,41.946057]},"n2433":{"id":"n2433","loc":[-85.636534,41.944793]},"n2434":{"id":"n2434","loc":[-85.637055,41.945188]},"n2435":{"id":"n2435","loc":[-85.636153,41.944618]},"n2436":{"id":"n2436","loc":[-85.636803,41.944944]},"n2437":{"id":"n2437","loc":[-85.633389,41.945735]},"n2438":{"id":"n2438","loc":[-85.633536,41.94585]},"n2439":{"id":"n2439","loc":[-85.63363,41.945993]},"n244":{"id":"n244","loc":[-85.636351,41.941438]},"n2440":{"id":"n2440","loc":[-85.633268,41.94568]},"n2441":{"id":"n2441","loc":[-85.635947,41.94546]},"n2442":{"id":"n2442","loc":[-85.636277,41.945268]},"n2443":{"id":"n2443","loc":[-85.635203,41.944287]},"n2444":{"id":"n2444","loc":[-85.634876,41.944477]},"n2445":{"id":"n2445","loc":[-85.634975,41.944419]},"n2446":{"id":"n2446","loc":[-85.633877,41.943438]},"n2447":{"id":"n2447","loc":[-85.63508,41.945113]},"n2448":{"id":"n2448","loc":[-85.635372,41.944932]},"n2449":{"id":"n2449","loc":[-85.636594,41.945935]},"n245":{"id":"n245","loc":[-85.635903,41.941436]},"n2450":{"id":"n2450","loc":[-85.636901,41.945747]},"n2451":{"id":"n2451","loc":[-85.636329,41.945228]},"n2452":{"id":"n2452","loc":[-85.636025,41.945417]},"n2453":{"id":"n2453","loc":[-85.634002,41.944644]},"n2454":{"id":"n2454","loc":[-85.63407,41.944692]},"n2455":{"id":"n2455","loc":[-85.634114,41.944756]},"n2456":{"id":"n2456","loc":[-85.633762,41.944809]},"n2457":{"id":"n2457","loc":[-85.634184,41.944807]},"n2458":{"id":"n2458","loc":[-85.634291,41.944819]},"n2459":{"id":"n2459","loc":[-85.634639,41.944845]},"n246":{"id":"n246","loc":[-85.635788,41.941436]},"n2460":{"id":"n2460","loc":[-85.633822,41.944861]},"n2461":{"id":"n2461","loc":[-85.63411,41.944855]},"n2462":{"id":"n2462","loc":[-85.63435,41.944872]},"n2463":{"id":"n2463","loc":[-85.63441,41.944903]},"n2464":{"id":"n2464","loc":[-85.633883,41.944913]},"n2465":{"id":"n2465","loc":[-85.634164,41.944896]},"n2466":{"id":"n2466","loc":[-85.633487,41.944926]},"n2467":{"id":"n2467","loc":[-85.634736,41.944929]},"n2468":{"id":"n2468","loc":[-85.633944,41.944965]},"n2469":{"id":"n2469","loc":[-85.633555,41.944983]},"n247":{"id":"n247","loc":[-85.635929,41.941511]},"n2470":{"id":"n2470","loc":[-85.633995,41.945013]},"n2471":{"id":"n2471","loc":[-85.633614,41.945037]},"n2472":{"id":"n2472","loc":[-85.634848,41.945031]},"n2473":{"id":"n2473","loc":[-85.634049,41.945061]},"n2474":{"id":"n2474","loc":[-85.633678,41.945094]},"n2475":{"id":"n2475","loc":[-85.63317,41.945111]},"n2476":{"id":"n2476","loc":[-85.633357,41.945103]},"n2477":{"id":"n2477","loc":[-85.633728,41.945136]},"n2478":{"id":"n2478","loc":[-85.634146,41.945148]},"n2479":{"id":"n2479","loc":[-85.633416,41.945157]},"n248":{"id":"n248","loc":[-85.635929,41.941317]},"n2480":{"id":"n2480","loc":[-85.634625,41.945172]},"n2481":{"id":"n2481","loc":[-85.633239,41.945174]},"n2482":{"id":"n2482","loc":[-85.63469,41.945185]},"n2483":{"id":"n2483","loc":[-85.634661,41.945203]},"n2484":{"id":"n2484","loc":[-85.63348,41.945214]},"n2485":{"id":"n2485","loc":[-85.633578,41.945221]},"n2486":{"id":"n2486","loc":[-85.634742,41.945231]},"n2487":{"id":"n2487","loc":[-85.634251,41.94525]},"n2488":{"id":"n2488","loc":[-85.633524,41.945254]},"n2489":{"id":"n2489","loc":[-85.63468,41.945271]},"n249":{"id":"n249","loc":[-85.636414,41.941316]},"n2490":{"id":"n2490","loc":[-85.633885,41.945272]},"n2491":{"id":"n2491","loc":[-85.634795,41.945288]},"n2492":{"id":"n2492","loc":[-85.634742,41.94532]},"n2493":{"id":"n2493","loc":[-85.633946,41.945327]},"n2494":{"id":"n2494","loc":[-85.634844,41.945331]},"n2495":{"id":"n2495","loc":[-85.63435,41.945349]},"n2496":{"id":"n2496","loc":[-85.633733,41.945357]},"n2497":{"id":"n2497","loc":[-85.633987,41.945375]},"n2498":{"id":"n2498","loc":[-85.634911,41.945419]},"n2499":{"id":"n2499","loc":[-85.634049,41.945431]},"n25":{"id":"n25","loc":[-85.634333,41.942809]},"n250":{"id":"n250","loc":[-85.636414,41.941511]},"n2500":{"id":"n2500","loc":[-85.633705,41.945461]},"n2501":{"id":"n2501","loc":[-85.633642,41.945408]},"n2502":{"id":"n2502","loc":[-85.634493,41.945475]},"n2503":{"id":"n2503","loc":[-85.634106,41.945484]},"n2504":{"id":"n2504","loc":[-85.635008,41.945505]},"n2505":{"id":"n2505","loc":[-85.633757,41.945506]},"n2506":{"id":"n2506","loc":[-85.634542,41.945519]},"n2507":{"id":"n2507","loc":[-85.634162,41.945536]},"n2508":{"id":"n2508","loc":[-85.633843,41.945547]},"n2509":{"id":"n2509","loc":[-85.634919,41.94556]},"n251":{"id":"n251","loc":[-85.636819,41.941617]},"n2510":{"id":"n2510","loc":[-85.633818,41.945561]},"n2511":{"id":"n2511","loc":[-85.634638,41.94559]},"n2512":{"id":"n2512","loc":[-85.633901,41.945598]},"n2513":{"id":"n2513","loc":[-85.634257,41.945626]},"n2514":{"id":"n2514","loc":[-85.633967,41.945652]},"n2515":{"id":"n2515","loc":[-85.634735,41.945676]},"n2516":{"id":"n2516","loc":[-85.635057,41.945683]},"n2517":{"id":"n2517","loc":[-85.635296,41.945703]},"n2518":{"id":"n2518","loc":[-85.635112,41.945703]},"n2519":{"id":"n2519","loc":[-85.634782,41.945729]},"n252":{"id":"n252","loc":[-85.636718,41.941619]},"n2520":{"id":"n2520","loc":[-85.634052,41.945747]},"n2521":{"id":"n2521","loc":[-85.635296,41.945757]},"n2522":{"id":"n2522","loc":[-85.635314,41.945757]},"n2523":{"id":"n2523","loc":[-85.635112,41.945761]},"n2524":{"id":"n2524","loc":[-85.63484,41.945778]},"n2525":{"id":"n2525","loc":[-85.635314,41.945938]},"n2526":{"id":"n2526","loc":[-85.63484,41.945922]},"n2527":{"id":"n2527","loc":[-85.635461,41.944879]},"n2528":{"id":"n2528","loc":[-85.636024,41.945384]},"n2529":{"id":"n2529","loc":[-85.636145,41.945312]},"n253":{"id":"n253","loc":[-85.636716,41.941509]},"n2530":{"id":"n2530","loc":[-85.6356,41.944797]},"n2531":{"id":"n2531","loc":[-85.635135,41.944354]},"n2532":{"id":"n2532","loc":[-85.632988,41.945369]},"n2533":{"id":"n2533","loc":[-85.633376,41.94563]},"n2534":{"id":"n2534","loc":[-85.633539,41.945534]},"n2535":{"id":"n2535","loc":[-85.633238,41.945248]},"n2536":{"id":"n2536","loc":[-85.633166,41.945216]},"n2537":{"id":"n2537","loc":[-85.633114,41.945188]},"n2538":{"id":"n2538","loc":[-85.633078,41.945127]},"n2539":{"id":"n2539","loc":[-85.633066,41.94508]},"n254":{"id":"n254","loc":[-85.636732,41.941509]},"n2540":{"id":"n2540","loc":[-85.633222,41.945358]},"n2541":{"id":"n2541","loc":[-85.633425,41.945541]},"n2542":{"id":"n2542","loc":[-85.63299,41.9455]},"n2543":{"id":"n2543","loc":[-85.634374,41.944327]},"n2544":{"id":"n2544","loc":[-85.633648,41.943697]},"n2545":{"id":"n2545","loc":[-85.633533,41.943764]},"n2546":{"id":"n2546","loc":[-85.634239,41.944417]},"n2547":{"id":"n2547","loc":[-85.634122,41.944395]},"n2548":{"id":"n2548","loc":[-85.634235,41.944326]},"n2549":{"id":"n2549","loc":[-85.633613,41.943787]},"n255":{"id":"n255","loc":[-85.636731,41.941461]},"n2550":{"id":"n2550","loc":[-85.633915,41.943613]},"n2551":{"id":"n2551","loc":[-85.634015,41.943555]},"n2552":{"id":"n2552","loc":[-85.63433,41.943839]},"n2553":{"id":"n2553","loc":[-85.634236,41.943894]},"n2554":{"id":"n2554","loc":[-85.635413,41.946052]},"n2555":{"id":"n2555","loc":[-85.635405,41.94569]},"n2556":{"id":"n2556","loc":[-85.635684,41.945925]},"n2557":{"id":"n2557","loc":[-85.635614,41.945742]},"n2558":{"id":"n2558","loc":[-85.635401,41.945745]},"n2559":{"id":"n2559","loc":[-85.635406,41.945928]},"n256":{"id":"n256","loc":[-85.636799,41.941461]},"n2560":{"id":"n2560","loc":[-85.633478,41.943663]},"n2561":{"id":"n2561","loc":[-85.633291,41.943526]},"n2562":{"id":"n2562","loc":[-85.633094,41.943541]},"n2563":{"id":"n2563","loc":[-85.633302,41.943492]},"n2564":{"id":"n2564","loc":[-85.633047,41.943623]},"n2565":{"id":"n2565","loc":[-85.633275,41.943562]},"n2566":{"id":"n2566","loc":[-85.633351,41.943518]},"n2567":{"id":"n2567","loc":[-85.633224,41.9434]},"n2568":{"id":"n2568","loc":[-85.633235,41.943369]},"n2569":{"id":"n2569","loc":[-85.635179,41.943911]},"n257":{"id":"n257","loc":[-85.6368,41.9415]},"n2570":{"id":"n2570","loc":[-85.635146,41.943918]},"n2571":{"id":"n2571","loc":[-85.634888,41.943905]},"n2572":{"id":"n2572","loc":[-85.634832,41.943911]},"n2573":{"id":"n2573","loc":[-85.634638,41.944007]},"n2574":{"id":"n2574","loc":[-85.634568,41.94405]},"n2575":{"id":"n2575","loc":[-85.635994,41.94501]},"n2576":{"id":"n2576","loc":[-85.636388,41.944608]},"n2577":{"id":"n2577","loc":[-85.636215,41.944787]},"n2578":{"id":"n2578","loc":[-85.637948,41.944587]},"n2579":{"id":"n2579","loc":[-85.637849,41.944567]},"n258":{"id":"n258","loc":[-85.636814,41.9415]},"n2580":{"id":"n2580","loc":[-85.637895,41.944455]},"n2581":{"id":"n2581","loc":[-85.637996,41.944477]},"n2582":{"id":"n2582","loc":[-85.635525,41.94337]},"n2583":{"id":"n2583","loc":[-85.637847,41.943923]},"n2584":{"id":"n2584","loc":[-85.637891,41.944124]},"n2585":{"id":"n2585","loc":[-85.638167,41.944229]},"n2586":{"id":"n2586","loc":[-85.638236,41.944097]},"n2587":{"id":"n2587","loc":[-85.638207,41.944025]},"n2588":{"id":"n2588","loc":[-85.638141,41.943997]},"n2589":{"id":"n2589","loc":[-85.638057,41.944015]},"n259":{"id":"n259","loc":[-85.636815,41.941538]},"n2590":{"id":"n2590","loc":[-85.637902,41.944231]},"n2591":{"id":"n2591","loc":[-85.638134,41.944307]},"n2592":{"id":"n2592","loc":[-85.638242,41.944294]},"n2593":{"id":"n2593","loc":[-85.638274,41.944222]},"n2594":{"id":"n2594","loc":[-85.638236,41.944174]},"n2595":{"id":"n2595","loc":[-85.638207,41.944157]},"n2596":{"id":"n2596","loc":[-85.637818,41.943984]},"n2597":{"id":"n2597","loc":[-85.634996,41.944439]},"n2598":{"id":"n2598","loc":[-85.633946,41.945804]},"n2599":{"id":"n2599","loc":[-85.634102,41.945864]},"n26":{"id":"n26","loc":[-85.634346,41.942744]},"n260":{"id":"n260","loc":[-85.636827,41.941538]},"n2600":{"id":"n2600","loc":[-85.633819,41.945756]},"n2601":{"id":"n2601","loc":[-85.634025,41.945975]},"n2602":{"id":"n2602","loc":[-85.633742,41.945867]},"n2603":{"id":"n2603","loc":[-85.63373,41.946004]},"n2604":{"id":"n2604","loc":[-85.633947,41.946081]},"n2605":{"id":"n2605","loc":[-85.633872,41.945917]},"n2606":{"id":"n2606","loc":[-85.633825,41.945985]},"n2607":{"id":"n2607","loc":[-85.633762,41.94596]},"n2608":{"id":"n2608","loc":[-85.634224,41.946037]},"n2609":{"id":"n2609","loc":[-85.634357,41.945851]},"n261":{"id":"n261","loc":[-85.636828,41.941584]},"n2610":{"id":"n2610","loc":[-85.634398,41.945813]},"n2611":{"id":"n2611","loc":[-85.634461,41.945812]},"n2612":{"id":"n2612","loc":[-85.634501,41.945852]},"n2613":{"id":"n2613","loc":[-85.634503,41.94597]},"n2614":{"id":"n2614","loc":[-85.634462,41.945971]},"n2615":{"id":"n2615","loc":[-85.634465,41.946036]},"n2616":{"id":"n2616","loc":[-85.634235,41.946072]},"n2617":{"id":"n2617","loc":[-85.634447,41.946036]},"n2618":{"id":"n2618","loc":[-85.634448,41.946052]},"n2619":{"id":"n2619","loc":[-85.634494,41.946051]},"n262":{"id":"n262","loc":[-85.636819,41.941585]},"n2620":{"id":"n2620","loc":[-85.634497,41.946144]},"n2621":{"id":"n2621","loc":[-85.634453,41.946144]},"n2622":{"id":"n2622","loc":[-85.634454,41.94616]},"n2623":{"id":"n2623","loc":[-85.634393,41.946161]},"n2624":{"id":"n2624","loc":[-85.634394,41.94618]},"n2625":{"id":"n2625","loc":[-85.634345,41.94618]},"n2626":{"id":"n2626","loc":[-85.634344,41.946162]},"n2627":{"id":"n2627","loc":[-85.63427,41.946163]},"n2628":{"id":"n2628","loc":[-85.634266,41.946071]},"n2629":{"id":"n2629","loc":[-85.634148,41.946163]},"n263":{"id":"n263","loc":[-85.636854,41.941714]},"n2630":{"id":"n2630","loc":[-85.634213,41.946072]},"n2631":{"id":"n2631","loc":[-85.633293,41.946309]},"n2632":{"id":"n2632","loc":[-85.633122,41.946239]},"n2633":{"id":"n2633","loc":[-85.633295,41.946005]},"n2634":{"id":"n2634","loc":[-85.633395,41.946047]},"n2635":{"id":"n2635","loc":[-85.633404,41.946035]},"n2636":{"id":"n2636","loc":[-85.633459,41.946057]},"n2637":{"id":"n2637","loc":[-85.633387,41.946154]},"n2638":{"id":"n2638","loc":[-85.633403,41.946161]},"n2639":{"id":"n2639","loc":[-85.634176,41.946415]},"n264":{"id":"n264","loc":[-85.636855,41.941774]},"n2640":{"id":"n2640","loc":[-85.634179,41.946339]},"n2641":{"id":"n2641","loc":[-85.634455,41.946345]},"n2642":{"id":"n2642","loc":[-85.634452,41.946422]},"n2643":{"id":"n2643","loc":[-85.63437,41.946421]},"n2644":{"id":"n2644","loc":[-85.634367,41.946497]},"n2645":{"id":"n2645","loc":[-85.634289,41.946495]},"n2646":{"id":"n2646","loc":[-85.634291,41.946448]},"n2647":{"id":"n2647","loc":[-85.634269,41.946448]},"n2648":{"id":"n2648","loc":[-85.63427,41.946417]},"n2649":{"id":"n2649","loc":[-85.63484,41.946328]},"n265":{"id":"n265","loc":[-85.636822,41.941774]},"n2650":{"id":"n2650","loc":[-85.634839,41.946187]},"n2651":{"id":"n2651","loc":[-85.635148,41.946186]},"n2652":{"id":"n2652","loc":[-85.635148,41.946216]},"n2653":{"id":"n2653","loc":[-85.63521,41.946216]},"n2654":{"id":"n2654","loc":[-85.63521,41.946348]},"n2655":{"id":"n2655","loc":[-85.635154,41.946348]},"n2656":{"id":"n2656","loc":[-85.635153,41.946327]},"n2657":{"id":"n2657","loc":[-85.634037,41.946957]},"n2658":{"id":"n2658","loc":[-85.634253,41.946953]},"n2659":{"id":"n2659","loc":[-85.63481,41.946543]},"n266":{"id":"n266","loc":[-85.636822,41.941778]},"n2660":{"id":"n2660","loc":[-85.634809,41.946459]},"n2661":{"id":"n2661","loc":[-85.635154,41.946458]},"n2662":{"id":"n2662","loc":[-85.635155,41.946554]},"n2663":{"id":"n2663","loc":[-85.635022,41.946547]},"n2664":{"id":"n2664","loc":[-85.635022,41.946573]},"n2665":{"id":"n2665","loc":[-85.634909,41.946574]},"n2666":{"id":"n2666","loc":[-85.634909,41.946561]},"n2667":{"id":"n2667","loc":[-85.634896,41.947159]},"n2668":{"id":"n2668","loc":[-85.634894,41.947032]},"n2669":{"id":"n2669","loc":[-85.635024,41.947031]},"n267":{"id":"n267","loc":[-85.636756,41.941779]},"n2670":{"id":"n2670","loc":[-85.635026,41.947158]},"n2671":{"id":"n2671","loc":[-85.635233,41.947105]},"n2672":{"id":"n2672","loc":[-85.635236,41.946991]},"n2673":{"id":"n2673","loc":[-85.635369,41.946993]},"n2674":{"id":"n2674","loc":[-85.635366,41.947107]},"n2675":{"id":"n2675","loc":[-85.634824,41.946929]},"n2676":{"id":"n2676","loc":[-85.634825,41.946818]},"n2677":{"id":"n2677","loc":[-85.63512,41.946819]},"n2678":{"id":"n2678","loc":[-85.635119,41.94693]},"n2679":{"id":"n2679","loc":[-85.634796,41.946806]},"n268":{"id":"n268","loc":[-85.636756,41.941774]},"n2680":{"id":"n2680","loc":[-85.634792,41.946604]},"n2681":{"id":"n2681","loc":[-85.634948,41.946602]},"n2682":{"id":"n2682","loc":[-85.634949,41.946645]},"n2683":{"id":"n2683","loc":[-85.634975,41.946644]},"n2684":{"id":"n2684","loc":[-85.634974,41.946599]},"n2685":{"id":"n2685","loc":[-85.635117,41.946598]},"n2686":{"id":"n2686","loc":[-85.635122,41.946801]},"n2687":{"id":"n2687","loc":[-85.634981,41.946803]},"n2688":{"id":"n2688","loc":[-85.634979,41.946752]},"n2689":{"id":"n2689","loc":[-85.634952,41.946752]},"n269":{"id":"n269","loc":[-85.636721,41.941774]},"n2690":{"id":"n2690","loc":[-85.634953,41.946804]},"n2691":{"id":"n2691","loc":[-85.634649,41.946841]},"n2692":{"id":"n2692","loc":[-85.634331,41.94684]},"n2693":{"id":"n2693","loc":[-85.634183,41.946809]},"n2694":{"id":"n2694","loc":[-85.633699,41.946607]},"n2695":{"id":"n2695","loc":[-85.634487,41.946664]},"n2696":{"id":"n2696","loc":[-85.634486,41.946598]},"n2697":{"id":"n2697","loc":[-85.63423,41.946599]},"n2698":{"id":"n2698","loc":[-85.634231,41.946662]},"n2699":{"id":"n2699","loc":[-85.634284,41.946662]},"n27":{"id":"n27","loc":[-85.634136,41.943183]},"n270":{"id":"n270","loc":[-85.63672,41.941714]},"n2700":{"id":"n2700","loc":[-85.634284,41.946679]},"n2701":{"id":"n2701","loc":[-85.634365,41.946679]},"n2702":{"id":"n2702","loc":[-85.634365,41.946664]},"n2703":{"id":"n2703","loc":[-85.635443,41.947015]},"n2704":{"id":"n2704","loc":[-85.635442,41.946801]},"n2705":{"id":"n2705","loc":[-85.63603,41.9468]},"n2706":{"id":"n2706","loc":[-85.636028,41.947016]},"n2707":{"id":"n2707","loc":[-85.635457,41.946582]},"n2708":{"id":"n2708","loc":[-85.635455,41.946211]},"n2709":{"id":"n2709","loc":[-85.635636,41.946579]},"n271":{"id":"n271","loc":[-85.636767,41.941713]},"n2710":{"id":"n2710","loc":[-85.635716,41.9468]},"n2711":{"id":"n2711","loc":[-85.635969,41.9468]},"n2712":{"id":"n2712","loc":[-85.635973,41.946295]},"n2713":{"id":"n2713","loc":[-85.636019,41.946484]},"n2714":{"id":"n2714","loc":[-85.636022,41.946388]},"n2715":{"id":"n2715","loc":[-85.635961,41.946493]},"n2716":{"id":"n2716","loc":[-85.635713,41.94621]},"n2717":{"id":"n2717","loc":[-85.635416,41.946142]},"n2718":{"id":"n2718","loc":[-85.635759,41.946203]},"n2719":{"id":"n2719","loc":[-85.636153,41.946747]},"n272":{"id":"n272","loc":[-85.636767,41.941706]},"n2720":{"id":"n2720","loc":[-85.635417,41.946915]},"n2721":{"id":"n2721","loc":[-85.636154,41.946915]},"n2722":{"id":"n2722","loc":[-85.635866,41.946473]},"n2723":{"id":"n2723","loc":[-85.635717,41.946633]},"n2724":{"id":"n2724","loc":[-85.635556,41.946166]},"n2725":{"id":"n2725","loc":[-85.63556,41.946556]},"n2726":{"id":"n2726","loc":[-85.635731,41.946594]},"n2727":{"id":"n2727","loc":[-85.635866,41.946595]},"n2728":{"id":"n2728","loc":[-85.635456,41.947028]},"n2729":{"id":"n2729","loc":[-85.635796,41.947023]},"n273":{"id":"n273","loc":[-85.636779,41.941698]},"n2730":{"id":"n2730","loc":[-85.635798,41.947091]},"n2731":{"id":"n2731","loc":[-85.63573,41.947092]},"n2732":{"id":"n2732","loc":[-85.635733,41.947233]},"n2733":{"id":"n2733","loc":[-85.636283,41.946863]},"n2734":{"id":"n2734","loc":[-85.63628,41.946706]},"n2735":{"id":"n2735","loc":[-85.636341,41.946705]},"n2736":{"id":"n2736","loc":[-85.636273,41.946584]},"n2737":{"id":"n2737","loc":[-85.636396,41.946545]},"n2738":{"id":"n2738","loc":[-85.636474,41.946684]},"n2739":{"id":"n2739","loc":[-85.636511,41.946861]},"n274":{"id":"n274","loc":[-85.636798,41.941697]},"n2740":{"id":"n2740","loc":[-85.633713,41.947184]},"n2741":{"id":"n2741","loc":[-85.633651,41.94716]},"n2742":{"id":"n2742","loc":[-85.633704,41.947085]},"n2743":{"id":"n2743","loc":[-85.6336,41.947044]},"n2744":{"id":"n2744","loc":[-85.633506,41.947177]},"n2745":{"id":"n2745","loc":[-85.629586,41.952469]},"n2746":{"id":"n2746","loc":[-85.634723,41.953681]},"n2747":{"id":"n2747","loc":[-85.63478,41.959007]},"n2748":{"id":"n2748","loc":[-85.632793,41.94405],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2749":{"id":"n2749","loc":[-85.634648,41.947325]},"n275":{"id":"n275","loc":[-85.63681,41.941705]},"n2750":{"id":"n2750","loc":[-85.625078,41.952097]},"n2751":{"id":"n2751","loc":[-85.633195,41.94734]},"n2752":{"id":"n2752","loc":[-85.626447,41.957168]},"n2753":{"id":"n2753","loc":[-85.632023,41.949012]},"n2754":{"id":"n2754","loc":[-85.630835,41.950656]},"n2755":{"id":"n2755","loc":[-85.634655,41.948612]},"n2756":{"id":"n2756","loc":[-85.636182,41.948605]},"n2757":{"id":"n2757","loc":[-85.634729,41.954667]},"n2758":{"id":"n2758","loc":[-85.634686,41.951159]},"n2759":{"id":"n2759","loc":[-85.636206,41.951146]},"n276":{"id":"n276","loc":[-85.63681,41.941714]},"n2760":{"id":"n2760","loc":[-85.634668,41.949891]},"n2761":{"id":"n2761","loc":[-85.634701,41.952422]},"n2762":{"id":"n2762","loc":[-85.634747,41.955907]},"n2763":{"id":"n2763","loc":[-85.627975,41.954695]},"n2764":{"id":"n2764","loc":[-85.626832,41.954698]},"n2765":{"id":"n2765","loc":[-85.632278,41.948624]},"n2766":{"id":"n2766","loc":[-85.628639,41.953725]},"n2767":{"id":"n2767","loc":[-85.636233,41.95241]},"n2768":{"id":"n2768","loc":[-85.631385,41.949913]},"n2769":{"id":"n2769","loc":[-85.630486,41.951194]},"n277":{"id":"n277","loc":[-85.636861,41.942041]},"n2770":{"id":"n2770","loc":[-85.624937,41.952088]},"n2771":{"id":"n2771","loc":[-85.624945,41.952022]},"n2772":{"id":"n2772","loc":[-85.636162,41.94731]},"n2773":{"id":"n2773","loc":[-85.636188,41.949881]},"n2774":{"id":"n2774","loc":[-85.631422,41.948294]},"n2775":{"id":"n2775","loc":[-85.632844,41.945547]},"n2776":{"id":"n2776","loc":[-85.632484,41.945344]},"n2777":{"id":"n2777","loc":[-85.631775,41.944636]},"n2778":{"id":"n2778","loc":[-85.632656,41.945471]},"n2779":{"id":"n2779","loc":[-85.631959,41.944827]},"n278":{"id":"n278","loc":[-85.636862,41.942099]},"n2780":{"id":"n2780","loc":[-85.631679,41.94438]},"n2781":{"id":"n2781","loc":[-85.625129,41.959272]},"n2782":{"id":"n2782","loc":[-85.632446,41.944861]},"n2783":{"id":"n2783","loc":[-85.632804,41.945477]},"n2784":{"id":"n2784","loc":[-85.632255,41.944962]},"n2785":{"id":"n2785","loc":[-85.632736,41.944757]},"n2786":{"id":"n2786","loc":[-85.632543,41.94486]},"n2787":{"id":"n2787","loc":[-85.632889,41.945561]},"n2788":{"id":"n2788","loc":[-85.632091,41.944949]},"n2789":{"id":"n2789","loc":[-85.632537,41.944713]},"n279":{"id":"n279","loc":[-85.636807,41.942099]},"n2790":{"id":"n2790","loc":[-85.632279,41.94485]},"n2791":{"id":"n2791","loc":[-85.632749,41.943247]},"n2792":{"id":"n2792","loc":[-85.632824,41.943152]},"n2793":{"id":"n2793","loc":[-85.632929,41.94317]},"n2794":{"id":"n2794","loc":[-85.632897,41.943078]},"n2795":{"id":"n2795","loc":[-85.632626,41.943231]},"n2796":{"id":"n2796","loc":[-85.634048,41.947257]},"n2797":{"id":"n2797","loc":[-85.634264,41.947252]},"n2798":{"id":"n2798","loc":[-85.635418,41.947317]},"n2799":{"id":"n2799","loc":[-85.635461,41.947237]},"n28":{"id":"n28","loc":[-85.63821,41.944308]},"n280":{"id":"n280","loc":[-85.636807,41.942126]},"n2800":{"id":"n2800","loc":[-85.632868,41.946229]},"n2801":{"id":"n2801","loc":[-85.633673,41.947242]},"n2802":{"id":"n2802","loc":[-85.623604,41.945881],"tags":{"amenity":"school","name":"Barrows School"}},"n2803":{"id":"n2803","loc":[-85.627401,41.943496]},"n2804":{"id":"n2804","loc":[-85.627403,41.943625]},"n2805":{"id":"n2805","loc":[-85.626409,41.943215]},"n2806":{"id":"n2806","loc":[-85.624884,41.943508]},"n2807":{"id":"n2807","loc":[-85.625191,41.943509]},"n2808":{"id":"n2808","loc":[-85.624882,41.94382]},"n2809":{"id":"n2809","loc":[-85.624893,41.945618]},"n281":{"id":"n281","loc":[-85.636726,41.942126]},"n2810":{"id":"n2810","loc":[-85.624912,41.946524]},"n2811":{"id":"n2811","loc":[-85.622721,41.946535]},"n2812":{"id":"n2812","loc":[-85.627399,41.94469]},"n2813":{"id":"n2813","loc":[-85.622716,41.945622]},"n2814":{"id":"n2814","loc":[-85.624886,41.944724]},"n2815":{"id":"n2815","loc":[-85.622674,41.944737]},"n2816":{"id":"n2816","loc":[-85.625092,41.945063]},"n2817":{"id":"n2817","loc":[-85.625233,41.945064]},"n2818":{"id":"n2818","loc":[-85.625229,41.944871]},"n2819":{"id":"n2819","loc":[-85.625066,41.944871]},"n282":{"id":"n282","loc":[-85.636726,41.942098]},"n2820":{"id":"n2820","loc":[-85.625024,41.944901]},"n2821":{"id":"n2821","loc":[-85.625025,41.944924]},"n2822":{"id":"n2822","loc":[-85.625087,41.944926]},"n2823":{"id":"n2823","loc":[-85.625349,41.944506]},"n2824":{"id":"n2824","loc":[-85.625347,41.944388]},"n2825":{"id":"n2825","loc":[-85.625152,41.94439]},"n2826":{"id":"n2826","loc":[-85.625152,41.944431]},"n2827":{"id":"n2827","loc":[-85.625134,41.944431]},"n2828":{"id":"n2828","loc":[-85.625136,41.944508]},"n2829":{"id":"n2829","loc":[-85.623236,41.946341]},"n283":{"id":"n283","loc":[-85.636708,41.942098]},"n2830":{"id":"n2830","loc":[-85.623241,41.946067]},"n2831":{"id":"n2831","loc":[-85.623207,41.946067]},"n2832":{"id":"n2832","loc":[-85.623212,41.945827]},"n2833":{"id":"n2833","loc":[-85.622981,41.945825]},"n2834":{"id":"n2834","loc":[-85.622976,41.946063]},"n2835":{"id":"n2835","loc":[-85.623006,41.946063]},"n2836":{"id":"n2836","loc":[-85.623002,41.946256]},"n2837":{"id":"n2837","loc":[-85.623075,41.946256]},"n2838":{"id":"n2838","loc":[-85.623074,41.946339]},"n2839":{"id":"n2839","loc":[-85.624574,41.951755]},"n284":{"id":"n284","loc":[-85.636708,41.942041]},"n2840":{"id":"n2840","loc":[-85.62498,41.951844]},"n2841":{"id":"n2841","loc":[-85.625086,41.95188]},"n2842":{"id":"n2842","loc":[-85.625135,41.951922]},"n2843":{"id":"n2843","loc":[-85.615273,41.945637]},"n2844":{"id":"n2844","loc":[-85.620172,41.945627]},"n2845":{"id":"n2845","loc":[-85.625167,41.951985]},"n2846":{"id":"n2846","loc":[-85.622741,41.947437]},"n2847":{"id":"n2847","loc":[-85.624907,41.947428]},"n2848":{"id":"n2848","loc":[-85.627046,41.940995]},"n2849":{"id":"n2849","loc":[-85.627295,41.941304]},"n285":{"id":"n285","loc":[-85.635618,41.941852]},"n2850":{"id":"n2850","loc":[-85.627352,41.94148]},"n2851":{"id":"n2851","loc":[-85.62737,41.942261]},"n2852":{"id":"n2852","loc":[-85.6264,41.942263]},"n2853":{"id":"n2853","loc":[-85.622769,41.949228]},"n2854":{"id":"n2854","loc":[-85.624937,41.949218]},"n2855":{"id":"n2855","loc":[-85.630001,41.944664]},"n2856":{"id":"n2856","loc":[-85.624873,41.942022]},"n2857":{"id":"n2857","loc":[-85.622761,41.948333]},"n2858":{"id":"n2858","loc":[-85.624924,41.948334]},"n2859":{"id":"n2859","loc":[-85.620051,41.94383]},"n286":{"id":"n286","loc":[-85.635621,41.94202]},"n2860":{"id":"n2860","loc":[-85.627629,41.946498]},"n2861":{"id":"n2861","loc":[-85.622757,41.950111]},"n2862":{"id":"n2862","loc":[-85.623685,41.954624]},"n2863":{"id":"n2863","loc":[-85.621459,41.944756]},"n2864":{"id":"n2864","loc":[-85.628637,41.944676]},"n2865":{"id":"n2865","loc":[-85.630125,41.944654]},"n2866":{"id":"n2866","loc":[-85.625196,41.952097]},"n2867":{"id":"n2867","loc":[-85.630257,41.944637]},"n2868":{"id":"n2868","loc":[-85.631247,41.944459]},"n2869":{"id":"n2869","loc":[-85.624867,41.94159]},"n287":{"id":"n287","loc":[-85.63524,41.942023]},"n2870":{"id":"n2870","loc":[-85.624958,41.950343]},"n2871":{"id":"n2871","loc":[-85.624948,41.950484]},"n2872":{"id":"n2872","loc":[-85.624813,41.950983]},"n2873":{"id":"n2873","loc":[-85.624723,41.951789]},"n2874":{"id":"n2874","loc":[-85.624262,41.9512]},"n2875":{"id":"n2875","loc":[-85.62414,41.951201]},"n2876":{"id":"n2876","loc":[-85.624139,41.95112]},"n2877":{"id":"n2877","loc":[-85.628481,41.945611]},"n2878":{"id":"n2878","loc":[-85.620072,41.946538]},"n2879":{"id":"n2879","loc":[-85.622763,41.95099]},"n288":{"id":"n288","loc":[-85.635237,41.941855]},"n2880":{"id":"n2880","loc":[-85.62814,41.946963]},"n2881":{"id":"n2881","loc":[-85.628245,41.947031]},"n2882":{"id":"n2882","loc":[-85.628331,41.947066]},"n2883":{"id":"n2883","loc":[-85.629722,41.944444],"tags":{"leisure":"park","name":"Scouter Park"}},"n2884":{"id":"n2884","loc":[-85.629977,41.943907]},"n2885":{"id":"n2885","loc":[-85.629947,41.943775]},"n2886":{"id":"n2886","loc":[-85.629899,41.943625]},"n2887":{"id":"n2887","loc":[-85.632286,41.944257]},"n2888":{"id":"n2888","loc":[-85.632523,41.944179]},"n2889":{"id":"n2889","loc":[-85.632141,41.944293]},"n289":{"id":"n289","loc":[-85.635568,41.940475]},"n2890":{"id":"n2890","loc":[-85.631571,41.9444]},"n2891":{"id":"n2891","loc":[-85.643236,41.941895]},"n2892":{"id":"n2892","loc":[-85.62865,41.945353]},"n2893":{"id":"n2893","loc":[-85.628594,41.945481]},"n2894":{"id":"n2894","loc":[-85.628581,41.947169]},"n2895":{"id":"n2895","loc":[-85.631843,41.943793]},"n2896":{"id":"n2896","loc":[-85.632299,41.943472]},"n2897":{"id":"n2897","loc":[-85.631519,41.944881]},"n2898":{"id":"n2898","loc":[-85.628429,41.947219]},"n2899":{"id":"n2899","loc":[-85.63145,41.945162]},"n29":{"id":"n29","loc":[-85.637963,41.944263]},"n290":{"id":"n290","loc":[-85.634584,41.940477]},"n2900":{"id":"n2900","loc":[-85.630939,41.945519]},"n2901":{"id":"n2901","loc":[-85.62903,41.945719]},"n2902":{"id":"n2902","loc":[-85.630521,41.945559]},"n2903":{"id":"n2903","loc":[-85.629294,41.945585]},"n2904":{"id":"n2904","loc":[-85.629845,41.945543]},"n2905":{"id":"n2905","loc":[-85.631497,41.944625]},"n2906":{"id":"n2906","loc":[-85.630281,41.945553]},"n2907":{"id":"n2907","loc":[-85.628553,41.946973]},"n2908":{"id":"n2908","loc":[-85.631383,41.945338]},"n2909":{"id":"n2909","loc":[-85.628843,41.946103]},"n291":{"id":"n291","loc":[-85.634583,41.940203]},"n2910":{"id":"n2910","loc":[-85.631193,41.945473]},"n2911":{"id":"n2911","loc":[-85.628897,41.945944]},"n2912":{"id":"n2912","loc":[-85.628789,41.946454]},"n2913":{"id":"n2913","loc":[-85.632548,41.944563]},"n2914":{"id":"n2914","loc":[-85.627527,41.944555]},"n2915":{"id":"n2915","loc":[-85.62752,41.943726]},"n2916":{"id":"n2916","loc":[-85.627894,41.943723]},"n2917":{"id":"n2917","loc":[-85.627897,41.943919]},"n2918":{"id":"n2918","loc":[-85.627991,41.943934]},"n2919":{"id":"n2919","loc":[-85.628082,41.943966]},"n292":{"id":"n292","loc":[-85.635567,41.940201]},"n2920":{"id":"n2920","loc":[-85.628177,41.944015]},"n2921":{"id":"n2921","loc":[-85.628193,41.944048]},"n2922":{"id":"n2922","loc":[-85.628167,41.944054]},"n2923":{"id":"n2923","loc":[-85.628193,41.944094]},"n2924":{"id":"n2924","loc":[-85.628213,41.944144]},"n2925":{"id":"n2925","loc":[-85.628214,41.944199]},"n2926":{"id":"n2926","loc":[-85.62833,41.944196]},"n2927":{"id":"n2927","loc":[-85.628328,41.944262]},"n2928":{"id":"n2928","loc":[-85.628173,41.944262]},"n2929":{"id":"n2929","loc":[-85.628171,41.944293]},"n293":{"id":"n293","loc":[-85.635816,41.942673],"tags":{"crossing":"zebra","highway":"crossing"}},"n2930":{"id":"n2930","loc":[-85.628039,41.944296]},"n2931":{"id":"n2931","loc":[-85.62804,41.944329]},"n2932":{"id":"n2932","loc":[-85.627829,41.944335]},"n2933":{"id":"n2933","loc":[-85.627835,41.94455]},"n2936":{"id":"n2936","loc":[-85.632823,41.945994]},"n294":{"id":"n294","loc":[-85.635696,41.942712]},"n2940":{"id":"n2940","loc":[-85.632192,41.945973]},"n2941":{"id":"n2941","loc":[-85.63226,41.94587]},"n2942":{"id":"n2942","loc":[-85.632721,41.946036]},"n2943":{"id":"n2943","loc":[-85.632641,41.946142]},"n2944":{"id":"n2944","loc":[-85.62937,41.947467]},"n2945":{"id":"n2945","loc":[-85.62959,41.942936]},"n2946":{"id":"n2946","loc":[-85.629551,41.94284]},"n2947":{"id":"n2947","loc":[-85.629501,41.942704]},"n2948":{"id":"n2948","loc":[-85.629472,41.942578]},"n2949":{"id":"n2949","loc":[-85.629361,41.941801]},"n295":{"id":"n295","loc":[-85.635679,41.941962]},"n2950":{"id":"n2950","loc":[-85.629339,41.941716]},"n2951":{"id":"n2951","loc":[-85.629315,41.94166]},"n2952":{"id":"n2952","loc":[-85.629279,41.941602]},"n2953":{"id":"n2953","loc":[-85.629227,41.941556]},"n2954":{"id":"n2954","loc":[-85.624261,41.95112]},"n2955":{"id":"n2955","loc":[-85.629153,41.941524]},"n2956":{"id":"n2956","loc":[-85.626904,41.941098]},"n2957":{"id":"n2957","loc":[-85.624588,41.951294]},"n2958":{"id":"n2958","loc":[-85.631844,41.942945]},"n2959":{"id":"n2959","loc":[-85.625854,41.949222]},"n296":{"id":"n296","loc":[-85.635672,41.941337]},"n2960":{"id":"n2960","loc":[-85.625146,41.955238]},"n2961":{"id":"n2961","loc":[-85.626745,41.948296]},"n2962":{"id":"n2962","loc":[-85.625721,41.95524]},"n2963":{"id":"n2963","loc":[-85.624706,41.952317]},"n2964":{"id":"n2964","loc":[-85.62609,41.956147]},"n2965":{"id":"n2965","loc":[-85.624401,41.954928]},"n2966":{"id":"n2966","loc":[-85.626558,41.955367]},"n2967":{"id":"n2967","loc":[-85.62468,41.955096]},"n2968":{"id":"n2968","loc":[-85.624159,41.953929]},"n2969":{"id":"n2969","loc":[-85.62506,41.951113]},"n297":{"id":"n297","loc":[-85.635658,41.941284]},"n2970":{"id":"n2970","loc":[-85.624942,41.951591]},"n2971":{"id":"n2971","loc":[-85.627399,41.947546]},"n2972":{"id":"n2972","loc":[-85.627695,41.947404]},"n2973":{"id":"n2973","loc":[-85.625925,41.94896]},"n2974":{"id":"n2974","loc":[-85.625725,41.950211]},"n2975":{"id":"n2975","loc":[-85.627008,41.947963]},"n2976":{"id":"n2976","loc":[-85.624373,41.953458]},"n2977":{"id":"n2977","loc":[-85.624137,41.954392]},"n2978":{"id":"n2978","loc":[-85.628257,41.947307]},"n2979":{"id":"n2979","loc":[-85.625281,41.95066]},"n298":{"id":"n298","loc":[-85.635602,41.941166]},"n2980":{"id":"n2980","loc":[-85.625865,41.949804]},"n2981":{"id":"n2981","loc":[-85.626508,41.955932]},"n2982":{"id":"n2982","loc":[-85.626333,41.955216]},"n2983":{"id":"n2983","loc":[-85.626637,41.955676]},"n2984":{"id":"n2984","loc":[-85.624223,41.954599]},"n2985":{"id":"n2985","loc":[-85.626219,41.948671]},"n2986":{"id":"n2986","loc":[-85.624556,41.953043]},"n2987":{"id":"n2987","loc":[-85.625598,41.956302]},"n2988":{"id":"n2988","loc":[-85.624571,41.952971]},"n2989":{"id":"n2989","loc":[-85.627141,41.940727]},"n299":{"id":"n299","loc":[-85.635598,41.941138]},"n2990":{"id":"n2990","loc":[-85.627102,41.939144]},"n2991":{"id":"n2991","loc":[-85.627127,41.940086]},"n2992":{"id":"n2992","loc":[-85.627116,41.940843]},"n2993":{"id":"n2993","loc":[-85.627132,41.9402]},"n2994":{"id":"n2994","loc":[-85.629734,41.940078]},"n2995":{"id":"n2995","loc":[-85.6276,41.937412]},"n2996":{"id":"n2996","loc":[-85.627451,41.937549]},"n2997":{"id":"n2997","loc":[-85.627375,41.937618]},"n2998":{"id":"n2998","loc":[-85.627278,41.937728]},"n2999":{"id":"n2999","loc":[-85.627199,41.937842]},"n3":{"id":"n3","loc":[-85.627345,41.953983]},"n30":{"id":"n30","loc":[-85.637882,41.944205]},"n300":{"id":"n300","loc":[-85.635614,41.941076]},"n3000":{"id":"n3000","loc":[-85.627141,41.937981]},"n3001":{"id":"n3001","loc":[-85.627109,41.938153]},"n3002":{"id":"n3002","loc":[-85.627101,41.938699]},"n3003":{"id":"n3003","loc":[-85.628311,41.942261]},"n3004":{"id":"n3004","loc":[-85.628439,41.940082]},"n3005":{"id":"n3005","loc":[-85.619538,41.942622],"tags":{"leisure":"slipway"}},"n3006":{"id":"n3006","loc":[-85.619872,41.942618]},"n3007":{"id":"n3007","loc":[-85.619755,41.942612]},"n3008":{"id":"n3008","loc":[-85.619647,41.942628]},"n3009":{"id":"n3009","loc":[-85.619415,41.942626]},"n301":{"id":"n301","loc":[-85.635659,41.940956]},"n3010":{"id":"n3010","loc":[-85.619212,41.942623]},"n3011":{"id":"n3011","loc":[-85.631485,41.942472]},"n3012":{"id":"n3012","loc":[-85.630986,41.941786]},"n3013":{"id":"n3013","loc":[-85.631797,41.942006]},"n3014":{"id":"n3014","loc":[-85.630972,41.941162]},"n3015":{"id":"n3015","loc":[-85.631396,41.941611],"tags":{"railway":"level_crossing"}},"n3016":{"id":"n3016","loc":[-85.631878,41.941545]},"n3017":{"id":"n3017","loc":[-85.630461,41.94055]},"n3018":{"id":"n3018","loc":[-85.629751,41.939539],"tags":{"railway":"level_crossing"}},"n3019":{"id":"n3019","loc":[-85.631663,41.941513]},"n302":{"id":"n302","loc":[-85.635666,41.940922]},"n3020":{"id":"n3020","loc":[-85.631328,41.941375]},"n3021":{"id":"n3021","loc":[-85.632554,41.941779]},"n3022":{"id":"n3022","loc":[-85.63245,41.941769]},"n3023":{"id":"n3023","loc":[-85.632475,41.941644]},"n3024":{"id":"n3024","loc":[-85.632581,41.941654]},"n3025":{"id":"n3025","loc":[-85.631957,41.941352]},"n3026":{"id":"n3026","loc":[-85.632293,41.941139]},"n3027":{"id":"n3027","loc":[-85.632315,41.941153]},"n3028":{"id":"n3028","loc":[-85.632302,41.941262]},"n3029":{"id":"n3029","loc":[-85.63237,41.941267]},"n303":{"id":"n303","loc":[-85.635667,41.940877]},"n3030":{"id":"n3030","loc":[-85.632356,41.941538]},"n3031":{"id":"n3031","loc":[-85.632134,41.941678]},"n3032":{"id":"n3032","loc":[-85.631942,41.941687]},"n3033":{"id":"n3033","loc":[-85.63203,41.941694]},"n3034":{"id":"n3034","loc":[-85.632166,41.941555]},"n3035":{"id":"n3035","loc":[-85.632412,41.941416]},"n3036":{"id":"n3036","loc":[-85.63248,41.941342]},"n3037":{"id":"n3037","loc":[-85.632502,41.941259]},"n3038":{"id":"n3038","loc":[-85.632453,41.941161]},"n3039":{"id":"n3039","loc":[-85.63235,41.941103]},"n304":{"id":"n304","loc":[-85.635668,41.940655]},"n3040":{"id":"n3040","loc":[-85.632236,41.941118]},"n3041":{"id":"n3041","loc":[-85.631894,41.941355]},"n3042":{"id":"n3042","loc":[-85.631859,41.941411]},"n3043":{"id":"n3043","loc":[-85.632011,41.941587]},"n3044":{"id":"n3044","loc":[-85.632446,41.941379]},"n3045":{"id":"n3045","loc":[-85.632511,41.941416]},"n3046":{"id":"n3046","loc":[-85.632545,41.941634]},"n3047":{"id":"n3047","loc":[-85.632612,41.94164]},"n3048":{"id":"n3048","loc":[-85.632595,41.942197]},"n3049":{"id":"n3049","loc":[-85.632565,41.942241]},"n305":{"id":"n305","loc":[-85.635628,41.940617]},"n3050":{"id":"n3050","loc":[-85.632515,41.942256]},"n3051":{"id":"n3051","loc":[-85.63245,41.94223]},"n3052":{"id":"n3052","loc":[-85.632401,41.942174]},"n3053":{"id":"n3053","loc":[-85.632391,41.942115]},"n3054":{"id":"n3054","loc":[-85.632029,41.941859]},"n3055":{"id":"n3055","loc":[-85.631828,41.941639]},"n3056":{"id":"n3056","loc":[-85.631829,41.941508]},"n3057":{"id":"n3057","loc":[-85.631281,41.94312]},"n3058":{"id":"n3058","loc":[-85.631421,41.943065]},"n3059":{"id":"n3059","loc":[-85.631339,41.942949]},"n306":{"id":"n306","loc":[-85.635623,41.940272]},"n3060":{"id":"n3060","loc":[-85.631199,41.943004]},"n3061":{"id":"n3061","loc":[-85.631102,41.942931]},"n3062":{"id":"n3062","loc":[-85.631009,41.942809]},"n3063":{"id":"n3063","loc":[-85.631383,41.94265]},"n3064":{"id":"n3064","loc":[-85.631477,41.942773]},"n3065":{"id":"n3065","loc":[-85.630638,41.942809]},"n3066":{"id":"n3066","loc":[-85.630738,41.942943]},"n3067":{"id":"n3067","loc":[-85.630841,41.9429]},"n3068":{"id":"n3068","loc":[-85.630741,41.942766]},"n3069":{"id":"n3069","loc":[-85.63054,41.942603]},"n307":{"id":"n307","loc":[-85.635651,41.940183]},"n3070":{"id":"n3070","loc":[-85.630498,41.942619]},"n3071":{"id":"n3071","loc":[-85.630567,41.942718]},"n3072":{"id":"n3072","loc":[-85.630616,41.942698]},"n3073":{"id":"n3073","loc":[-85.630642,41.94273]},"n3074":{"id":"n3074","loc":[-85.630686,41.942714]},"n3075":{"id":"n3075","loc":[-85.630715,41.942754]},"n3076":{"id":"n3076","loc":[-85.6309,41.942681]},"n3077":{"id":"n3077","loc":[-85.630843,41.942605]},"n3078":{"id":"n3078","loc":[-85.6309,41.942581]},"n3079":{"id":"n3079","loc":[-85.630832,41.942487]},"n308":{"id":"n308","loc":[-85.63577,41.940183],"tags":{"crossing":"zebra","highway":"crossing"}},"n3080":{"id":"n3080","loc":[-85.630773,41.942509]},"n3081":{"id":"n3081","loc":[-85.630718,41.942436]},"n3082":{"id":"n3082","loc":[-85.630485,41.942524]},"n3083":{"id":"n3083","loc":[-85.631468,41.941233]},"n3084":{"id":"n3084","loc":[-85.631334,41.94114]},"n3085":{"id":"n3085","loc":[-85.632052,41.940568]},"n3086":{"id":"n3086","loc":[-85.63219,41.940663]},"n3087":{"id":"n3087","loc":[-85.631323,41.940834]},"n3088":{"id":"n3088","loc":[-85.631122,41.941002]},"n3089":{"id":"n3089","loc":[-85.631321,41.941133]},"n309":{"id":"n309","loc":[-85.636939,41.942544]},"n3090":{"id":"n3090","loc":[-85.631521,41.940966]},"n3091":{"id":"n3091","loc":[-85.631103,41.940253]},"n3092":{"id":"n3092","loc":[-85.631226,41.940211]},"n3093":{"id":"n3093","loc":[-85.631597,41.940805]},"n3094":{"id":"n3094","loc":[-85.631474,41.940847]},"n3095":{"id":"n3095","loc":[-85.631811,41.940534]},"n3096":{"id":"n3096","loc":[-85.631588,41.94061]},"n3097":{"id":"n3097","loc":[-85.631438,41.940366]},"n3098":{"id":"n3098","loc":[-85.631661,41.94029]},"n3099":{"id":"n3099","loc":[-85.630621,41.940041]},"n31":{"id":"n31","loc":[-85.63827,41.944203]},"n310":{"id":"n310","loc":[-85.636323,41.942552]},"n3100":{"id":"n3100","loc":[-85.630436,41.939773]},"n3101":{"id":"n3101","loc":[-85.63059,41.939714]},"n3102":{"id":"n3102","loc":[-85.630775,41.939983]},"n3103":{"id":"n3103","loc":[-85.63047,41.940167]},"n3104":{"id":"n3104","loc":[-85.63013,41.939686]},"n3105":{"id":"n3105","loc":[-85.630302,41.939618]},"n3106":{"id":"n3106","loc":[-85.630641,41.9401]},"n3107":{"id":"n3107","loc":[-85.630966,41.940619]},"n3108":{"id":"n3108","loc":[-85.630874,41.940493]},"n3109":{"id":"n3109","loc":[-85.630933,41.940469]},"n311":{"id":"n311","loc":[-85.636257,41.942555]},"n3110":{"id":"n3110","loc":[-85.630763,41.940236]},"n3111":{"id":"n3111","loc":[-85.63088,41.940189]},"n3112":{"id":"n3112","loc":[-85.631142,41.940548]},"n3113":{"id":"n3113","loc":[-85.630958,41.940871]},"n3114":{"id":"n3114","loc":[-85.630874,41.940778]},"n3115":{"id":"n3115","loc":[-85.631062,41.940684]},"n3116":{"id":"n3116","loc":[-85.631146,41.940777]},"n3117":{"id":"n3117","loc":[-85.632031,41.940575]},"n3118":{"id":"n3118","loc":[-85.631777,41.940186]},"n3119":{"id":"n3119","loc":[-85.631346,41.940179]},"n312":{"id":"n312","loc":[-85.636208,41.942561]},"n3120":{"id":"n3120","loc":[-85.631342,41.94012]},"n3121":{"id":"n3121","loc":[-85.631831,41.940118]},"n3122":{"id":"n3122","loc":[-85.632115,41.940543]},"n3123":{"id":"n3123","loc":[-85.631031,41.941683]},"n3124":{"id":"n3124","loc":[-85.630981,41.941608]},"n3125":{"id":"n3125","loc":[-85.631209,41.941516]},"n3126":{"id":"n3126","loc":[-85.631264,41.941586]},"n3127":{"id":"n3127","loc":[-85.630938,41.94155]},"n3128":{"id":"n3128","loc":[-85.631156,41.941462]},"n3129":{"id":"n3129","loc":[-85.631197,41.94152]},"n313":{"id":"n313","loc":[-85.636159,41.942573]},"n3130":{"id":"n3130","loc":[-85.630895,41.941485]},"n3131":{"id":"n3131","loc":[-85.630824,41.941389]},"n3132":{"id":"n3132","loc":[-85.630986,41.941323]},"n3133":{"id":"n3133","loc":[-85.631057,41.941419]},"n3134":{"id":"n3134","loc":[-85.630777,41.941328]},"n3135":{"id":"n3135","loc":[-85.630907,41.941274]},"n3136":{"id":"n3136","loc":[-85.630953,41.941335]},"n3137":{"id":"n3137","loc":[-85.630797,41.941247]},"n3138":{"id":"n3138","loc":[-85.630701,41.94117]},"n3139":{"id":"n3139","loc":[-85.630829,41.941113]},"n314":{"id":"n314","loc":[-85.635743,41.942881]},"n3140":{"id":"n3140","loc":[-85.6309,41.941201]},"n3141":{"id":"n3141","loc":[-85.630765,41.941206]},"n3142":{"id":"n3142","loc":[-85.630739,41.941218]},"n3143":{"id":"n3143","loc":[-85.630582,41.941039]},"n3144":{"id":"n3144","loc":[-85.630412,41.940818]},"n3145":{"id":"n3145","loc":[-85.630509,41.940777]},"n3146":{"id":"n3146","loc":[-85.630678,41.941004]},"n3147":{"id":"n3147","loc":[-85.630773,41.942166]},"n3148":{"id":"n3148","loc":[-85.630708,41.942074]},"n3149":{"id":"n3149","loc":[-85.630863,41.942013]},"n315":{"id":"n315","loc":[-85.635452,41.942966]},"n3150":{"id":"n3150","loc":[-85.630928,41.942105]},"n3151":{"id":"n3151","loc":[-85.630701,41.942026]},"n3152":{"id":"n3152","loc":[-85.630665,41.941971]},"n3153":{"id":"n3153","loc":[-85.630793,41.941918]},"n3154":{"id":"n3154","loc":[-85.630837,41.94197]},"n3155":{"id":"n3155","loc":[-85.630757,41.941871]},"n3156":{"id":"n3156","loc":[-85.630629,41.941923]},"n3157":{"id":"n3157","loc":[-85.630694,41.941783]},"n3158":{"id":"n3158","loc":[-85.630534,41.941847]},"n3159":{"id":"n3159","loc":[-85.630598,41.941935]},"n316":{"id":"n316","loc":[-85.634911,41.943118]},"n3160":{"id":"n3160","loc":[-85.631548,41.93938]},"n3161":{"id":"n3161","loc":[-85.631525,41.939919]},"n3162":{"id":"n3162","loc":[-85.631648,41.940043]},"n3163":{"id":"n3163","loc":[-85.624586,41.951121]},"n3164":{"id":"n3164","loc":[-85.622139,41.952064]},"n3165":{"id":"n3165","loc":[-85.622141,41.952144]},"n3166":{"id":"n3166","loc":[-85.621977,41.952146]},"n3167":{"id":"n3167","loc":[-85.621978,41.952211]},"n3168":{"id":"n3168","loc":[-85.62191,41.952212]},"n3169":{"id":"n3169","loc":[-85.633628,41.935437]},"n317":{"id":"n317","loc":[-85.634743,41.943167]},"n3170":{"id":"n3170","loc":[-85.632849,41.935518]},"n3171":{"id":"n3171","loc":[-85.632376,41.93574]},"n3172":{"id":"n3172","loc":[-85.631517,41.935897]},"n3173":{"id":"n3173","loc":[-85.630433,41.936124]},"n3174":{"id":"n3174","loc":[-85.630207,41.936427]},"n3175":{"id":"n3175","loc":[-85.630346,41.936795]},"n3176":{"id":"n3176","loc":[-85.62996,41.936974]},"n3177":{"id":"n3177","loc":[-85.629916,41.937488]},"n3178":{"id":"n3178","loc":[-85.629946,41.937802]},"n3179":{"id":"n3179","loc":[-85.629977,41.937905]},"n318":{"id":"n318","loc":[-85.634401,41.94328]},"n3180":{"id":"n3180","loc":[-85.63016,41.937909]},"n3181":{"id":"n3181","loc":[-85.630804,41.937791]},"n3182":{"id":"n3182","loc":[-85.631688,41.937808]},"n3183":{"id":"n3183","loc":[-85.631685,41.938008]},"n3184":{"id":"n3184","loc":[-85.631845,41.938116]},"n3185":{"id":"n3185","loc":[-85.63207,41.938181]},"n3186":{"id":"n3186","loc":[-85.632143,41.938371]},"n3187":{"id":"n3187","loc":[-85.632056,41.938435]},"n3188":{"id":"n3188","loc":[-85.631787,41.938457]},"n3189":{"id":"n3189","loc":[-85.631657,41.938728]},"n319":{"id":"n319","loc":[-85.634345,41.943299]},"n3190":{"id":"n3190","loc":[-85.631595,41.93775]},"n3191":{"id":"n3191","loc":[-85.630264,41.937839]},"n3192":{"id":"n3192","loc":[-85.628591,41.948536]},"n3193":{"id":"n3193","loc":[-85.63205,41.951181]},"n3194":{"id":"n3194","loc":[-85.632034,41.949909]},"n3195":{"id":"n3195","loc":[-85.630841,41.951191]},"n3196":{"id":"n3196","loc":[-85.632083,41.9537]},"n3197":{"id":"n3197","loc":[-85.630929,41.959037]},"n3198":{"id":"n3198","loc":[-85.632151,41.959028]},"n3199":{"id":"n3199","loc":[-85.630911,41.957428]},"n32":{"id":"n32","loc":[-85.638273,41.944246]},"n320":{"id":"n320","loc":[-85.634287,41.943326]},"n3200":{"id":"n3200","loc":[-85.63213,41.957427]},"n3201":{"id":"n3201","loc":[-85.632072,41.952447]},"n3202":{"id":"n3202","loc":[-85.632095,41.954677]},"n3203":{"id":"n3203","loc":[-85.632111,41.955911]},"n3204":{"id":"n3204","loc":[-85.630855,41.952457]},"n3205":{"id":"n3205","loc":[-85.630869,41.953709]},"n3206":{"id":"n3206","loc":[-85.63088,41.954682]},"n3207":{"id":"n3207","loc":[-85.630894,41.955913]},"n3208":{"id":"n3208","loc":[-85.633214,41.948619]},"n3209":{"id":"n3209","loc":[-85.633253,41.951171]},"n321":{"id":"n321","loc":[-85.634233,41.943354]},"n3210":{"id":"n3210","loc":[-85.633234,41.949901]},"n3211":{"id":"n3211","loc":[-85.633922,41.948616]},"n3212":{"id":"n3212","loc":[-85.625188,41.947832]},"n3213":{"id":"n3213","loc":[-85.625208,41.947775]},"n3214":{"id":"n3214","loc":[-85.625229,41.94776]},"n3215":{"id":"n3215","loc":[-85.625201,41.947749]},"n3216":{"id":"n3216","loc":[-85.625168,41.947707]},"n3217":{"id":"n3217","loc":[-85.625171,41.947609]},"n3218":{"id":"n3218","loc":[-85.625213,41.947564]},"n3219":{"id":"n3219","loc":[-85.62529,41.94756]},"n322":{"id":"n322","loc":[-85.634099,41.943429]},"n3220":{"id":"n3220","loc":[-85.625303,41.947533]},"n3221":{"id":"n3221","loc":[-85.625344,41.947482]},"n3222":{"id":"n3222","loc":[-85.625442,41.947468]},"n3223":{"id":"n3223","loc":[-85.62565,41.947494]},"n3224":{"id":"n3224","loc":[-85.625726,41.947613]},"n3225":{"id":"n3225","loc":[-85.625703,41.947728]},"n3226":{"id":"n3226","loc":[-85.625534,41.94781]},"n3227":{"id":"n3227","loc":[-85.625391,41.947822]},"n3228":{"id":"n3228","loc":[-85.625304,41.947859]},"n3229":{"id":"n3229","loc":[-85.625203,41.947885]},"n323":{"id":"n323","loc":[-85.633958,41.943507],"tags":{"highway":"crossing"}},"n3230":{"id":"n3230","loc":[-85.624691,41.948659]},"n3231":{"id":"n3231","loc":[-85.624328,41.948661]},"n3232":{"id":"n3232","loc":[-85.624331,41.949046]},"n3233":{"id":"n3233","loc":[-85.624694,41.949045]},"n3234":{"id":"n3234","loc":[-85.623623,41.949606]},"n3235":{"id":"n3235","loc":[-85.623623,41.9497]},"n3236":{"id":"n3236","loc":[-85.623357,41.9497]},"n3237":{"id":"n3237","loc":[-85.623357,41.949614]},"n3238":{"id":"n3238","loc":[-85.623974,41.949429]},"n3239":{"id":"n3239","loc":[-85.623974,41.949605]},"n324":{"id":"n324","loc":[-85.633698,41.943651],"tags":{"railway":"crossing"}},"n3240":{"id":"n3240","loc":[-85.624501,41.951226]},"n3241":{"id":"n3241","loc":[-85.624501,41.951123]},"n3242":{"id":"n3242","loc":[-85.624319,41.951123]},"n3243":{"id":"n3243","loc":[-85.624319,41.951226]},"n3244":{"id":"n3244","loc":[-85.624121,41.950866]},"n3245":{"id":"n3245","loc":[-85.624115,41.950525]},"n3246":{"id":"n3246","loc":[-85.624315,41.950523]},"n3247":{"id":"n3247","loc":[-85.62432,41.950865]},"n3248":{"id":"n3248","loc":[-85.624393,41.950867]},"n3249":{"id":"n3249","loc":[-85.62439,41.950596]},"n325":{"id":"n325","loc":[-85.633508,41.943757]},"n3250":{"id":"n3250","loc":[-85.624673,41.950594]},"n3251":{"id":"n3251","loc":[-85.624675,41.95082]},"n3252":{"id":"n3252","loc":[-85.62451,41.950821]},"n3253":{"id":"n3253","loc":[-85.62451,41.950866]},"n3254":{"id":"n3254","loc":[-85.624101,41.949346]},"n3255":{"id":"n3255","loc":[-85.624244,41.949346]},"n3256":{"id":"n3256","loc":[-85.624244,41.949368]},"n3257":{"id":"n3257","loc":[-85.62434,41.949368]},"n3258":{"id":"n3258","loc":[-85.624342,41.949351]},"n3259":{"id":"n3259","loc":[-85.624725,41.949348]},"n326":{"id":"n326","loc":[-85.634839,41.942974]},"n3260":{"id":"n3260","loc":[-85.624755,41.950495]},"n3261":{"id":"n3261","loc":[-85.624121,41.950502]},"n3262":{"id":"n3262","loc":[-85.625453,41.950163]},"n3263":{"id":"n3263","loc":[-85.625454,41.949976]},"n3264":{"id":"n3264","loc":[-85.625549,41.949977]},"n3265":{"id":"n3265","loc":[-85.62555,41.949833]},"n3266":{"id":"n3266","loc":[-85.625577,41.949833]},"n3267":{"id":"n3267","loc":[-85.625578,41.949656]},"n3268":{"id":"n3268","loc":[-85.625195,41.949655]},"n3269":{"id":"n3269","loc":[-85.625192,41.950162]},"n327":{"id":"n327","loc":[-85.634657,41.943028]},"n3270":{"id":"n3270","loc":[-85.622992,41.949614]},"n3271":{"id":"n3271","loc":[-85.622991,41.949431]},"n3272":{"id":"n3272","loc":[-85.620103,41.951]},"n3273":{"id":"n3273","loc":[-85.605644,41.947468]},"n3274":{"id":"n3274","loc":[-85.617421,41.947457]},"n3275":{"id":"n3275","loc":[-85.620078,41.947444]},"n3276":{"id":"n3276","loc":[-85.620087,41.94924]},"n3277":{"id":"n3277","loc":[-85.62156,41.948333]},"n3278":{"id":"n3278","loc":[-85.620106,41.950132]},"n3279":{"id":"n3279","loc":[-85.637412,41.951136]},"n328":{"id":"n328","loc":[-85.634222,41.943152]},"n3280":{"id":"n3280","loc":[-85.635429,41.948608]},"n3281":{"id":"n3281","loc":[-85.635047,41.947788]},"n3282":{"id":"n3282","loc":[-85.635048,41.947796]},"n3283":{"id":"n3283","loc":[-85.635002,41.947797]},"n3284":{"id":"n3284","loc":[-85.635002,41.947788]},"n3285":{"id":"n3285","loc":[-85.634914,41.94779]},"n3286":{"id":"n3286","loc":[-85.634913,41.947753]},"n3287":{"id":"n3287","loc":[-85.63494,41.947753]},"n3288":{"id":"n3288","loc":[-85.634938,41.947708]},"n3289":{"id":"n3289","loc":[-85.635124,41.947705]},"n329":{"id":"n329","loc":[-85.634099,41.943202]},"n3290":{"id":"n3290","loc":[-85.635126,41.947787]},"n3291":{"id":"n3291","loc":[-85.634972,41.947599]},"n3292":{"id":"n3292","loc":[-85.634921,41.9476]},"n3293":{"id":"n3293","loc":[-85.63485,41.947546]},"n3294":{"id":"n3294","loc":[-85.63485,41.947508]},"n3295":{"id":"n3295","loc":[-85.634924,41.947457]},"n3296":{"id":"n3296","loc":[-85.634967,41.947456]},"n3297":{"id":"n3297","loc":[-85.635041,41.947512]},"n3298":{"id":"n3298","loc":[-85.635041,41.947542]},"n3299":{"id":"n3299","loc":[-85.634244,41.947839]},"n33":{"id":"n33","loc":[-85.638257,41.944188]},"n330":{"id":"n330","loc":[-85.634093,41.943138]},"n3300":{"id":"n3300","loc":[-85.634243,41.947793]},"n3301":{"id":"n3301","loc":[-85.634244,41.947686]},"n3302":{"id":"n3302","loc":[-85.634243,41.947657]},"n3303":{"id":"n3303","loc":[-85.634462,41.947653]},"n3304":{"id":"n3304","loc":[-85.634468,41.947835]},"n3305":{"id":"n3305","loc":[-85.634416,41.948006]},"n3306":{"id":"n3306","loc":[-85.634415,41.947898]},"n3307":{"id":"n3307","loc":[-85.634275,41.947899]},"n3308":{"id":"n3308","loc":[-85.634275,41.947927]},"n3309":{"id":"n3309","loc":[-85.63425,41.947927]},"n331":{"id":"n331","loc":[-85.633938,41.943291]},"n3310":{"id":"n3310","loc":[-85.63425,41.947976]},"n3311":{"id":"n3311","loc":[-85.634274,41.947976]},"n3312":{"id":"n3312","loc":[-85.634275,41.948007]},"n3313":{"id":"n3313","loc":[-85.634342,41.947635]},"n3314":{"id":"n3314","loc":[-85.634339,41.947497]},"n3315":{"id":"n3315","loc":[-85.634313,41.94748]},"n3316":{"id":"n3316","loc":[-85.634287,41.947474]},"n3317":{"id":"n3317","loc":[-85.63498,41.94815]},"n3318":{"id":"n3318","loc":[-85.634891,41.94815]},"n3319":{"id":"n3319","loc":[-85.634892,41.948169]},"n332":{"id":"n332","loc":[-85.633535,41.943511],"tags":{"railway":"crossing"}},"n3320":{"id":"n3320","loc":[-85.634852,41.948169]},"n3321":{"id":"n3321","loc":[-85.634853,41.948268]},"n3322":{"id":"n3322","loc":[-85.634832,41.948268]},"n3323":{"id":"n3323","loc":[-85.634832,41.948296]},"n3324":{"id":"n3324","loc":[-85.634965,41.948295]},"n3325":{"id":"n3325","loc":[-85.634966,41.948321]},"n3326":{"id":"n3326","loc":[-85.634999,41.948321]},"n3327":{"id":"n3327","loc":[-85.634999,41.948295]},"n3328":{"id":"n3328","loc":[-85.635175,41.948293]},"n3329":{"id":"n3329","loc":[-85.635175,41.948262]},"n333":{"id":"n333","loc":[-85.63339,41.943596]},"n3330":{"id":"n3330","loc":[-85.635159,41.948262]},"n3331":{"id":"n3331","loc":[-85.635158,41.948152]},"n3332":{"id":"n3332","loc":[-85.635067,41.948152]},"n3333":{"id":"n3333","loc":[-85.635065,41.947966]},"n3334":{"id":"n3334","loc":[-85.634979,41.947966]},"n3335":{"id":"n3335","loc":[-85.634307,41.948326]},"n3336":{"id":"n3336","loc":[-85.634305,41.948298]},"n3337":{"id":"n3337","loc":[-85.634331,41.948055]},"n3338":{"id":"n3338","loc":[-85.634331,41.948046]},"n3339":{"id":"n3339","loc":[-85.634435,41.948047]},"n334":{"id":"n334","loc":[-85.632842,41.943895]},"n3340":{"id":"n3340","loc":[-85.634434,41.948375]},"n3341":{"id":"n3341","loc":[-85.634463,41.948373]},"n3342":{"id":"n3342","loc":[-85.634464,41.948456]},"n3343":{"id":"n3343","loc":[-85.63443,41.948457]},"n3344":{"id":"n3344","loc":[-85.634432,41.948505]},"n3345":{"id":"n3345","loc":[-85.637386,41.94906]},"n3346":{"id":"n3346","loc":[-85.637113,41.9486]},"n3347":{"id":"n3347","loc":[-85.635448,41.949424]},"n335":{"id":"n335","loc":[-85.633856,41.943315]},"n3352":{"id":"n3352","loc":[-85.635457,41.949787]},"n3353":{"id":"n3353","loc":[-85.635459,41.949886]},"n336":{"id":"n336","loc":[-85.633697,41.943405]},"n337":{"id":"n337","loc":[-85.63347,41.943181]},"n3372":{"id":"n3372","loc":[-85.634423,41.950964]},"n3373":{"id":"n3373","loc":[-85.634424,41.95074]},"n3374":{"id":"n3374","loc":[-85.634394,41.950284]},"n3375":{"id":"n3375","loc":[-85.634398,41.950626]},"n3376":{"id":"n3376","loc":[-85.63452,41.951063]},"n3377":{"id":"n3377","loc":[-85.634511,41.949977]},"n3378":{"id":"n3378","loc":[-85.637409,41.949873]},"n3379":{"id":"n3379","loc":[-85.634824,41.94996]},"n338":{"id":"n338","loc":[-85.633597,41.943109]},"n3380":{"id":"n3380","loc":[-85.635437,41.949954]},"n3381":{"id":"n3381","loc":[-85.634844,41.951064]},"n3382":{"id":"n3382","loc":[-85.635458,41.951058]},"n3383":{"id":"n3383","loc":[-85.633921,41.947333]},"n3384":{"id":"n3384","loc":[-85.634208,41.947793]},"n3385":{"id":"n3385","loc":[-85.634204,41.947687]},"n3386":{"id":"n3386","loc":[-85.63424,41.947475]},"n3387":{"id":"n3387","loc":[-85.63424,41.947635]},"n3388":{"id":"n3388","loc":[-85.634089,41.948328]},"n3389":{"id":"n3389","loc":[-85.63424,41.948299]},"n339":{"id":"n339","loc":[-85.633673,41.943184]},"n3390":{"id":"n3390","loc":[-85.634239,41.948212]},"n3391":{"id":"n3391","loc":[-85.634086,41.948214]},"n3392":{"id":"n3392","loc":[-85.63408,41.948056]},"n3393":{"id":"n3393","loc":[-85.634093,41.948506]},"n3394":{"id":"n3394","loc":[-85.64344,41.941866]},"n3395":{"id":"n3395","loc":[-85.63378,41.95099]},"n3396":{"id":"n3396","loc":[-85.633779,41.950967]},"n3397":{"id":"n3397","loc":[-85.63375,41.950746]},"n3398":{"id":"n3398","loc":[-85.63375,41.950697]},"n3399":{"id":"n3399","loc":[-85.633903,41.950696]},"n34":{"id":"n34","loc":[-85.638176,41.944312]},"n340":{"id":"n340","loc":[-85.633714,41.94316]},"n3400":{"id":"n3400","loc":[-85.633901,41.950436]},"n3401":{"id":"n3401","loc":[-85.633492,41.950438]},"n3402":{"id":"n3402","loc":[-85.633494,41.950756]},"n3403":{"id":"n3403","loc":[-85.633454,41.950756]},"n3404":{"id":"n3404","loc":[-85.633456,41.950992]},"n3405":{"id":"n3405","loc":[-85.633994,41.950284]},"n3406":{"id":"n3406","loc":[-85.633998,41.950628]},"n3407":{"id":"n3407","loc":[-85.633364,41.951068]},"n3408":{"id":"n3408","loc":[-85.633356,41.949982]},"n3409":{"id":"n3409","loc":[-85.643327,41.941903]},"n341":{"id":"n341","loc":[-85.633811,41.943256]},"n3410":{"id":"n3410","loc":[-85.633292,41.953691]},"n3411":{"id":"n3411","loc":[-85.637432,41.952399]},"n3412":{"id":"n3412","loc":[-85.633349,41.957422]},"n3413":{"id":"n3413","loc":[-85.633326,41.955909]},"n3414":{"id":"n3414","loc":[-85.633307,41.954673]},"n3415":{"id":"n3415","loc":[-85.633273,41.952436]},"n3416":{"id":"n3416","loc":[-85.633361,41.95823],"tags":{"highway":"turning_circle"}},"n3417":{"id":"n3417","loc":[-85.619899,41.945527]},"n3418":{"id":"n3418","loc":[-85.643422,41.941946]},"n3419":{"id":"n3419","loc":[-85.643505,41.942033]},"n342":{"id":"n342","loc":[-85.633801,41.943261]},"n3420":{"id":"n3420","loc":[-85.620088,41.945571]},"n3421":{"id":"n3421","loc":[-85.620051,41.945505]},"n3422":{"id":"n3422","loc":[-85.62001,41.94541]},"n3423":{"id":"n3423","loc":[-85.620982,41.944742]},"n3424":{"id":"n3424","loc":[-85.621305,41.944782]},"n3425":{"id":"n3425","loc":[-85.621174,41.944819]},"n3426":{"id":"n3426","loc":[-85.621029,41.944871]},"n3427":{"id":"n3427","loc":[-85.620741,41.945011]},"n3428":{"id":"n3428","loc":[-85.620616,41.945085]},"n3429":{"id":"n3429","loc":[-85.620506,41.945172]},"n343":{"id":"n343","loc":[-85.63374,41.943514]},"n3430":{"id":"n3430","loc":[-85.620394,41.945273]},"n3431":{"id":"n3431","loc":[-85.620316,41.94536]},"n3432":{"id":"n3432","loc":[-85.620257,41.945452]},"n3433":{"id":"n3433","loc":[-85.620212,41.945535]},"n3434":{"id":"n3434","loc":[-85.620101,41.945811]},"n3435":{"id":"n3435","loc":[-85.620081,41.945937]},"n3436":{"id":"n3436","loc":[-85.619899,41.943718]},"n3437":{"id":"n3437","loc":[-85.619969,41.943211]},"n3438":{"id":"n3438","loc":[-85.619894,41.943292]},"n3439":{"id":"n3439","loc":[-85.620047,41.944738]},"n344":{"id":"n344","loc":[-85.633665,41.943441]},"n3440":{"id":"n3440","loc":[-85.620226,41.946088]},"n3441":{"id":"n3441","loc":[-85.620225,41.945864]},"n3442":{"id":"n3442","loc":[-85.620518,41.945863]},"n3443":{"id":"n3443","loc":[-85.620519,41.945944]},"n3444":{"id":"n3444","loc":[-85.620388,41.945944]},"n3445":{"id":"n3445","loc":[-85.620389,41.946088]},"n3446":{"id":"n3446","loc":[-85.618405,41.946566]},"n3447":{"id":"n3447","loc":[-85.619156,41.946562]},"n3448":{"id":"n3448","loc":[-85.619154,41.946319]},"n3449":{"id":"n3449","loc":[-85.618736,41.946322]},"n345":{"id":"n345","loc":[-85.633162,41.942947]},"n3450":{"id":"n3450","loc":[-85.618733,41.94612]},"n3451":{"id":"n3451","loc":[-85.619317,41.946116]},"n3452":{"id":"n3452","loc":[-85.619316,41.946023]},"n3453":{"id":"n3453","loc":[-85.619622,41.946021]},"n3454":{"id":"n3454","loc":[-85.619624,41.946171]},"n3455":{"id":"n3455","loc":[-85.61977,41.94617]},"n3456":{"id":"n3456","loc":[-85.619769,41.94602]},"n3457":{"id":"n3457","loc":[-85.619732,41.94602]},"n3458":{"id":"n3458","loc":[-85.619731,41.945856]},"n3459":{"id":"n3459","loc":[-85.619617,41.945857]},"n346":{"id":"n346","loc":[-85.633598,41.943083]},"n3460":{"id":"n3460","loc":[-85.619616,41.945776]},"n3461":{"id":"n3461","loc":[-85.619447,41.945777]},"n3462":{"id":"n3462","loc":[-85.619415,41.945778]},"n3463":{"id":"n3463","loc":[-85.618378,41.945788]},"n3464":{"id":"n3464","loc":[-85.618384,41.946132]},"n3465":{"id":"n3465","loc":[-85.618503,41.94613]},"n3466":{"id":"n3466","loc":[-85.618506,41.946319]},"n3467":{"id":"n3467","loc":[-85.6184,41.94632]},"n3468":{"id":"n3468","loc":[-85.618248,41.946416]},"n3469":{"id":"n3469","loc":[-85.618247,41.946319]},"n347":{"id":"n347","loc":[-85.63343,41.943179]},"n3470":{"id":"n3470","loc":[-85.618039,41.946321]},"n3471":{"id":"n3471","loc":[-85.61804,41.946418]},"n3472":{"id":"n3472","loc":[-85.620118,41.951895]},"n3473":{"id":"n3473","loc":[-85.617075,41.95469]},"n3474":{"id":"n3474","loc":[-85.620107,41.952113]},"n3475":{"id":"n3475","loc":[-85.620091,41.95232]},"n3476":{"id":"n3476","loc":[-85.620047,41.952505]},"n3477":{"id":"n3477","loc":[-85.61998,41.952715]},"n3478":{"id":"n3478","loc":[-85.619861,41.952986]},"n3479":{"id":"n3479","loc":[-85.619622,41.953365]},"n348":{"id":"n348","loc":[-85.633669,41.94341]},"n3480":{"id":"n3480","loc":[-85.619441,41.953567]},"n3481":{"id":"n3481","loc":[-85.619259,41.953741]},"n3482":{"id":"n3482","loc":[-85.618835,41.954056]},"n3483":{"id":"n3483","loc":[-85.618602,41.954194]},"n3484":{"id":"n3484","loc":[-85.618305,41.954347]},"n3485":{"id":"n3485","loc":[-85.618006,41.954466]},"n3486":{"id":"n3486","loc":[-85.617611,41.954587]},"n3487":{"id":"n3487","loc":[-85.615094,41.943412]},"n3488":{"id":"n3488","loc":[-85.619337,41.943025]},"n3489":{"id":"n3489","loc":[-85.610477,41.945527]},"n349":{"id":"n349","loc":[-85.633566,41.943466]},"n3490":{"id":"n3490","loc":[-85.610477,41.943718]},"n3491":{"id":"n3491","loc":[-85.619804,41.942976]},"n3492":{"id":"n3492","loc":[-85.61921,41.942672]},"n3493":{"id":"n3493","loc":[-85.619862,41.942836]},"n3494":{"id":"n3494","loc":[-85.616326,41.942769]},"n3495":{"id":"n3495","loc":[-85.617953,41.942917]},"n3496":{"id":"n3496","loc":[-85.61972,41.942728]},"n3497":{"id":"n3497","loc":[-85.61944,41.942784]},"n3498":{"id":"n3498","loc":[-85.615323,41.942841]},"n3499":{"id":"n3499","loc":[-85.612923,41.943718]},"n35":{"id":"n35","loc":[-85.637928,41.944249]},"n350":{"id":"n350","loc":[-85.633031,41.942986]},"n3500":{"id":"n3500","loc":[-85.61958,41.942756]},"n3501":{"id":"n3501","loc":[-85.619643,41.942647],"tags":{"leisure":"fishing"}},"n3502":{"id":"n3502","loc":[-85.619935,41.942962]},"n3503":{"id":"n3503","loc":[-85.629677,41.954687]},"n3504":{"id":"n3504","loc":[-85.629083,41.953722]},"n3505":{"id":"n3505","loc":[-85.621907,41.952067]},"n3506":{"id":"n3506","loc":[-85.621788,41.952058]},"n3507":{"id":"n3507","loc":[-85.629665,41.953718]},"n3508":{"id":"n3508","loc":[-85.624454,41.954707]},"n3509":{"id":"n3509","loc":[-85.634609,41.954585]},"n351":{"id":"n351","loc":[-85.633238,41.94283]},"n3510":{"id":"n3510","loc":[-85.634595,41.953772]},"n3511":{"id":"n3511","loc":[-85.633425,41.953783]},"n3512":{"id":"n3512","loc":[-85.633439,41.954596]},"n3517":{"id":"n3517","loc":[-85.621789,41.952179]},"n3518":{"id":"n3518","loc":[-85.624105,41.954704]},"n3519":{"id":"n3519","loc":[-85.623306,41.954542]},"n352":{"id":"n352","loc":[-85.633173,41.943556]},"n3520":{"id":"n3520","loc":[-85.623123,41.954502]},"n3521":{"id":"n3521","loc":[-85.622965,41.954473]},"n3522":{"id":"n3522","loc":[-85.622822,41.954455]},"n3523":{"id":"n3523","loc":[-85.62269,41.954448]},"n3524":{"id":"n3524","loc":[-85.622388,41.954467]},"n3525":{"id":"n3525","loc":[-85.62403,41.954895]},"n3526":{"id":"n3526","loc":[-85.623579,41.954855]},"n3527":{"id":"n3527","loc":[-85.623836,41.954951]},"n3528":{"id":"n3528","loc":[-85.622473,41.954592]},"n3529":{"id":"n3529","loc":[-85.622753,41.95458]},"n353":{"id":"n353","loc":[-85.633127,41.943552]},"n3530":{"id":"n3530","loc":[-85.62404,41.955078]},"n3531":{"id":"n3531","loc":[-85.624126,41.954999]},"n3532":{"id":"n3532","loc":[-85.623171,41.954687]},"n3533":{"id":"n3533","loc":[-85.624276,41.955206]},"n3534":{"id":"n3534","loc":[-85.62491,41.952801]},"n3535":{"id":"n3535","loc":[-85.625186,41.952756]},"n3536":{"id":"n3536","loc":[-85.625552,41.952792]},"n3537":{"id":"n3537","loc":[-85.626001,41.952948]},"n3538":{"id":"n3538","loc":[-85.626528,41.952984]},"n3539":{"id":"n3539","loc":[-85.626942,41.952886]},"n354":{"id":"n354","loc":[-85.632745,41.943222]},"n3540":{"id":"n3540","loc":[-85.627092,41.952685]},"n3541":{"id":"n3541","loc":[-85.627212,41.95244]},"n3542":{"id":"n3542","loc":[-85.627158,41.952226]},"n3543":{"id":"n3543","loc":[-85.627002,41.951972]},"n3544":{"id":"n3544","loc":[-85.626822,41.951838]},"n3545":{"id":"n3545","loc":[-85.626528,41.951807]},"n3546":{"id":"n3546","loc":[-85.625653,41.951852]},"n3547":{"id":"n3547","loc":[-85.625348,41.951834]},"n3548":{"id":"n3548","loc":[-85.625114,41.951767]},"n3549":{"id":"n3549","loc":[-85.620627,41.954682]},"n355":{"id":"n355","loc":[-85.632756,41.943199]},"n3550":{"id":"n3550","loc":[-85.622758,41.951884]},"n3551":{"id":"n3551","loc":[-85.618135,41.954734]},"n3552":{"id":"n3552","loc":[-85.620229,41.95472]},"n3553":{"id":"n3553","loc":[-85.624491,41.955573]},"n3554":{"id":"n3554","loc":[-85.621792,41.958314]},"n3555":{"id":"n3555","loc":[-85.623395,41.960001]},"n3556":{"id":"n3556","loc":[-85.620461,41.956212]},"n3557":{"id":"n3557","loc":[-85.62109,41.956766]},"n3558":{"id":"n3558","loc":[-85.620246,41.956224]},"n3559":{"id":"n3559","loc":[-85.625017,41.956068]},"n356":{"id":"n356","loc":[-85.632855,41.943147]},"n3560":{"id":"n3560","loc":[-85.622795,41.959702]},"n3561":{"id":"n3561","loc":[-85.621573,41.958457]},"n3562":{"id":"n3562","loc":[-85.619631,41.9573]},"n3563":{"id":"n3563","loc":[-85.62095,41.956311]},"n3564":{"id":"n3564","loc":[-85.619694,41.957408]},"n3565":{"id":"n3565","loc":[-85.621079,41.957751]},"n3566":{"id":"n3566","loc":[-85.622426,41.961142]},"n3567":{"id":"n3567","loc":[-85.623251,41.960484]},"n3568":{"id":"n3568","loc":[-85.619084,41.956291]},"n3569":{"id":"n3569","loc":[-85.622227,41.959303]},"n357":{"id":"n357","loc":[-85.632888,41.94315]},"n3570":{"id":"n3570","loc":[-85.620976,41.959104]},"n3571":{"id":"n3571","loc":[-85.621208,41.95653]},"n3572":{"id":"n3572","loc":[-85.623531,41.95951]},"n3573":{"id":"n3573","loc":[-85.623556,41.957935]},"n3574":{"id":"n3574","loc":[-85.623037,41.95746]},"n3575":{"id":"n3575","loc":[-85.621175,41.956427]},"n3576":{"id":"n3576","loc":[-85.622651,41.960109]},"n3577":{"id":"n3577","loc":[-85.621803,41.960747]},"n3578":{"id":"n3578","loc":[-85.620791,41.961874]},"n3579":{"id":"n3579","loc":[-85.625295,41.956786]},"n358":{"id":"n358","loc":[-85.633232,41.943547]},"n3580":{"id":"n3580","loc":[-85.619662,41.956894]},"n3581":{"id":"n3581","loc":[-85.622442,41.958708]},"n3582":{"id":"n3582","loc":[-85.621744,41.955864]},"n3583":{"id":"n3583","loc":[-85.621336,41.959212]},"n3584":{"id":"n3584","loc":[-85.622801,41.957304]},"n3585":{"id":"n3585","loc":[-85.619973,41.957433]},"n3586":{"id":"n3586","loc":[-85.619556,41.955717]},"n3587":{"id":"n3587","loc":[-85.622978,41.958601]},"n3588":{"id":"n3588","loc":[-85.625396,41.956264]},"n3589":{"id":"n3589","loc":[-85.623525,41.958034]},"n359":{"id":"n359","loc":[-85.633302,41.94351]},"n3590":{"id":"n3590","loc":[-85.623299,41.959631]},"n3591":{"id":"n3591","loc":[-85.622678,41.959873]},"n3592":{"id":"n3592","loc":[-85.625553,41.956179]},"n3593":{"id":"n3593","loc":[-85.623557,41.959231]},"n3594":{"id":"n3594","loc":[-85.622843,41.957373]},"n3595":{"id":"n3595","loc":[-85.619378,41.955677]},"n3596":{"id":"n3596","loc":[-85.620092,41.955425]},"n3597":{"id":"n3597","loc":[-85.622666,41.96044]},"n3598":{"id":"n3598","loc":[-85.621996,41.960256]},"n3599":{"id":"n3599","loc":[-85.623273,41.959997]},"n36":{"id":"n36","loc":[-85.637894,41.945551]},"n360":{"id":"n360","loc":[-85.633442,41.943794],"tags":{"highway":"crossing"}},"n3600":{"id":"n3600","loc":[-85.62477,41.95689]},"n3601":{"id":"n3601","loc":[-85.621641,41.955015]},"n3602":{"id":"n3602","loc":[-85.622495,41.960392]},"n3603":{"id":"n3603","loc":[-85.61918,41.955565]},"n3604":{"id":"n3604","loc":[-85.620017,41.955505]},"n3605":{"id":"n3605","loc":[-85.621739,41.956315]},"n3606":{"id":"n3606","loc":[-85.622957,41.959837]},"n3607":{"id":"n3607","loc":[-85.620912,41.960919]},"n3608":{"id":"n3608","loc":[-85.625231,41.956235]},"n3609":{"id":"n3609","loc":[-85.620976,41.961868]},"n361":{"id":"n361","loc":[-85.633381,41.94383]},"n3610":{"id":"n3610","loc":[-85.620956,41.958908]},"n3611":{"id":"n3611","loc":[-85.619035,41.956139]},"n3612":{"id":"n3612","loc":[-85.623643,41.958669]},"n3613":{"id":"n3613","loc":[-85.61949,41.956539]},"n3614":{"id":"n3614","loc":[-85.621927,41.958242]},"n3615":{"id":"n3615","loc":[-85.620826,41.955721]},"n3616":{"id":"n3616","loc":[-85.621202,41.961321]},"n3617":{"id":"n3617","loc":[-85.624877,41.95594]},"n3618":{"id":"n3618","loc":[-85.62065,41.958369]},"n3619":{"id":"n3619","loc":[-85.621524,41.956279]},"n362":{"id":"n362","loc":[-85.632977,41.944053]},"n3620":{"id":"n3620","loc":[-85.624662,41.955932]},"n3621":{"id":"n3621","loc":[-85.623048,41.958509]},"n3622":{"id":"n3622","loc":[-85.62111,41.95754]},"n3623":{"id":"n3623","loc":[-85.621508,41.954847]},"n3624":{"id":"n3624","loc":[-85.620655,41.958601]},"n3625":{"id":"n3625","loc":[-85.62154,41.954971]},"n3626":{"id":"n3626","loc":[-85.621691,41.955521]},"n3627":{"id":"n3627","loc":[-85.62154,41.954739]},"n3628":{"id":"n3628","loc":[-85.621996,41.959913]},"n3629":{"id":"n3629","loc":[-85.622286,41.960699]},"n363":{"id":"n363","loc":[-85.632915,41.943981],"tags":{"crossing":"zebra","highway":"crossing"}},"n3630":{"id":"n3630","loc":[-85.622844,41.9572]},"n3631":{"id":"n3631","loc":[-85.620252,41.955446]},"n3632":{"id":"n3632","loc":[-85.623434,41.957528]},"n3633":{"id":"n3633","loc":[-85.623429,41.956858]},"n3634":{"id":"n3634","loc":[-85.622957,41.957137]},"n3635":{"id":"n3635","loc":[-85.622554,41.959027]},"n3636":{"id":"n3636","loc":[-85.623289,41.958314]},"n3637":{"id":"n3637","loc":[-85.622977,41.960855]},"n3638":{"id":"n3638","loc":[-85.624008,41.956953]},"n3639":{"id":"n3639","loc":[-85.621278,41.960855]},"n364":{"id":"n364","loc":[-85.632724,41.943969],"tags":{"crossing":"zebra","highway":"crossing"}},"n3640":{"id":"n3640","loc":[-85.623128,41.956993]},"n3641":{"id":"n3641","loc":[-85.622452,41.959183]},"n3642":{"id":"n3642","loc":[-85.621095,41.961082]},"n3643":{"id":"n3643","loc":[-85.622011,41.960544]},"n3644":{"id":"n3644","loc":[-85.621637,41.955385]},"n3645":{"id":"n3645","loc":[-85.620999,41.959271]},"n3646":{"id":"n3646","loc":[-85.620044,41.956347]},"n3647":{"id":"n3647","loc":[-85.621936,41.959682]},"n3648":{"id":"n3648","loc":[-85.623761,41.95685]},"n3649":{"id":"n3649","loc":[-85.621239,41.959343]},"n365":{"id":"n365","loc":[-85.632621,41.944034]},"n3650":{"id":"n3650","loc":[-85.621073,41.956012]},"n3651":{"id":"n3651","loc":[-85.621271,41.956184]},"n3652":{"id":"n3652","loc":[-85.623444,41.95778]},"n3653":{"id":"n3653","loc":[-85.62125,41.96186]},"n3654":{"id":"n3654","loc":[-85.62169,41.961059]},"n3655":{"id":"n3655","loc":[-85.620012,41.955637]},"n3656":{"id":"n3656","loc":[-85.621058,41.9573]},"n3657":{"id":"n3657","loc":[-85.621138,41.957663]},"n3658":{"id":"n3658","loc":[-85.620773,41.957895]},"n3659":{"id":"n3659","loc":[-85.62007,41.957157]},"n366":{"id":"n366","loc":[-85.632684,41.944109],"tags":{"crossing":"zebra","highway":"crossing"}},"n3660":{"id":"n3660","loc":[-85.624534,41.955844]},"n3661":{"id":"n3661","loc":[-85.621932,41.960807]},"n3662":{"id":"n3662","loc":[-85.623358,41.958138]},"n3663":{"id":"n3663","loc":[-85.620456,41.955514]},"n3664":{"id":"n3664","loc":[-85.623504,41.957607]},"n3665":{"id":"n3665","loc":[-85.621444,41.960751]},"n3666":{"id":"n3666","loc":[-85.623492,41.960213]},"n3667":{"id":"n3667","loc":[-85.621669,41.954655]},"n3668":{"id":"n3668","loc":[-85.623106,41.958685]},"n3669":{"id":"n3669","loc":[-85.620922,41.957867]},"n367":{"id":"n367","loc":[-85.632738,41.944172]},"n3670":{"id":"n3670","loc":[-85.620092,41.957296]},"n3671":{"id":"n3671","loc":[-85.621669,41.955222]},"n3672":{"id":"n3672","loc":[-85.621614,41.960967]},"n3673":{"id":"n3673","loc":[-85.621691,41.955732]},"n3674":{"id":"n3674","loc":[-85.619207,41.956419]},"n3675":{"id":"n3675","loc":[-85.621116,41.956603]},"n3676":{"id":"n3676","loc":[-85.623311,41.956929]},"n3677":{"id":"n3677","loc":[-85.625671,41.956499]},"n3678":{"id":"n3678","loc":[-85.623525,41.956738]},"n3679":{"id":"n3679","loc":[-85.625381,41.956634]},"n368":{"id":"n368","loc":[-85.63287,41.944135],"tags":{"crossing":"zebra","highway":"crossing"}},"n3680":{"id":"n3680","loc":[-85.620096,41.95677]},"n3681":{"id":"n3681","loc":[-85.623803,41.958745]},"n3682":{"id":"n3682","loc":[-85.623498,41.958457]},"n3683":{"id":"n3683","loc":[-85.624223,41.957009]},"n3684":{"id":"n3684","loc":[-85.620026,41.956946]},"n3685":{"id":"n3685","loc":[-85.623005,41.960124]},"n3686":{"id":"n3686","loc":[-85.619073,41.955832]},"n3687":{"id":"n3687","loc":[-85.621744,41.95501]},"n3688":{"id":"n3688","loc":[-85.620804,41.958781]},"n3689":{"id":"n3689","loc":[-85.619844,41.957448]},"n369":{"id":"n369","loc":[-85.63298,41.944076]},"n3690":{"id":"n3690","loc":[-85.623713,41.958872]},"n3691":{"id":"n3691","loc":[-85.622329,41.960507]},"n3692":{"id":"n3692","loc":[-85.620804,41.956244]},"n3693":{"id":"n3693","loc":[-85.621818,41.955968]},"n3694":{"id":"n3694","loc":[-85.621405,41.958697]},"n3695":{"id":"n3695","loc":[-85.620998,41.960996]},"n3696":{"id":"n3696","loc":[-85.621621,41.960444]},"n3697":{"id":"n3697","loc":[-85.620941,41.961637]},"n3698":{"id":"n3698","loc":[-85.622195,41.958333]},"n3699":{"id":"n3699","loc":[-85.621668,41.961529]},"n37":{"id":"n37","loc":[-85.637611,41.945383]},"n370":{"id":"n370","loc":[-85.633191,41.944471]},"n3700":{"id":"n3700","loc":[-85.621015,41.957049]},"n3701":{"id":"n3701","loc":[-85.619368,41.955521]},"n3702":{"id":"n3702","loc":[-85.651578,41.942534]},"n3703":{"id":"n3703","loc":[-85.651541,41.943847]},"n3704":{"id":"n3704","loc":[-85.651365,41.944817]},"n3705":{"id":"n3705","loc":[-85.651076,41.945985]},"n3706":{"id":"n3706","loc":[-85.650626,41.947213]},"n3707":{"id":"n3707","loc":[-85.649669,41.949161]},"n3708":{"id":"n3708","loc":[-85.641802,41.961801]},"n3709":{"id":"n3709","loc":[-85.623333,41.961987]},"n371":{"id":"n371","loc":[-85.633132,41.94372]},"n3710":{"id":"n3710","loc":[-85.620621,41.965658]},"n3711":{"id":"n3711","loc":[-85.605673,41.965764]},"n3712":{"id":"n3712","loc":[-85.605664,41.962094]},"n3713":{"id":"n3713","loc":[-85.583774,41.962178]},"n3714":{"id":"n3714","loc":[-85.583774,41.961789]},"n3715":{"id":"n3715","loc":[-85.581303,41.961783]},"n3716":{"id":"n3716","loc":[-85.581245,41.958394]},"n3717":{"id":"n3717","loc":[-85.585299,41.955483]},"n3718":{"id":"n3718","loc":[-85.585588,41.955331]},"n3719":{"id":"n3719","loc":[-85.586053,41.955163]},"n372":{"id":"n372","loc":[-85.633011,41.943788]},"n3720":{"id":"n3720","loc":[-85.58632,41.955076]},"n3721":{"id":"n3721","loc":[-85.586478,41.955025]},"n3722":{"id":"n3722","loc":[-85.58692,41.954947]},"n3723":{"id":"n3723","loc":[-85.587345,41.954913]},"n3724":{"id":"n3724","loc":[-85.605592,41.954766]},"n3725":{"id":"n3725","loc":[-85.605303,41.936236]},"n3726":{"id":"n3726","loc":[-85.606941,41.936117]},"n3727":{"id":"n3727","loc":[-85.60876,41.935856]},"n3728":{"id":"n3728","loc":[-85.610092,41.935451]},"n3729":{"id":"n3729","loc":[-85.610681,41.935247]},"n373":{"id":"n373","loc":[-85.632854,41.943632]},"n3730":{"id":"n3730","loc":[-85.611446,41.934955]},"n3731":{"id":"n3731","loc":[-85.612057,41.934696]},"n3732":{"id":"n3732","loc":[-85.613256,41.934084]},"n3733":{"id":"n3733","loc":[-85.613948,41.933682]},"n3734":{"id":"n3734","loc":[-85.614638,41.933212]},"n3735":{"id":"n3735","loc":[-85.619801,41.929305]},"n3736":{"id":"n3736","loc":[-85.619768,41.925548]},"n3737":{"id":"n3737","loc":[-85.625761,41.925597]},"n3738":{"id":"n3738","loc":[-85.6263,41.927323]},"n3739":{"id":"n3739","loc":[-85.633708,41.927402]},"n374":{"id":"n374","loc":[-85.632974,41.943565]},"n3740":{"id":"n3740","loc":[-85.633927,41.929109]},"n3741":{"id":"n3741","loc":[-85.639213,41.929088]},"n3742":{"id":"n3742","loc":[-85.639204,41.925488]},"n3743":{"id":"n3743","loc":[-85.651425,41.925406]},"n3744":{"id":"n3744","loc":[-85.643386,41.941933]},"n3745":{"id":"n3745","loc":[-85.642776,41.941161]},"n3746":{"id":"n3746","loc":[-85.637277,41.948812]},"n3747":{"id":"n3747","loc":[-85.637366,41.94897]},"n3748":{"id":"n3748","loc":[-85.637329,41.94889]},"n3749":{"id":"n3749","loc":[-85.629649,41.952596]},"n375":{"id":"n375","loc":[-85.632741,41.943351]},"n3750":{"id":"n3750","loc":[-85.630291,41.954684]},"n3751":{"id":"n3751","loc":[-85.630284,41.953713]},"n3752":{"id":"n3752","loc":[-85.630269,41.952463]},"n3753":{"id":"n3753","loc":[-85.633933,41.949896]},"n3754":{"id":"n3754","loc":[-85.629339,41.941467]},"n3755":{"id":"n3755","loc":[-85.629857,41.94316]},"n3756":{"id":"n3756","loc":[-85.629987,41.944025]},"n3757":{"id":"n3757","loc":[-85.628538,41.948604]},"n3758":{"id":"n3758","loc":[-85.627415,41.957442]},"n3759":{"id":"n3759","loc":[-85.627019,41.957369]},"n376":{"id":"n376","loc":[-85.63251,41.943481]},"n3760":{"id":"n3760","loc":[-85.62167,41.952179]},"n3761":{"id":"n3761","loc":[-85.62167,41.952138]},"n3762":{"id":"n3762","loc":[-85.621562,41.952139]},"n3763":{"id":"n3763","loc":[-85.621562,41.952058]},"n3764":{"id":"n3764","loc":[-85.621476,41.952043]},"n3765":{"id":"n3765","loc":[-85.621477,41.952132]},"n3766":{"id":"n3766","loc":[-85.621386,41.952132]},"n3767":{"id":"n3767","loc":[-85.621387,41.95214]},"n3768":{"id":"n3768","loc":[-85.621262,41.95214]},"n3769":{"id":"n3769","loc":[-85.621261,41.952038]},"n377":{"id":"n377","loc":[-85.632706,41.943715]},"n3770":{"id":"n3770","loc":[-85.621389,41.952038]},"n3771":{"id":"n3771","loc":[-85.621389,41.952043]},"n3772":{"id":"n3772","loc":[-85.620898,41.952024]},"n3773":{"id":"n3773","loc":[-85.620898,41.952085]},"n3774":{"id":"n3774","loc":[-85.620774,41.952084]},"n3775":{"id":"n3775","loc":[-85.620774,41.952023]},"n3776":{"id":"n3776","loc":[-85.620749,41.952036]},"n3777":{"id":"n3777","loc":[-85.620723,41.952097]},"n3778":{"id":"n3778","loc":[-85.626158,41.958996]},"n3779":{"id":"n3779","loc":[-85.626319,41.958686]},"n378":{"id":"n378","loc":[-85.638683,41.943295]},"n3780":{"id":"n3780","loc":[-85.626119,41.958629]},"n3781":{"id":"n3781","loc":[-85.626064,41.958733]},"n3782":{"id":"n3782","loc":[-85.626155,41.958759]},"n3783":{"id":"n3783","loc":[-85.626048,41.958965]},"n3784":{"id":"n3784","loc":[-85.620648,41.952079]},"n3785":{"id":"n3785","loc":[-85.63826,41.961213]},"n3786":{"id":"n3786","loc":[-85.638003,41.961614]},"n3787":{"id":"n3787","loc":[-85.638817,41.961902]},"n3788":{"id":"n3788","loc":[-85.639073,41.961501]},"n3789":{"id":"n3789","loc":[-85.620674,41.952018]},"n379":{"id":"n379","loc":[-85.638684,41.94323]},"n3790":{"id":"n3790","loc":[-85.62082,41.952106]},"n3791":{"id":"n3791","loc":[-85.620819,41.952143]},"n3792":{"id":"n3792","loc":[-85.620778,41.952143]},"n3793":{"id":"n3793","loc":[-85.620778,41.952106]},"n3794":{"id":"n3794","loc":[-85.620563,41.952276]},"n3795":{"id":"n3795","loc":[-85.620543,41.95238]},"n3796":{"id":"n3796","loc":[-85.620422,41.952367]},"n3797":{"id":"n3797","loc":[-85.620441,41.952263]},"n3798":{"id":"n3798","loc":[-85.620561,41.952266]},"n3799":{"id":"n3799","loc":[-85.620444,41.952254]},"n38":{"id":"n38","loc":[-85.63879,41.943295]},"n380":{"id":"n380","loc":[-85.638627,41.94322]},"n3800":{"id":"n3800","loc":[-85.620773,41.955585]},"n3801":{"id":"n3801","loc":[-85.621265,41.955989]},"n3802":{"id":"n3802","loc":[-85.620692,41.954969]},"n3803":{"id":"n3803","loc":[-85.620691,41.955367]},"n3804":{"id":"n3804","loc":[-85.620458,41.952178]},"n3805":{"id":"n3805","loc":[-85.620575,41.95219]},"n3806":{"id":"n3806","loc":[-85.617609,41.952712]},"n3807":{"id":"n3807","loc":[-85.617533,41.952801],"tags":{"entrance":"yes"}},"n3808":{"id":"n3808","loc":[-85.616816,41.952911]},"n3809":{"id":"n3809","loc":[-85.616797,41.952901]},"n381":{"id":"n381","loc":[-85.638624,41.943294]},"n3810":{"id":"n3810","loc":[-85.616343,41.952694]},"n3811":{"id":"n3811","loc":[-85.616336,41.952729]},"n3812":{"id":"n3812","loc":[-85.616343,41.952772]},"n3813":{"id":"n3813","loc":[-85.628479,41.948649]},"n3814":{"id":"n3814","loc":[-85.628413,41.948679]},"n3815":{"id":"n3815","loc":[-85.628336,41.948694]},"n3816":{"id":"n3816","loc":[-85.62826,41.948694]},"n3817":{"id":"n3817","loc":[-85.628185,41.948679]},"n3818":{"id":"n3818","loc":[-85.628103,41.948649]},"n3819":{"id":"n3819","loc":[-85.627482,41.948395]},"n382":{"id":"n382","loc":[-85.638437,41.943291]},"n3820":{"id":"n3820","loc":[-85.619957,41.951168]},"n3821":{"id":"n3821","loc":[-85.619955,41.952077]},"n3822":{"id":"n3822","loc":[-85.619843,41.952666]},"n3823":{"id":"n3823","loc":[-85.619513,41.95324]},"n3824":{"id":"n3824","loc":[-85.619163,41.953668]},"n3825":{"id":"n3825","loc":[-85.618813,41.953947]},"n3826":{"id":"n3826","loc":[-85.618265,41.954252]},"n3827":{"id":"n3827","loc":[-85.617691,41.954458]},"n3828":{"id":"n3828","loc":[-85.616978,41.95459]},"n3829":{"id":"n3829","loc":[-85.615408,41.954628]},"n383":{"id":"n383","loc":[-85.63844,41.943209]},"n3830":{"id":"n3830","loc":[-85.615374,41.951076]},"n3831":{"id":"n3831","loc":[-85.61932,41.947564]},"n3832":{"id":"n3832","loc":[-85.610553,41.94755]},"n3833":{"id":"n3833","loc":[-85.610572,41.951065]},"n3834":{"id":"n3834","loc":[-85.617548,41.94757]},"n3835":{"id":"n3835","loc":[-85.619842,41.947939]},"n3836":{"id":"n3836","loc":[-85.619874,41.950905]},"n3837":{"id":"n3837","loc":[-85.619695,41.950911]},"n3838":{"id":"n3838","loc":[-85.617591,41.951078]},"n3839":{"id":"n3839","loc":[-85.619551,41.951065]},"n384":{"id":"n384","loc":[-85.632616,41.944021]},"n3840":{"id":"n3840","loc":[-85.626813,41.947337]},"n3841":{"id":"n3841","loc":[-85.616371,41.952814]},"n3842":{"id":"n3842","loc":[-85.617205,41.951308]},"n3843":{"id":"n3843","loc":[-85.616795,41.950953]},"n3844":{"id":"n3844","loc":[-85.617441,41.950889]},"n3845":{"id":"n3845","loc":[-85.619155,41.949377]},"n3846":{"id":"n3846","loc":[-85.618556,41.949377]},"n3847":{"id":"n3847","loc":[-85.618557,41.948372]},"n3848":{"id":"n3848","loc":[-85.619156,41.948372]},"n3849":{"id":"n3849","loc":[-85.61927,41.949796]},"n385":{"id":"n385","loc":[-85.632319,41.944172]},"n3850":{"id":"n3850","loc":[-85.61926,41.948344]},"n3851":{"id":"n3851","loc":[-85.619219,41.948264]},"n3852":{"id":"n3852","loc":[-85.619147,41.948196]},"n3853":{"id":"n3853","loc":[-85.619049,41.948144]},"n3854":{"id":"n3854","loc":[-85.618942,41.948116]},"n3855":{"id":"n3855","loc":[-85.618822,41.948109]},"n3856":{"id":"n3856","loc":[-85.618699,41.94813]},"n3857":{"id":"n3857","loc":[-85.618937,41.951943]},"n3858":{"id":"n3858","loc":[-85.616755,41.952231]},"n3859":{"id":"n3859","loc":[-85.616799,41.95472]},"n386":{"id":"n386","loc":[-85.63221,41.944066]},"n3860":{"id":"n3860","loc":[-85.616458,41.954735]},"n3861":{"id":"n3861","loc":[-85.61763,41.951515]},"n3862":{"id":"n3862","loc":[-85.617735,41.951572]},"n3863":{"id":"n3863","loc":[-85.61929,41.951573]},"n3864":{"id":"n3864","loc":[-85.617134,41.951348]},"n3865":{"id":"n3865","loc":[-85.616598,41.95192]},"n3866":{"id":"n3866","loc":[-85.616572,41.951992]},"n3867":{"id":"n3867","loc":[-85.616583,41.952076]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616916,41.952279]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617088,41.952254]},"n3871":{"id":"n3871","loc":[-85.61892,41.951467]},"n3872":{"id":"n3872","loc":[-85.618035,41.951473]},"n3873":{"id":"n3873","loc":[-85.618036,41.951572]},"n3874":{"id":"n3874","loc":[-85.61892,41.951573]},"n3875":{"id":"n3875","loc":[-85.618919,41.951957]},"n3876":{"id":"n3876","loc":[-85.619457,41.952237]},"n3877":{"id":"n3877","loc":[-85.618178,41.953618]},"n3878":{"id":"n3878","loc":[-85.617658,41.953366]},"n3879":{"id":"n3879","loc":[-85.617987,41.953024]},"n388":{"id":"n388","loc":[-85.632268,41.943621]},"n3880":{"id":"n3880","loc":[-85.618429,41.953248]},"n3881":{"id":"n3881","loc":[-85.618554,41.953119]},"n3882":{"id":"n3882","loc":[-85.618077,41.952868]},"n3883":{"id":"n3883","loc":[-85.618039,41.952886]},"n3884":{"id":"n3884","loc":[-85.619375,41.952169]},"n3885":{"id":"n3885","loc":[-85.618137,41.953538]},"n3886":{"id":"n3886","loc":[-85.61799,41.953555]},"n3887":{"id":"n3887","loc":[-85.617729,41.953423]},"n3888":{"id":"n3888","loc":[-85.618101,41.953029]},"n3889":{"id":"n3889","loc":[-85.618516,41.953119]},"n389":{"id":"n389","loc":[-85.631951,41.943773]},"n3890":{"id":"n3890","loc":[-85.619132,41.952042]},"n3891":{"id":"n3891","loc":[-85.618235,41.952981]},"n3892":{"id":"n3892","loc":[-85.618485,41.952425]},"n3893":{"id":"n3893","loc":[-85.618676,41.952519]},"n3894":{"id":"n3894","loc":[-85.618942,41.952648]},"n3895":{"id":"n3895","loc":[-85.618287,41.953122]},"n3896":{"id":"n3896","loc":[-85.617914,41.953516]},"n3897":{"id":"n3897","loc":[-85.617836,41.953573]},"n3898":{"id":"n3898","loc":[-85.616477,41.95289]},"n3899":{"id":"n3899","loc":[-85.618441,41.953201]},"n39":{"id":"n39","loc":[-85.619931,41.951013]},"n390":{"id":"n390","loc":[-85.631981,41.943654]},"n3900":{"id":"n3900","loc":[-85.617537,41.953335]},"n3901":{"id":"n3901","loc":[-85.617221,41.953166]},"n3902":{"id":"n3902","loc":[-85.617253,41.953135]},"n3903":{"id":"n3903","loc":[-85.617211,41.953114]},"n3904":{"id":"n3904","loc":[-85.617197,41.95313]},"n3905":{"id":"n3905","loc":[-85.616802,41.952925]},"n3906":{"id":"n3906","loc":[-85.616771,41.952928]},"n3907":{"id":"n3907","loc":[-85.616493,41.952785]},"n3908":{"id":"n3908","loc":[-85.616823,41.952426]},"n3909":{"id":"n3909","loc":[-85.617191,41.952616]},"n391":{"id":"n391","loc":[-85.631886,41.943699]},"n3910":{"id":"n3910","loc":[-85.61724,41.952559]},"n3911":{"id":"n3911","loc":[-85.61721,41.952542]},"n3912":{"id":"n3912","loc":[-85.617395,41.952351]},"n3913":{"id":"n3913","loc":[-85.617426,41.952368]},"n3914":{"id":"n3914","loc":[-85.617483,41.952309]},"n3915":{"id":"n3915","loc":[-85.617332,41.952229]},"n3916":{"id":"n3916","loc":[-85.617451,41.952102]},"n3917":{"id":"n3917","loc":[-85.617477,41.952115]},"n3918":{"id":"n3918","loc":[-85.617658,41.951923]},"n3919":{"id":"n3919","loc":[-85.617634,41.95191]},"n392":{"id":"n392","loc":[-85.631807,41.943606]},"n3920":{"id":"n3920","loc":[-85.617747,41.951786]},"n3921":{"id":"n3921","loc":[-85.618268,41.952056]},"n3922":{"id":"n3922","loc":[-85.618211,41.952122]},"n3923":{"id":"n3923","loc":[-85.618386,41.95222]},"n3924":{"id":"n3924","loc":[-85.618098,41.952527]},"n3925":{"id":"n3925","loc":[-85.617916,41.95243]},"n3926":{"id":"n3926","loc":[-85.617854,41.952498]},"n3927":{"id":"n3927","loc":[-85.617769,41.952453]},"n3928":{"id":"n3928","loc":[-85.617476,41.952773]},"n3929":{"id":"n3929","loc":[-85.617876,41.952973]},"n393":{"id":"n393","loc":[-85.631902,41.943561]},"n3930":{"id":"n3930","loc":[-85.617174,41.953638]},"n3931":{"id":"n3931","loc":[-85.618016,41.953578]},"n3932":{"id":"n3932","loc":[-85.618107,41.953628]},"n3933":{"id":"n3933","loc":[-85.618067,41.954268]},"n3934":{"id":"n3934","loc":[-85.617864,41.954263]},"n3935":{"id":"n3935","loc":[-85.61762,41.954205]},"n3936":{"id":"n3936","loc":[-85.617437,41.954103]},"n3937":{"id":"n3937","loc":[-85.617294,41.953978]},"n3938":{"id":"n3938","loc":[-85.617217,41.95384]},"n3939":{"id":"n3939","loc":[-85.616814,41.954327]},"n394":{"id":"n394","loc":[-85.63236,41.943543]},"n3940":{"id":"n3940","loc":[-85.616778,41.95381]},"n3941":{"id":"n3941","loc":[-85.616585,41.953707]},"n3942":{"id":"n3942","loc":[-85.616458,41.954318]},"n3943":{"id":"n3943","loc":[-85.616643,41.954345]},"n3944":{"id":"n3944","loc":[-85.618133,41.951412]},"n3945":{"id":"n3945","loc":[-85.618326,41.951411]},"n3946":{"id":"n3946","loc":[-85.618503,41.95141]},"n3947":{"id":"n3947","loc":[-85.618681,41.951409]},"n3948":{"id":"n3948","loc":[-85.618868,41.951408]},"n3949":{"id":"n3949","loc":[-85.617047,41.95136]},"n395":{"id":"n395","loc":[-85.633839,41.944082]},"n3950":{"id":"n3950","loc":[-85.616494,41.951959]},"n3951":{"id":"n3951","loc":[-85.616497,41.952072]},"n3952":{"id":"n3952","loc":[-85.616565,41.952165]},"n3953":{"id":"n3953","loc":[-85.616663,41.952218]},"n3954":{"id":"n3954","loc":[-85.616733,41.952255]},"n3955":{"id":"n3955","loc":[-85.617238,41.952512],"tags":{"entrance":"yes"}},"n3956":{"id":"n3956","loc":[-85.617043,41.952406]},"n3957":{"id":"n3957","loc":[-85.617691,41.951711]},"n3958":{"id":"n3958","loc":[-85.617773,41.951679]},"n3959":{"id":"n3959","loc":[-85.619085,41.951681]},"n396":{"id":"n396","loc":[-85.63376,41.944097]},"n3960":{"id":"n3960","loc":[-85.617943,41.952895]},"n3961":{"id":"n3961","loc":[-85.618039,41.952938]},"n3962":{"id":"n3962","loc":[-85.61763,41.95336]},"n3963":{"id":"n3963","loc":[-85.617554,41.95344]},"n3964":{"id":"n3964","loc":[-85.617381,41.952366],"tags":{"entrance":"yes"}},"n3965":{"id":"n3965","loc":[-85.617184,41.952254]},"n3966":{"id":"n3966","loc":[-85.617208,41.952496]},"n3967":{"id":"n3967","loc":[-85.617124,41.952581],"tags":{"entrance":"yes"}},"n3968":{"id":"n3968","loc":[-85.618094,41.952735]},"n3969":{"id":"n3969","loc":[-85.617702,41.952525],"tags":{"entrance":"yes"}},"n397":{"id":"n397","loc":[-85.63361,41.943957]},"n3970":{"id":"n3970","loc":[-85.617554,41.952686],"tags":{"entrance":"yes"}},"n3971":{"id":"n3971","loc":[-85.617959,41.952878]},"n3972":{"id":"n3972","loc":[-85.616367,41.952655]},"n3973":{"id":"n3973","loc":[-85.616416,41.952851]},"n3974":{"id":"n3974","loc":[-85.619777,41.951075]},"n3975":{"id":"n3975","loc":[-85.618611,41.94817]},"n3976":{"id":"n3976","loc":[-85.618538,41.948229]},"n3977":{"id":"n3977","loc":[-85.617421,41.947559]},"n3978":{"id":"n3978","loc":[-85.617395,41.951039]},"n3979":{"id":"n3979","loc":[-85.618488,41.94829]},"n398":{"id":"n398","loc":[-85.633309,41.943886]},"n3980":{"id":"n3980","loc":[-85.610238,41.954774]},"n3981":{"id":"n3981","loc":[-85.617449,41.950756]},"n3982":{"id":"n3982","loc":[-85.617288,41.951286]},"n3983":{"id":"n3983","loc":[-85.61745,41.950197]},"n3984":{"id":"n3984","loc":[-85.617436,41.948908]},"n3985":{"id":"n3985","loc":[-85.615915,41.953804]},"n3986":{"id":"n3986","loc":[-85.615953,41.953968]},"n3987":{"id":"n3987","loc":[-85.616031,41.954085]},"n3988":{"id":"n3988","loc":[-85.616135,41.954181]},"n3989":{"id":"n3989","loc":[-85.616273,41.954263]},"n399":{"id":"n399","loc":[-85.633226,41.943931]},"n3990":{"id":"n3990","loc":[-85.618327,41.951083]},"n3991":{"id":"n3991","loc":[-85.618135,41.951084]},"n3992":{"id":"n3992","loc":[-85.618503,41.951082]},"n3993":{"id":"n3993","loc":[-85.618682,41.951081]},"n3994":{"id":"n3994","loc":[-85.618864,41.951082]},"n3995":{"id":"n3995","loc":[-85.616761,41.950101]},"n3996":{"id":"n3996","loc":[-85.617317,41.947558]},"n3997":{"id":"n3997","loc":[-85.617336,41.948883]},"n3998":{"id":"n3998","loc":[-85.616779,41.949295]},"n3999":{"id":"n3999","loc":[-85.616754,41.949349]},"n4":{"id":"n4","loc":[-85.622764,41.950892],"tags":{"highway":"stop"}},"n40":{"id":"n40","loc":[-85.619841,41.951037]},"n400":{"id":"n400","loc":[-85.63326,41.943966]},"n4000":{"id":"n4000","loc":[-85.616761,41.950865]},"n4001":{"id":"n4001","loc":[-85.616883,41.951041]},"n4002":{"id":"n4002","loc":[-85.617004,41.951142]},"n4003":{"id":"n4003","loc":[-85.617062,41.951248]},"n4004":{"id":"n4004","loc":[-85.616809,41.949273]},"n4005":{"id":"n4005","loc":[-85.616755,41.949489]},"n4006":{"id":"n4006","loc":[-85.616759,41.949971]},"n4007":{"id":"n4007","loc":[-85.616757,41.949702]},"n4008":{"id":"n4008","loc":[-85.618456,41.94836]},"n4009":{"id":"n4009","loc":[-85.618447,41.948428]},"n401":{"id":"n401","loc":[-85.63324,41.943976]},"n4010":{"id":"n4010","loc":[-85.618437,41.949322]},"n4011":{"id":"n4011","loc":[-85.618447,41.949418]},"n4012":{"id":"n4012","loc":[-85.618478,41.949491]},"n4013":{"id":"n4013","loc":[-85.618535,41.949559]},"n4014":{"id":"n4014","loc":[-85.618623,41.94962]},"n4015":{"id":"n4015","loc":[-85.618721,41.94966]},"n4016":{"id":"n4016","loc":[-85.618838,41.949674]},"n4017":{"id":"n4017","loc":[-85.618967,41.949667]},"n4018":{"id":"n4018","loc":[-85.619065,41.949632]},"n4019":{"id":"n4019","loc":[-85.61915,41.949578]},"n402":{"id":"n402","loc":[-85.63327,41.944006]},"n4020":{"id":"n4020","loc":[-85.619216,41.949507]},"n4021":{"id":"n4021","loc":[-85.61927,41.949399]},"n4022":{"id":"n4022","loc":[-85.619074,41.947639]},"n4023":{"id":"n4023","loc":[-85.619073,41.947793]},"n4024":{"id":"n4024","loc":[-85.618912,41.947793]},"n4025":{"id":"n4025","loc":[-85.618911,41.947947]},"n4026":{"id":"n4026","loc":[-85.618752,41.947947]},"n4027":{"id":"n4027","loc":[-85.618754,41.947637]},"n4028":{"id":"n4028","loc":[-85.617896,41.947599]},"n4029":{"id":"n4029","loc":[-85.617898,41.947811]},"n403":{"id":"n403","loc":[-85.633278,41.944002]},"n4030":{"id":"n4030","loc":[-85.617717,41.947812]},"n4031":{"id":"n4031","loc":[-85.617715,41.9476]},"n4032":{"id":"n4032","loc":[-85.619003,41.949828]},"n4033":{"id":"n4033","loc":[-85.619003,41.949882]},"n4034":{"id":"n4034","loc":[-85.618926,41.949882]},"n4035":{"id":"n4035","loc":[-85.618926,41.949828]},"n4036":{"id":"n4036","loc":[-85.618861,41.949809]},"n4037":{"id":"n4037","loc":[-85.618861,41.949898]},"n4038":{"id":"n4038","loc":[-85.618688,41.949898]},"n4039":{"id":"n4039","loc":[-85.618687,41.94981]},"n404":{"id":"n404","loc":[-85.63331,41.944036]},"n4040":{"id":"n4040","loc":[-85.618349,41.949473]},"n4041":{"id":"n4041","loc":[-85.618287,41.949473]},"n4042":{"id":"n4042","loc":[-85.618287,41.94942]},"n4043":{"id":"n4043","loc":[-85.618348,41.949419]},"n4044":{"id":"n4044","loc":[-85.62316,41.951604]},"n4045":{"id":"n4045","loc":[-85.623026,41.951605]},"n4046":{"id":"n4046","loc":[-85.623023,41.951466]},"n4047":{"id":"n4047","loc":[-85.623134,41.951465]},"n4048":{"id":"n4048","loc":[-85.623136,41.951539]},"n4049":{"id":"n4049","loc":[-85.623159,41.951539]},"n405":{"id":"n405","loc":[-85.633348,41.944015]},"n4050":{"id":"n4050","loc":[-85.623025,41.95155]},"n4051":{"id":"n4051","loc":[-85.622955,41.951551]},"n4052":{"id":"n4052","loc":[-85.622953,41.951507]},"n4053":{"id":"n4053","loc":[-85.623024,41.951506]},"n4054":{"id":"n4054","loc":[-85.623318,41.951242]},"n4055":{"id":"n4055","loc":[-85.623175,41.951241]},"n4056":{"id":"n4056","loc":[-85.623176,41.951153]},"n4057":{"id":"n4057","loc":[-85.623319,41.951154]},"n4058":{"id":"n4058","loc":[-85.623077,41.951191]},"n4059":{"id":"n4059","loc":[-85.622973,41.951191]},"n406":{"id":"n406","loc":[-85.63338,41.944048]},"n4060":{"id":"n4060","loc":[-85.622972,41.951349]},"n4061":{"id":"n4061","loc":[-85.623059,41.95135]},"n4062":{"id":"n4062","loc":[-85.62306,41.951301]},"n4063":{"id":"n4063","loc":[-85.623077,41.951301]},"n4064":{"id":"n4064","loc":[-85.623117,41.951405]},"n4065":{"id":"n4065","loc":[-85.62312,41.951087]},"n4066":{"id":"n4066","loc":[-85.623118,41.951274]},"n4067":{"id":"n4067","loc":[-85.62328,41.951275]},"n4068":{"id":"n4068","loc":[-85.62328,41.951242]},"n4069":{"id":"n4069","loc":[-85.623179,41.951392]},"n407":{"id":"n407","loc":[-85.633431,41.94402]},"n4070":{"id":"n4070","loc":[-85.623141,41.951392]},"n4071":{"id":"n4071","loc":[-85.623142,41.95136]},"n4072":{"id":"n4072","loc":[-85.623179,41.951361]},"n4073":{"id":"n4073","loc":[-85.622565,41.951639]},"n4074":{"id":"n4074","loc":[-85.622565,41.951741]},"n4075":{"id":"n4075","loc":[-85.622463,41.95174]},"n4076":{"id":"n4076","loc":[-85.622463,41.95173]},"n4077":{"id":"n4077","loc":[-85.622442,41.95173]},"n4078":{"id":"n4078","loc":[-85.622442,41.951742]},"n4079":{"id":"n4079","loc":[-85.622361,41.951742]},"n408":{"id":"n408","loc":[-85.633425,41.944014]},"n4080":{"id":"n4080","loc":[-85.622362,41.951667]},"n4081":{"id":"n4081","loc":[-85.622441,41.951667]},"n4082":{"id":"n4082","loc":[-85.622441,41.951688]},"n4083":{"id":"n4083","loc":[-85.622461,41.951688]},"n4084":{"id":"n4084","loc":[-85.622461,41.951638]},"n4085":{"id":"n4085","loc":[-85.62255,41.951587]},"n4086":{"id":"n4086","loc":[-85.622449,41.95159]},"n4087":{"id":"n4087","loc":[-85.622441,41.951448]},"n4088":{"id":"n4088","loc":[-85.62253,41.951445]},"n4089":{"id":"n4089","loc":[-85.622532,41.951486]},"n409":{"id":"n409","loc":[-85.633457,41.943997]},"n4090":{"id":"n4090","loc":[-85.622555,41.951485]},"n4091":{"id":"n4091","loc":[-85.622558,41.951531]},"n4092":{"id":"n4092","loc":[-85.622547,41.951531]},"n4093":{"id":"n4093","loc":[-85.622451,41.95159]},"n4094":{"id":"n4094","loc":[-85.622452,41.95161]},"n4095":{"id":"n4095","loc":[-85.622106,41.951617]},"n4096":{"id":"n4096","loc":[-85.622133,41.951443]},"n4097":{"id":"n4097","loc":[-85.622552,41.951379]},"n4098":{"id":"n4098","loc":[-85.622443,41.95138]},"n4099":{"id":"n4099","loc":[-85.622441,41.951281]},"n41":{"id":"n41","loc":[-85.636233,41.942764]},"n410":{"id":"n410","loc":[-85.633429,41.943969]},"n4100":{"id":"n4100","loc":[-85.62255,41.95128]},"n4101":{"id":"n4101","loc":[-85.622541,41.951437]},"n4102":{"id":"n4102","loc":[-85.622441,41.951438]},"n4103":{"id":"n4103","loc":[-85.621561,41.951444]},"n4104":{"id":"n4104","loc":[-85.622302,41.951479]},"n4105":{"id":"n4105","loc":[-85.6223,41.95152]},"n4106":{"id":"n4106","loc":[-85.622169,41.951517]},"n4107":{"id":"n4107","loc":[-85.622171,41.951476]},"n4108":{"id":"n4108","loc":[-85.622543,41.951228]},"n4109":{"id":"n4109","loc":[-85.622433,41.951228]},"n411":{"id":"n411","loc":[-85.633442,41.943962]},"n4110":{"id":"n4110","loc":[-85.622433,41.951133]},"n4111":{"id":"n4111","loc":[-85.622543,41.951133]},"n4112":{"id":"n4112","loc":[-85.622356,41.951256]},"n4113":{"id":"n4113","loc":[-85.622293,41.951256]},"n4114":{"id":"n4114","loc":[-85.622292,41.9512]},"n4115":{"id":"n4115","loc":[-85.622313,41.9512]},"n4116":{"id":"n4116","loc":[-85.622312,41.951173]},"n4117":{"id":"n4117","loc":[-85.622364,41.951173]},"n4118":{"id":"n4118","loc":[-85.622365,41.951231]},"n4119":{"id":"n4119","loc":[-85.622355,41.951231]},"n412":{"id":"n412","loc":[-85.633411,41.943932]},"n4120":{"id":"n4120","loc":[-85.62197,41.951155]},"n4121":{"id":"n4121","loc":[-85.62197,41.951213]},"n4122":{"id":"n4122","loc":[-85.621848,41.951213]},"n4123":{"id":"n4123","loc":[-85.621848,41.951155]},"n4124":{"id":"n4124","loc":[-85.622193,41.951268]},"n4125":{"id":"n4125","loc":[-85.622194,41.951305]},"n4126":{"id":"n4126","loc":[-85.622121,41.951306]},"n4127":{"id":"n4127","loc":[-85.622121,41.951322]},"n4128":{"id":"n4128","loc":[-85.621984,41.951324]},"n4129":{"id":"n4129","loc":[-85.621983,41.951271]},"n413":{"id":"n413","loc":[-85.633421,41.943926]},"n4130":{"id":"n4130","loc":[-85.622171,41.9514]},"n4131":{"id":"n4131","loc":[-85.622148,41.951382]},"n4132":{"id":"n4132","loc":[-85.6221,41.951414]},"n4133":{"id":"n4133","loc":[-85.622122,41.951433]},"n4134":{"id":"n4134","loc":[-85.621782,41.951148]},"n4135":{"id":"n4135","loc":[-85.621783,41.951219]},"n4136":{"id":"n4136","loc":[-85.62164,41.951221]},"n4137":{"id":"n4137","loc":[-85.62164,41.951236]},"n4138":{"id":"n4138","loc":[-85.621556,41.951237]},"n4139":{"id":"n4139","loc":[-85.621555,41.95117]},"n414":{"id":"n414","loc":[-85.633376,41.94388]},"n4140":{"id":"n4140","loc":[-85.621644,41.951169]},"n4141":{"id":"n4141","loc":[-85.621643,41.951139]},"n4142":{"id":"n4142","loc":[-85.621719,41.951138]},"n4143":{"id":"n4143","loc":[-85.621719,41.951148]},"n4144":{"id":"n4144","loc":[-85.621409,41.951322]},"n4145":{"id":"n4145","loc":[-85.621338,41.951322]},"n4146":{"id":"n4146","loc":[-85.621336,41.95115]},"n4147":{"id":"n4147","loc":[-85.621521,41.951149]},"n4148":{"id":"n4148","loc":[-85.621522,41.951228]},"n4149":{"id":"n4149","loc":[-85.621408,41.951228]},"n415":{"id":"n415","loc":[-85.633348,41.943895]},"n4150":{"id":"n4150","loc":[-85.621284,41.951219]},"n4151":{"id":"n4151","loc":[-85.621153,41.951219]},"n4152":{"id":"n4152","loc":[-85.621152,41.951152]},"n4153":{"id":"n4153","loc":[-85.621283,41.951152]},"n4154":{"id":"n4154","loc":[-85.621159,41.951241]},"n4155":{"id":"n4155","loc":[-85.62116,41.951301]},"n4156":{"id":"n4156","loc":[-85.621088,41.951302]},"n4157":{"id":"n4157","loc":[-85.621088,41.951241]},"n4158":{"id":"n4158","loc":[-85.621049,41.951158]},"n4159":{"id":"n4159","loc":[-85.62105,41.951229]},"n416":{"id":"n416","loc":[-85.633341,41.943888]},"n4160":{"id":"n4160","loc":[-85.620976,41.951229]},"n4161":{"id":"n4161","loc":[-85.620977,41.951295]},"n4162":{"id":"n4162","loc":[-85.620887,41.951296]},"n4163":{"id":"n4163","loc":[-85.620886,41.951229]},"n4164":{"id":"n4164","loc":[-85.620862,41.951229]},"n4165":{"id":"n4165","loc":[-85.620861,41.951159]},"n4166":{"id":"n4166","loc":[-85.620626,41.951133]},"n4167":{"id":"n4167","loc":[-85.620626,41.951205]},"n4168":{"id":"n4168","loc":[-85.620412,41.951206]},"n4169":{"id":"n4169","loc":[-85.620411,41.951134]},"n417":{"id":"n417","loc":[-85.633321,41.943898]},"n4170":{"id":"n4170","loc":[-85.621775,41.951443]},"n4171":{"id":"n4171","loc":[-85.621777,41.951264]},"n4172":{"id":"n4172","loc":[-85.621565,41.951654]},"n4173":{"id":"n4173","loc":[-85.621331,41.951439]},"n4174":{"id":"n4174","loc":[-85.621031,41.951443]},"n4175":{"id":"n4175","loc":[-85.621836,41.951724]},"n4176":{"id":"n4176","loc":[-85.621834,41.951621]},"n4177":{"id":"n4177","loc":[-85.62197,41.951619]},"n4178":{"id":"n4178","loc":[-85.621972,41.951722]},"n4179":{"id":"n4179","loc":[-85.621772,41.951638]},"n418":{"id":"n418","loc":[-85.633547,41.943896]},"n4180":{"id":"n4180","loc":[-85.621772,41.951715]},"n4181":{"id":"n4181","loc":[-85.621699,41.951716]},"n4182":{"id":"n4182","loc":[-85.6217,41.951722]},"n4183":{"id":"n4183","loc":[-85.621641,41.951722]},"n4184":{"id":"n4184","loc":[-85.62164,41.951639]},"n4185":{"id":"n4185","loc":[-85.621505,41.951655]},"n4186":{"id":"n4186","loc":[-85.621505,41.951729]},"n4187":{"id":"n4187","loc":[-85.621389,41.951729]},"n4188":{"id":"n4188","loc":[-85.62139,41.951654]},"n4189":{"id":"n4189","loc":[-85.621105,41.951635]},"n419":{"id":"n419","loc":[-85.633467,41.944075]},"n4190":{"id":"n4190","loc":[-85.621104,41.951576]},"n4191":{"id":"n4191","loc":[-85.621168,41.951576]},"n4192":{"id":"n4192","loc":[-85.621168,41.951595]},"n4193":{"id":"n4193","loc":[-85.621261,41.951595]},"n4194":{"id":"n4194","loc":[-85.621261,41.951646]},"n4195":{"id":"n4195","loc":[-85.621294,41.951646]},"n4196":{"id":"n4196","loc":[-85.621294,41.951732]},"n4197":{"id":"n4197","loc":[-85.621251,41.951732]},"n4198":{"id":"n4198","loc":[-85.621251,41.95174]},"n4199":{"id":"n4199","loc":[-85.621175,41.951741]},"n42":{"id":"n42","loc":[-85.635996,41.942727]},"n420":{"id":"n420","loc":[-85.633578,41.944055]},"n4200":{"id":"n4200","loc":[-85.621175,41.951651]},"n4201":{"id":"n4201","loc":[-85.621189,41.951651]},"n4202":{"id":"n4202","loc":[-85.621189,41.951635]},"n4203":{"id":"n4203","loc":[-85.620554,41.951641]},"n4204":{"id":"n4204","loc":[-85.620555,41.951742]},"n4205":{"id":"n4205","loc":[-85.620719,41.951742]},"n4206":{"id":"n4206","loc":[-85.620719,41.951731]},"n4207":{"id":"n4207","loc":[-85.620803,41.95173]},"n4208":{"id":"n4208","loc":[-85.620803,41.951603]},"n4209":{"id":"n4209","loc":[-85.62072,41.951603]},"n421":{"id":"n421","loc":[-85.633462,41.944125]},"n4210":{"id":"n4210","loc":[-85.620721,41.951641]},"n4211":{"id":"n4211","loc":[-85.620269,41.953053]},"n4212":{"id":"n4212","loc":[-85.620229,41.953051]},"n4213":{"id":"n4213","loc":[-85.620231,41.953013]},"n4214":{"id":"n4214","loc":[-85.620271,41.953015]},"n4215":{"id":"n4215","loc":[-85.620215,41.953133]},"n4216":{"id":"n4216","loc":[-85.62013,41.953134]},"n4217":{"id":"n4217","loc":[-85.620129,41.953083]},"n4218":{"id":"n4218","loc":[-85.620214,41.953082]},"n4219":{"id":"n4219","loc":[-85.62016,41.953272]},"n422":{"id":"n422","loc":[-85.633372,41.944061]},"n4220":{"id":"n4220","loc":[-85.620046,41.953273]},"n4221":{"id":"n4221","loc":[-85.620045,41.953171]},"n4222":{"id":"n4222","loc":[-85.620088,41.953171]},"n4223":{"id":"n4223","loc":[-85.620087,41.953162]},"n4224":{"id":"n4224","loc":[-85.620121,41.953162]},"n4225":{"id":"n4225","loc":[-85.620121,41.953173]},"n4226":{"id":"n4226","loc":[-85.620157,41.953173]},"n4227":{"id":"n4227","loc":[-85.620158,41.953196]},"n4228":{"id":"n4228","loc":[-85.620189,41.953196]},"n4229":{"id":"n4229","loc":[-85.620189,41.953246]},"n423":{"id":"n423","loc":[-85.633509,41.943981]},"n4230":{"id":"n4230","loc":[-85.62016,41.953246]},"n4231":{"id":"n4231","loc":[-85.6195,41.954012]},"n4232":{"id":"n4232","loc":[-85.619438,41.954057]},"n4233":{"id":"n4233","loc":[-85.619418,41.954043]},"n4234":{"id":"n4234","loc":[-85.619381,41.954069]},"n4235":{"id":"n4235","loc":[-85.619399,41.954083]},"n4236":{"id":"n4236","loc":[-85.619339,41.954126]},"n4237":{"id":"n4237","loc":[-85.619584,41.954313]},"n4238":{"id":"n4238","loc":[-85.619743,41.954198]},"n4239":{"id":"n4239","loc":[-85.619453,41.954727]},"n424":{"id":"n424","loc":[-85.635421,41.945367]},"n4240":{"id":"n4240","loc":[-85.619503,41.954581]},"n4241":{"id":"n4241","loc":[-85.619597,41.954472]},"n4242":{"id":"n4242","loc":[-85.619862,41.95419]},"n4243":{"id":"n4243","loc":[-85.619506,41.953907]},"n4244":{"id":"n4244","loc":[-85.619261,41.9541]},"n4245":{"id":"n4245","loc":[-85.619246,41.954139]},"n4246":{"id":"n4246","loc":[-85.619244,41.9542]},"n4247":{"id":"n4247","loc":[-85.619259,41.954243]},"n4248":{"id":"n4248","loc":[-85.619285,41.954274]},"n4249":{"id":"n4249","loc":[-85.619123,41.954381]},"n425":{"id":"n425","loc":[-85.634425,41.943552]},"n4250":{"id":"n4250","loc":[-85.619641,41.954607]},"n4251":{"id":"n4251","loc":[-85.619383,41.954615]},"n4252":{"id":"n4252","loc":[-85.61896,41.954391]},"n4253":{"id":"n4253","loc":[-85.619211,41.954178]},"n4254":{"id":"n4254","loc":[-85.619115,41.954102]},"n4255":{"id":"n4255","loc":[-85.619519,41.953821]},"n4256":{"id":"n4256","loc":[-85.619956,41.954156]},"n4257":{"id":"n4257","loc":[-85.619851,41.954266]},"n4258":{"id":"n4258","loc":[-85.619779,41.95436]},"n4259":{"id":"n4259","loc":[-85.620525,41.954364]},"n426":{"id":"n426","loc":[-85.634248,41.943654]},"n4260":{"id":"n4260","loc":[-85.620398,41.954365]},"n4261":{"id":"n4261","loc":[-85.620398,41.954324]},"n4262":{"id":"n4262","loc":[-85.620525,41.954323]},"n4263":{"id":"n4263","loc":[-85.620359,41.954588]},"n4264":{"id":"n4264","loc":[-85.620321,41.954588]},"n4265":{"id":"n4265","loc":[-85.620321,41.954599]},"n4266":{"id":"n4266","loc":[-85.620296,41.954599]},"n4267":{"id":"n4267","loc":[-85.620296,41.954587]},"n4268":{"id":"n4268","loc":[-85.620262,41.954588]},"n4269":{"id":"n4269","loc":[-85.620261,41.954516]},"n427":{"id":"n427","loc":[-85.634177,41.943585]},"n4270":{"id":"n4270","loc":[-85.620282,41.954516]},"n4271":{"id":"n4271","loc":[-85.620282,41.954373]},"n4272":{"id":"n4272","loc":[-85.620378,41.954373]},"n4273":{"id":"n4273","loc":[-85.620379,41.954486]},"n4274":{"id":"n4274","loc":[-85.620348,41.954486]},"n4275":{"id":"n4275","loc":[-85.620348,41.954537]},"n4276":{"id":"n4276","loc":[-85.620359,41.954537]},"n4277":{"id":"n4277","loc":[-85.620463,41.95521]},"n4278":{"id":"n4278","loc":[-85.620409,41.955273]},"n4279":{"id":"n4279","loc":[-85.620205,41.955177]},"n428":{"id":"n428","loc":[-85.634354,41.943484]},"n4280":{"id":"n4280","loc":[-85.620288,41.955079]},"n4281":{"id":"n4281","loc":[-85.620379,41.955121]},"n4282":{"id":"n4282","loc":[-85.620349,41.955157]},"n4283":{"id":"n4283","loc":[-85.620083,41.955101]},"n4284":{"id":"n4284","loc":[-85.620083,41.954986]},"n4285":{"id":"n4285","loc":[-85.620016,41.954986]},"n4286":{"id":"n4286","loc":[-85.620016,41.954999]},"n4287":{"id":"n4287","loc":[-85.619941,41.954999]},"n4288":{"id":"n4288","loc":[-85.619941,41.954988]},"n4289":{"id":"n4289","loc":[-85.619815,41.954988]},"n429":{"id":"n429","loc":[-85.638577,41.943212]},"n4290":{"id":"n4290","loc":[-85.619815,41.955075]},"n4291":{"id":"n4291","loc":[-85.619948,41.955075]},"n4292":{"id":"n4292","loc":[-85.619948,41.955082]},"n4293":{"id":"n4293","loc":[-85.620004,41.955082]},"n4294":{"id":"n4294","loc":[-85.620004,41.955101]},"n4295":{"id":"n4295","loc":[-85.619293,41.955127]},"n4296":{"id":"n4296","loc":[-85.619208,41.955124]},"n4297":{"id":"n4297","loc":[-85.619212,41.955061]},"n4298":{"id":"n4298","loc":[-85.619297,41.955064]},"n4299":{"id":"n4299","loc":[-85.619068,41.954936]},"n43":{"id":"n43","loc":[-85.637047,41.943054]},"n430":{"id":"n430","loc":[-85.638576,41.943219]},"n4300":{"id":"n4300","loc":[-85.619003,41.954936]},"n4301":{"id":"n4301","loc":[-85.619004,41.955003]},"n4302":{"id":"n4302","loc":[-85.618994,41.955003]},"n4303":{"id":"n4303","loc":[-85.618994,41.955016]},"n4304":{"id":"n4304","loc":[-85.618973,41.955016]},"n4305":{"id":"n4305","loc":[-85.618973,41.955071]},"n4306":{"id":"n4306","loc":[-85.619061,41.955071]},"n4307":{"id":"n4307","loc":[-85.61906,41.955024]},"n4308":{"id":"n4308","loc":[-85.619105,41.955024]},"n4309":{"id":"n4309","loc":[-85.619105,41.954956]},"n431":{"id":"n431","loc":[-85.638653,41.943078]},"n4310":{"id":"n4310","loc":[-85.619068,41.954956]},"n4311":{"id":"n4311","loc":[-85.618294,41.954596]},"n4312":{"id":"n4312","loc":[-85.618235,41.954602]},"n4313":{"id":"n4313","loc":[-85.618222,41.954535]},"n4314":{"id":"n4314","loc":[-85.618281,41.954529]},"n4315":{"id":"n4315","loc":[-85.618593,41.954556]},"n4316":{"id":"n4316","loc":[-85.618551,41.954565]},"n4317":{"id":"n4317","loc":[-85.618545,41.954552]},"n4318":{"id":"n4318","loc":[-85.618493,41.954563]},"n4319":{"id":"n4319","loc":[-85.618449,41.954455]},"n432":{"id":"n432","loc":[-85.638654,41.943148]},"n4320":{"id":"n4320","loc":[-85.618544,41.954434]},"n4321":{"id":"n4321","loc":[-85.622545,41.950775]},"n4322":{"id":"n4322","loc":[-85.622546,41.950843]},"n4323":{"id":"n4323","loc":[-85.622503,41.950844]},"n4324":{"id":"n4324","loc":[-85.622503,41.950853]},"n4325":{"id":"n4325","loc":[-85.622479,41.950853]},"n4326":{"id":"n4326","loc":[-85.622478,41.950843]},"n4327":{"id":"n4327","loc":[-85.622425,41.950843]},"n4328":{"id":"n4328","loc":[-85.622425,41.950808]},"n4329":{"id":"n4329","loc":[-85.622366,41.950809]},"n433":{"id":"n433","loc":[-85.638387,41.943151]},"n4330":{"id":"n4330","loc":[-85.622364,41.950673]},"n4331":{"id":"n4331","loc":[-85.622448,41.950673]},"n4332":{"id":"n4332","loc":[-85.622449,41.950732]},"n4333":{"id":"n4333","loc":[-85.622479,41.950731]},"n4334":{"id":"n4334","loc":[-85.622479,41.950775]},"n4335":{"id":"n4335","loc":[-85.621909,41.950641]},"n4336":{"id":"n4336","loc":[-85.621864,41.950641]},"n4337":{"id":"n4337","loc":[-85.621865,41.950567]},"n4338":{"id":"n4338","loc":[-85.62191,41.950567]},"n4339":{"id":"n4339","loc":[-85.621787,41.950829]},"n434":{"id":"n434","loc":[-85.638386,41.94308]},"n4340":{"id":"n4340","loc":[-85.621786,41.950775]},"n4341":{"id":"n4341","loc":[-85.621588,41.950776]},"n4342":{"id":"n4342","loc":[-85.621589,41.950848]},"n4343":{"id":"n4343","loc":[-85.621737,41.950847]},"n4344":{"id":"n4344","loc":[-85.621737,41.950829]},"n4345":{"id":"n4345","loc":[-85.621509,41.950846]},"n4346":{"id":"n4346","loc":[-85.621399,41.950846]},"n4347":{"id":"n4347","loc":[-85.621398,41.95073]},"n4348":{"id":"n4348","loc":[-85.621509,41.95073]},"n4349":{"id":"n4349","loc":[-85.621217,41.950841]},"n435":{"id":"n435","loc":[-85.634427,41.943533]},"n4350":{"id":"n4350","loc":[-85.6211,41.95084]},"n4351":{"id":"n4351","loc":[-85.6211,41.950777]},"n4352":{"id":"n4352","loc":[-85.621218,41.950778]},"n4353":{"id":"n4353","loc":[-85.621055,41.950764]},"n4354":{"id":"n4354","loc":[-85.621054,41.950826]},"n4355":{"id":"n4355","loc":[-85.620988,41.950826]},"n4356":{"id":"n4356","loc":[-85.620988,41.950843]},"n4357":{"id":"n4357","loc":[-85.620842,41.950843]},"n4358":{"id":"n4358","loc":[-85.620842,41.950764]},"n4359":{"id":"n4359","loc":[-85.620825,41.950922]},"n436":{"id":"n436","loc":[-85.63428,41.943229]},"n4360":{"id":"n4360","loc":[-85.620824,41.950553]},"n4361":{"id":"n4361","loc":[-85.620543,41.950771]},"n4362":{"id":"n4362","loc":[-85.620431,41.950772]},"n4363":{"id":"n4363","loc":[-85.62043,41.950585]},"n4364":{"id":"n4364","loc":[-85.620542,41.950585]},"n4365":{"id":"n4365","loc":[-85.62068,41.950505]},"n4366":{"id":"n4366","loc":[-85.620681,41.950552]},"n4367":{"id":"n4367","loc":[-85.620589,41.950553]},"n4368":{"id":"n4368","loc":[-85.620588,41.950506]},"n4369":{"id":"n4369","loc":[-85.620539,41.950407]},"n437":{"id":"n437","loc":[-85.634499,41.943461]},"n4370":{"id":"n4370","loc":[-85.62054,41.950504]},"n4371":{"id":"n4371","loc":[-85.620416,41.950504]},"n4372":{"id":"n4372","loc":[-85.620416,41.950408]},"n4373":{"id":"n4373","loc":[-85.620742,41.95038]},"n4374":{"id":"n4374","loc":[-85.620527,41.95038]},"n4375":{"id":"n4375","loc":[-85.620528,41.950408]},"n4376":{"id":"n4376","loc":[-85.622449,41.950373]},"n4377":{"id":"n4377","loc":[-85.622452,41.950397]},"n4378":{"id":"n4378","loc":[-85.622336,41.950404]},"n4379":{"id":"n4379","loc":[-85.622333,41.950379]},"n438":{"id":"n438","loc":[-85.634514,41.943486]},"n4380":{"id":"n4380","loc":[-85.622263,41.950324]},"n4381":{"id":"n4381","loc":[-85.622261,41.950256]},"n4382":{"id":"n4382","loc":[-85.62236,41.950254]},"n4383":{"id":"n4383","loc":[-85.62236,41.95027]},"n4384":{"id":"n4384","loc":[-85.622402,41.950281]},"n4385":{"id":"n4385","loc":[-85.622403,41.9503]},"n4386":{"id":"n4386","loc":[-85.622439,41.950299]},"n4387":{"id":"n4387","loc":[-85.62244,41.950334]},"n4388":{"id":"n4388","loc":[-85.622414,41.950335]},"n4389":{"id":"n4389","loc":[-85.622414,41.95036]},"n439":{"id":"n439","loc":[-85.63452,41.943511]},"n4390":{"id":"n4390","loc":[-85.62231,41.950362]},"n4391":{"id":"n4391","loc":[-85.622309,41.950323]},"n4392":{"id":"n4392","loc":[-85.622015,41.950539]},"n4393":{"id":"n4393","loc":[-85.621909,41.95054]},"n4394":{"id":"n4394","loc":[-85.621909,41.950472]},"n4395":{"id":"n4395","loc":[-85.622015,41.950471]},"n4396":{"id":"n4396","loc":[-85.62199,41.950439]},"n4397":{"id":"n4397","loc":[-85.621956,41.95044]},"n4398":{"id":"n4398","loc":[-85.621955,41.950405]},"n4399":{"id":"n4399","loc":[-85.621988,41.950404]},"n44":{"id":"n44","loc":[-85.636799,41.943055]},"n440":{"id":"n440","loc":[-85.63451,41.943534]},"n4400":{"id":"n4400","loc":[-85.621668,41.950418]},"n4401":{"id":"n4401","loc":[-85.621667,41.950343]},"n4402":{"id":"n4402","loc":[-85.621745,41.950342]},"n4403":{"id":"n4403","loc":[-85.621744,41.950306]},"n4404":{"id":"n4404","loc":[-85.621764,41.950306]},"n4405":{"id":"n4405","loc":[-85.621763,41.950254]},"n4406":{"id":"n4406","loc":[-85.621861,41.950253]},"n4407":{"id":"n4407","loc":[-85.621861,41.950274]},"n4408":{"id":"n4408","loc":[-85.621896,41.950273]},"n4409":{"id":"n4409","loc":[-85.621898,41.950389]},"n441":{"id":"n441","loc":[-85.634483,41.943556]},"n4410":{"id":"n4410","loc":[-85.621843,41.95039]},"n4411":{"id":"n4411","loc":[-85.621843,41.950425]},"n4412":{"id":"n4412","loc":[-85.621789,41.950425]},"n4413":{"id":"n4413","loc":[-85.621789,41.950386]},"n4414":{"id":"n4414","loc":[-85.621752,41.950387]},"n4415":{"id":"n4415","loc":[-85.621753,41.950417]},"n4416":{"id":"n4416","loc":[-85.621556,41.950562]},"n4417":{"id":"n4417","loc":[-85.621552,41.950217]},"n4418":{"id":"n4418","loc":[-85.621788,41.950562]},"n4419":{"id":"n4419","loc":[-85.621155,41.950562]},"n442":{"id":"n442","loc":[-85.63419,41.943713]},"n4420":{"id":"n4420","loc":[-85.622473,41.950551]},"n4421":{"id":"n4421","loc":[-85.622043,41.950551]},"n4422":{"id":"n4422","loc":[-85.62142,41.950454]},"n4423":{"id":"n4423","loc":[-85.621315,41.950455]},"n4424":{"id":"n4424","loc":[-85.621313,41.950311]},"n4425":{"id":"n4425","loc":[-85.621388,41.950311]},"n4426":{"id":"n4426","loc":[-85.621387,41.950261]},"n4427":{"id":"n4427","loc":[-85.621468,41.95026]},"n4428":{"id":"n4428","loc":[-85.621468,41.950271]},"n4429":{"id":"n4429","loc":[-85.621503,41.95027]},"n443":{"id":"n443","loc":[-85.634462,41.943294]},"n4430":{"id":"n4430","loc":[-85.621505,41.950353]},"n4431":{"id":"n4431","loc":[-85.621483,41.950354]},"n4432":{"id":"n4432","loc":[-85.621483,41.950392]},"n4433":{"id":"n4433","loc":[-85.621419,41.950393]},"n4434":{"id":"n4434","loc":[-85.621213,41.95039]},"n4435":{"id":"n4435","loc":[-85.621127,41.950391]},"n4436":{"id":"n4436","loc":[-85.621126,41.950357]},"n4437":{"id":"n4437","loc":[-85.621094,41.950357]},"n4438":{"id":"n4438","loc":[-85.621094,41.950391]},"n4439":{"id":"n4439","loc":[-85.620977,41.950392]},"n444":{"id":"n444","loc":[-85.634298,41.943389]},"n4440":{"id":"n4440","loc":[-85.620975,41.950278]},"n4441":{"id":"n4441","loc":[-85.621087,41.950277]},"n4442":{"id":"n4442","loc":[-85.621088,41.950331]},"n4443":{"id":"n4443","loc":[-85.621211,41.950312]},"n4444":{"id":"n4444","loc":[-85.621104,41.950313]},"n4445":{"id":"n4445","loc":[-85.621105,41.950331]},"n4446":{"id":"n4446","loc":[-85.620706,41.950328]},"n4447":{"id":"n4447","loc":[-85.620606,41.950327]},"n4448":{"id":"n4448","loc":[-85.620607,41.950261]},"n4449":{"id":"n4449","loc":[-85.620707,41.950262]},"n445":{"id":"n445","loc":[-85.634527,41.943623]},"n4450":{"id":"n4450","loc":[-85.620599,41.950336]},"n4451":{"id":"n4451","loc":[-85.620559,41.950336]},"n4452":{"id":"n4452","loc":[-85.620559,41.950299]},"n4453":{"id":"n4453","loc":[-85.620599,41.950299]},"n4454":{"id":"n4454","loc":[-85.620545,41.950357]},"n4455":{"id":"n4455","loc":[-85.620418,41.950357]},"n4456":{"id":"n4456","loc":[-85.620417,41.950257]},"n4457":{"id":"n4457","loc":[-85.620544,41.950256]},"n4458":{"id":"n4458","loc":[-85.620246,41.950131],"tags":{"highway":"crossing"}},"n4459":{"id":"n4459","loc":[-85.620252,41.950956]},"n446":{"id":"n446","loc":[-85.634608,41.943577]},"n4460":{"id":"n4460","loc":[-85.620245,41.950179]},"n4461":{"id":"n4461","loc":[-85.620246,41.950088]},"n4462":{"id":"n4462","loc":[-85.620251,41.950885]},"n4463":{"id":"n4463","loc":[-85.620103,41.950884],"tags":{"crossing":"zebra","highway":"crossing"}},"n4464":{"id":"n4464","loc":[-85.619992,41.950884]},"n4465":{"id":"n4465","loc":[-85.619704,41.951008]},"n4466":{"id":"n4466","loc":[-85.619599,41.951122]},"n4467":{"id":"n4467","loc":[-85.619264,41.951486]},"n4468":{"id":"n4468","loc":[-85.619179,41.951573],"tags":{"highway":"crossing"}},"n4469":{"id":"n4469","loc":[-85.620251,41.950999],"tags":{"highway":"crossing"}},"n447":{"id":"n447","loc":[-85.634555,41.943531]},"n4470":{"id":"n4470","loc":[-85.620249,41.951066]},"n4471":{"id":"n4471","loc":[-85.620256,41.951374]},"n4472":{"id":"n4472","loc":[-85.620249,41.951389]},"n4473":{"id":"n4473","loc":[-85.620249,41.951407]},"n4474":{"id":"n4474","loc":[-85.620255,41.951423]},"n4475":{"id":"n4475","loc":[-85.62026,41.951853]},"n4476":{"id":"n4476","loc":[-85.620262,41.951894],"tags":{"highway":"crossing"}},"n4477":{"id":"n4477","loc":[-85.620265,41.951957]},"n4478":{"id":"n4478","loc":[-85.620262,41.952135]},"n4479":{"id":"n4479","loc":[-85.620241,41.952424]},"n448":{"id":"n448","loc":[-85.634555,41.943482]},"n4480":{"id":"n4480","loc":[-85.620213,41.952583]},"n4481":{"id":"n4481","loc":[-85.620158,41.952754]},"n4482":{"id":"n4482","loc":[-85.620065,41.952942]},"n4483":{"id":"n4483","loc":[-85.619753,41.953439]},"n4484":{"id":"n4484","loc":[-85.619605,41.953626]},"n4485":{"id":"n4485","loc":[-85.619381,41.953834]},"n4486":{"id":"n4486","loc":[-85.619069,41.954066]},"n4487":{"id":"n4487","loc":[-85.618674,41.95429]},"n4488":{"id":"n4488","loc":[-85.621816,41.952389]},"n4489":{"id":"n4489","loc":[-85.6217,41.952386]},"n449":{"id":"n449","loc":[-85.634509,41.943427]},"n4490":{"id":"n4490","loc":[-85.621705,41.952306]},"n4491":{"id":"n4491","loc":[-85.621821,41.95231]},"n4492":{"id":"n4492","loc":[-85.621819,41.952272]},"n4493":{"id":"n4493","loc":[-85.621778,41.952272]},"n4494":{"id":"n4494","loc":[-85.621778,41.952199]},"n4495":{"id":"n4495","loc":[-85.621818,41.952199]},"n4496":{"id":"n4496","loc":[-85.621754,41.952281]},"n4497":{"id":"n4497","loc":[-85.621701,41.95228]},"n4498":{"id":"n4498","loc":[-85.621702,41.952197]},"n4499":{"id":"n4499","loc":[-85.621755,41.952197]},"n45":{"id":"n45","loc":[-85.636791,41.942792]},"n450":{"id":"n450","loc":[-85.63453,41.943365]},"n4500":{"id":"n4500","loc":[-85.628201,41.954694],"tags":{"highway":"stop","stop":"all"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop"}},"n4508":{"id":"n4508","loc":[-85.629559,41.957343]},"n4509":{"id":"n4509","loc":[-85.628723,41.95735]},"n451":{"id":"n451","loc":[-85.634356,41.943468]},"n4510":{"id":"n4510","loc":[-85.62842,41.957515]},"n4511":{"id":"n4511","loc":[-85.627561,41.957525]},"n4512":{"id":"n4512","loc":[-85.630323,41.957508]},"n4513":{"id":"n4513","loc":[-85.630811,41.957506]},"n4514":{"id":"n4514","loc":[-85.630839,41.960874]},"n4515":{"id":"n4515","loc":[-85.631035,41.957506]},"n4516":{"id":"n4516","loc":[-85.632027,41.9575]},"n4517":{"id":"n4517","loc":[-85.631038,41.958066]},"n4518":{"id":"n4518","loc":[-85.630787,41.954769]},"n4519":{"id":"n4519","loc":[-85.630806,41.957342]},"n452":{"id":"n452","loc":[-85.634123,41.943596]},"n4520":{"id":"n4520","loc":[-85.630809,41.957428],"tags":{"highway":"crossing"}},"n4521":{"id":"n4521","loc":[-85.630912,41.957506],"tags":{"highway":"crossing"}},"n4522":{"id":"n4522","loc":[-85.631033,41.957428],"tags":{"highway":"crossing"}},"n4523":{"id":"n4523","loc":[-85.631032,41.957341]},"n4524":{"id":"n4524","loc":[-85.63091,41.957341],"tags":{"highway":"crossing"}},"n4525":{"id":"n4525","loc":[-85.631027,41.95597]},"n4526":{"id":"n4526","loc":[-85.631027,41.955913],"tags":{"highway":"crossing"}},"n4527":{"id":"n4527","loc":[-85.631025,41.955873]},"n4528":{"id":"n4528","loc":[-85.631073,41.955913],"tags":{"highway":"stop"}},"n4529":{"id":"n4529","loc":[-85.631007,41.954766]},"n453":{"id":"n453","loc":[-85.634709,41.943926]},"n4530":{"id":"n4530","loc":[-85.630881,41.954768],"tags":{"highway":"crossing"}},"n4531":{"id":"n4531","loc":[-85.628022,41.954776]},"n4532":{"id":"n4532","loc":[-85.627385,41.95584]},"n4533":{"id":"n4533","loc":[-85.627329,41.955937]},"n4534":{"id":"n4534","loc":[-85.626583,41.957153]},"n4535":{"id":"n4535","loc":[-85.629675,41.954564],"tags":{"highway":"stop"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop"}},"n4538":{"id":"n4538","loc":[-85.630784,41.954682],"tags":{"highway":"crossing"}},"n4539":{"id":"n4539","loc":[-85.63078,41.954595]},"n454":{"id":"n454","loc":[-85.63525,41.943855]},"n4540":{"id":"n4540","loc":[-85.630879,41.954595],"tags":{"highway":"crossing"}},"n4541":{"id":"n4541","loc":[-85.631004,41.954594]},"n4542":{"id":"n4542","loc":[-85.631006,41.954681],"tags":{"highway":"crossing"}},"n4543":{"id":"n4543","loc":[-85.631045,41.959036],"tags":{"highway":"stop"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop"}},"n4552":{"id":"n4552","loc":[-85.626519,41.957256]},"n4553":{"id":"n4553","loc":[-85.625334,41.959165]},"n4554":{"id":"n4554","loc":[-85.626483,41.95806]},"n4555":{"id":"n4555","loc":[-85.626481,41.958175]},"n4556":{"id":"n4556","loc":[-85.626412,41.958174]},"n4557":{"id":"n4557","loc":[-85.626412,41.958202]},"n4558":{"id":"n4558","loc":[-85.62628,41.958201]},"n4559":{"id":"n4559","loc":[-85.626283,41.958057]},"n456":{"id":"n456","loc":[-85.638854,41.943104]},"n4560":{"id":"n4560","loc":[-85.622763,41.95109],"tags":{"highway":"stop"}},"n4561":{"id":"n4561","loc":[-85.622858,41.950876],"tags":{"emergency":"fire_hydrant"}},"n4562":{"id":"n4562","loc":[-85.624073,41.950393]},"n4563":{"id":"n4563","loc":[-85.624077,41.950924]},"n4564":{"id":"n4564","loc":[-85.624599,41.950984],"tags":{"highway":"stop"}},"n4565":{"id":"n4565","loc":[-85.624831,41.95119],"tags":{"emergency":"fire_hydrant"}},"n4566":{"id":"n4566","loc":[-85.624437,41.952568],"tags":{"emergency":"fire_hydrant"}},"n4567":{"id":"n4567","loc":[-85.624077,41.954606],"tags":{"emergency":"fire_hydrant"}},"n4568":{"id":"n4568","loc":[-85.624263,41.954888]},"n4569":{"id":"n4569","loc":[-85.624206,41.954919]},"n457":{"id":"n457","loc":[-85.635186,41.943901]},"n4570":{"id":"n4570","loc":[-85.624154,41.954865]},"n4571":{"id":"n4571","loc":[-85.624212,41.954835]},"n4572":{"id":"n4572","loc":[-85.622442,41.954401],"tags":{"emergency":"fire_hydrant"}},"n4573":{"id":"n4573","loc":[-85.619751,41.954658],"tags":{"emergency":"fire_hydrant"}},"n4574":{"id":"n4574","loc":[-85.617785,41.954534]},"n4575":{"id":"n4575","loc":[-85.617416,41.954721]},"n4576":{"id":"n4576","loc":[-85.617662,41.95474]},"n4577":{"id":"n4577","loc":[-85.618014,41.954717]},"n4578":{"id":"n4578","loc":[-85.617886,41.954671]},"n4579":{"id":"n4579","loc":[-85.617831,41.954612]},"n458":{"id":"n458","loc":[-85.635162,41.943917]},"n4580":{"id":"n4580","loc":[-85.617968,41.954752]},"n4581":{"id":"n4581","loc":[-85.617815,41.954752]},"n4582":{"id":"n4582","loc":[-85.617938,41.954695]},"n4583":{"id":"n4583","loc":[-85.617856,41.954642],"tags":{"highway":"stop"}},"n4584":{"id":"n4584","loc":[-85.619116,41.954164],"tags":{"man_made":"flagpole"}},"n4585":{"id":"n4585","loc":[-85.619569,41.953255],"tags":{"emergency":"fire_hydrant"}},"n4586":{"id":"n4586","loc":[-85.620352,41.951894],"tags":{"highway":"stop"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop"}},"n459":{"id":"n459","loc":[-85.634856,41.943905]},"n4590":{"id":"n4590","loc":[-85.620374,41.95018],"tags":{"emergency":"fire_hydrant"}},"n4591":{"id":"n4591","loc":[-85.620301,41.949239],"tags":{"highway":"stop"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop"}},"n4594":{"id":"n4594","loc":[-85.620191,41.947352],"tags":{"emergency":"fire_hydrant"}},"n4595":{"id":"n4595","loc":[-85.622819,41.947493],"tags":{"emergency":"fire_hydrant"}},"n4596":{"id":"n4596","loc":[-85.622744,41.947541],"tags":{"highway":"stop"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop"}},"n4598":{"id":"n4598","loc":[-85.622909,41.948333],"tags":{"highway":"give_way"}},"n4599":{"id":"n4599","loc":[-85.622593,41.948333],"tags":{"highway":"give_way"}},"n46":{"id":"n46","loc":[-85.637131,41.94307]},"n460":{"id":"n460","loc":[-85.634811,41.944007]},"n4600":{"id":"n4600","loc":[-85.622835,41.948387],"tags":{"emergency":"fire_hydrant"}},"n4601":{"id":"n4601","loc":[-85.622768,41.949125],"tags":{"highway":"stop"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop"}},"n4606":{"id":"n4606","loc":[-85.624849,41.949106],"tags":{"emergency":"fire_hydrant"}},"n4607":{"id":"n4607","loc":[-85.624858,41.950119],"tags":{"emergency":"fire_hydrant"}},"n4608":{"id":"n4608","loc":[-85.624752,41.948334],"tags":{"highway":"give_way"}},"n4609":{"id":"n4609","loc":[-85.624845,41.948422],"tags":{"emergency":"fire_hydrant"}},"n461":{"id":"n461","loc":[-85.634987,41.943112]},"n4610":{"id":"n4610","loc":[-85.62484,41.947539],"tags":{"emergency":"fire_hydrant"}},"n4611":{"id":"n4611","loc":[-85.62476,41.947428],"tags":{"highway":"stop"}},"n4612":{"id":"n4612","loc":[-85.620286,41.950926]},"n4613":{"id":"n4613","loc":[-85.618237,41.950963]},"n4614":{"id":"n4614","loc":[-85.618107,41.950876]},"n4615":{"id":"n4615","loc":[-85.618131,41.950393]},"n4616":{"id":"n4616","loc":[-85.61823,41.9499]},"n4617":{"id":"n4617","loc":[-85.619138,41.950212]},"n4618":{"id":"n4618","loc":[-85.619299,41.950388]},"n4619":{"id":"n4619","loc":[-85.619306,41.950897]},"n462":{"id":"n462","loc":[-85.634698,41.943194]},"n4620":{"id":"n4620","loc":[-85.619155,41.950958]},"n4621":{"id":"n4621","loc":[-85.620079,41.947715]},"n4622":{"id":"n4622","loc":[-85.619674,41.947728]},"n4623":{"id":"n4623","loc":[-85.619634,41.947735]},"n4624":{"id":"n4624","loc":[-85.619587,41.947756],"tags":{"barrier":"gate"}},"n4625":{"id":"n4625","loc":[-85.61953,41.947796]},"n4626":{"id":"n4626","loc":[-85.619475,41.947847]},"n4627":{"id":"n4627","loc":[-85.619433,41.947903]},"n4628":{"id":"n4628","loc":[-85.619402,41.947982]},"n4629":{"id":"n4629","loc":[-85.619394,41.948043]},"n463":{"id":"n463","loc":[-85.634632,41.943219]},"n4630":{"id":"n4630","loc":[-85.619395,41.948476]},"n4631":{"id":"n4631","loc":[-85.618367,41.947452]},"n4632":{"id":"n4632","loc":[-85.618371,41.947567],"tags":{"barrier":"gate"}},"n4633":{"id":"n4633","loc":[-85.618341,41.947622]},"n4634":{"id":"n4634","loc":[-85.618138,41.94773]},"n4635":{"id":"n4635","loc":[-85.618078,41.947814]},"n4636":{"id":"n4636","loc":[-85.618072,41.948009]},"n4637":{"id":"n4637","loc":[-85.618269,41.947666]},"n4638":{"id":"n4638","loc":[-85.618099,41.947765]},"n4639":{"id":"n4639","loc":[-85.618378,41.954453]},"n464":{"id":"n464","loc":[-85.63459,41.943239]},"n4640":{"id":"n4640","loc":[-85.618198,41.95453]},"n4641":{"id":"n4641","loc":[-85.618212,41.954623]},"n4642":{"id":"n4642","loc":[-85.635211,41.943103],"tags":{"leisure":"picnic_table"}},"n4643":{"id":"n4643","loc":[-85.635345,41.943448],"tags":{"leisure":"picnic_table"}},"n4644":{"id":"n4644","loc":[-85.635901,41.943353],"tags":{"amenity":"bench"}},"n4645":{"id":"n4645","loc":[-85.635815,41.942638],"tags":{"highway":"stop"}},"n4646":{"id":"n4646","loc":[-85.635355,41.942044],"tags":{"leisure":"picnic_table"}},"n4647":{"id":"n4647","loc":[-85.635206,41.942045],"tags":{"leisure":"picnic_table"}},"n4648":{"id":"n4648","loc":[-85.63504,41.941992],"tags":{"leisure":"picnic_table"}},"n4649":{"id":"n4649","loc":[-85.635185,41.942001]},"n465":{"id":"n465","loc":[-85.634555,41.943263]},"n4650":{"id":"n4650","loc":[-85.635176,41.942021]},"n4651":{"id":"n4651","loc":[-85.635127,41.942008]},"n4652":{"id":"n4652","loc":[-85.635136,41.941988]},"n4653":{"id":"n4653","loc":[-85.635,41.941709],"tags":{"emergency":"fire_hydrant"}},"n4654":{"id":"n4654","loc":[-85.634893,41.941801]},"n4655":{"id":"n4655","loc":[-85.634937,41.941843]},"n4656":{"id":"n4656","loc":[-85.634963,41.941859]},"n4657":{"id":"n4657","loc":[-85.635027,41.941904]},"n4658":{"id":"n4658","loc":[-85.63494,41.94187]},"n4659":{"id":"n4659","loc":[-85.634951,41.941871]},"n466":{"id":"n466","loc":[-85.634526,41.943289]},"n4660":{"id":"n4660","loc":[-85.634753,41.941701],"tags":{"amenity":"drinking_water"}},"n4661":{"id":"n4661","loc":[-85.634717,41.941804],"tags":{"amenity":"bench"}},"n4662":{"id":"n4662","loc":[-85.634554,41.941883],"tags":{"amenity":"bench"}},"n4663":{"id":"n4663","loc":[-85.635002,41.941579],"tags":{"amenity":"fountain"}},"n4664":{"id":"n4664","loc":[-85.635258,41.94188],"tags":{"amenity":"waste_basket"}},"n4665":{"id":"n4665","loc":[-85.635262,41.941581],"tags":{"amenity":"bench"}},"n4666":{"id":"n4666","loc":[-85.635319,41.941744],"tags":{"amenity":"bench"}},"n4667":{"id":"n4667","loc":[-85.634702,41.941473],"tags":{"amenity":"waste_basket"}},"n4668":{"id":"n4668","loc":[-85.633981,41.941966],"tags":{"amenity":"bench"}},"n4669":{"id":"n4669","loc":[-85.63388,41.941743]},"n467":{"id":"n467","loc":[-85.635163,41.944985]},"n4670":{"id":"n4670","loc":[-85.633746,41.941741]},"n4671":{"id":"n4671","loc":[-85.633749,41.941664]},"n4672":{"id":"n4672","loc":[-85.633883,41.941667]},"n4673":{"id":"n4673","loc":[-85.634283,41.941183],"tags":{"leisure":"picnic_table"}},"n4674":{"id":"n4674","loc":[-85.634046,41.941102],"tags":{"amenity":"bbq"}},"n4675":{"id":"n4675","loc":[-85.63401,41.941093],"tags":{"amenity":"bbq"}},"n4676":{"id":"n4676","loc":[-85.633408,41.940862],"tags":{"amenity":"bench"}},"n4677":{"id":"n4677","loc":[-85.633359,41.940651],"tags":{"amenity":"bench"}},"n4678":{"id":"n4678","loc":[-85.634109,41.940831]},"n4679":{"id":"n4679","loc":[-85.63396,41.940867]},"n468":{"id":"n468","loc":[-85.635095,41.945035]},"n4680":{"id":"n4680","loc":[-85.633816,41.940913]},"n4681":{"id":"n4681","loc":[-85.633237,41.940455]},"n4682":{"id":"n4682","loc":[-85.634453,41.940025],"tags":{"emergency":"fire_hydrant"}},"n4683":{"id":"n4683","loc":[-85.635692,41.940218],"tags":{"emergency":"fire_hydrant"}},"n4684":{"id":"n4684","loc":[-85.635566,41.940102],"tags":{"highway":"stop"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop"}},"n4686":{"id":"n4686","loc":[-85.635883,41.94012],"tags":{"crossing":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","highway":"crossing"}},"n4689":{"id":"n4689","loc":[-85.635669,41.940043]},"n469":{"id":"n469","loc":[-85.634269,41.944431]},"n4690":{"id":"n4690","loc":[-85.635661,41.940107],"tags":{"crossing":"zebra","highway":"crossing"}},"n4691":{"id":"n4691","loc":[-85.635424,41.941005],"tags":{"amenity":"fountain"}},"n4692":{"id":"n4692","loc":[-85.635542,41.941371],"tags":{"amenity":"bench"}},"n4693":{"id":"n4693","loc":[-85.635709,41.941341],"tags":{"emergency":"fire_hydrant"}},"n4694":{"id":"n4694","loc":[-85.637038,41.942513],"tags":{"highway":"stop"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way"}},"n4699":{"id":"n4699","loc":[-85.638288,41.941236],"tags":{"emergency":"fire_hydrant"}},"n47":{"id":"n47","loc":[-85.636693,41.943073]},"n470":{"id":"n470","loc":[-85.634352,41.944376]},"n4700":{"id":"n4700","loc":[-85.63935,41.94128],"tags":{"emergency":"fire_hydrant"}},"n4701":{"id":"n4701","loc":[-85.639277,41.941337],"tags":{"highway":"give_way"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way"}},"n4703":{"id":"n4703","loc":[-85.642191,41.940039]},"n4704":{"id":"n4704","loc":[-85.640585,41.941263],"tags":{"emergency":"fire_hydrant"}},"n4705":{"id":"n4705","loc":[-85.64049,41.941327],"tags":{"highway":"stop"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop"}},"n4709":{"id":"n4709","loc":[-85.641756,41.941392],"tags":{"emergency":"fire_hydrant"}},"n471":{"id":"n471","loc":[-85.634747,41.944561],"tags":{"railway":"crossing"}},"n4710":{"id":"n4710","loc":[-85.642014,41.941313],"tags":{"highway":"stop"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop"}},"n4719":{"id":"n4719","loc":[-85.639527,41.942505],"tags":{"emergency":"fire_hydrant"}},"n472":{"id":"n472","loc":[-85.634667,41.944613]},"n4720":{"id":"n4720","loc":[-85.638238,41.942745],"tags":{"highway":"stop"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop"}},"n4722":{"id":"n4722","loc":[-85.638018,41.94299],"tags":{"amenity":"waste_disposal"}},"n4723":{"id":"n4723","loc":[-85.637918,41.944152],"tags":{"amenity":"waste_basket"}},"n4724":{"id":"n4724","loc":[-85.635902,41.943291],"tags":{"leisure":"picnic_table"}},"n4725":{"id":"n4725","loc":[-85.63704,41.942741],"tags":{"highway":"stop"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop"}},"n4728":{"id":"n4728","loc":[-85.632154,41.943539],"tags":{"emergency":"fire_hydrant"}},"n4729":{"id":"n4729","loc":[-85.633567,41.944641],"tags":{"amenity":"bench"}},"n473":{"id":"n473","loc":[-85.634161,41.944371]},"n4730":{"id":"n4730","loc":[-85.633127,41.944574],"tags":{"amenity":"bench"}},"n4731":{"id":"n4731","loc":[-85.633439,41.944871],"tags":{"amenity":"bench"}},"n4732":{"id":"n4732","loc":[-85.633676,41.944799],"tags":{"amenity":"waste_basket"}},"n4733":{"id":"n4733","loc":[-85.633466,41.944862],"tags":{"amenity":"waste_basket"}},"n4734":{"id":"n4734","loc":[-85.633451,41.944847],"tags":{"emergency":"fire_hydrant"}},"n4735":{"id":"n4735","loc":[-85.634202,41.945543],"tags":{"amenity":"waste_basket"}},"n4736":{"id":"n4736","loc":[-85.634652,41.945472],"tags":{"leisure":"picnic_table"}},"n4737":{"id":"n4737","loc":[-85.6347,41.945445],"tags":{"leisure":"picnic_table"}},"n4738":{"id":"n4738","loc":[-85.634646,41.945662],"tags":{"emergency":"fire_hydrant"}},"n4739":{"id":"n4739","loc":[-85.634673,41.945687],"tags":{"amenity":"waste_basket"}},"n474":{"id":"n474","loc":[-85.633861,41.944117]},"n4740":{"id":"n4740","loc":[-85.63449,41.945827],"tags":{"amenity":"clock","display":"analog"}},"n4741":{"id":"n4741","loc":[-85.63481,41.946056],"tags":{"highway":"stop"}},"n4742":{"id":"n4742","loc":[-85.634814,41.946176],"tags":{"amenity":"post_box"}},"n4743":{"id":"n4743","loc":[-85.638744,41.945328]},"n4744":{"id":"n4744","loc":[-85.63867,41.945228],"tags":{"amenity":"bench"}},"n4745":{"id":"n4745","loc":[-85.639487,41.945042],"tags":{"highway":"stop"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop"}},"n476":{"id":"n476","loc":[-85.63423,41.943692]},"n4760":{"id":"n4760","loc":[-85.63169,41.947812]},"n4761":{"id":"n4761","loc":[-85.631307,41.947655]},"n4762":{"id":"n4762","loc":[-85.631407,41.947413]},"n4763":{"id":"n4763","loc":[-85.631173,41.947306]},"n4764":{"id":"n4764","loc":[-85.631316,41.947145]},"n4765":{"id":"n4765","loc":[-85.631476,41.947087]},"n4766":{"id":"n4766","loc":[-85.631793,41.946871]},"n4767":{"id":"n4767","loc":[-85.631884,41.946723]},"n4768":{"id":"n4768","loc":[-85.631814,41.946397]},"n4769":{"id":"n4769","loc":[-85.631382,41.947685]},"n477":{"id":"n477","loc":[-85.635096,41.942814]},"n4770":{"id":"n4770","loc":[-85.63109,41.947819]},"n4771":{"id":"n4771","loc":[-85.630921,41.947961]},"n4772":{"id":"n4772","loc":[-85.630249,41.947709]},"n4773":{"id":"n4773","loc":[-85.630149,41.947451]},"n4774":{"id":"n4774","loc":[-85.629733,41.947339]},"n4775":{"id":"n4775","loc":[-85.629755,41.946948]},"n4776":{"id":"n4776","loc":[-85.630457,41.947103]},"n4777":{"id":"n4777","loc":[-85.630934,41.946939]},"n4778":{"id":"n4778","loc":[-85.631277,41.946852]},"n4779":{"id":"n4779","loc":[-85.63142,41.946781]},"n478":{"id":"n478","loc":[-85.635058,41.942795]},"n4780":{"id":"n4780","loc":[-85.631116,41.946474]},"n4781":{"id":"n4781","loc":[-85.63073,41.945965]},"n4782":{"id":"n4782","loc":[-85.631337,41.94571]},"n4783":{"id":"n4783","loc":[-85.631589,41.945487]},"n4784":{"id":"n4784","loc":[-85.632278,41.945784]},"n4785":{"id":"n4785","loc":[-85.632105,41.946034]},"n4786":{"id":"n4786","loc":[-85.632532,41.946198]},"n4787":{"id":"n4787","loc":[-85.632566,41.946151]},"n4788":{"id":"n4788","loc":[-85.632684,41.946196]},"n4789":{"id":"n4789","loc":[-85.628676,41.947106]},"n479":{"id":"n479","loc":[-85.635002,41.94279]},"n4790":{"id":"n4790","loc":[-85.628973,41.946476]},"n4791":{"id":"n4791","loc":[-85.629094,41.946079]},"n4792":{"id":"n4792","loc":[-85.629226,41.94578]},"n4793":{"id":"n4793","loc":[-85.629479,41.945682]},"n4794":{"id":"n4794","loc":[-85.630606,41.94569]},"n4795":{"id":"n4795","loc":[-85.631255,41.945588]},"n4796":{"id":"n4796","loc":[-85.631546,41.945281]},"n4797":{"id":"n4797","loc":[-85.631629,41.944823]},"n4798":{"id":"n4798","loc":[-85.631766,41.944958]},"n4799":{"id":"n4799","loc":[-85.631689,41.945318]},"n48":{"id":"n48","loc":[-85.636689,41.94276]},"n480":{"id":"n480","loc":[-85.634908,41.94279]},"n4800":{"id":"n4800","loc":[-85.615069,41.945527]},"n4801":{"id":"n4801","loc":[-85.615058,41.946677]},"n4802":{"id":"n4802","loc":[-85.613692,41.946689]},"n4803":{"id":"n4803","loc":[-85.613475,41.946531]},"n4804":{"id":"n4804","loc":[-85.611717,41.946252]},"n4805":{"id":"n4805","loc":[-85.611353,41.946385]},"n4806":{"id":"n4806","loc":[-85.611304,41.947397]},"n4807":{"id":"n4807","loc":[-85.610564,41.947401]},"n4808":{"id":"n4808","loc":[-85.610553,41.947122]},"n4809":{"id":"n4809","loc":[-85.610194,41.946992]},"n481":{"id":"n481","loc":[-85.634478,41.942342]},"n4810":{"id":"n4810","loc":[-85.609976,41.946628]},"n4811":{"id":"n4811","loc":[-85.609769,41.946523]},"n4812":{"id":"n4812","loc":[-85.609307,41.946523]},"n4813":{"id":"n4813","loc":[-85.609035,41.946462]},"n4814":{"id":"n4814","loc":[-85.609018,41.943277]},"n4815":{"id":"n4815","loc":[-85.609617,41.943423]},"n4816":{"id":"n4816","loc":[-85.610471,41.943447]},"n4817":{"id":"n4817","loc":[-85.621491,41.949168]},"n4818":{"id":"n4818","loc":[-85.620266,41.94917]},"n4819":{"id":"n4819","loc":[-85.620262,41.947557]},"n482":{"id":"n482","loc":[-85.634521,41.942254]},"n4820":{"id":"n4820","loc":[-85.620825,41.947556]},"n4821":{"id":"n4821","loc":[-85.620827,41.948371]},"n4822":{"id":"n4822","loc":[-85.621489,41.94837]},"n4823":{"id":"n4823","loc":[-85.622865,41.950928]},"n4824":{"id":"n4824","loc":[-85.622858,41.949744]},"n4825":{"id":"n4825","loc":[-85.623696,41.949714]},"n4826":{"id":"n4826","loc":[-85.623696,41.949647]},"n4827":{"id":"n4827","loc":[-85.624019,41.949647]},"n4828":{"id":"n4828","loc":[-85.624024,41.950093]},"n4829":{"id":"n4829","loc":[-85.622885,41.949711]},"n483":{"id":"n483","loc":[-85.63425,41.941819]},"n4830":{"id":"n4830","loc":[-85.624584,41.951049]},"n4831":{"id":"n4831","loc":[-85.624669,41.9511]},"n4832":{"id":"n4832","loc":[-85.624316,41.952218]},"n4833":{"id":"n4833","loc":[-85.623819,41.952094]},"n4834":{"id":"n4834","loc":[-85.623385,41.952101]},"n4835":{"id":"n4835","loc":[-85.623456,41.951238]},"n4836":{"id":"n4836","loc":[-85.623535,41.951051]},"n4837":{"id":"n4837","loc":[-85.624693,41.950921]},"n4838":{"id":"n4838","loc":[-85.624727,41.950897]},"n4839":{"id":"n4839","loc":[-85.624869,41.950341]},"n484":{"id":"n484","loc":[-85.634324,41.942131]},"n4840":{"id":"n4840","loc":[-85.624859,41.949284]},"n4841":{"id":"n4841","loc":[-85.624788,41.949262]},"n4842":{"id":"n4842","loc":[-85.62402,41.949265]},"n4843":{"id":"n4843","loc":[-85.610382,41.954663]},"n4844":{"id":"n4844","loc":[-85.605675,41.954667]},"n4845":{"id":"n4845","loc":[-85.605669,41.949407]},"n4846":{"id":"n4846","loc":[-85.610376,41.949404]},"n4847":{"id":"n4847","loc":[-85.605552,41.958536]},"n4848":{"id":"n4848","loc":[-85.595755,41.958588]},"n4849":{"id":"n4849","loc":[-85.595732,41.956419]},"n485":{"id":"n485","loc":[-85.634211,41.941374]},"n4850":{"id":"n4850","loc":[-85.596908,41.955605]},"n4851":{"id":"n4851","loc":[-85.597723,41.955596]},"n4852":{"id":"n4852","loc":[-85.597715,41.954967]},"n4853":{"id":"n4853","loc":[-85.5874,41.955018]},"n4854":{"id":"n4854","loc":[-85.586615,41.955124]},"n4855":{"id":"n4855","loc":[-85.58613,41.955293]},"n4856":{"id":"n4856","loc":[-85.586166,41.962122]},"n4857":{"id":"n4857","loc":[-85.587008,41.955052]},"n4858":{"id":"n4858","loc":[-85.591685,41.95499]},"n4859":{"id":"n4859","loc":[-85.591718,41.956649]},"n486":{"id":"n486","loc":[-85.634085,41.940704]},"n4860":{"id":"n4860","loc":[-85.591133,41.956649]},"n4861":{"id":"n4861","loc":[-85.591061,41.95582]},"n4862":{"id":"n4862","loc":[-85.590677,41.95613]},"n4863":{"id":"n4863","loc":[-85.590826,41.956369]},"n4864":{"id":"n4864","loc":[-85.591016,41.954991]},"n4865":{"id":"n4865","loc":[-85.587656,41.954855]},"n4866":{"id":"n4866","loc":[-85.5964,41.955274]},"n4867":{"id":"n4867","loc":[-85.58776,41.96178]},"n4868":{"id":"n4868","loc":[-85.601172,41.960448]},"n4869":{"id":"n4869","loc":[-85.589489,41.960478]},"n487":{"id":"n487","loc":[-85.635567,41.940944]},"n4870":{"id":"n4870","loc":[-85.586664,41.960493]},"n4871":{"id":"n4871","loc":[-85.591227,41.95676]},"n4872":{"id":"n4872","loc":[-85.589424,41.958093]},"n4873":{"id":"n4873","loc":[-85.588779,41.957611]},"n4874":{"id":"n4874","loc":[-85.590583,41.956278]},"n4875":{"id":"n4875","loc":[-85.590759,41.957106]},"n4876":{"id":"n4876","loc":[-85.592213,41.958218]},"n4877":{"id":"n4877","loc":[-85.592262,41.958279]},"n4878":{"id":"n4878","loc":[-85.592304,41.958358]},"n4879":{"id":"n4879","loc":[-85.592351,41.95849]},"n488":{"id":"n488","loc":[-85.635542,41.940919]},"n4880":{"id":"n4880","loc":[-85.592363,41.958605]},"n4881":{"id":"n4881","loc":[-85.592383,41.96047]},"n4882":{"id":"n4882","loc":[-85.592376,41.959808]},"n4883":{"id":"n4883","loc":[-85.600825,41.959779]},"n4884":{"id":"n4884","loc":[-85.601084,41.959844]},"n4885":{"id":"n4885","loc":[-85.601144,41.959908]},"n4886":{"id":"n4886","loc":[-85.601164,41.960008]},"n4887":{"id":"n4887","loc":[-85.601162,41.960125]},"n4888":{"id":"n4888","loc":[-85.601134,41.960221]},"n4889":{"id":"n4889","loc":[-85.600993,41.960353]},"n489":{"id":"n489","loc":[-85.635514,41.940906]},"n4890":{"id":"n4890","loc":[-85.600794,41.960449]},"n4891":{"id":"n4891","loc":[-85.60098,41.959792]},"n4892":{"id":"n4892","loc":[-85.601067,41.960294]},"n4893":{"id":"n4893","loc":[-85.596829,41.959793]},"n4894":{"id":"n4894","loc":[-85.596839,41.960459]},"n4895":{"id":"n4895","loc":[-85.589364,41.958048]},"n4896":{"id":"n4896","loc":[-85.587374,41.959511]},"n4897":{"id":"n4897","loc":[-85.587286,41.959564]},"n4898":{"id":"n4898","loc":[-85.587163,41.959632]},"n4899":{"id":"n4899","loc":[-85.586694,41.959865]},"n49":{"id":"n49","loc":[-85.637127,41.942757]},"n490":{"id":"n490","loc":[-85.635469,41.940896]},"n4900":{"id":"n4900","loc":[-85.586634,41.959921]},"n4901":{"id":"n4901","loc":[-85.586607,41.960001]},"n4902":{"id":"n4902","loc":[-85.586599,41.960099]},"n4903":{"id":"n4903","loc":[-85.586602,41.96034]},"n4904":{"id":"n4904","loc":[-85.586669,41.960439]},"n4905":{"id":"n4905","loc":[-85.586758,41.960493]},"n4906":{"id":"n4906","loc":[-85.586618,41.960391]},"n4907":{"id":"n4907","loc":[-85.591201,41.956352]},"n4908":{"id":"n4908","loc":[-85.59112,41.954843]},"n4909":{"id":"n4909","loc":[-85.591536,41.956349]},"n491":{"id":"n491","loc":[-85.635667,41.940826]},"n4910":{"id":"n4910","loc":[-85.590953,41.956354]},"n4911":{"id":"n4911","loc":[-85.591468,41.956406]},"n4912":{"id":"n4912","loc":[-85.591469,41.956478]},"n4913":{"id":"n4913","loc":[-85.591123,41.956481]},"n4914":{"id":"n4914","loc":[-85.591121,41.956409]},"n4915":{"id":"n4915","loc":[-85.590826,41.955954]},"n4916":{"id":"n4916","loc":[-85.590612,41.956115]},"n4917":{"id":"n4917","loc":[-85.590402,41.955962]},"n4918":{"id":"n4918","loc":[-85.590622,41.955804]},"n4919":{"id":"n4919","loc":[-85.59011,41.956502]},"n492":{"id":"n492","loc":[-85.636197,41.940599]},"n4920":{"id":"n4920","loc":[-85.589877,41.956668]},"n4921":{"id":"n4921","loc":[-85.589777,41.95659]},"n4922":{"id":"n4922","loc":[-85.59001,41.956424]},"n4923":{"id":"n4923","loc":[-85.589595,41.956427]},"n4924":{"id":"n4924","loc":[-85.589434,41.956549]},"n4925":{"id":"n4925","loc":[-85.589262,41.956424]},"n4926":{"id":"n4926","loc":[-85.589422,41.956302]},"n4927":{"id":"n4927","loc":[-85.589358,41.956286]},"n4928":{"id":"n4928","loc":[-85.5892,41.956408]},"n4929":{"id":"n4929","loc":[-85.589032,41.956288]},"n493":{"id":"n493","loc":[-85.6362,41.940686]},"n4930":{"id":"n4930","loc":[-85.58919,41.956166]},"n4931":{"id":"n4931","loc":[-85.589165,41.956132]},"n4932":{"id":"n4932","loc":[-85.589002,41.956253]},"n4933":{"id":"n4933","loc":[-85.588826,41.956122]},"n4934":{"id":"n4934","loc":[-85.588989,41.956001]},"n4935":{"id":"n4935","loc":[-85.588673,41.955757]},"n4936":{"id":"n4936","loc":[-85.588502,41.955882]},"n4937":{"id":"n4937","loc":[-85.588339,41.955759]},"n4938":{"id":"n4938","loc":[-85.58851,41.955633]},"n4939":{"id":"n4939","loc":[-85.590382,41.955892]},"n494":{"id":"n494","loc":[-85.635969,41.94069]},"n4940":{"id":"n4940","loc":[-85.589923,41.956231]},"n4941":{"id":"n4941","loc":[-85.58984,41.956168]},"n4942":{"id":"n4942","loc":[-85.5903,41.95583]},"n4943":{"id":"n4943","loc":[-85.589636,41.956038]},"n4944":{"id":"n4944","loc":[-85.589546,41.956105]},"n4945":{"id":"n4945","loc":[-85.589045,41.955729]},"n4946":{"id":"n4946","loc":[-85.589135,41.955662]},"n4947":{"id":"n4947","loc":[-85.590718,41.955293]},"n4948":{"id":"n4948","loc":[-85.590718,41.955374]},"n4949":{"id":"n4949","loc":[-85.589211,41.955369]},"n495":{"id":"n495","loc":[-85.635965,41.940561]},"n4950":{"id":"n4950","loc":[-85.589212,41.955287]},"n4951":{"id":"n4951","loc":[-85.589675,41.956817]},"n4952":{"id":"n4952","loc":[-85.58947,41.95697]},"n4953":{"id":"n4953","loc":[-85.589219,41.956784]},"n4954":{"id":"n4954","loc":[-85.589425,41.95663]},"n4955":{"id":"n4955","loc":[-85.589373,41.95702]},"n4956":{"id":"n4956","loc":[-85.589171,41.957172]},"n4957":{"id":"n4957","loc":[-85.588962,41.957019]},"n4958":{"id":"n4958","loc":[-85.589164,41.956867]},"n4959":{"id":"n4959","loc":[-85.588881,41.955006]},"n496":{"id":"n496","loc":[-85.636031,41.94056]},"n4960":{"id":"n4960","loc":[-85.588804,41.955006]},"n4961":{"id":"n4961","loc":[-85.604773,41.954521]},"n4962":{"id":"n4962","loc":[-85.601603,41.954527]},"n4963":{"id":"n4963","loc":[-85.600823,41.954169]},"n4964":{"id":"n4964","loc":[-85.600828,41.950191]},"n4965":{"id":"n4965","loc":[-85.601673,41.949457]},"n4966":{"id":"n4966","loc":[-85.604464,41.949488]},"n4967":{"id":"n4967","loc":[-85.60538,41.950212]},"n4968":{"id":"n4968","loc":[-85.605395,41.954108]},"n4969":{"id":"n4969","loc":[-85.604771,41.954109]},"n497":{"id":"n497","loc":[-85.636032,41.940602]},"n4970":{"id":"n4970","loc":[-85.600613,41.953916]},"n4971":{"id":"n4971","loc":[-85.599758,41.954649]},"n4972":{"id":"n4972","loc":[-85.591194,41.954663]},"n4973":{"id":"n4973","loc":[-85.591182,41.950465]},"n4974":{"id":"n4974","loc":[-85.591871,41.950464]},"n4975":{"id":"n4975","loc":[-85.591868,41.949209]},"n4976":{"id":"n4976","loc":[-85.592155,41.949209]},"n4977":{"id":"n4977","loc":[-85.592155,41.94848]},"n4978":{"id":"n4978","loc":[-85.600615,41.948482]},"n4979":{"id":"n4979","loc":[-85.605421,41.949378]},"n498":{"id":"n498","loc":[-85.635776,41.940583]},"n4980":{"id":"n4980","loc":[-85.600614,41.949373]},"n4981":{"id":"n4981","loc":[-85.601316,41.94849]},"n4982":{"id":"n4982","loc":[-85.601592,41.947641]},"n4983":{"id":"n4983","loc":[-85.60395,41.947618]},"n4984":{"id":"n4984","loc":[-85.603973,41.948114]},"n4985":{"id":"n4985","loc":[-85.605398,41.948103]},"n4986":{"id":"n4986","loc":[-85.614017,41.965566]},"n4987":{"id":"n4987","loc":[-85.605787,41.965619]},"n4988":{"id":"n4988","loc":[-85.60577,41.963821]},"n4989":{"id":"n4989","loc":[-85.612886,41.963808]},"n499":{"id":"n499","loc":[-85.63589,41.940578]},"n4990":{"id":"n4990","loc":[-85.613207,41.963705]},"n4991":{"id":"n4991","loc":[-85.613511,41.963525]},"n4992":{"id":"n4992","loc":[-85.613667,41.963305]},"n4993":{"id":"n4993","loc":[-85.613779,41.962983]},"n4994":{"id":"n4994","loc":[-85.613797,41.959709]},"n4995":{"id":"n4995","loc":[-85.613663,41.95936]},"n4996":{"id":"n4996","loc":[-85.61339,41.959064]},"n4997":{"id":"n4997","loc":[-85.610503,41.956898]},"n4998":{"id":"n4998","loc":[-85.610485,41.956595]},"n4999":{"id":"n4999","loc":[-85.613892,41.956621]},"n5":{"id":"n5","loc":[-85.622744,41.95268]},"n50":{"id":"n50","loc":[-85.636673,41.943143]},"n500":{"id":"n500","loc":[-85.636198,41.940578]},"n5000":{"id":"n5000","loc":[-85.613866,41.958574]},"n5001":{"id":"n5001","loc":[-85.615262,41.958561]},"n5002":{"id":"n5002","loc":[-85.615279,41.959541]},"n5003":{"id":"n5003","loc":[-85.615314,41.95597]},"n5004":{"id":"n5004","loc":[-85.613887,41.955988]},"n5005":{"id":"n5005","loc":[-85.613074,41.962244]},"n5006":{"id":"n5006","loc":[-85.611678,41.963354]},"n5007":{"id":"n5007","loc":[-85.611678,41.963487]},"n5008":{"id":"n5008","loc":[-85.606906,41.963502]},"n5009":{"id":"n5009","loc":[-85.605777,41.962657]},"n501":{"id":"n501","loc":[-85.636251,41.940584]},"n5010":{"id":"n5010","loc":[-85.605711,41.9599]},"n5011":{"id":"n5011","loc":[-85.608139,41.9585]},"n5012":{"id":"n5012","loc":[-85.60814,41.956306]},"n5013":{"id":"n5013","loc":[-85.608854,41.95581]},"n5014":{"id":"n5014","loc":[-85.610039,41.955883]},"n5015":{"id":"n5015","loc":[-85.610068,41.956754]},"n5016":{"id":"n5016","loc":[-85.613058,41.959411]},"n5017":{"id":"n5017","loc":[-85.610234,41.957068]},"n5018":{"id":"n5018","loc":[-85.609826,41.95581]},"n5019":{"id":"n5019","loc":[-85.606987,41.958505]},"n502":{"id":"n502","loc":[-85.636279,41.940605]},"n5020":{"id":"n5020","loc":[-85.606498,41.958846]},"n5021":{"id":"n5021","loc":[-85.606013,41.959342]},"n5022":{"id":"n5022","loc":[-85.614553,41.961581]},"n5023":{"id":"n5023","loc":[-85.61465,41.96214]},"n5024":{"id":"n5024","loc":[-85.615277,41.962442]},"n5025":{"id":"n5025","loc":[-85.615451,41.962972]},"n5026":{"id":"n5026","loc":[-85.614355,41.964826]},"n5027":{"id":"n5027","loc":[-85.615133,41.964589]},"n5028":{"id":"n5028","loc":[-85.615342,41.963818]},"n5029":{"id":"n5029","loc":[-85.615971,41.963792]},"n503":{"id":"n503","loc":[-85.636285,41.940633]},"n5030":{"id":"n5030","loc":[-85.615751,41.963122]},"n5031":{"id":"n5031","loc":[-85.616575,41.963123]},"n5032":{"id":"n5032","loc":[-85.612527,41.963846]},"n5033":{"id":"n5033","loc":[-85.630653,41.940709]},"n5034":{"id":"n5034","loc":[-85.629858,41.939568]},"n5035":{"id":"n5035","loc":[-85.629847,41.937926]},"n504":{"id":"n504","loc":[-85.636281,41.940662]},"n505":{"id":"n505","loc":[-85.636266,41.940688]},"n506":{"id":"n506","loc":[-85.636236,41.940701]},"n507":{"id":"n507","loc":[-85.63619,41.940706]},"n508":{"id":"n508","loc":[-85.635892,41.940707]},"n509":{"id":"n509","loc":[-85.635777,41.9407]},"n51":{"id":"n51","loc":[-85.636673,41.942864]},"n510":{"id":"n510","loc":[-85.636044,41.940578]},"n511":{"id":"n511","loc":[-85.635946,41.940578]},"n512":{"id":"n512","loc":[-85.636475,41.940732]},"n513":{"id":"n513","loc":[-85.636475,41.940777]},"n514":{"id":"n514","loc":[-85.636405,41.940777]},"n515":{"id":"n515","loc":[-85.636405,41.940732]},"n516":{"id":"n516","loc":[-85.636471,41.940916]},"n517":{"id":"n517","loc":[-85.636471,41.940961]},"n518":{"id":"n518","loc":[-85.636404,41.940961]},"n519":{"id":"n519","loc":[-85.636404,41.940916]},"n52":{"id":"n52","loc":[-85.636227,41.942864]},"n520":{"id":"n520","loc":[-85.636286,41.941127]},"n521":{"id":"n521","loc":[-85.636203,41.941126]},"n522":{"id":"n522","loc":[-85.636204,41.941083]},"n523":{"id":"n523","loc":[-85.636287,41.941083]},"n524":{"id":"n524","loc":[-85.636124,41.941064]},"n525":{"id":"n525","loc":[-85.636,41.941065]},"n526":{"id":"n526","loc":[-85.636,41.940964]},"n527":{"id":"n527","loc":[-85.636045,41.940964]},"n528":{"id":"n528","loc":[-85.636045,41.940928]},"n529":{"id":"n529","loc":[-85.636111,41.940928]},"n53":{"id":"n53","loc":[-85.636227,41.943143]},"n530":{"id":"n530","loc":[-85.636111,41.940961]},"n531":{"id":"n531","loc":[-85.636123,41.940961]},"n532":{"id":"n532","loc":[-85.636124,41.940997]},"n533":{"id":"n533","loc":[-85.636164,41.940997]},"n534":{"id":"n534","loc":[-85.636164,41.941044]},"n535":{"id":"n535","loc":[-85.636124,41.941044]},"n536":{"id":"n536","loc":[-85.636534,41.941256]},"n537":{"id":"n537","loc":[-85.63645,41.941246]},"n538":{"id":"n538","loc":[-85.636462,41.941189]},"n539":{"id":"n539","loc":[-85.636546,41.941199]},"n54":{"id":"n54","loc":[-85.636198,41.943119]},"n540":{"id":"n540","loc":[-85.636802,41.941226]},"n541":{"id":"n541","loc":[-85.636701,41.941215]},"n542":{"id":"n542","loc":[-85.636709,41.941174]},"n543":{"id":"n543","loc":[-85.636656,41.941168]},"n544":{"id":"n544","loc":[-85.636666,41.941122]},"n545":{"id":"n545","loc":[-85.636781,41.941136]},"n546":{"id":"n546","loc":[-85.636774,41.94117]},"n547":{"id":"n547","loc":[-85.636812,41.941175]},"n548":{"id":"n548","loc":[-85.636803,41.941047]},"n549":{"id":"n549","loc":[-85.636785,41.941047]},"n55":{"id":"n55","loc":[-85.635945,41.94312]},"n550":{"id":"n550","loc":[-85.636785,41.941058]},"n551":{"id":"n551","loc":[-85.636644,41.941059]},"n552":{"id":"n552","loc":[-85.636644,41.941038]},"n553":{"id":"n553","loc":[-85.636581,41.941039]},"n554":{"id":"n554","loc":[-85.636581,41.940995]},"n555":{"id":"n555","loc":[-85.636746,41.940995]},"n556":{"id":"n556","loc":[-85.636746,41.940978]},"n557":{"id":"n557","loc":[-85.636803,41.940978]},"n558":{"id":"n558","loc":[-85.636781,41.940768]},"n559":{"id":"n559","loc":[-85.636783,41.940828]},"n56":{"id":"n56","loc":[-85.635943,41.942909]},"n560":{"id":"n560","loc":[-85.636761,41.940828]},"n561":{"id":"n561","loc":[-85.636762,41.940857]},"n562":{"id":"n562","loc":[-85.636641,41.940859]},"n563":{"id":"n563","loc":[-85.63664,41.940805]},"n564":{"id":"n564","loc":[-85.636676,41.940804]},"n565":{"id":"n565","loc":[-85.636675,41.940769]},"n566":{"id":"n566","loc":[-85.636733,41.94033]},"n567":{"id":"n567","loc":[-85.636471,41.940334]},"n568":{"id":"n568","loc":[-85.636469,41.940262]},"n569":{"id":"n569","loc":[-85.636731,41.940257]},"n57":{"id":"n57","loc":[-85.636227,41.942909]},"n570":{"id":"n570","loc":[-85.636798,41.940419]},"n571":{"id":"n571","loc":[-85.6368,41.940524]},"n572":{"id":"n572","loc":[-85.63664,41.940526]},"n573":{"id":"n573","loc":[-85.636638,41.940421]},"n574":{"id":"n574","loc":[-85.636372,41.940551]},"n575":{"id":"n575","loc":[-85.636338,41.94055]},"n576":{"id":"n576","loc":[-85.636339,41.940524]},"n577":{"id":"n577","loc":[-85.636373,41.940525]},"n578":{"id":"n578","loc":[-85.636388,41.940435]},"n579":{"id":"n579","loc":[-85.636222,41.940436]},"n58":{"id":"n58","loc":[-85.63627,41.943175]},"n580":{"id":"n580","loc":[-85.636222,41.940366]},"n581":{"id":"n581","loc":[-85.636387,41.940365]},"n582":{"id":"n582","loc":[-85.636158,41.940482]},"n583":{"id":"n583","loc":[-85.635963,41.940484]},"n584":{"id":"n584","loc":[-85.635961,41.940399]},"n585":{"id":"n585","loc":[-85.636156,41.940397]},"n586":{"id":"n586","loc":[-85.635987,41.940314]},"n587":{"id":"n587","loc":[-85.635987,41.940268]},"n588":{"id":"n588","loc":[-85.635968,41.940268]},"n589":{"id":"n589","loc":[-85.635967,41.940212]},"n59":{"id":"n59","loc":[-85.635531,41.943176]},"n590":{"id":"n590","loc":[-85.636082,41.940211]},"n591":{"id":"n591","loc":[-85.636083,41.94027]},"n592":{"id":"n592","loc":[-85.636064,41.94027]},"n593":{"id":"n593","loc":[-85.636064,41.940313]},"n594":{"id":"n594","loc":[-85.638071,41.941562]},"n595":{"id":"n595","loc":[-85.637953,41.941562]},"n596":{"id":"n596","loc":[-85.637952,41.941522]},"n597":{"id":"n597","loc":[-85.637876,41.941523]},"n598":{"id":"n598","loc":[-85.637876,41.941471]},"n599":{"id":"n599","loc":[-85.638035,41.94147]},"n6":{"id":"n6","loc":[-85.624925,41.950604]},"n60":{"id":"n60","loc":[-85.63542,41.942883]},"n600":{"id":"n600","loc":[-85.638035,41.941513]},"n601":{"id":"n601","loc":[-85.638071,41.941512]},"n602":{"id":"n602","loc":[-85.637038,41.942543],"tags":{"crossing":"zebra","highway":"crossing"}},"n603":{"id":"n603","loc":[-85.637134,41.942542]},"n604":{"id":"n604","loc":[-85.638122,41.942532]},"n605":{"id":"n605","loc":[-85.638121,41.942478]},"n606":{"id":"n606","loc":[-85.638104,41.941424]},"n607":{"id":"n607","loc":[-85.637115,41.941438]},"n608":{"id":"n608","loc":[-85.637133,41.942453]},"n609":{"id":"n609","loc":[-85.637429,41.942004]},"n61":{"id":"n61","loc":[-85.635701,41.942802]},"n610":{"id":"n610","loc":[-85.637125,41.942004]},"n611":{"id":"n611","loc":[-85.637022,41.942004]},"n612":{"id":"n612","loc":[-85.635952,41.943579]},"n613":{"id":"n613","loc":[-85.635872,41.943594]},"n614":{"id":"n614","loc":[-85.635857,41.943551]},"n615":{"id":"n615","loc":[-85.635937,41.943535]},"n616":{"id":"n616","loc":[-85.63671,41.94344]},"n617":{"id":"n617","loc":[-85.636427,41.94334]},"n618":{"id":"n618","loc":[-85.635353,41.943279]},"n619":{"id":"n619","loc":[-85.635319,41.943257]},"n62":{"id":"n62","loc":[-85.6358,41.942997]},"n620":{"id":"n620","loc":[-85.638786,41.943105]},"n621":{"id":"n621","loc":[-85.634957,41.943146]},"n622":{"id":"n622","loc":[-85.635012,41.943119]},"n623":{"id":"n623","loc":[-85.632409,41.944222]},"n624":{"id":"n624","loc":[-85.631863,41.944749]},"n625":{"id":"n625","loc":[-85.631915,41.944722]},"n626":{"id":"n626","loc":[-85.631884,41.94464]},"n627":{"id":"n627","loc":[-85.631792,41.944359]},"n628":{"id":"n628","loc":[-85.631817,41.944703]},"n629":{"id":"n629","loc":[-85.633464,41.945787]},"n63":{"id":"n63","loc":[-85.635808,41.943176]},"n630":{"id":"n630","loc":[-85.633583,41.945919]},"n631":{"id":"n631","loc":[-85.63382,41.945698]},"n632":{"id":"n632","loc":[-85.633681,41.945571]},"n633":{"id":"n633","loc":[-85.634217,41.946824]},"n634":{"id":"n634","loc":[-85.634271,41.946836]},"n635":{"id":"n635","loc":[-85.634319,41.94573]},"n636":{"id":"n636","loc":[-85.634377,41.945672]},"n637":{"id":"n637","loc":[-85.634909,41.945354]},"n638":{"id":"n638","loc":[-85.634726,41.945493],"tags":{"artwork_type":"mural","tourism":"artwork"}},"n639":{"id":"n639","loc":[-85.63546,41.945612]},"n64":{"id":"n64","loc":[-85.63631,41.943253]},"n640":{"id":"n640","loc":[-85.635561,41.945493]},"n641":{"id":"n641","loc":[-85.635417,41.945565]},"n642":{"id":"n642","loc":[-85.635315,41.945583]},"n643":{"id":"n643","loc":[-85.63506,41.945383]},"n644":{"id":"n644","loc":[-85.635198,41.945199]},"n645":{"id":"n645","loc":[-85.635361,41.94558]},"n646":{"id":"n646","loc":[-85.635017,41.945066]},"n647":{"id":"n647","loc":[-85.634779,41.945206]},"n648":{"id":"n648","loc":[-85.63425,41.945655]},"n649":{"id":"n649","loc":[-85.634247,41.945631]},"n65":{"id":"n65","loc":[-85.635398,41.943259]},"n650":{"id":"n650","loc":[-85.634889,41.945921]},"n651":{"id":"n651","loc":[-85.634889,41.945939]},"n652":{"id":"n652","loc":[-85.634889,41.945761]},"n653":{"id":"n653","loc":[-85.634889,41.945778]},"n654":{"id":"n654","loc":[-85.635112,41.945715]},"n655":{"id":"n655","loc":[-85.635025,41.945714]},"n656":{"id":"n656","loc":[-85.635027,41.945761]},"n657":{"id":"n657","loc":[-85.635438,41.945665]},"n658":{"id":"n658","loc":[-85.635416,41.945676]},"n659":{"id":"n659","loc":[-85.635401,41.945709]},"n66":{"id":"n66","loc":[-85.635336,41.943036]},"n660":{"id":"n660","loc":[-85.635271,41.945566]},"n661":{"id":"n661","loc":[-85.636106,41.946268]},"n662":{"id":"n662","loc":[-85.635867,41.946747]},"n663":{"id":"n663","loc":[-85.636476,41.946797]},"n664":{"id":"n664","loc":[-85.63651,41.946796]},"n665":{"id":"n665","loc":[-85.635367,41.946389]},"n666":{"id":"n666","loc":[-85.635367,41.946437]},"n667":{"id":"n667","loc":[-85.634787,41.946441]},"n668":{"id":"n668","loc":[-85.6358,41.946243]},"n669":{"id":"n669","loc":[-85.635784,41.94622]},"n67":{"id":"n67","loc":[-85.635911,41.942899]},"n670":{"id":"n670","loc":[-85.635727,41.946195]},"n671":{"id":"n671","loc":[-85.635708,41.946588]},"n672":{"id":"n672","loc":[-85.635648,41.946561]},"n673":{"id":"n673","loc":[-85.635624,41.946555]},"n674":{"id":"n674","loc":[-85.635417,41.946559]},"n675":{"id":"n675","loc":[-85.634866,41.946561]},"n676":{"id":"n676","loc":[-85.634866,41.946543]},"n677":{"id":"n677","loc":[-85.635085,41.946546]},"n678":{"id":"n678","loc":[-85.635085,41.946554]},"n679":{"id":"n679","loc":[-85.634584,41.94488]},"n68":{"id":"n68","loc":[-85.635915,41.943156]},"n680":{"id":"n680","loc":[-85.634557,41.944882]},"n681":{"id":"n681","loc":[-85.634455,41.944943]},"n682":{"id":"n682","loc":[-85.634305,41.944968]},"n683":{"id":"n683","loc":[-85.634261,41.944927]},"n684":{"id":"n684","loc":[-85.634132,41.944741]},"n685":{"id":"n685","loc":[-85.633705,41.944759]},"n686":{"id":"n686","loc":[-85.633918,41.944616]},"n687":{"id":"n687","loc":[-85.633974,41.944663]},"n688":{"id":"n688","loc":[-85.6336,41.944665]},"n689":{"id":"n689","loc":[-85.633817,41.944528]},"n69":{"id":"n69","loc":[-85.63631,41.943157]},"n690":{"id":"n690","loc":[-85.633889,41.944485]},"n691":{"id":"n691","loc":[-85.633931,41.944525]},"n692":{"id":"n692","loc":[-85.633864,41.944563]},"n693":{"id":"n693","loc":[-85.633456,41.944524]},"n694":{"id":"n694","loc":[-85.633676,41.944399]},"n695":{"id":"n695","loc":[-85.633352,41.944415]},"n696":{"id":"n696","loc":[-85.633655,41.944234]},"n697":{"id":"n697","loc":[-85.633761,41.94435]},"n698":{"id":"n698","loc":[-85.633254,41.944318]},"n699":{"id":"n699","loc":[-85.633472,41.944188]},"n7":{"id":"n7","loc":[-85.638791,41.943231]},"n70":{"id":"n70","loc":[-85.63579,41.942967]},"n700":{"id":"n700","loc":[-85.633524,41.944237]},"n701":{"id":"n701","loc":[-85.633583,41.944202]},"n702":{"id":"n702","loc":[-85.633632,41.944247]},"n703":{"id":"n703","loc":[-85.633165,41.944228]},"n704":{"id":"n704","loc":[-85.633388,41.944105]},"n705":{"id":"n705","loc":[-85.633117,41.944175]},"n706":{"id":"n706","loc":[-85.633302,41.944077]},"n707":{"id":"n707","loc":[-85.633352,41.944126]},"n708":{"id":"n708","loc":[-85.633052,41.944107]},"n709":{"id":"n709","loc":[-85.633237,41.944009]},"n71":{"id":"n71","loc":[-85.637506,41.942824]},"n710":{"id":"n710","loc":[-85.633187,41.943955]},"n711":{"id":"n711","loc":[-85.633,41.944054]},"n712":{"id":"n712","loc":[-85.633155,41.944265]},"n713":{"id":"n713","loc":[-85.633669,41.944765]},"n714":{"id":"n714","loc":[-85.634468,41.945503]},"n715":{"id":"n715","loc":[-85.63455,41.945566]},"n716":{"id":"n716","loc":[-85.634737,41.945729]},"n717":{"id":"n717","loc":[-85.634753,41.945752]},"n718":{"id":"n718","loc":[-85.634756,41.945781]},"n719":{"id":"n719","loc":[-85.634758,41.945978]},"n72":{"id":"n72","loc":[-85.637511,41.943056]},"n720":{"id":"n720","loc":[-85.634363,41.945548],"tags":{"crossing":"zebra","highway":"crossing"}},"n721":{"id":"n721","loc":[-85.634245,41.945599]},"n722":{"id":"n722","loc":[-85.633474,41.944889]},"n723":{"id":"n723","loc":[-85.632997,41.944418]},"n724":{"id":"n724","loc":[-85.63278,41.944183]},"n725":{"id":"n725","loc":[-85.63331,41.944429]},"n726":{"id":"n726","loc":[-85.633568,41.944829],"tags":{"crossing":"zebra","highway":"crossing"}},"n727":{"id":"n727","loc":[-85.634669,41.94567]},"n728":{"id":"n728","loc":[-85.634462,41.945787]},"n729":{"id":"n729","loc":[-85.634272,41.945625]},"n73":{"id":"n73","loc":[-85.637361,41.943058]},"n730":{"id":"n730","loc":[-85.634344,41.945699],"tags":{"crossing":"zebra","highway":"crossing"}},"n731":{"id":"n731","loc":[-85.634426,41.945783]},"n732":{"id":"n732","loc":[-85.632425,41.944137]},"n733":{"id":"n733","loc":[-85.632302,41.944192]},"n734":{"id":"n734","loc":[-85.632762,41.944174]},"n735":{"id":"n735","loc":[-85.632713,41.944179]},"n736":{"id":"n736","loc":[-85.632411,41.944327]},"n737":{"id":"n737","loc":[-85.632362,41.944341]},"n738":{"id":"n738","loc":[-85.632236,41.944204]},"n739":{"id":"n739","loc":[-85.634939,41.942165]},"n74":{"id":"n74","loc":[-85.637356,41.942825]},"n740":{"id":"n740","loc":[-85.635079,41.941535]},"n741":{"id":"n741","loc":[-85.635112,41.941595]},"n742":{"id":"n742","loc":[-85.635113,41.941633]},"n743":{"id":"n743","loc":[-85.635067,41.941652]},"n744":{"id":"n744","loc":[-85.634989,41.941651]},"n745":{"id":"n745","loc":[-85.634921,41.941609]},"n746":{"id":"n746","loc":[-85.634881,41.941544]},"n747":{"id":"n747","loc":[-85.635537,41.940939]},"n748":{"id":"n748","loc":[-85.635573,41.941048]},"n749":{"id":"n749","loc":[-85.635453,41.94091]},"n75":{"id":"n75","loc":[-85.638097,41.942833]},"n750":{"id":"n750","loc":[-85.635319,41.940943]},"n751":{"id":"n751","loc":[-85.637057,41.943224]},"n752":{"id":"n752","loc":[-85.636989,41.943296]},"n753":{"id":"n753","loc":[-85.636851,41.943299]},"n754":{"id":"n754","loc":[-85.636848,41.94322]},"n755":{"id":"n755","loc":[-85.636986,41.943217]},"n756":{"id":"n756","loc":[-85.637569,41.943454]},"n757":{"id":"n757","loc":[-85.637437,41.943458]},"n758":{"id":"n758","loc":[-85.637432,41.943384]},"n759":{"id":"n759","loc":[-85.637564,41.94338]},"n76":{"id":"n76","loc":[-85.638098,41.942912]},"n760":{"id":"n760","loc":[-85.637213,41.943378]},"n761":{"id":"n761","loc":[-85.637217,41.943435]},"n762":{"id":"n762","loc":[-85.637235,41.943434]},"n763":{"id":"n763","loc":[-85.637237,41.943465]},"n764":{"id":"n764","loc":[-85.637424,41.943459]},"n765":{"id":"n765","loc":[-85.637418,41.943371]},"n766":{"id":"n766","loc":[-85.638094,41.943149]},"n767":{"id":"n767","loc":[-85.638096,41.943201]},"n768":{"id":"n768","loc":[-85.638041,41.943202]},"n769":{"id":"n769","loc":[-85.638042,41.943216]},"n77":{"id":"n77","loc":[-85.637705,41.942913]},"n770":{"id":"n770","loc":[-85.637927,41.943218]},"n771":{"id":"n771","loc":[-85.637926,41.943201]},"n772":{"id":"n772","loc":[-85.637897,41.943201]},"n773":{"id":"n773","loc":[-85.637896,41.943155]},"n774":{"id":"n774","loc":[-85.637962,41.943153]},"n775":{"id":"n775","loc":[-85.637962,41.943134]},"n776":{"id":"n776","loc":[-85.638017,41.943132]},"n777":{"id":"n777","loc":[-85.638018,41.943151]},"n778":{"id":"n778","loc":[-85.638045,41.943289]},"n779":{"id":"n779","loc":[-85.638048,41.943363]},"n78":{"id":"n78","loc":[-85.637705,41.942834]},"n780":{"id":"n780","loc":[-85.637842,41.943367]},"n781":{"id":"n781","loc":[-85.637839,41.943296]},"n782":{"id":"n782","loc":[-85.637896,41.943295]},"n783":{"id":"n783","loc":[-85.637897,41.943314]},"n784":{"id":"n784","loc":[-85.637957,41.943312]},"n785":{"id":"n785","loc":[-85.637957,41.943291]},"n786":{"id":"n786","loc":[-85.637816,41.943375]},"n787":{"id":"n787","loc":[-85.637815,41.943416]},"n788":{"id":"n788","loc":[-85.637715,41.943415]},"n789":{"id":"n789","loc":[-85.637716,41.943374]},"n79":{"id":"n79","loc":[-85.638071,41.942298]},"n790":{"id":"n790","loc":[-85.637912,41.943545]},"n791":{"id":"n791","loc":[-85.637909,41.943479]},"n792":{"id":"n792","loc":[-85.637967,41.943477]},"n793":{"id":"n793","loc":[-85.637967,41.94346]},"n794":{"id":"n794","loc":[-85.638077,41.943457]},"n795":{"id":"n795","loc":[-85.638078,41.943473]},"n796":{"id":"n796","loc":[-85.638124,41.943471]},"n797":{"id":"n797","loc":[-85.638126,41.943514]},"n798":{"id":"n798","loc":[-85.638079,41.943515]},"n799":{"id":"n799","loc":[-85.638079,41.943532]},"n8":{"id":"n8","loc":[-85.635241,41.941948]},"n80":{"id":"n80","loc":[-85.638074,41.942431]},"n800":{"id":"n800","loc":[-85.638028,41.943534]},"n801":{"id":"n801","loc":[-85.638028,41.943542]},"n802":{"id":"n802","loc":[-85.638845,41.942983]},"n803":{"id":"n803","loc":[-85.638846,41.94305]},"n804":{"id":"n804","loc":[-85.638661,41.943052]},"n805":{"id":"n805","loc":[-85.63866,41.942984]},"n806":{"id":"n806","loc":[-85.638579,41.942753]},"n807":{"id":"n807","loc":[-85.638445,41.942755]},"n808":{"id":"n808","loc":[-85.638452,41.942978]},"n809":{"id":"n809","loc":[-85.638545,41.942976]},"n81":{"id":"n81","loc":[-85.637836,41.942433]},"n810":{"id":"n810","loc":[-85.638543,41.942935]},"n811":{"id":"n811","loc":[-85.638571,41.942934]},"n812":{"id":"n812","loc":[-85.63857,41.942901]},"n813":{"id":"n813","loc":[-85.638611,41.9429]},"n814":{"id":"n814","loc":[-85.638607,41.942769]},"n815":{"id":"n815","loc":[-85.63858,41.94277]},"n816":{"id":"n816","loc":[-85.638597,41.942614]},"n817":{"id":"n817","loc":[-85.638601,41.94273]},"n818":{"id":"n818","loc":[-85.638686,41.942731]},"n819":{"id":"n819","loc":[-85.638689,41.942917]},"n82":{"id":"n82","loc":[-85.637835,41.94242]},"n820":{"id":"n820","loc":[-85.638558,41.943018]},"n821":{"id":"n821","loc":[-85.638243,41.943019]},"n822":{"id":"n822","loc":[-85.637536,41.943887]},"n823":{"id":"n823","loc":[-85.63749,41.943926]},"n824":{"id":"n824","loc":[-85.63743,41.943886]},"n825":{"id":"n825","loc":[-85.637476,41.943847]},"n826":{"id":"n826","loc":[-85.637527,41.943846]},"n827":{"id":"n827","loc":[-85.637141,41.943728]},"n828":{"id":"n828","loc":[-85.637201,41.943755]},"n829":{"id":"n829","loc":[-85.636987,41.943608]},"n83":{"id":"n83","loc":[-85.63776,41.942421]},"n830":{"id":"n830","loc":[-85.637441,41.943807]},"n831":{"id":"n831","loc":[-85.637673,41.94399]},"n832":{"id":"n832","loc":[-85.637783,41.944137]},"n833":{"id":"n833","loc":[-85.63845,41.944333]},"n834":{"id":"n834","loc":[-85.638159,41.944248]},"n835":{"id":"n835","loc":[-85.637859,41.94416]},"n836":{"id":"n836","loc":[-85.638685,41.944542]},"n837":{"id":"n837","loc":[-85.638714,41.944611]},"n838":{"id":"n838","loc":[-85.638711,41.944757]},"n839":{"id":"n839","loc":[-85.638774,41.945069]},"n84":{"id":"n84","loc":[-85.637758,41.942339]},"n840":{"id":"n840","loc":[-85.638742,41.945205]},"n841":{"id":"n841","loc":[-85.640267,41.942403]},"n842":{"id":"n842","loc":[-85.640154,41.942404]},"n843":{"id":"n843","loc":[-85.640152,41.942249]},"n844":{"id":"n844","loc":[-85.640266,41.942248]},"n845":{"id":"n845","loc":[-85.640366,41.942599]},"n846":{"id":"n846","loc":[-85.640362,41.942192]},"n847":{"id":"n847","loc":[-85.640146,41.942191]},"n848":{"id":"n848","loc":[-85.640122,41.942196]},"n849":{"id":"n849","loc":[-85.640108,41.942211]},"n85":{"id":"n85","loc":[-85.637836,41.942339]},"n850":{"id":"n850","loc":[-85.640101,41.942236]},"n851":{"id":"n851","loc":[-85.640103,41.94241]},"n852":{"id":"n852","loc":[-85.64011,41.942435]},"n853":{"id":"n853","loc":[-85.640126,41.942445]},"n854":{"id":"n854","loc":[-85.640153,41.942451]},"n855":{"id":"n855","loc":[-85.640183,41.942452]},"n856":{"id":"n856","loc":[-85.640364,41.942452]},"n857":{"id":"n857","loc":[-85.640007,41.942452]},"n858":{"id":"n858","loc":[-85.639449,41.942461]},"n859":{"id":"n859","loc":[-85.640049,41.942391]},"n86":{"id":"n86","loc":[-85.637835,41.942301]},"n860":{"id":"n860","loc":[-85.640052,41.942503]},"n861":{"id":"n861","loc":[-85.639575,41.94251]},"n862":{"id":"n862","loc":[-85.639572,41.942398]},"n863":{"id":"n863","loc":[-85.638782,41.942227]},"n864":{"id":"n864","loc":[-85.63843,41.942226]},"n865":{"id":"n865","loc":[-85.63823,41.942183]},"n866":{"id":"n866","loc":[-85.638363,41.942216],"tags":{"barrier":"gate"}},"n867":{"id":"n867","loc":[-85.6384,41.942223]},"n868":{"id":"n868","loc":[-85.636042,41.942797]},"n869":{"id":"n869","loc":[-85.636308,41.942752]},"n87":{"id":"n87","loc":[-85.637566,41.942367]},"n870":{"id":"n870","loc":[-85.636516,41.942729]},"n871":{"id":"n871","loc":[-85.636782,41.942712]},"n872":{"id":"n872","loc":[-85.636944,41.942706]},"n873":{"id":"n873","loc":[-85.63704,41.942706]},"n874":{"id":"n874","loc":[-85.637237,41.942703]},"n875":{"id":"n875","loc":[-85.637553,41.9427]},"n876":{"id":"n876","loc":[-85.638236,41.942697]},"n877":{"id":"n877","loc":[-85.636284,41.942781]},"n878":{"id":"n878","loc":[-85.636551,41.942641]},"n879":{"id":"n879","loc":[-85.633914,41.943693]},"n88":{"id":"n88","loc":[-85.637566,41.94241]},"n880":{"id":"n880","loc":[-85.63389,41.943708]},"n881":{"id":"n881","loc":[-85.633866,41.943686]},"n882":{"id":"n882","loc":[-85.63389,41.943671]},"n883":{"id":"n883","loc":[-85.633857,41.943609]},"n884":{"id":"n884","loc":[-85.634858,41.944474]},"n885":{"id":"n885","loc":[-85.633988,41.943234]},"n886":{"id":"n886","loc":[-85.633999,41.943485]},"n887":{"id":"n887","loc":[-85.634109,41.943449],"tags":{"emergency":"fire_hydrant"}},"n888":{"id":"n888","loc":[-85.635728,41.942655],"tags":{"emergency":"fire_hydrant"}},"n889":{"id":"n889","loc":[-85.636499,41.942845],"tags":{"man_made":"flagpole"}},"n89":{"id":"n89","loc":[-85.637455,41.94241]},"n890":{"id":"n890","loc":[-85.636197,41.943073]},"n891":{"id":"n891","loc":[-85.636227,41.943073]},"n892":{"id":"n892","loc":[-85.637433,41.942933],"tags":{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"restaurant","cuisine":"pizza","name":"Pizza Hut"}},"n893":{"id":"n893","loc":[-85.637907,41.942879],"tags":{"amenity":"car_wash"}},"n894":{"id":"n894","loc":[-85.637661,41.943018]},"n895":{"id":"n895","loc":[-85.636933,41.942733],"tags":{"emergency":"fire_hydrant"}},"n896":{"id":"n896","loc":[-85.637661,41.94304]},"n897":{"id":"n897","loc":[-85.637562,41.943041]},"n898":{"id":"n898","loc":[-85.637556,41.942725]},"n899":{"id":"n899","loc":[-85.637656,41.942724]},"n9":{"id":"n9","loc":[-85.635159,41.941926]},"n90":{"id":"n90","loc":[-85.637454,41.942367]},"n900":{"id":"n900","loc":[-85.637657,41.942779]},"n901":{"id":"n901","loc":[-85.637983,41.942777]},"n902":{"id":"n902","loc":[-85.637982,41.942616]},"n903":{"id":"n903","loc":[-85.637777,41.942778]},"n904":{"id":"n904","loc":[-85.637775,41.942699]},"n905":{"id":"n905","loc":[-85.637772,41.942618]},"n906":{"id":"n906","loc":[-85.637982,41.942698]},"n907":{"id":"n907","loc":[-85.637941,41.942378],"tags":{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Gem Pawnbroker","shop":"pawnbroker"}},"n908":{"id":"n908","loc":[-85.637515,41.942394],"tags":{"second_hand":"only","shop":"car"}},"n909":{"id":"n909","loc":[-85.638743,41.942374],"tags":{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes","shop":"car_repair"}},"n91":{"id":"n91","loc":[-85.637565,41.942341]},"n910":{"id":"n910","loc":[-85.638594,41.942357]},"n911":{"id":"n911","loc":[-85.634312,41.943562],"tags":{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"cafe","cuisine":"coffee_shop","name":"L.A.'s Coffee Cafe","outdoor_seating":"yes"}},"n912":{"id":"n912","loc":[-85.634404,41.943512]},"n913":{"id":"n913","loc":[-85.634391,41.943519],"tags":{"entrance":"yes"}},"n914":{"id":"n914","loc":[-85.634259,41.943538],"tags":{"entrance":"yes"}},"n915":{"id":"n915","loc":[-85.634247,41.943528]},"n916":{"id":"n916","loc":[-85.633747,41.943322],"tags":{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Preferred Insurance Services","office":"insurance"}},"n917":{"id":"n917","loc":[-85.63299,41.943686],"tags":{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lynn's Garage","service:vehicle:tyres":"yes","shop":"car_repair"}},"n918":{"id":"n918","loc":[-85.633438,41.944883]},"n919":{"id":"n919","loc":[-85.633265,41.944983]},"n92":{"id":"n92","loc":[-85.637481,41.942341]},"n920":{"id":"n920","loc":[-85.633315,41.945027]},"n921":{"id":"n921","loc":[-85.633376,41.944827]},"n922":{"id":"n922","loc":[-85.633199,41.944922]},"n923":{"id":"n923","loc":[-85.633316,41.944772]},"n924":{"id":"n924","loc":[-85.633147,41.944867]},"n925":{"id":"n925","loc":[-85.633261,41.944719]},"n926":{"id":"n926","loc":[-85.633096,41.944812]},"n927":{"id":"n927","loc":[-85.633191,41.944645]},"n928":{"id":"n928","loc":[-85.632981,41.94476]},"n929":{"id":"n929","loc":[-85.633062,41.94483]},"n93":{"id":"n93","loc":[-85.637481,41.94226]},"n930":{"id":"n930","loc":[-85.633146,41.944602]},"n931":{"id":"n931","loc":[-85.632969,41.944703]},"n932":{"id":"n932","loc":[-85.633008,41.944745]},"n933":{"id":"n933","loc":[-85.633088,41.944545]},"n934":{"id":"n934","loc":[-85.632868,41.944655]},"n935":{"id":"n935","loc":[-85.632941,41.944718]},"n936":{"id":"n936","loc":[-85.633028,41.944483]},"n937":{"id":"n937","loc":[-85.632817,41.944605]},"n938":{"id":"n938","loc":[-85.632923,41.944373]},"n939":{"id":"n939","loc":[-85.632692,41.944485]},"n94":{"id":"n94","loc":[-85.637565,41.94226]},"n940":{"id":"n940","loc":[-85.632871,41.944316]},"n941":{"id":"n941","loc":[-85.632655,41.944421]},"n942":{"id":"n942","loc":[-85.632711,41.944478]},"n943":{"id":"n943","loc":[-85.632825,41.94426]},"n944":{"id":"n944","loc":[-85.632606,41.944363]},"n945":{"id":"n945","loc":[-85.63275,41.94418]},"n946":{"id":"n946","loc":[-85.632588,41.944256]},"n947":{"id":"n947","loc":[-85.632611,41.944279]},"n948":{"id":"n948","loc":[-85.632548,41.944306]},"n949":{"id":"n949","loc":[-85.632512,41.944406]},"n95":{"id":"n95","loc":[-85.637188,41.942217]},"n950":{"id":"n950","loc":[-85.632565,41.944463]},"n951":{"id":"n951","loc":[-85.632579,41.944456]},"n952":{"id":"n952","loc":[-85.632634,41.944518]},"n953":{"id":"n953","loc":[-85.632686,41.944569]},"n954":{"id":"n954","loc":[-85.632745,41.944537]},"n955":{"id":"n955","loc":[-85.632659,41.944587]},"n956":{"id":"n956","loc":[-85.632778,41.944705]},"n957":{"id":"n957","loc":[-85.632815,41.944301],"tags":{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Access Point Employment","office":"employment_agency"}},"n958":{"id":"n958","loc":[-85.6332,41.944174],"tags":{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paisley Emporium","shop":"second_hand"}},"n959":{"id":"n959","loc":[-85.633578,41.944568],"tags":{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lowry's Books","shop":"books"}},"n96":{"id":"n96","loc":[-85.637189,41.942303]},"n960":{"id":"n960","loc":[-85.63344,41.944443],"tags":{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"restaurant","cuisine":"pizza","name":"Paisano's Bar and Grill"}},"n961":{"id":"n961","loc":[-85.633009,41.944542],"tags":{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"cafe","cuisine":"american","internet_access":"yes","name":"Main Street Cafe"}},"n962":{"id":"n962","loc":[-85.633674,41.944682],"tags":{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Fitness"}},"n963":{"id":"n963","loc":[-85.633376,41.944868],"tags":{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Barbell"}},"n964":{"id":"n964","loc":[-85.633366,41.944783]},"n965":{"id":"n965","loc":[-85.633296,41.94482]},"n966":{"id":"n966","loc":[-85.633214,41.94487]},"n967":{"id":"n967","loc":[-85.633005,41.944988]},"n968":{"id":"n968","loc":[-85.633269,41.944816]},"n969":{"id":"n969","loc":[-85.633215,41.944842]},"n97":{"id":"n97","loc":[-85.637299,41.942302]},"n970":{"id":"n970","loc":[-85.633245,41.944871]},"n971":{"id":"n971","loc":[-85.633296,41.944845]},"n972":{"id":"n972","loc":[-85.633254,41.944845],"tags":{"natural":"tree"}},"n973":{"id":"n973","loc":[-85.633557,41.945515]},"n974":{"id":"n974","loc":[-85.633279,41.945246]},"n975":{"id":"n975","loc":[-85.63324,41.945226]},"n976":{"id":"n976","loc":[-85.6332,41.945213]},"n977":{"id":"n977","loc":[-85.633133,41.945164]},"n978":{"id":"n978","loc":[-85.63312,41.945132]},"n979":{"id":"n979","loc":[-85.633095,41.945081]},"n98":{"id":"n98","loc":[-85.637299,41.942314]},"n980":{"id":"n980","loc":[-85.633064,41.945047]},"n981":{"id":"n981","loc":[-85.632739,41.944742]},"n982":{"id":"n982","loc":[-85.633281,41.945026]},"n983":{"id":"n983","loc":[-85.633155,41.944903]},"n984":{"id":"n984","loc":[-85.633079,41.944829]},"n985":{"id":"n985","loc":[-85.63304,41.944853]},"n986":{"id":"n986","loc":[-85.632949,41.944776]},"n987":{"id":"n987","loc":[-85.632921,41.944725]},"n988":{"id":"n988","loc":[-85.632859,41.944673]},"n989":{"id":"n989","loc":[-85.632895,41.94505]},"n99":{"id":"n99","loc":[-85.637396,41.942313]},"n990":{"id":"n990","loc":[-85.633336,41.945138]},"n991":{"id":"n991","loc":[-85.633466,41.945265]},"n992":{"id":"n992","loc":[-85.633367,41.945327]},"n993":{"id":"n993","loc":[-85.633163,41.945189]},"n994":{"id":"n994","loc":[-85.633678,41.945309]},"n995":{"id":"n995","loc":[-85.633619,41.945261]},"n996":{"id":"n996","loc":[-85.63355,41.945301]},"n997":{"id":"n997","loc":[-85.633607,41.945352]},"n998":{"id":"n998","loc":[-85.633579,41.945327],"tags":{"entrance":"yes"}},"n999":{"id":"n999","loc":[-85.633445,41.945404]},"r2":{"id":"r2","members":[{"id":"w225","role":"outer","type":"way"}],"tags":{"type":"multipolygon","waterway":"riverbank"}},"r5":{"id":"r5","members":[{"id":"w642","role":"outer","type":"way"}],"tags":{"admin_level":"8","border_type":"city","boundary":"administrative","name":"Three Rivers","place":"city","type":"boundary"}},"w1":{"id":"w1","nodes":["n5","n1797"],"tags":{"highway":"residential","name":"12th Avenue"}},"w10":{"id":"w10","nodes":["n54","n55","n56","n57","n891","n890","n54"],"tags":{"building":"yes"}},"w100":{"id":"w100","nodes":["n451","n915","n452"],"tags":{"highway":"footway"}},"w101":{"id":"w101","nodes":["n461","n462","n463","n464","n465","n466"],"tags":{"barrier":"fence"}},"w102":{"id":"w102","nodes":["n467","n468","n469","n470","n472","n467"],"tags":{"amenity":"parking"}},"w103":{"id":"w103","nodes":["n2597","n2444","n471","n472"],"tags":{"highway":"footway"}},"w104":{"id":"w104","nodes":["n473","n474","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w105":{"id":"w105","nodes":["n475","n324","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w106":{"id":"w106","nodes":["n886","n452","n476"],"tags":{"footway":"sidewalk","highway":"footway"}},"w107":{"id":"w107","nodes":["n485","n4678","n486","n18"],"tags":{"highway":"service"}},"w108":{"id":"w108","nodes":["n300","n487","n488","n489","n490"],"tags":{"highway":"footway"}},"w109":{"id":"w109","nodes":["n490","n491"],"tags":{"highway":"footway"}},"w11":{"id":"w11","nodes":["n58","n63","n59","n315","n60"],"tags":{"highway":"service"}},"w110":{"id":"w110","nodes":["n492","n493","n494","n495","n496","n497","n492"],"tags":{"building":"yes"}},"w111":{"id":"w111","nodes":["n498","n499","n511"],"tags":{"highway":"service"}},"w112":{"id":"w112","nodes":["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],"tags":{"highway":"service"}},"w113":{"id":"w113","nodes":["n511","n510"],"tags":{"covered":"yes","highway":"service"}},"w114":{"id":"w114","nodes":["n512","n513","n514","n515","n512"],"tags":{"building":"yes"}},"w115":{"id":"w115","nodes":["n516","n517","n518","n519","n516"],"tags":{"building":"yes"}},"w116":{"id":"w116","nodes":["n520","n521","n522","n523","n520"],"tags":{"building":"yes"}},"w117":{"id":"w117","nodes":["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],"tags":{"building":"yes"}},"w118":{"id":"w118","nodes":["n536","n537","n538","n539","n536"],"tags":{"building":"yes"}},"w119":{"id":"w119","nodes":["n540","n541","n542","n543","n544","n545","n546","n547","n540"],"tags":{"building":"yes"}},"w12":{"id":"w12","nodes":["n61","n314","n70","n62","n63"],"tags":{"highway":"service"}},"w120":{"id":"w120","nodes":["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],"tags":{"building":"yes"}},"w121":{"id":"w121","nodes":["n558","n559","n560","n561","n562","n563","n564","n565","n558"],"tags":{"building":"yes"}},"w122":{"id":"w122","nodes":["n566","n567","n568","n569","n566"],"tags":{"building":"yes"}},"w123":{"id":"w123","nodes":["n570","n571","n572","n573","n570"],"tags":{"building":"yes"}},"w124":{"id":"w124","nodes":["n574","n575","n576","n577","n574"],"tags":{"building":"yes"}},"w125":{"id":"w125","nodes":["n578","n579","n580","n581","n578"],"tags":{"building":"yes"}},"w126":{"id":"w126","nodes":["n582","n583","n584","n585","n582"],"tags":{"building":"yes"}},"w127":{"id":"w127","nodes":["n586","n587","n588","n589","n590","n591","n592","n593","n586"],"tags":{"building":"yes"}},"w128":{"id":"w128","nodes":["n594","n595","n596","n597","n598","n599","n600","n601","n594"],"tags":{"building":"yes"}},"w129":{"id":"w129","nodes":["n309","n602","n603"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w13":{"id":"w13","nodes":["n64","n65","n66","n67","n68","n69","n64"],"tags":{"amenity":"parking"}},"w130":{"id":"w130","nodes":["n603","n604"],"tags":{"footway":"sidewalk","highway":"footway"}},"w131":{"id":"w131","nodes":["n604","n605","n606"],"tags":{"footway":"sidewalk","highway":"footway"}},"w132":{"id":"w132","nodes":["n606","n607"],"tags":{"footway":"sidewalk","highway":"footway"}},"w133":{"id":"w133","nodes":["n607","n610","n608","n603"],"tags":{"footway":"sidewalk","highway":"footway"}},"w134":{"id":"w134","nodes":["n609","n610","n611"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w135":{"id":"w135","nodes":["n244","n245","n246"],"tags":{"highway":"service"}},"w136":{"id":"w136","nodes":["n612","n613","n614","n615","n612"],"tags":{"amenity":"shelter"}},"w137":{"id":"w137","nodes":["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],"tags":{"highway":"residential","name":"Foster Street"}},"w138":{"id":"w138","nodes":["n2779","n625","n626","n627"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w139":{"id":"w139","nodes":["n630","n631","n632","n2437"],"tags":{"highway":"service"}},"w14":{"id":"w14","nodes":["n71","n72","n73","n74","n71"],"tags":{"building":"yes"}},"w140":{"id":"w140","nodes":["n643","n637","n715","n2410"],"tags":{"highway":"footway","name":"Mural Mall"}},"w141":{"id":"w141","nodes":["n639","n2516"],"tags":{"barrier":"wall"}},"w142":{"id":"w142","nodes":["n640","n641","n645","n642","n660","n643","n644"],"tags":{"highway":"service"}},"w143":{"id":"w143","nodes":["n646","n647"],"tags":{"highway":"service"}},"w144":{"id":"w144","nodes":["n654","n655","n656"],"tags":{"barrier":"wall"}},"w145":{"id":"w145","nodes":["n665","n666","n667"],"tags":{"barrier":"wall"}},"w146":{"id":"w146","nodes":["n2727","n662","n2719"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w147":{"id":"w147","nodes":["n2725","n674"],"tags":{"highway":"service","oneway":"yes"}},"w148":{"id":"w148","nodes":["n2464","n2460","n2454","n684","n2455","n2464"],"tags":{"building":"yes"}},"w149":{"id":"w149","nodes":["n2456","n685","n686","n687","n2456"],"tags":{"building":"yes"}},"w15":{"id":"w15","nodes":["n75","n76","n77","n78","n75"],"tags":{"building":"yes"}},"w150":{"id":"w150","nodes":["n685","n688","n689","n690","n691","n692","n686","n685"],"tags":{"building":"yes"}},"w151":{"id":"w151","nodes":["n688","n693","n694","n689","n688"],"tags":{"building":"yes"}},"w152":{"id":"w152","nodes":["n693","n695","n702","n696","n697","n694","n693"],"tags":{"building":"yes"}},"w153":{"id":"w153","nodes":["n695","n698","n699","n700","n701","n702","n695"],"tags":{"building":"yes"}},"w154":{"id":"w154","nodes":["n698","n703","n707","n704","n699","n698"],"tags":{"building":"yes"}},"w155":{"id":"w155","nodes":["n703","n705","n706","n707","n703"],"tags":{"building":"yes"}},"w156":{"id":"w156","nodes":["n705","n708","n709","n706","n705"],"tags":{"building":"yes"}},"w157":{"id":"w157","nodes":["n709","n710","n711","n708","n709"],"tags":{"building":"yes"}},"w158":{"id":"w158","nodes":["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w159":{"id":"w159","nodes":["n714","n720","n721"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w16":{"id":"w16","nodes":["n79","n80","n81","n82","n83","n84","n85","n86","n79"],"tags":{"building":"yes"}},"w160":{"id":"w160","nodes":["n729","n721","n722","n964","n723","n724"],"tags":{"footway":"sidewalk","highway":"footway"}},"w161":{"id":"w161","nodes":["n713","n726","n722"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w164":{"id":"w164","nodes":["n365","n732","n733","n738"],"tags":{"footway":"sidewalk","highway":"footway"}},"w165":{"id":"w165","nodes":["n724","n734","n367","n735","n736","n737"],"tags":{"footway":"sidewalk","highway":"footway"}},"w166":{"id":"w166","nodes":["n739","n2037","n2038","n2039","n2040","n1623","n2032"],"tags":{"highway":"footway"}},"w167":{"id":"w167","nodes":["n150","n751"],"tags":{"highway":"service"}},"w168":{"id":"w168","nodes":["n752","n753","n754","n755","n752"],"tags":{"building":"yes"}},"w169":{"id":"w169","nodes":["n756","n757","n758","n759","n756"],"tags":{"building":"yes"}},"w17":{"id":"w17","nodes":["n87","n88","n89","n90","n87"],"tags":{"building":"yes"}},"w170":{"id":"w170","nodes":["n760","n761","n762","n763","n764","n765","n760"],"tags":{"building":"yes"}},"w171":{"id":"w171","nodes":["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],"tags":{"building":"yes"}},"w172":{"id":"w172","nodes":["n778","n779","n780","n781","n782","n783","n784","n785","n778"],"tags":{"building":"yes"}},"w173":{"id":"w173","nodes":["n786","n787","n788","n789","n786"],"tags":{"building":"yes"}},"w174":{"id":"w174","nodes":["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],"tags":{"building":"yes"}},"w175":{"id":"w175","nodes":["n802","n803","n804","n805","n802"],"tags":{"building":"yes"}},"w176":{"id":"w176","nodes":["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],"tags":{"building":"yes"}},"w177":{"id":"w177","nodes":["n816","n1140","n817","n818","n819","n820","n821"],"tags":{"highway":"service"}},"w178":{"id":"w178","nodes":["n822","n823","n824","n825","n822"],"tags":{"building":"yes"}},"w179":{"id":"w179","nodes":["n841","n842","n843","n844","n841"],"tags":{"building":"yes"}},"w18":{"id":"w18","nodes":["n91","n92","n93","n94","n91"],"tags":{"building":"yes"}},"w180":{"id":"w180","nodes":["n845","n856","n846"],"tags":{"highway":"service"}},"w181":{"id":"w181","nodes":["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],"tags":{"highway":"service","oneway":"yes","service":"drive-through"}},"w182":{"id":"w182","nodes":["n857","n858"],"tags":{"highway":"service"}},"w183":{"id":"w183","nodes":["n859","n860","n861","n862","n859"],"tags":{"amenity":"parking"}},"w184":{"id":"w184","nodes":["n863","n864","n867","n866","n865"],"tags":{"highway":"service"}},"w185":{"id":"w185","nodes":["n883","n884"],"tags":{"barrier":"fence"}},"w186":{"id":"w186","nodes":["n1954","n622","n1955"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w187":{"id":"w187","nodes":["n621","n1954"],"tags":{"highway":"steps","incline":"up","name":"Riverwalk Trail","surface":"wood"}},"w188":{"id":"w188","nodes":["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"wood"}},"w189":{"id":"w189","nodes":["n2273","n2274"],"tags":{"highway":"steps","incline":"down","name":"Riverwalk Trail","surface":"wood"}},"w19":{"id":"w19","nodes":["n95","n96","n97","n98","n99","n100","n101","n102","n95"],"tags":{"building":"yes"}},"w190":{"id":"w190","nodes":["n821","n894","n900","n903","n901"],"tags":{"highway":"service"}},"w191":{"id":"w191","nodes":["n896","n897","n898","n899","n900","n894","n896"],"tags":{"amenity":"parking"}},"w192":{"id":"w192","nodes":["n903","n904","n905"],"tags":{"highway":"service"}},"w193":{"id":"w193","nodes":["n901","n906","n902"],"tags":{"highway":"service"}},"w194":{"id":"w194","nodes":["n912","n913"],"tags":{"highway":"footway"}},"w195":{"id":"w195","nodes":["n914","n915"],"tags":{"highway":"footway"}},"w196":{"id":"w196","nodes":["n2466","n918","n919","n920","n2466"],"tags":{"building":"yes"}},"w197":{"id":"w197","nodes":["n918","n921","n922","n919","n918"],"tags":{"building":"yes"}},"w198":{"id":"w198","nodes":["n923","n925","n926","n924","n923"],"tags":{"building":"yes"}},"w199":{"id":"w199","nodes":["n925","n927","n932","n928","n929","n926","n925"],"tags":{"building":"yes"}},"w2":{"id":"w2","nodes":["n3523","n2182","n2160"],"tags":{"highway":"service"}},"w20":{"id":"w20","nodes":["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],"tags":{"building":"yes"}},"w200":{"id":"w200","nodes":["n927","n930","n931","n932","n927"],"tags":{"building":"yes"}},"w201":{"id":"w201","nodes":["n930","n933","n934","n935","n931","n930"],"tags":{"building":"yes"}},"w202":{"id":"w202","nodes":["n933","n936","n937","n934","n933"],"tags":{"building":"yes"}},"w203":{"id":"w203","nodes":["n936","n938","n942","n939","n954","n937","n936"],"tags":{"building":"yes"}},"w204":{"id":"w204","nodes":["n938","n940","n941","n942","n938"],"tags":{"building":"yes"}},"w205":{"id":"w205","nodes":["n940","n943","n944","n941","n940"],"tags":{"building":"yes"}},"w206":{"id":"w206","nodes":["n943","n945","n946","n947","n948","n944","n943"],"tags":{"building":"yes"}},"w207":{"id":"w207","nodes":["n944","n949","n950","n951","n941","n944"],"tags":{"building":"yes"}},"w208":{"id":"w208","nodes":["n941","n951","n952","n939","n942","n941"],"tags":{"building":"yes"}},"w209":{"id":"w209","nodes":["n952","n953","n954","n939","n952"],"tags":{"building":"yes"}},"w21":{"id":"w21","nodes":["n115","n116","n117","n118","n115"],"tags":{"building":"yes"}},"w210":{"id":"w210","nodes":["n953","n955","n956","n934","n937","n954","n953"],"tags":{"building":"yes"}},"w211":{"id":"w211","nodes":["n964","n965"],"tags":{"highway":"footway"}},"w212":{"id":"w212","nodes":["n966","n983","n967","n989"],"tags":{"highway":"footway"}},"w213":{"id":"w213","nodes":["n965","n968","n969","n966","n970","n971","n965"],"tags":{"highway":"footway"}},"w214":{"id":"w214","nodes":["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],"tags":{"footway":"sidewalk","highway":"footway"}},"w215":{"id":"w215","nodes":["n978","n982","n983","n984","n985","n986","n987","n988","n981"],"tags":{"highway":"footway"}},"w216":{"id":"w216","nodes":["n976","n990","n991","n992"],"tags":{"highway":"footway"}},"w217":{"id":"w217","nodes":["n998","n999"],"tags":{"highway":"footway"}},"w218":{"id":"w218","nodes":["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],"tags":{"footway":"sidewalk","highway":"footway"}},"w219":{"id":"w219","nodes":["n719","n1026","n1027"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w22":{"id":"w22","nodes":["n119","n120","n121","n122","n119"],"tags":{"building":"yes"}},"w220":{"id":"w220","nodes":["n1027","n1028","n1019"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w221":{"id":"w221","nodes":["n2080","n1828","n1863","n1829"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w222":{"id":"w222","nodes":["n1029","n1030","n1031"],"tags":{"highway":"service"}},"w223":{"id":"w223","nodes":["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],"tags":{"name":"Rocky River","waterway":"river"}},"w224":{"id":"w224","nodes":["n3750","n3751","n3752"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w225":{"id":"w225","nodes":["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},"w226":{"id":"w226","nodes":["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w227":{"id":"w227","nodes":["n2994","n3012","n3011","n2958"],"tags":{"highway":"secondary","name":"Main Street"}},"w228":{"id":"w228","nodes":["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],"tags":{"highway":"primary","name":"Main Street"}},"w229":{"id":"w229","nodes":["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w23":{"id":"w23","nodes":["n123","n124","n125","n126","n123"],"tags":{"building":"yes"}},"w230":{"id":"w230","nodes":["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],"tags":{"name":"Saint Joseph River","waterway":"river"}},"w231":{"id":"w231","nodes":["n456","n1036","n1037","n1038"],"tags":{"barrier":"wall"}},"w232":{"id":"w232","nodes":["n1034","n1039","n1040"],"tags":{"barrier":"wall"}},"w233":{"id":"w233","nodes":["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],"tags":{"access":"private","leisure":"swimming_pool"}},"w234":{"id":"w234","nodes":["n1047","n1048"],"tags":{"barrier":"hedge"}},"w235":{"id":"w235","nodes":["n1049","n1050","n1051","n1052","n1049"],"tags":{"building":"yes"}},"w236":{"id":"w236","nodes":["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],"tags":{"building":"yes"}},"w237":{"id":"w237","nodes":["n1061","n1062","n1063","n1064","n1065","n1061"],"tags":{"building":"yes"}},"w238":{"id":"w238","nodes":["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],"tags":{"building":"yes"}},"w239":{"id":"w239","nodes":["n1072","n1073","n1074","n1075","n1072"],"tags":{"building":"yes"}},"w24":{"id":"w24","nodes":["n127","n128","n129","n130","n127"],"tags":{"building":"yes"}},"w240":{"id":"w240","nodes":["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],"tags":{"building":"yes"}},"w241":{"id":"w241","nodes":["n1082","n1083","n1084","n1085","n1082"],"tags":{"building":"yes"}},"w242":{"id":"w242","nodes":["n1086","n1087","n1088","n1089","n1086"],"tags":{"building":"yes"}},"w243":{"id":"w243","nodes":["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],"tags":{"building":"yes"}},"w244":{"id":"w244","nodes":["n1098","n1099","n1100","n1101"],"tags":{"barrier":"fence"}},"w245":{"id":"w245","nodes":["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],"tags":{"highway":"service"}},"w246":{"id":"w246","nodes":["n1103","n1139","n1104"],"tags":{"barrier":"fence"}},"w247":{"id":"w247","nodes":["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],"tags":{"building":"yes"}},"w248":{"id":"w248","nodes":["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],"tags":{"building":"yes"}},"w249":{"id":"w249","nodes":["n1121","n1122","n1123","n1124","n1121"],"tags":{"building":"yes"}},"w25":{"id":"w25","nodes":["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],"tags":{"building":"yes"}},"w250":{"id":"w250","nodes":["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],"tags":{"building":"yes"}},"w251":{"id":"w251","nodes":["n1137","n1138","n1139"],"tags":{"barrier":"fence"}},"w252":{"id":"w252","nodes":["n876","n1140","n1141"],"tags":{"footway":"sidewalk","highway":"footway"}},"w253":{"id":"w253","nodes":["n1141","n1142","n1143","n1144","n1145","n1146"],"tags":{"footway":"sidewalk","highway":"footway"}},"w254":{"id":"w254","nodes":["n1146","n4743","n1147","n1148"],"tags":{"footway":"sidewalk","highway":"footway"}},"w255":{"id":"w255","nodes":["n1148","n1149","n1150","n1151"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w256":{"id":"w256","nodes":["n1151","n1153","n1154","n1155"],"tags":{"footway":"sidewalk","highway":"footway"}},"w257":{"id":"w257","nodes":["n1155","n1156"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w258":{"id":"w258","nodes":["n1157","n1158"],"tags":{"barrier":"retaining_wall"}},"w259":{"id":"w259","nodes":["n1156","n1161","n1159","n1160","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w26":{"id":"w26","nodes":["n143","n608","n144"],"tags":{"highway":"service"}},"w260":{"id":"w260","nodes":["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],"tags":{"highway":"footway"}},"w261":{"id":"w261","nodes":["n1171","n1172","n1173"],"tags":{"barrier":"wall"}},"w262":{"id":"w262","nodes":["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],"tags":{"natural":"wood"}},"w263":{"id":"w263","nodes":["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w264":{"id":"w264","nodes":["n1186","n1187","n1188","n1189","n1186"],"tags":{"building":"yes"}},"w265":{"id":"w265","nodes":["n1190","n1191","n1192","n1193","n1190"],"tags":{"building":"yes"}},"w266":{"id":"w266","nodes":["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],"tags":{"building":"yes"}},"w267":{"id":"w267","nodes":["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],"tags":{"building":"house"}},"w268":{"id":"w268","nodes":["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],"tags":{"building":"house"}},"w269":{"id":"w269","nodes":["n1221","n1225","n1222","n1223","n1224","n1221"],"tags":{"building":"house"}},"w27":{"id":"w27","nodes":["n145","n147","n146"],"tags":{"highway":"footway"}},"w270":{"id":"w270","nodes":["n1225","n1226","n1227","n1229","n1228"],"tags":{"barrier":"fence"}},"w271":{"id":"w271","nodes":["n1229","n1230"],"tags":{"barrier":"fence"}},"w272":{"id":"w272","nodes":["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],"tags":{"building":"house"}},"w273":{"id":"w273","nodes":["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],"tags":{"building":"house"}},"w274":{"id":"w274","nodes":["n1247","n1248","n1249","n1250","n1247"],"tags":{"building":"house"}},"w275":{"id":"w275","nodes":["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],"tags":{"building":"house"}},"w276":{"id":"w276","nodes":["n1257","n1258","n1259","n1260","n1257"],"tags":{"building":"shed"}},"w277":{"id":"w277","nodes":["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],"tags":{"building":"house"}},"w278":{"id":"w278","nodes":["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],"tags":{"building":"house"}},"w279":{"id":"w279","nodes":["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],"tags":{"building":"house"}},"w28":{"id":"w28","nodes":["n147","n148"],"tags":{"highway":"footway"}},"w280":{"id":"w280","nodes":["n1281","n1282","n1283","n1284"],"tags":{"barrier":"fence"}},"w281":{"id":"w281","nodes":["n1285","n1286","n1287","n1288","n1285"],"tags":{"building":"house"}},"w282":{"id":"w282","nodes":["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],"tags":{"building":"house"}},"w283":{"id":"w283","nodes":["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],"tags":{"access":"private","leisure":"swimming_pool"}},"w284":{"id":"w284","nodes":["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],"tags":{"building":"house"}},"w285":{"id":"w285","nodes":["n1313","n1314","n1315","n1316","n1313"],"tags":{"building":"house"}},"w286":{"id":"w286","nodes":["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],"tags":{"building":"house"}},"w287":{"id":"w287","nodes":["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],"tags":{"building":"yes"}},"w288":{"id":"w288","nodes":["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],"tags":{"access":"private","leisure":"swimming_pool"}},"w289":{"id":"w289","nodes":["n1356","n1331"],"tags":{"barrier":"fence"}},"w29":{"id":"w29","nodes":["n149","n874","n150","n151","n897","n898","n875","n152"],"tags":{"highway":"service","oneway":"yes"}},"w290":{"id":"w290","nodes":["n1357","n1358","n1359","n1360","n1357"],"tags":{"building":"shed"}},"w291":{"id":"w291","nodes":["n1358","n1361","n1362"],"tags":{"barrier":"fence"}},"w292":{"id":"w292","nodes":["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],"tags":{"building":"house"}},"w293":{"id":"w293","nodes":["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],"tags":{"leisure":"swimming_pool"}},"w294":{"id":"w294","nodes":["n1367","n1375","n1376","n1377"],"tags":{"barrier":"fence"}},"w295":{"id":"w295","nodes":["n1378","n1379","n1380","n1381","n1378"],"tags":{"building":"house"}},"w296":{"id":"w296","nodes":["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],"tags":{"building":"house"}},"w297":{"id":"w297","nodes":["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],"tags":{"building":"house"}},"w298":{"id":"w298","nodes":["n1394","n1395","n1396","n1397","n1394"],"tags":{"building":"house"}},"w299":{"id":"w299","nodes":["n1398","n1399","n1400","n1401","n1398"],"tags":{"access":"private3","leisure":"swimming_pool"}},"w3":{"id":"w3","nodes":["n1","n2"],"tags":{"highway":"track","name":"Water Street"}},"w30":{"id":"w30","nodes":["n153","n154","n155","n156","n153"],"tags":{"amenity":"parking"}},"w300":{"id":"w300","nodes":["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],"tags":{"building":"house"}},"w301":{"id":"w301","nodes":["n1414","n1415","n1416","n1417","n1414"],"tags":{"building":"garage"}},"w302":{"id":"w302","nodes":["n1406","n1418","n1419","n1403"],"tags":{"barrier":"fence"}},"w303":{"id":"w303","nodes":["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],"tags":{"building":"house"}},"w304":{"id":"w304","nodes":["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],"tags":{"access":"private","leisure":"swimming_pool"}},"w305":{"id":"w305","nodes":["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],"tags":{"building":"house"}},"w306":{"id":"w306","nodes":["n1455","n1456","n1457","n1458","n1455"],"tags":{"building":"shed"}},"w307":{"id":"w307","nodes":["n1459","n1460","n1461","n1462","n1459"],"tags":{"building":"shed"}},"w308":{"id":"w308","nodes":["n1463","n1464"],"tags":{"barrier":"fence"}},"w309":{"id":"w309","nodes":["n1465","n1466","n1467","n1468"],"tags":{"barrier":"fence"}},"w31":{"id":"w31","nodes":["n157","n605","n158"],"tags":{"highway":"service"}},"w310":{"id":"w310","nodes":["n1469","n1481","n1463"],"tags":{"barrier":"hedge"}},"w311":{"id":"w311","nodes":["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],"tags":{"building":"house"}},"w312":{"id":"w312","nodes":["n1480","n1481"],"tags":{"barrier":"wall"}},"w313":{"id":"w313","nodes":["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],"tags":{"access":"private","leisure":"swimming_pool"}},"w314":{"id":"w314","nodes":["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],"tags":{"building":"house"}},"w315":{"id":"w315","nodes":["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],"tags":{"building":"house"}},"w316":{"id":"w316","nodes":["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],"tags":{"building":"house"}},"w317":{"id":"w317","nodes":["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],"tags":{"building":"house"}},"w318":{"id":"w318","nodes":["n1532","n1533"],"tags":{"barrier":"fence"}},"w319":{"id":"w319","nodes":["n1534","n1532","n1535"],"tags":{"barrier":"fence"}},"w32":{"id":"w32","nodes":["n159","n160","n161","n162","n159"],"tags":{"amenity":"parking"}},"w320":{"id":"w320","nodes":["n1536","n1537","n1538","n1539","n1536"],"tags":{"building":"shed"}},"w321":{"id":"w321","nodes":["n1540","n1541","n1542","n1543","n1540"],"tags":{"building":"shed"}},"w322":{"id":"w322","nodes":["n1544","n1545","n1546","n1547","n1544"],"tags":{"building":"shed"}},"w323":{"id":"w323","nodes":["n1548","n1549","n1550","n1551","n1548"],"tags":{"building":"house"}},"w324":{"id":"w324","nodes":["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],"tags":{"building":"house"}},"w325":{"id":"w325","nodes":["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],"tags":{"building":"house"}},"w326":{"id":"w326","nodes":["n1561","n1568","n1569","n1570"],"tags":{"barrier":"wall"}},"w327":{"id":"w327","nodes":["n1571","n1572"],"tags":{"barrier":"fence"}},"w328":{"id":"w328","nodes":["n1573","n1574","n1575","n1576","n1573"],"tags":{"building":"house"}},"w329":{"id":"w329","nodes":["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],"tags":{"building":"house"}},"w33":{"id":"w33","nodes":["n157","n163"],"tags":{"highway":"service"}},"w330":{"id":"w330","nodes":["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],"tags":{"building":"house"}},"w331":{"id":"w331","nodes":["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],"tags":{"access":"private","leisure":"swimming_pool"}},"w332":{"id":"w332","nodes":["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],"tags":{"building":"house"}},"w333":{"id":"w333","nodes":["n2018","n1626","n1627","n2017","n2018"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w334":{"id":"w334","nodes":["n2","n3","n2764"],"tags":{"highway":"service","name":"Water Street"}},"w335":{"id":"w335","nodes":["n3","n1628","n1614"],"tags":{"highway":"service"}},"w336":{"id":"w336","nodes":["n3198","n4545","n2747"],"tags":{"highway":"residential","name":"Morris Avenue"}},"w337":{"id":"w337","nodes":["n1629","n3504"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w338":{"id":"w338","nodes":["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],"tags":{"highway":"service","service":"parking_aisle"}},"w339":{"id":"w339","nodes":["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],"tags":{"highway":"residential","name":"Millard Street"}},"w34":{"id":"w34","nodes":["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],"tags":{"amenity":"parking"}},"w340":{"id":"w340","nodes":["n1824","n1825"],"tags":{"highway":"service","service":"parking_aisle"}},"w341":{"id":"w341","nodes":["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],"tags":{"building":"yes"}},"w342":{"id":"w342","nodes":["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],"tags":{"amenity":"parking","fee":"no"}},"w343":{"id":"w343","nodes":["n1757","n1758","n1759","n1760","n1757"],"tags":{"building":"yes"}},"w344":{"id":"w344","nodes":["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],"tags":{"building":"school"}},"w345":{"id":"w345","nodes":["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],"tags":{"building":"yes"}},"w346":{"id":"w346","nodes":["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],"tags":{"highway":"residential","name":"Douglas Avenue"}},"w347":{"id":"w347","nodes":["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w348":{"id":"w348","nodes":["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],"tags":{"leisure":"playground"}},"w349":{"id":"w349","nodes":["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],"tags":{"highway":"service"}},"w35":{"id":"w35","nodes":["n168","n167","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w350":{"id":"w350","nodes":["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],"tags":{"amenity":"parking"}},"w351":{"id":"w351","nodes":["n1717","n1718","n1719","n1720","n1717"],"tags":{"building":"yes"}},"w352":{"id":"w352","nodes":["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],"tags":{"building":"yes"}},"w353":{"id":"w353","nodes":["n1637","n1636","n1029","n4715","n1630"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w354":{"id":"w354","nodes":["n1713","n1714","n1715","n1716","n1713"],"tags":{"building":"yes"}},"w355":{"id":"w355","nodes":["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],"tags":{"building":"yes"}},"w356":{"id":"w356","nodes":["n1631","n4717","n1840","n4745","n1841"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w357":{"id":"w357","nodes":["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],"tags":{"building":"yes"}},"w358":{"id":"w358","nodes":["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],"tags":{"building":"yes"}},"w359":{"id":"w359","nodes":["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],"tags":{"highway":"residential","name":"South Street"}},"w36":{"id":"w36","nodes":["n910","n171","n866","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w360":{"id":"w360","nodes":["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],"tags":{"building":"yes"}},"w361":{"id":"w361","nodes":["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],"tags":{"highway":"service"}},"w362":{"id":"w362","nodes":["n1639","n1683","n4710","n1633"],"tags":{"highway":"residential","name":"South Street","oneway":"yes"}},"w363":{"id":"w363","nodes":["n1646","n1647","n1648","n1649","n1646"],"tags":{"leisure":"pitch","pitch":"basketball"}},"w364":{"id":"w364","nodes":["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],"tags":{"amenity":"school","name":"Three Rivers Middle School"}},"w365":{"id":"w365","nodes":["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],"tags":{"building":"yes"}},"w366":{"id":"w366","nodes":["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],"tags":{"amenity":"parking"}},"w367":{"id":"w367","nodes":["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],"tags":{"highway":"residential","name":"Grant Avenue"}},"w368":{"id":"w368","nodes":["n1853","n1687","n1688","n1854","n1853"],"tags":{"amenity":"library","building":"yes","name":"Three Rivers Public Library"}},"w369":{"id":"w369","nodes":["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],"tags":{"amenity":"parking"}},"w37":{"id":"w37","nodes":["n173","n174","n175","n176","n177","n178","n179","n180","n173"],"tags":{"building":"yes"}},"w370":{"id":"w370","nodes":["n1645","n1638","n858","n4718","n1631"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w371":{"id":"w371","nodes":["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],"tags":{"amenity":"school","name":"Three Rivers High School"}},"w372":{"id":"w372","nodes":["n1697","n1698","n1699","n1700","n1697"],"tags":{"building":"yes"}},"w373":{"id":"w373","nodes":["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],"tags":{"amenity":"parking"}},"w374":{"id":"w374","nodes":["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],"tags":{"building":"yes"}},"w375":{"id":"w375","nodes":["n1822","n1823"],"tags":{"highway":"service","service":"parking_aisle"}},"w376":{"id":"w376","nodes":["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],"tags":{"amenity":"parking"}},"w377":{"id":"w377","nodes":["n1676","n1675","n1674","n1673"],"tags":{"highway":"service","oneway":"yes"}},"w378":{"id":"w378","nodes":["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],"tags":{"amenity":"school","name":"Andrews Elementary School"}},"w379":{"id":"w379","nodes":["n1630","n4714","n1847","n4750","n1844"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w38":{"id":"w38","nodes":["n181","n182","n183","n185","n184","n181"],"tags":{"building":"yes"}},"w380":{"id":"w380","nodes":["n1683","n3745","n1686","n1633"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w381":{"id":"w381","nodes":["n2022","n2037"],"tags":{"highway":"footway"}},"w382":{"id":"w382","nodes":["n1826","n1863"],"tags":{"highway":"residential"}},"w383":{"id":"w383","nodes":["n2011","n2012","n739","n2013","n2014","n2029","n2011"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w384":{"id":"w384","nodes":["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],"tags":{"building":"yes"}},"w385":{"id":"w385","nodes":["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],"tags":{"natural":"water"}},"w386":{"id":"w386","nodes":["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],"tags":{"highway":"service"}},"w387":{"id":"w387","nodes":["n1846","n1843","n865","n157","n4721","n1831"],"tags":{"highway":"residential","name":"Andrews Street"}},"w388":{"id":"w388","nodes":["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],"tags":{"highway":"footway"}},"w389":{"id":"w389","nodes":["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],"tags":{"name":"Rocky River","waterway":"river"}},"w39":{"id":"w39","nodes":["n185","n186","n187"],"tags":{"barrier":"fence"}},"w390":{"id":"w390","nodes":["n2050","n2051","n2052","n2053","n2050"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w391":{"id":"w391","nodes":["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],"tags":{"highway":"residential","name":"Constantine Street"}},"w392":{"id":"w392","nodes":["n1869","n212","n436","n2281","n2081"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w393":{"id":"w393","nodes":["n1829","n611","n144","n4694","n602","n1832"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w394":{"id":"w394","nodes":["n1997","n1998","n2000","n1999"],"tags":{"highway":"service","service":"parking_aisle"}},"w395":{"id":"w395","nodes":["n1835","n1869"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w396":{"id":"w396","nodes":["n2000","n2001"],"tags":{"highway":"service","service":"parking_aisle"}},"w397":{"id":"w397","nodes":["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],"tags":{"highway":"residential","name":"Spring Street"}},"w398":{"id":"w398","nodes":["n2015","n2016","n2017","n2018","n2015"],"tags":{"building":"yes"}},"w399":{"id":"w399","nodes":["n2062","n45","n2063","n877","n41","n1852"],"tags":{"highway":"service"}},"w4":{"id":"w4","nodes":["n7","n38","n378","n379","n7"],"tags":{"building":"yes"}},"w40":{"id":"w40","nodes":["n188","n189","n190","n191","n192","n193","n188"],"tags":{"building":"house"}},"w400":{"id":"w400","nodes":["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],"tags":{"amenity":"parking"}},"w401":{"id":"w401","nodes":["n1963","n1964"],"tags":{"bridge":"yes","highway":"footway"}},"w402":{"id":"w402","nodes":["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","barrier":"fence","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"}},"w403":{"id":"w403","nodes":["n1957","n1958","n1959","n481","n1960","n482","n1949"],"tags":{"highway":"path"}},"w404":{"id":"w404","nodes":["n2281","n27","n330","n1987","n1988"],"tags":{"highway":"service"}},"w405":{"id":"w405","nodes":["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w406":{"id":"w406","nodes":["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],"tags":{"highway":"footway"}},"w407":{"id":"w407","nodes":["n2034","n2036","n2009"],"tags":{"highway":"footway"}},"w408":{"id":"w408","nodes":["n1964","n1965","n2002","n1966","n21","n1967","n1969"],"tags":{"highway":"footway"}},"w409":{"id":"w409","nodes":["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],"tags":{"natural":"water"}},"w41":{"id":"w41","nodes":["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],"tags":{"building":"house"}},"w410":{"id":"w410","nodes":["n1868","n2088"],"tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail"}},"w411":{"id":"w411","nodes":["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],"tags":{"highway":"footway"}},"w412":{"id":"w412","nodes":["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","leisure":"park","name":"Scidmore Park"}},"w413":{"id":"w413","nodes":["n1831","n876","n4720","n821","n2089"],"tags":{"highway":"residential","name":"Andrews Street"}},"w414":{"id":"w414","nodes":["n2002","n2003","n2004","n2005","n2006","n2007"],"tags":{"highway":"footway"}},"w415":{"id":"w415","nodes":["n1979","n1980","n1981","n1982","n1979"],"tags":{"amenity":"parking"}},"w416":{"id":"w416","nodes":["n2054","n2055","n2056","n2057","n2054"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w417":{"id":"w417","nodes":["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],"tags":{"leisure":"park","name":"Memory Isle Park"}},"w418":{"id":"w418","nodes":["n2033","n2034","n2035"],"tags":{"highway":"footway"}},"w419":{"id":"w419","nodes":["n1983","n1984","n1985","n1986","n1983"],"tags":{"amenity":"parking"}},"w42":{"id":"w42","nodes":["n206","n207","n208","n209","n210","n211","n206"],"tags":{"building":"house"}},"w420":{"id":"w420","nodes":["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],"tags":{"highway":"residential","name":"French Street"}},"w421":{"id":"w421","nodes":["n2337","n2268"],"tags":{"highway":"path"}},"w422":{"id":"w422","nodes":["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],"tags":{"natural":"water"}},"w423":{"id":"w423","nodes":["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],"tags":{"natural":"wetland"}},"w424":{"id":"w424","nodes":["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],"tags":{"highway":"residential","name":"Pealer Street"}},"w425":{"id":"w425","nodes":["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w426":{"id":"w426","nodes":["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],"tags":{"building":"yes"}},"w427":{"id":"w427","nodes":["n2671","n2672","n2673","n2674","n2671"],"tags":{"building":"yes"}},"w428":{"id":"w428","nodes":["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],"tags":{"building":"yes"}},"w429":{"id":"w429","nodes":["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],"tags":{"amenity":"parking"}},"w43":{"id":"w43","nodes":["n1955","n1956"],"tags":{"footway":"sidewalk","highway":"footway","name":"Riverwalk Trail"}},"w430":{"id":"w430","nodes":["n2471","n2474","n2484","n2479","n2471"],"tags":{"building":"yes"}},"w431":{"id":"w431","nodes":["n2218","n2434","n2436","n2433","n2435","n2210"],"tags":{"name":"Rocky River","waterway":"river"}},"w432":{"id":"w432","nodes":["n2782","n2532","n2783","n2784","n2782"],"tags":{"amenity":"parking"}},"w433":{"id":"w433","nodes":["n2513","n649","n2520","n2514","n2507","n2513"],"tags":{"building":"yes"}},"w434":{"id":"w434","nodes":["n2470","n2468","n2461","n2465","n2470"],"tags":{"building":"yes"}},"w435":{"id":"w435","nodes":["n2598","n2599","n648","n649","n2520","n2598"],"tags":{"building":"yes"}},"w436":{"id":"w436","nodes":["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],"tags":{"building":"yes"}},"w437":{"id":"w437","nodes":["n2503","n2512","n2508","n2499","n2503"],"tags":{"building":"yes"}},"w438":{"id":"w438","nodes":["n2440","n2800","n2774","n1"],"tags":{"highway":"residential","name":"Water Street"}},"w439":{"id":"w439","nodes":["n2675","n2676","n2677","n2678","n2675"],"tags":{"building":"yes"}},"w44":{"id":"w44","nodes":["n213","n214","n215","n216","n213"],"tags":{"building":"yes"}},"w440":{"id":"w440","nodes":["n2512","n2503","n2507","n2514","n2512"],"tags":{"building":"yes"}},"w441":{"id":"w441","nodes":["n2554","n2717","n674","n2720","n2798"],"tags":{"highway":"service","oneway":"yes"}},"w442":{"id":"w442","nodes":["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],"tags":{"amenity":"parking"}},"w443":{"id":"w443","nodes":["n2629","n2627","n2628","n2616","n2630","n2629"],"tags":{"building":"yes"}},"w444":{"id":"w444","nodes":["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w445":{"id":"w445","nodes":["n2572","n2573"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w446":{"id":"w446","nodes":["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],"tags":{"building":"yes"}},"w447":{"id":"w447","nodes":["n2780","n2777","n628","n624","n2779"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w448":{"id":"w448","nodes":["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],"tags":{"building":"yes"}},"w449":{"id":"w449","nodes":["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],"tags":{"amenity":"parking"}},"w45":{"id":"w45","nodes":["n217","n218","n219","n220","n217"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w450":{"id":"w450","nodes":["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],"tags":{"building":"yes"}},"w451":{"id":"w451","nodes":["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],"tags":{"amenity":"parking"}},"w452":{"id":"w452","nodes":["n2273","n457","n2569","n458","n2570"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w453":{"id":"w453","nodes":["n2447","n2242","n2448","n2527","n2530"],"tags":{"highway":"service"}},"w454":{"id":"w454","nodes":["n2560","n333","n2561"],"tags":{"highway":"service","service":"parking_aisle"}},"w455":{"id":"w455","nodes":["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],"tags":{"building":"yes"}},"w456":{"id":"w456","nodes":["n2425","n2429","n2424"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w457":{"id":"w457","nodes":["n2487","n2467","n2472","n2480","n2495","n2487"],"tags":{"building":"yes"}},"w458":{"id":"w458","nodes":["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],"tags":{"building":"yes"}},"w459":{"id":"w459","nodes":["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],"tags":{"building":"yes"}},"w46":{"id":"w46","nodes":["n221","n222","n223","n224","n221"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w460":{"id":"w460","nodes":["n2468","n2464","n2455","n2457","n2461","n2468"],"tags":{"building":"yes"}},"w461":{"id":"w461","nodes":["n2478","n2473","n683","n682","n2463","n681","n2478"],"tags":{"building":"yes"}},"w462":{"id":"w462","nodes":["n2547","n473","n2548","n2549"],"tags":{"highway":"service","service":"parking_aisle"}},"w463":{"id":"w463","nodes":["n2573","n2574"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w464":{"id":"w464","nodes":["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],"tags":{"highway":"service","service":"parking_aisle"}},"w465":{"id":"w465","nodes":["n2571","n459","n2572"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w466":{"id":"w466","nodes":["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],"tags":{"highway":"service"}},"w467":{"id":"w467","nodes":["n2484","n2474","n2477","n2485","n2488","n2484"],"tags":{"building":"yes"}},"w468":{"id":"w468","nodes":["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],"tags":{"building":"yes"}},"w469":{"id":"w469","nodes":["n2469","n2476","n2481","n2475","n920","n2466","n2469"],"tags":{"building":"yes"}},"w47":{"id":"w47","nodes":["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],"tags":{"highway":"service"}},"w470":{"id":"w470","nodes":["n2473","n2470","n2465","n2458","n2462","n683","n2473"],"tags":{"building":"yes"}},"w471":{"id":"w471","nodes":["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],"tags":{"building":"yes"}},"w472":{"id":"w472","nodes":["n2424","n2426","n2427","n2428"],"tags":{"highway":"residential","name":"Moore Street"}},"w473":{"id":"w473","nodes":["n2432","n1026","n4741","n2554","n2425"],"tags":{"highway":"residential","name":"Moore Street"}},"w474":{"id":"w474","nodes":["n2577","n2576"],"tags":{"bridge":"yes","highway":"footway"}},"w475":{"id":"w475","nodes":["n2497","n2505","n2500","n2493","n2497"],"tags":{"building":"yes"}},"w476":{"id":"w476","nodes":["n2493","n2500","n2501","n2496","n2490","n2493"],"tags":{"building":"yes"}},"w477":{"id":"w477","nodes":["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],"tags":{"highway":"residential","name":"Railroad Drive"}},"w478":{"id":"w478","nodes":["n2515","n2511","n2498","n2504","n2509","n2515"],"tags":{"building":"yes"}},"w479":{"id":"w479","nodes":["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],"tags":{"building":"yes"}},"w48":{"id":"w48","nodes":["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],"tags":{"building":"yes"}},"w480":{"id":"w480","nodes":["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],"tags":{"amenity":"parking"}},"w481":{"id":"w481","nodes":["n2796","n2657","n2658","n2797","n2796"],"tags":{"building":"yes"}},"w482":{"id":"w482","nodes":["n2550","n2551","n442","n2552","n2553","n2550"],"tags":{"amenity":"parking"}},"w483":{"id":"w483","nodes":["n2790","n2542"],"tags":{"highway":"service","service":"parking_aisle"}},"w484":{"id":"w484","nodes":["n2311","n1102"],"tags":{"highway":"service"}},"w485":{"id":"w485","nodes":["n2515","n2509","n2516","n2519","n2515"],"tags":{"building":"yes"}},"w486":{"id":"w486","nodes":["n2506","n2502","n2492","n2491","n2494","n2506"],"tags":{"building":"yes"}},"w487":{"id":"w487","nodes":["n2667","n2668","n2669","n2670","n2667"],"tags":{"building":"yes"}},"w488":{"id":"w488","nodes":["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],"tags":{"building":"yes"}},"w489":{"id":"w489","nodes":["n2081","n2430"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w49":{"id":"w49","nodes":["n237","n238"],"tags":{"highway":"footway"}},"w490":{"id":"w490","nodes":["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],"tags":{"highway":"residential","name":"Portage Avenue"}},"w491":{"id":"w491","nodes":["n2578","n2579","n2580","n2581","n2578"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w492":{"id":"w492","nodes":["n2556","n2557","n2558","n2559","n2556"],"tags":{"amenity":"parking"}},"w493":{"id":"w493","nodes":["n2460","n2456","n687","n2453","n2454","n2460"],"tags":{"building":"yes"}},"w494":{"id":"w494","nodes":["n2471","n2479","n2476","n2469","n2471"],"tags":{"building":"yes"}},"w495":{"id":"w495","nodes":["n2724","n2725","n673","n672","n671","n2726","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w496":{"id":"w496","nodes":["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],"tags":{"building":"yes"}},"w497":{"id":"w497","nodes":["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w498":{"id":"w498","nodes":["n2691","n2692","n634","n633","n2693","n2694"],"tags":{"highway":"service"}},"w499":{"id":"w499","nodes":["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],"tags":{"highway":"residential","name":"West Street"}},"w5":{"id":"w5","nodes":["n380","n381","n382","n383","n429","n430","n380"],"tags":{"building":"yes"}},"w50":{"id":"w50","nodes":["n239","n499","n508","n245","n238","n242","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w500":{"id":"w500","nodes":["n2428","n1152","n2421","n2324"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w501":{"id":"w501","nodes":["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],"tags":{"building":"yes"}},"w502":{"id":"w502","nodes":["n2570","n2571"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w503":{"id":"w503","nodes":["n2540","n2542","n2787"],"tags":{"highway":"service"}},"w504":{"id":"w504","nodes":["n2269","n2582","n2250"],"tags":{"highway":"path"}},"w505":{"id":"w505","nodes":["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],"tags":{"building":"yes"}},"w506":{"id":"w506","nodes":["n2543","n2544","n2545","n395","n2546","n2543"],"tags":{"amenity":"parking"}},"w507":{"id":"w507","nodes":["n2449","n2450","n2451","n2452","n1162","n2449"],"tags":{"leisure":"pitch","sport":"tennis"}},"w508":{"id":"w508","nodes":["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],"tags":{"highway":"service"}},"w509":{"id":"w509","nodes":["n2499","n2508","n2510","n2505","n2497","n2499"],"tags":{"building":"yes"}},"w51":{"id":"w51","nodes":["n241","n242","n243","n244"],"tags":{"highway":"service","surface":"unpaved"}},"w510":{"id":"w510","nodes":["n2575","n2577"],"tags":{"highway":"footway"}},"w511":{"id":"w511","nodes":["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],"tags":{"amenity":"parking"}},"w512":{"id":"w512","nodes":["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],"tags":{"building":"yes"}},"w513":{"id":"w513","nodes":["n2720","n2721"],"tags":{"highway":"service","service":"parking_aisle"}},"w514":{"id":"w514","nodes":["n2788","n2790","n2789","n989","n2540","n2541"],"tags":{"highway":"service","service":"parking_aisle"}},"w515":{"id":"w515","nodes":["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],"tags":{"highway":"residential","name":"Middle Street"}},"w516":{"id":"w516","nodes":["n2852","n2805"],"tags":{"access":"private","highway":"service","name":"Battle Street"}},"w517":{"id":"w517","nodes":["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w518":{"id":"w518","nodes":["n2859","n2808"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w519":{"id":"w519","nodes":["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],"tags":{"building":"yes"}},"w52":{"id":"w52","nodes":["n247","n248","n249","n250","n247"],"tags":{"amenity":"parking"}},"w520":{"id":"w520","nodes":["n2806","n2807","n2803"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w521":{"id":"w521","nodes":["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],"tags":{"building":"yes"}},"w522":{"id":"w522","nodes":["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],"tags":{"highway":"residential","name":"Washington Street"}},"w523":{"id":"w523","nodes":["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],"tags":{"highway":"residential","name":"5th Avenue"}},"w524":{"id":"w524","nodes":["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],"tags":{"building":"yes"}},"w525":{"id":"w525","nodes":["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],"tags":{"highway":"residential","name":"Wood Street"}},"w526":{"id":"w526","nodes":["n2877","n2809","n2813","n2844","n2843"],"tags":{"highway":"residential","name":"4th Avenue"}},"w527":{"id":"w527","nodes":["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],"tags":{"amenity":"parking"}},"w528":{"id":"w528","nodes":["n2864","n2892","n2893","n2877","n2860","n3840"],"tags":{"highway":"residential","name":"Garden Street"}},"w529":{"id":"w529","nodes":["n2868","n2890"],"tags":{"bridge":"yes","highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w53":{"id":"w53","nodes":["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],"tags":{"building":"yes"}},"w530":{"id":"w530","nodes":["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],"tags":{"building":"yes"}},"w531":{"id":"w531","nodes":["n2958","n2896"],"tags":{"bridge":"yes","highway":"secondary","name":"Main Street"}},"w532":{"id":"w532","nodes":["n2896","n394","n364","n2748"],"tags":{"highway":"secondary","name":"Main Street"}},"w533":{"id":"w533","nodes":["n2800","n2943","n2940","n2941","n2942","n2943"],"tags":{"highway":"service","service":"parking_aisle"}},"w534":{"id":"w534","nodes":["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],"tags":{"barrier":"fence"}},"w535":{"id":"w535","nodes":["n2894","n2944","n2774","n2765"],"tags":{"highway":"residential","name":"5th Avenue"}},"w536":{"id":"w536","nodes":["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w537":{"id":"w537","nodes":["n2895","n738","n2887","n737","n2913"],"tags":{"highway":"residential","name":"Water Street"}},"w538":{"id":"w538","nodes":["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],"tags":{"highway":"residential","name":"River Drive"}},"w539":{"id":"w539","nodes":["n2882","n2894"],"tags":{"bridge":"yes","highway":"residential","name":"5th Avenue"}},"w54":{"id":"w54","nodes":["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],"tags":{"building":"yes"}},"w540":{"id":"w540","nodes":["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],"tags":{"name":"Portage River","waterway":"river"}},"w541":{"id":"w541","nodes":["n2852","n2851","n3003"],"tags":{"highway":"residential","name":"1st Avenue"}},"w542":{"id":"w542","nodes":["n2991","n3004","n2994"],"tags":{"highway":"residential","name":"River Street"}},"w543":{"id":"w543","nodes":["n2993","n2989"],"tags":{"bridge":"yes","highway":"residential","name":"6th Street"}},"w544":{"id":"w544","nodes":["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],"tags":{"highway":"residential","name":"6th Street"}},"w545":{"id":"w545","nodes":["n2989","n2992","n2848"],"tags":{"highway":"residential","name":"6th Street"}},"w546":{"id":"w546","nodes":["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],"tags":{"natural":"wetland"}},"w547":{"id":"w547","nodes":["n2088","n3013","n3015","n3014","n3017","n3018"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w548":{"id":"w548","nodes":["n3083","n3084","n3085","n3086","n3083"],"tags":{"building":"yes"}},"w549":{"id":"w549","nodes":["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],"tags":{"leisure":"park","name":"Conservation Park"}},"w55":{"id":"w55","nodes":["n277","n278","n279","n280","n281","n282","n283","n284","n277"],"tags":{"building":"yes"}},"w550":{"id":"w550","nodes":["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],"tags":{"highway":"service"}},"w551":{"id":"w551","nodes":["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],"tags":{"highway":"footway"}},"w552":{"id":"w552","nodes":["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],"tags":{"building":"yes"}},"w553":{"id":"w553","nodes":["n3123","n3124","n3129","n3125","n3126","n3123"],"tags":{"building":"yes"}},"w554":{"id":"w554","nodes":["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],"tags":{"building":"yes"}},"w555":{"id":"w555","nodes":["n3087","n3088","n3089","n3090","n3087"],"tags":{"building":"yes"}},"w556":{"id":"w556","nodes":["n3113","n3114","n3115","n3116","n3113"],"tags":{"building":"yes"}},"w557":{"id":"w557","nodes":["n3103","n3104","n3105","n3106","n3103"],"tags":{"building":"yes"}},"w558":{"id":"w558","nodes":["n3127","n3128","n3129","n3124","n3127"],"tags":{"building":"yes"}},"w559":{"id":"w559","nodes":["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],"tags":{"building":"yes"}},"w56":{"id":"w56","nodes":["n285","n286","n287","n288","n285"],"tags":{"amenity":"parking"}},"w560":{"id":"w560","nodes":["n3091","n3092","n3093","n3094","n3091"],"tags":{"building":"yes"}},"w561":{"id":"w561","nodes":["n3155","n3157","n3158","n3159","n3156","n3155"],"tags":{"building":"yes"}},"w562":{"id":"w562","nodes":["n3057","n3058","n3059","n3060","n3057"],"tags":{"building":"yes"}},"w563":{"id":"w563","nodes":["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],"tags":{"building":"yes"}},"w564":{"id":"w564","nodes":["n3134","n3135","n3136","n3131","n3134"],"tags":{"building":"yes"}},"w565":{"id":"w565","nodes":["n3143","n3144","n3145","n3146","n3143"],"tags":{"building":"yes"}},"w566":{"id":"w566","nodes":["n3095","n3096","n3097","n3098","n3095"],"tags":{"building":"yes"}},"w567":{"id":"w567","nodes":["n3130","n3131","n3136","n3132","n3133","n3130"],"tags":{"building":"yes"}},"w568":{"id":"w568","nodes":["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],"tags":{"amenity":"parking"}},"w569":{"id":"w569","nodes":["n3061","n3062","n3063","n3064","n3061"],"tags":{"building":"yes"}},"w57":{"id":"w57","nodes":["n289","n290","n291","n292","n289"],"tags":{"amenity":"parking"}},"w570":{"id":"w570","nodes":["n3155","n3156","n3152","n3153","n3155"],"tags":{"building":"yes"}},"w571":{"id":"w571","nodes":["n3099","n3100","n3101","n3102","n3099"],"tags":{"building":"yes"}},"w572":{"id":"w572","nodes":["n3147","n3148","n3149","n3150","n3147"],"tags":{"building":"yes"}},"w573":{"id":"w573","nodes":["n3039","n2284"],"tags":{"highway":"service"}},"w574":{"id":"w574","nodes":["n3151","n3152","n3153","n3154","n3151"],"tags":{"building":"yes"}},"w575":{"id":"w575","nodes":["n3021","n3022","n3023","n3024","n3021"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w576":{"id":"w576","nodes":["n3065","n3066","n3067","n3068","n3065"],"tags":{"building":"yes"}},"w577":{"id":"w577","nodes":["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],"tags":{"highway":"service","name":"Willow Drive","service":"driveway","surface":"unpaved"}},"w578":{"id":"w578","nodes":["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],"tags":{"building":"yes"}},"w579":{"id":"w579","nodes":["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],"tags":{"highway":"residential","name":"Elm Street"}},"w58":{"id":"w58","nodes":["n240","n293","n294"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w580":{"id":"w580","nodes":["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],"tags":{"building":"yes"}},"w581":{"id":"w581","nodes":["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],"tags":{"highway":"residential","name":"Kelsey Street"}},"w582":{"id":"w582","nodes":["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],"tags":{"highway":"residential","name":"Walnut Street"}},"w583":{"id":"w583","nodes":["n3272","n4469","n4588","n2879","n4564","n2872"],"tags":{"highway":"residential","name":"10th Avenue"}},"w584":{"id":"w584","nodes":["n3243","n3242","n3241","n3240","n3243"],"tags":{"building":"industrial"}},"w585":{"id":"w585","nodes":["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],"tags":{"highway":"residential","name":"6th Avenue"}},"w586":{"id":"w586","nodes":["n3276","n4591","n2853","n4605","n2854"],"tags":{"highway":"residential","name":"8th Avenue"}},"w587":{"id":"w587","nodes":["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],"tags":{"building":"industrial"}},"w588":{"id":"w588","nodes":["n3277","n4599","n2857","n4598","n4608","n2858"],"tags":{"highway":"residential","name":"7th Avenue"}},"w589":{"id":"w589","nodes":["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],"tags":{"building":"yes"}},"w59":{"id":"w59","nodes":["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],"tags":{"footway":"sidewalk","highway":"footway"}},"w590":{"id":"w590","nodes":["n3278","n4458","n4589","n4604","n2861"],"tags":{"highway":"residential","name":"9th Avenue"}},"w591":{"id":"w591","nodes":["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],"tags":{"building":"industrial"}},"w592":{"id":"w592","nodes":["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],"tags":{"natural":"water","water":"pond"}},"w593":{"id":"w593","nodes":["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],"tags":{"building":"industrial"}},"w594":{"id":"w594","nodes":["n3233","n3232","n3231","n3230","n3233"],"tags":{"building":"yes"}},"w595":{"id":"w595","nodes":["n3247","n3246","n3245","n3244","n3247"],"tags":{"building":"industrial"}},"w596":{"id":"w596","nodes":["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],"tags":{"highway":"residential","name":"Armitage Street"}},"w597":{"id":"w597","nodes":["n2193","n2194","n2195","n2197","n2193"],"tags":{"building":"yes"}},"w598":{"id":"w598","nodes":["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],"tags":{"building":"school"}},"w6":{"id":"w6","nodes":["n879","n880","n881","n882","n879"],"tags":{"building":"shed"}},"w60":{"id":"w60","nodes":["n239","n308","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w600":{"id":"w600","nodes":["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],"tags":{"building":"yes"}},"w601":{"id":"w601","nodes":["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],"tags":{"building":"yes"}},"w602":{"id":"w602","nodes":["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],"tags":{"building":"yes"}},"w603":{"id":"w603","nodes":["n3353","n3352","n3347","n3280","n2798"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w604":{"id":"w604","nodes":["n3753","n3211","n3383"],"tags":{"highway":"service","service":"alley"}},"w605":{"id":"w605","nodes":["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],"tags":{"building":"yes"}},"w606":{"id":"w606","nodes":["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],"tags":{"building":"yes"}},"w607":{"id":"w607","nodes":["n2198","n2207"],"tags":{"barrier":"wall"}},"w608":{"id":"w608","nodes":["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],"tags":{"highway":"residential","name":"East Street"}},"w609":{"id":"w609","nodes":["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],"tags":{"highway":"residential","name":"Maple Street"}},"w61":{"id":"w61","nodes":["n309","n310","n311","n312","n313","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w610":{"id":"w610","nodes":["n3379","n3380","n3382","n3381","n3379"],"tags":{"leisure":"park","name":"LaFayette Park"}},"w611":{"id":"w611","nodes":["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],"tags":{"highway":"residential","name":"Bennett Street"}},"w612":{"id":"w612","nodes":["n2751","n3383","n2749","n2798","n2772"],"tags":{"highway":"residential","name":"Market Street"}},"w613":{"id":"w613","nodes":["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],"tags":{"building":"yes"}},"w614":{"id":"w614","nodes":["n3375","n3406","n3405","n3374","n3375"],"tags":{"leisure":"playground"}},"w615":{"id":"w615","nodes":["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],"tags":{"building":"yes"}},"w616":{"id":"w616","nodes":["n3376","n3407","n3408","n3377","n3376"],"tags":{"amenity":"school","name":"Three Rivers Elementary School"}},"w617":{"id":"w617","nodes":["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],"tags":{"building":"yes"}},"w619":{"id":"w619","nodes":["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],"tags":{"highway":"secondary","name":"Michigan Avenue","ref":"M 60"}},"w62":{"id":"w62","nodes":["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],"tags":{"footway":"sidewalk","highway":"footway"}},"w620":{"id":"w620","nodes":["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],"tags":{"highway":"residential"}},"w621":{"id":"w621","nodes":["n3468","n3469","n3470","n3471","n3468"],"tags":{"building":"yes"}},"w622":{"id":"w622","nodes":["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],"tags":{"landuse":"cemetery","name":"Riverside Cemetery"}},"w623":{"id":"w623","nodes":["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],"tags":{"building":"yes"}},"w624":{"id":"w624","nodes":["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],"tags":{"building":"yes"}},"w625":{"id":"w625","nodes":["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],"tags":{"highway":"secondary","name":"Jefferson Street","name_1":"State Highway 60","ref":"M 60"}},"w626":{"id":"w626","nodes":["n3439","n3423","n2863"],"tags":{"highway":"unclassified","name":"Michigan Avenue","name_1":"State Highway 60"}},"w627":{"id":"w627","nodes":["n3500","n3005"],"tags":{"highway":"service"}},"w628":{"id":"w628","nodes":["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],"tags":{"leisure":"park","name":"Marina Park"}},"w629":{"id":"w629","nodes":["n2208","n2209","n2212","n2214","n2208"],"tags":{"building":"yes"}},"w63":{"id":"w63","nodes":["n1955","n316"],"tags":{"footway":"sidewalk","highway":"footway"}},"w630":{"id":"w630","nodes":["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w631":{"id":"w631","nodes":["n2215","n2750","n2770","n2771","n2215"],"tags":{"building":"yes"}},"w632":{"id":"w632","nodes":["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],"tags":{"highway":"residential","name":"Cushman Street"}},"w633":{"id":"w633","nodes":["n2745","n3749","n3507","n4535","n3503"],"tags":{"highway":"residential","name":"Pine Street"}},"w634":{"id":"w634","nodes":["n3510","n3511","n3512","n3509","n3510"],"tags":{"leisure":"park","name":"Bowman Park"}},"w636":{"id":"w636","nodes":["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],"tags":{"highway":"residential","name":"Wheeler Street"}},"w637":{"id":"w637","nodes":["n3550","n4586","n4476","n3472"],"tags":{"highway":"residential","name":"11th Avenue"}},"w638":{"id":"w638","nodes":["n3508","n3518"],"tags":{"bridge":"yes","highway":"residential","name":"Hoffman Street"}},"w639":{"id":"w639","nodes":["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w64":{"id":"w64","nodes":["n316","n317"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w640":{"id":"w640","nodes":["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],"tags":{"landuse":"reservoir","name":"Hoffman Pond","natural":"water"}},"w641":{"id":"w641","nodes":["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],"tags":{"waterway":"river"}},"w642":{"id":"w642","nodes":["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],"tags":{"admin_level":"8","boundary":"administrative"}},"w643":{"id":"w643","nodes":["n2839","n2873"],"tags":{"highway":"service","service":"driveway"}},"w644":{"id":"w644","nodes":["n2873","n2840"],"tags":{"bridge":"yes","highway":"service","layer":"1","service":"driveway"}},"w645":{"id":"w645","nodes":["n2840","n2841","n2842","n2845","n2866"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w646":{"id":"w646","nodes":["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],"tags":{"highway":"residential","name":"Flower Street"}},"w647":{"id":"w647","nodes":["n2874","n2875","n2876","n2954","n2874"],"tags":{"building":"industrial"}},"w648":{"id":"w648","nodes":["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],"tags":{"building":"yes"}},"w649":{"id":"w649","nodes":["n3197","n4543","n4544","n3198"],"tags":{"highway":"residential","name":"Morris Avenue","surface":"unpaved"}},"w65":{"id":"w65","nodes":["n317","n318","n319","n320","n321"],"tags":{"footway":"sidewalk","highway":"footway"}},"w650":{"id":"w650","nodes":["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],"tags":{"highway":"residential","name":"Adams Street"}},"w651":{"id":"w651","nodes":["n3788","n3785","n3786","n3787","n3788"],"tags":{"power":"station"}},"w652":{"id":"w652","nodes":["n2957","n3163","n3241"],"tags":{"barrier":"wall"}},"w653":{"id":"w653","nodes":["n3549","n3802","n3803","n3800","n3801"],"tags":{"highway":"service","surface":"unpaved"}},"w654":{"id":"w654","nodes":["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],"tags":{"building":"yes"}},"w655":{"id":"w655","nodes":["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],"tags":{"building":"yes"}},"w656":{"id":"w656","nodes":["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],"tags":{"building":"yes"}},"w657":{"id":"w657","nodes":["n3772","n3773","n3774","n3775","n3772"],"tags":{"building":"yes"}},"w658":{"id":"w658","nodes":["n3776","n3777","n3784","n3789","n3776"],"tags":{"building":"yes"}},"w659":{"id":"w659","nodes":["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],"tags":{"leisure":"pitch","sport":"baseball"}},"w66":{"id":"w66","nodes":["n321","n322"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w660":{"id":"w660","nodes":["n3982","n3842","n3864","n3865","n3866","n3867","n3868","n3858","n3869","n3870","n3862"],"tags":{"highway":"service"}},"w661":{"id":"w661","nodes":["n3968","n3969"],"tags":{"highway":"footway"}},"w662":{"id":"w662","nodes":["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],"tags":{"amenity":"parking"}},"w663":{"id":"w663","nodes":["n3964","n3965"],"tags":{"highway":"footway"}},"w664":{"id":"w664","nodes":["n3966","n3967"],"tags":{"highway":"footway"}},"w665":{"id":"w665","nodes":["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],"tags":{"highway":"service","service":"parking_aisle"}},"w666":{"id":"w666","nodes":["n3895","n3896"],"tags":{"highway":"service","service":"parking_aisle"}},"w667":{"id":"w667","nodes":["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],"tags":{"access":"private","highway":"service","name":"Collins Drive"}},"w668":{"id":"w668","nodes":["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],"tags":{"building":"school"}},"w669":{"id":"w669","nodes":["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],"tags":{"highway":"service"}},"w67":{"id":"w67","nodes":["n322","n886","n323","n475"],"tags":{"footway":"crossing","highway":"footway"}},"w670":{"id":"w670","nodes":["n3473","n3859","n3860","n3980","n4908","n4865"],"tags":{"highway":"secondary","name":"Hoffman Street","ref":"M 60"}},"w671":{"id":"w671","nodes":["n3970","n3806","n3971"],"tags":{"highway":"footway"}},"w672":{"id":"w672","nodes":["n3892","n3893","n3894"],"tags":{"highway":"service","service":"parking_aisle"}},"w673":{"id":"w673","nodes":["n3945","n3946","n3992","n3990","n3945"],"tags":{"leisure":"pitch","sport":"tennis"}},"w674":{"id":"w674","nodes":["n3890","n3893","n3891"],"tags":{"highway":"service","service":"parking_aisle"}},"w675":{"id":"w675","nodes":["n3947","n3948","n3994","n3993","n3947"],"tags":{"leisure":"pitch","sport":"tennis"}},"w676":{"id":"w676","nodes":["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],"tags":{"highway":"service"}},"w677":{"id":"w677","nodes":["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3950","n3951","n3952","n3953","n3954","n3956","n3966","n3955"],"tags":{"highway":"footway"}},"w678":{"id":"w678","nodes":["n3887","n3888","n3895","n3899"],"tags":{"highway":"service","service":"parking_aisle"}},"w679":{"id":"w679","nodes":["n3946","n3947","n3993","n3992","n3946"],"tags":{"leisure":"pitch","sport":"tennis"}},"w68":{"id":"w68","nodes":["n294","n1952","n326"],"tags":{"footway":"sidewalk","highway":"footway"}},"w680":{"id":"w680","nodes":["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],"tags":{"leisure":"pitch","sport":"baseball"}},"w681":{"id":"w681","nodes":["n3990","n3991","n3944","n3945","n3990"],"tags":{"leisure":"pitch","sport":"tennis"}},"w682":{"id":"w682","nodes":["n3871","n3872","n3873","n3874","n3871"],"tags":{"amenity":"parking"}},"w683":{"id":"w683","nodes":["n3956","n3965","n3957","n3958","n3959"],"tags":{"footway":"sidewalk","highway":"footway"}},"w684":{"id":"w684","nodes":["n3790","n3791","n3792","n3793","n3790"],"tags":{"building":"shed"}},"w685":{"id":"w685","nodes":["n3794","n3795","n3796","n3797","n3794"],"tags":{"building":"yes"}},"w686":{"id":"w686","nodes":["n3798","n3799","n3804","n3805","n3798"],"tags":{"building":"yes"}},"w687":{"id":"w687","nodes":["n3806","n3807"],"tags":{"highway":"footway"}},"w688":{"id":"w688","nodes":["n3845","n3846","n3847","n3848","n3845"],"tags":{"leisure":"pitch","sport":"american_football"}},"w689":{"id":"w689","nodes":["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],"tags":{"leisure":"track","sport":"running"}},"w69":{"id":"w69","nodes":["n326","n327"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w690":{"id":"w690","nodes":["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],"tags":{"building":"yes"}},"w691":{"id":"w691","nodes":["n4028","n4029","n4030","n4031","n4028"],"tags":{"building":"yes"}},"w692":{"id":"w692","nodes":["n4032","n4033","n4034","n4035","n4032"],"tags":{"building":"yes"}},"w693":{"id":"w693","nodes":["n4036","n4037","n4038","n4039","n4036"],"tags":{"building":"yes"}},"w694":{"id":"w694","nodes":["n4040","n4041","n4042","n4043","n4040"],"tags":{"building":"yes"}},"w695":{"id":"w695","nodes":["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],"tags":{"building":"yes"}},"w696":{"id":"w696","nodes":["n4050","n4051","n4052","n4053","n4050"],"tags":{"building":"roof"}},"w697":{"id":"w697","nodes":["n4054","n4068","n4055","n4056","n4057","n4054"],"tags":{"building":"yes"}},"w698":{"id":"w698","nodes":["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],"tags":{"building":"yes"}},"w699":{"id":"w699","nodes":["n4064","n4066","n4065"],"tags":{"barrier":"fence"}},"w7":{"id":"w7","nodes":["n43","n44","n45"],"tags":{"highway":"service"}},"w70":{"id":"w70","nodes":["n327","n328","n27","n329"],"tags":{"footway":"sidewalk","highway":"footway"}},"w700":{"id":"w700","nodes":["n4066","n4067","n4068"],"tags":{"barrier":"fence"}},"w701":{"id":"w701","nodes":["n4069","n4070","n4071","n4072","n4069"],"tags":{"building":"shed"}},"w702":{"id":"w702","nodes":["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],"tags":{"building":"yes"}},"w703":{"id":"w703","nodes":["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],"tags":{"building":"yes"}},"w704":{"id":"w704","nodes":["n4093","n4094","n4095","n4096"],"tags":{"barrier":"fence"}},"w705":{"id":"w705","nodes":["n4097","n4098","n4099","n4100","n4097"],"tags":{"building":"yes"}},"w706":{"id":"w706","nodes":["n4098","n4102","n4087"],"tags":{"barrier":"fence"}},"w707":{"id":"w707","nodes":["n4101","n4102","n4096","n4170","n4103"],"tags":{"barrier":"fence"}},"w708":{"id":"w708","nodes":["n4104","n4105","n4106","n4107","n4104"],"tags":{"access":"private","leisure":"swimming_pool"}},"w709":{"id":"w709","nodes":["n4108","n4109","n4110","n4111","n4108"],"tags":{"building":"yes"}},"w71":{"id":"w71","nodes":["n329","n331"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w710":{"id":"w710","nodes":["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],"tags":{"building":"yes"}},"w711":{"id":"w711","nodes":["n4120","n4121","n4122","n4123","n4120"],"tags":{"building":"yes"}},"w712":{"id":"w712","nodes":["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],"tags":{"building":"yes"}},"w713":{"id":"w713","nodes":["n4130","n4131","n4132","n4133","n4130"],"tags":{"building":"shed"}},"w714":{"id":"w714","nodes":["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],"tags":{"building":"yes"}},"w715":{"id":"w715","nodes":["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],"tags":{"building":"yes"}},"w716":{"id":"w716","nodes":["n4150","n4151","n4152","n4153","n4150"],"tags":{"building":"yes"}},"w717":{"id":"w717","nodes":["n4154","n4155","n4156","n4157","n4154"],"tags":{"building":"yes"}},"w718":{"id":"w718","nodes":["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],"tags":{"building":"yes"}},"w719":{"id":"w719","nodes":["n4166","n4167","n4168","n4169","n4166"],"tags":{"building":"yes"}},"w72":{"id":"w72","nodes":["n331","n344","n332","n333","n334"],"tags":{"footway":"sidewalk","highway":"footway"}},"w720":{"id":"w720","nodes":["n4170","n4171"],"tags":{"barrier":"fence"}},"w721":{"id":"w721","nodes":["n4138","n4103"],"tags":{"barrier":"fence"}},"w722":{"id":"w722","nodes":["n4103","n4172"],"tags":{"barrier":"fence"}},"w723":{"id":"w723","nodes":["n4173","n4174"],"tags":{"barrier":"fence"}},"w724":{"id":"w724","nodes":["n4175","n4176","n4177","n4178","n4175"],"tags":{"building":"yes"}},"w725":{"id":"w725","nodes":["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],"tags":{"building":"yes"}},"w726":{"id":"w726","nodes":["n4185","n4186","n4187","n4188","n4185"],"tags":{"building":"yes"}},"w727":{"id":"w727","nodes":["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],"tags":{"building":"yes"}},"w728":{"id":"w728","nodes":["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],"tags":{"building":"yes"}},"w729":{"id":"w729","nodes":["n4211","n4212","n4213","n4214","n4211"],"tags":{"building":"shed"}},"w73":{"id":"w73","nodes":["n335","n336","n337","n338","n339","n340","n341","n342","n335"],"tags":{"building":"yes"}},"w730":{"id":"w730","nodes":["n4215","n4216","n4217","n4218","n4215"],"tags":{"building":"yes"}},"w731":{"id":"w731","nodes":["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],"tags":{"building":"yes"}},"w732":{"id":"w732","nodes":["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],"tags":{"building":"yes"}},"w733":{"id":"w733","nodes":["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],"tags":{"highway":"service"}},"w734":{"id":"w734","nodes":["n4240","n4249","n4248"],"tags":{"highway":"service","service":"parking_aisle"}},"w735":{"id":"w735","nodes":["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],"tags":{"amenity":"parking"}},"w736":{"id":"w736","nodes":["n4259","n4260","n4261","n4262","n4259"],"tags":{"building":"yes"}},"w737":{"id":"w737","nodes":["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],"tags":{"building":"yes"}},"w738":{"id":"w738","nodes":["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],"tags":{"building":"yes"}},"w739":{"id":"w739","nodes":["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],"tags":{"building":"yes"}},"w74":{"id":"w74","nodes":["n343","n344","n345"],"tags":{"highway":"service"}},"w740":{"id":"w740","nodes":["n4295","n4296","n4297","n4298","n4295"],"tags":{"building":"yes"}},"w741":{"id":"w741","nodes":["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],"tags":{"building":"yes"}},"w742":{"id":"w742","nodes":["n4311","n4312","n4313","n4314","n4311"],"tags":{"building":"shed"}},"w743":{"id":"w743","nodes":["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],"tags":{"building":"yes"}},"w744":{"id":"w744","nodes":["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],"tags":{"building":"yes"}},"w745":{"id":"w745","nodes":["n4335","n4336","n4337","n4338","n4335"],"tags":{"building":"shed"}},"w746":{"id":"w746","nodes":["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],"tags":{"building":"yes"}},"w747":{"id":"w747","nodes":["n4345","n4346","n4347","n4348","n4345"],"tags":{"building":"yes"}},"w748":{"id":"w748","nodes":["n4349","n4350","n4351","n4352","n4349"],"tags":{"building":"yes"}},"w749":{"id":"w749","nodes":["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],"tags":{"building":"yes"}},"w75":{"id":"w75","nodes":["n346","n347","n348","n349","n350","n351","n346"],"tags":{"amenity":"parking"}},"w750":{"id":"w750","nodes":["n4612","n4359","n4360"],"tags":{"barrier":"fence"}},"w751":{"id":"w751","nodes":["n4361","n4362","n4363","n4364","n4361"],"tags":{"building":"yes"}},"w752":{"id":"w752","nodes":["n4365","n4366","n4367","n4368","n4365"],"tags":{"building":"yes"}},"w753":{"id":"w753","nodes":["n4369","n4370","n4371","n4372","n4375","n4369"],"tags":{"building":"yes"}},"w754":{"id":"w754","nodes":["n4373","n4374","n4375"],"tags":{"barrier":"fence"}},"w755":{"id":"w755","nodes":["n4376","n4377","n4378","n4379","n4376"],"tags":{"building":"shed"}},"w756":{"id":"w756","nodes":["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],"tags":{"building":"yes"}},"w757":{"id":"w757","nodes":["n4392","n4393","n4394","n4395","n4392"],"tags":{"building":"yes"}},"w758":{"id":"w758","nodes":["n4396","n4397","n4398","n4399","n4396"],"tags":{"building":"shed"}},"w759":{"id":"w759","nodes":["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],"tags":{"building":"yes"}},"w76":{"id":"w76","nodes":["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w760":{"id":"w760","nodes":["n4416","n4417"],"tags":{"barrier":"fence"}},"w761":{"id":"w761","nodes":["n4418","n4416","n4419"],"tags":{"barrier":"fence"}},"w762":{"id":"w762","nodes":["n4420","n4421"],"tags":{"barrier":"fence"}},"w763":{"id":"w763","nodes":["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],"tags":{"building":"yes"}},"w764":{"id":"w764","nodes":["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],"tags":{"building":"yes"}},"w765":{"id":"w765","nodes":["n4446","n4447","n4448","n4449","n4446"],"tags":{"building":"yes"}},"w766":{"id":"w766","nodes":["n4450","n4451","n4452","n4453","n4450"],"tags":{"building":"yes"}},"w767":{"id":"w767","nodes":["n4454","n4455","n4456","n4457","n4454"],"tags":{"building":"yes"}},"w768":{"id":"w768","nodes":["n4461","n4458","n4460"],"tags":{"footway":"crossing","highway":"footway"}},"w769":{"id":"w769","nodes":["n4460","n4462","n4459"],"tags":{"footway":"sidewalk","highway":"footway"}},"w77":{"id":"w77","nodes":["n325","n360","n361"],"tags":{"footway":"crossing","highway":"footway"}},"w770":{"id":"w770","nodes":["n4462","n4463","n4464"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w771":{"id":"w771","nodes":["n4464","n4465","n4466","n4467"],"tags":{"footway":"sidewalk","highway":"footway"}},"w772":{"id":"w772","nodes":["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],"tags":{"footway":"sidewalk","highway":"footway"}},"w773":{"id":"w773","nodes":["n4467","n4468","n3959"],"tags":{"footway":"crossing","highway":"footway"}},"w774":{"id":"w774","nodes":["n4459","n4469","n4470"],"tags":{"footway":"crossing","highway":"footway"}},"w775":{"id":"w775","nodes":["n4470","n4471","n4472","n4473","n4474","n4475"],"tags":{"footway":"sidewalk","highway":"footway"}},"w776":{"id":"w776","nodes":["n4475","n4476","n4477"],"tags":{"footway":"crossing","highway":"footway"}},"w777":{"id":"w777","nodes":["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],"tags":{"footway":"sidewalk","highway":"footway"}},"w778":{"id":"w778","nodes":["n4488","n4489","n4490","n4491","n4488"],"tags":{"building":"yes"}},"w779":{"id":"w779","nodes":["n4492","n4493","n4494","n4495","n4492"],"tags":{"building":"yes"}},"w78":{"id":"w78","nodes":["n361","n362","n369"],"tags":{"footway":"sidewalk","highway":"footway"}},"w780":{"id":"w780","nodes":["n4496","n4497","n4498","n4499","n4496"],"tags":{"access":"private","leisure":"swimming_pool"}},"w781":{"id":"w781","nodes":["n4508","n4509"],"tags":{"footway":"sidewalk","highway":"footway"}},"w782":{"id":"w782","nodes":["n4510","n4511"],"tags":{"footway":"sidewalk","highway":"footway"}},"w783":{"id":"w783","nodes":["n4512","n4513"],"tags":{"footway":"sidewalk","highway":"footway"}},"w784":{"id":"w784","nodes":["n4513","n4514"],"tags":{"footway":"sidewalk","highway":"footway"}},"w785":{"id":"w785","nodes":["n4515","n4516"],"tags":{"footway":"sidewalk","highway":"footway"}},"w786":{"id":"w786","nodes":["n4517","n4515"],"tags":{"footway":"sidewalk","highway":"footway"}},"w787":{"id":"w787","nodes":["n4518","n4519"],"tags":{"footway":"sidewalk","highway":"footway"}},"w788":{"id":"w788","nodes":["n4519","n4520","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w789":{"id":"w789","nodes":["n4515","n4521","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w79":{"id":"w79","nodes":["n362","n363","n334"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w790":{"id":"w790","nodes":["n4515","n4522","n4523"],"tags":{"footway":"crossing","highway":"footway"}},"w791":{"id":"w791","nodes":["n4523","n4524","n4519"],"tags":{"footway":"crossing","highway":"footway"}},"w792":{"id":"w792","nodes":["n4523","n4525"],"tags":{"footway":"sidewalk","highway":"footway"}},"w793":{"id":"w793","nodes":["n4525","n4526","n4527"],"tags":{"footway":"crossing","highway":"footway"}},"w794":{"id":"w794","nodes":["n4527","n4529"],"tags":{"footway":"sidewalk","highway":"footway"}},"w795":{"id":"w795","nodes":["n4529","n4530","n4518"],"tags":{"footway":"crossing","highway":"footway"}},"w796":{"id":"w796","nodes":["n4518","n4531"],"tags":{"footway":"sidewalk","highway":"footway"}},"w797":{"id":"w797","nodes":["n4531","n4532"],"tags":{"footway":"sidewalk","highway":"footway"}},"w798":{"id":"w798","nodes":["n4533","n4534"],"tags":{"footway":"sidewalk","highway":"footway"}},"w799":{"id":"w799","nodes":["n4518","n4538","n4539"],"tags":{"footway":"crossing","highway":"footway"}},"w8":{"id":"w8","nodes":["n46","n47","n145","n48","n49","n46"],"tags":{"amenity":"parking"}},"w80":{"id":"w80","nodes":["n334","n364","n365"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w800":{"id":"w800","nodes":["n4539","n4540","n4541"],"tags":{"footway":"crossing","highway":"footway"}},"w801":{"id":"w801","nodes":["n4541","n4542","n4529"],"tags":{"footway":"crossing","highway":"footway"}},"w802":{"id":"w802","nodes":["n4552","n4553"],"tags":{"footway":"sidewalk","highway":"footway"}},"w803":{"id":"w803","nodes":["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],"tags":{"building":"yes"}},"w804":{"id":"w804","nodes":["n4562","n4563"],"tags":{"barrier":"retaining_wall"}},"w805":{"id":"w805","nodes":["n4568","n4569","n4570","n4571","n4568"],"tags":{"building":"yes"}},"w806":{"id":"w806","nodes":["n3473","n4575","n4576","n4581","n4580","n3551"],"tags":{"highway":"residential","oneway":"yes"}},"w807":{"id":"w807","nodes":["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],"tags":{"leisure":"pitch","sport":"baseball"}},"w808":{"id":"w808","nodes":["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],"tags":{"highway":"service"}},"w809":{"id":"w809","nodes":["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],"tags":{"highway":"service"}},"w81":{"id":"w81","nodes":["n365","n366","n367"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w810":{"id":"w810","nodes":["n4639","n4640","n4641"],"tags":{"barrier":"fence"}},"w811":{"id":"w811","nodes":["n4649","n4650","n4651","n4652","n4649"],"tags":{"building":"yes"}},"w812":{"id":"w812","nodes":["n4654","n4655"],"tags":{"barrier":"fence"}},"w813":{"id":"w813","nodes":["n4656","n4657"],"tags":{"barrier":"fence"}},"w814":{"id":"w814","nodes":["n4669","n4670","n4671","n4672","n4669"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w820":{"id":"w820","nodes":["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],"tags":{"natural":"wood"}},"w821":{"id":"w821","nodes":["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],"tags":{"natural":"scrub"}},"w822":{"id":"w822","nodes":["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],"tags":{"natural":"wood"}},"w823":{"id":"w823","nodes":["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],"tags":{"natural":"wood"}},"w824":{"id":"w824","nodes":["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],"tags":{"landuse":"recreation_ground"}},"w825":{"id":"w825","nodes":["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],"tags":{"landuse":"recreation_ground"}},"w826":{"id":"w826","nodes":["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],"tags":{"landuse":"industrial"}},"w827":{"id":"w827","nodes":["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],"tags":{"landuse":"industrial"}},"w828":{"id":"w828","nodes":["n4843","n4844","n4845","n4846","n4843"],"tags":{"landuse":"farmland"}},"w829":{"id":"w829","nodes":["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],"tags":{"aeroway":"aerodrome","name":"Three Rivers Municipal Airport"}},"w83":{"id":"w83","nodes":["n371","n372","n373","n374","n371"],"tags":{"building":"yes"}},"w830":{"id":"w830","nodes":["n4855","n4854","n4857","n4853","n4960"],"tags":{"barrier":"fence"}},"w831":{"id":"w831","nodes":["n4860","n4859","n4858","n4852","n4851"],"tags":{"barrier":"fence"}},"w832":{"id":"w832","nodes":["n4866","n4878","n4869","n4867"],"tags":{"aeroway":"runway","ref":"5/23"}},"w833":{"id":"w833","nodes":["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],"tags":{"aeroway":"runway","ref":"9/27"}},"w834":{"id":"w834","nodes":["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],"tags":{"aeroway":"apron"}},"w835":{"id":"w835","nodes":["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],"tags":{"aeroway":"taxiway"}},"w836":{"id":"w836","nodes":["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],"tags":{"aeroway":"taxiway"}},"w837":{"id":"w837","nodes":["n4893","n4894"],"tags":{"aeroway":"taxiway"}},"w838":{"id":"w838","nodes":["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],"tags":{"aeroway":"taxiway"}},"w839":{"id":"w839","nodes":["n4907","n4908"],"tags":{"highway":"service"}},"w84":{"id":"w84","nodes":["n374","n375","n376","n377","n373","n374"],"tags":{"building":"yes"}},"w840":{"id":"w840","nodes":["n4909","n4907","n4910"],"tags":{"highway":"service"}},"w841":{"id":"w841","nodes":["n4911","n4912","n4913","n4914","n4911"],"tags":{"building":"yes"}},"w842":{"id":"w842","nodes":["n4915","n4916","n4917","n4918","n4915"],"tags":{"aeroway":"hangar","building":"yes"}},"w843":{"id":"w843","nodes":["n4919","n4920","n4921","n4922","n4919"],"tags":{"building":"yes"}},"w844":{"id":"w844","nodes":["n4923","n4924","n4925","n4926","n4923"],"tags":{"aeroway":"hangar","building":"yes"}},"w845":{"id":"w845","nodes":["n4927","n4928","n4929","n4930","n4927"],"tags":{"aeroway":"hangar","building":"yes"}},"w846":{"id":"w846","nodes":["n4931","n4932","n4933","n4934","n4931"],"tags":{"aeroway":"hangar","building":"yes"}},"w847":{"id":"w847","nodes":["n4935","n4936","n4937","n4938","n4935"],"tags":{"aeroway":"hangar","building":"yes"}},"w848":{"id":"w848","nodes":["n4939","n4940","n4941","n4942","n4939"],"tags":{"aeroway":"hangar","building":"yes"}},"w849":{"id":"w849","nodes":["n4943","n4944","n4945","n4946","n4943"],"tags":{"aeroway":"hangar","building":"yes"}},"w85":{"id":"w85","nodes":["n431","n432","n1038","n433","n434","n1040","n431"],"tags":{"building":"yes"}},"w850":{"id":"w850","nodes":["n4947","n4948","n4949","n4950","n4947"],"tags":{"aeroway":"hangar","building":"yes"}},"w851":{"id":"w851","nodes":["n4951","n4952","n4953","n4954","n4951"],"tags":{"aeroway":"hangar","building":"yes"}},"w852":{"id":"w852","nodes":["n4955","n4956","n4957","n4958","n4955"],"tags":{"aeroway":"hangar","building":"yes"}},"w853":{"id":"w853","nodes":["n4959","n4864","n4861","n4862","n4863"],"tags":{"barrier":"fence"}},"w854":{"id":"w854","nodes":["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],"tags":{"landuse":"farmland"}},"w855":{"id":"w855","nodes":["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],"tags":{"landuse":"farmland"}},"w856":{"id":"w856","nodes":["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],"tags":{"natural":"scrub"}},"w857":{"id":"w857","nodes":["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],"tags":{"landuse":"farmland"}},"w858":{"id":"w858","nodes":["n5001","n5003","n5004","n4999","n5000","n5001"],"tags":{"natural":"scrub"}},"w859":{"id":"w859","nodes":["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],"tags":{"landuse":"farmland"}},"w86":{"id":"w86","nodes":["n384","n385","n386","n387","n384"],"tags":{"building":"yes"}},"w860":{"id":"w860","nodes":["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],"tags":{"landuse":"industrial"}},"w87":{"id":"w87","nodes":["n387","n388","n389","n386","n387"],"tags":{"building":"yes"}},"w88":{"id":"w88","nodes":["n390","n391","n392","n393","n390"],"tags":{"building":"yes"}},"w89":{"id":"w89","nodes":["n394","n2895"],"tags":{"highway":"service"}},"w9":{"id":"w9","nodes":["n50","n51","n148","n52","n57","n891","n53","n50"],"tags":{"building":"yes"}},"w90":{"id":"w90","nodes":["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],"tags":{"building":"yes"}},"w91":{"id":"w91","nodes":["n418","n423","n419"],"tags":{"highway":"service"}},"w92":{"id":"w92","nodes":["n420","n421","n422","n423","n420"],"tags":{"amenity":"parking"}},"w93":{"id":"w93","nodes":["n2282","n1876"],"tags":{"name":"Rocky River","tunnel":"building_passage","waterway":"river"}},"w94":{"id":"w94","nodes":["n1876","n885","n1875","n2234"],"tags":{"name":"Rocky River","waterway":"river"}},"w95":{"id":"w95","nodes":["n425","n426","n427","n914","n428","n913","n425"],"tags":{"building":"yes"}},"w96":{"id":"w96","nodes":["n456","n620","n1034","n1035","n456"],"tags":{"building":"yes"}},"w97":{"id":"w97","nodes":["n435","n912","n451","n321"],"tags":{"highway":"footway"}},"w98":{"id":"w98","nodes":["n436","n319","n437","n438","n439","n440","n441","n476","n442"],"tags":{"highway":"service"}},"w99":{"id":"w99","nodes":["n443","n444","n445","n446","n447","n448","n449","n450","n443"],"tags":{"amenity":"parking"}}};
50070 // toggles the visibility of ui elements, using a combination of the
50071 // hide class, which sets display=none, and a d3 transition for opacity.
50072 // this will cause blinking when called repeatedly, so check that the
50073 // value actually changes between calls.
50074 function uiToggle(show, callback) {
50075 return function(selection$$1) {
50077 .style('opacity', show ? 0 : 1)
50078 .classed('hide', false)
50080 .style('opacity', show ? 1 : 0)
50081 .on('end', function() {
50083 .classed('hide', !show)
50084 .style('opacity', null);
50085 if (callback) callback.apply(this);
50090 // Tooltips and svg mask used to highlight certain features
50091 function uiCurtain() {
50093 var surface = d3_select(null),
50094 tooltip = d3_select(null),
50095 darkness = d3_select(null);
50097 function curtain(selection$$1) {
50098 surface = selection$$1
50100 .attr('id', 'curtain')
50101 .style('z-index', 1000)
50102 .style('pointer-events', 'none')
50103 .style('position', 'absolute')
50107 darkness = surface.append('path')
50110 .attr('class', 'curtain-darkness');
50112 d3_select(window).on('resize.curtain', resize);
50114 tooltip = selection$$1.append('div')
50115 .attr('class', 'tooltip')
50116 .style('z-index', 1002);
50120 .attr('class', 'tooltip-arrow');
50124 .attr('class', 'tooltip-inner');
50129 function resize() {
50131 .attr('width', window.innerWidth)
50132 .attr('height', window.innerHeight);
50133 curtain.cut(darkness.datum());
50139 * Reveal cuts the curtain to highlight the given box,
50140 * and shows a tooltip with instructions next to the box.
50142 * @param {String|ClientRect} [box] box used to cut the curtain
50143 * @param {String} [text] text for a tooltip
50144 * @param {Object} [options]
50145 * @param {string} [options.tooltipClass] optional class to add to the tooltip
50146 * @param {integer} [options.duration] transition time in milliseconds
50147 * @param {string} [options.buttonText] if set, create a button with this text label
50148 * @param {function} [options.buttonCallback] if set, the callback for the button
50149 * @param {String|ClientRect} [options.tooltipBox] box for tooltip position, if different from box for the curtain
50151 curtain.reveal = function(box, text, options) {
50152 if (typeof box === 'string') {
50153 box = d3_select(box).node();
50155 if (box && box.getBoundingClientRect) {
50156 box = copyBox(box.getBoundingClientRect());
50159 options = options || {};
50162 if (options.tooltipBox) {
50163 tooltipBox = options.tooltipBox;
50164 if (typeof tooltipBox === 'string') {
50165 tooltipBox = d3_select(tooltipBox).node();
50167 if (tooltipBox && tooltipBox.getBoundingClientRect) {
50168 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
50174 if (tooltipBox && text) {
50175 // pseudo markdown bold text for the instruction section..
50176 var parts = text.split('**');
50177 var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
50179 html += '<span class="instruction">' + parts[1] + '</span>';
50182 html = html.replace(/\*(.*?)\*/g, '<em>$1</em>'); // emphasis
50183 html = html.replace(/\{br\}/g, '<br/><br/>'); // linebreak
50185 if (options.buttonText && options.buttonCallback) {
50186 html += '<div class="button-section">' +
50187 '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
50190 var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
50192 .classed(classes, true)
50193 .selectAll('.tooltip-inner')
50196 if (options.buttonText && options.buttonCallback) {
50197 var button = tooltip.selectAll('.button-section .button.action');
50199 .on('click', function() {
50200 event.preventDefault();
50201 options.buttonCallback();
50205 var tip = copyBox(tooltip.node().getBoundingClientRect()),
50206 w = window.innerWidth,
50207 h = window.innerHeight,
50208 tooltipWidth = 200,
50213 // hack: this will have bottom placement,
50214 // so need to reserve extra space for the tooltip illustration.
50215 if (options.tooltipClass === 'intro-mouse') {
50219 // trim box dimensions to just the portion that fits in the window..
50220 if (tooltipBox.top + tooltipBox.height > h) {
50221 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
50223 if (tooltipBox.left + tooltipBox.width > w) {
50224 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
50227 // determine tooltip placement..
50229 if (tooltipBox.top + tooltipBox.height < 100) {
50230 // tooltip below box..
50233 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
50234 tooltipBox.top + tooltipBox.height
50237 } else if (tooltipBox.top > h - 140) {
50238 // tooltip above box..
50241 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
50242 tooltipBox.top - tip.height
50246 // tooltip to the side of the tooltipBox..
50247 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
50249 if (textDirection === 'rtl') {
50250 if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
50252 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
50256 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
50260 if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
50262 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
50266 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
50271 if (options.duration !== 0 || !tooltip.classed(side)) {
50272 tooltip.call(uiToggle(true));
50276 .style('top', pos[1] + 'px')
50277 .style('left', pos[0] + 'px')
50278 .attr('class', classes + ' ' + side);
50281 // shift tooltip-inner if it is very close to the top or bottom edge
50282 // (doesn't affect the placement of the tooltip-arrow)
50284 if (side === 'left' || side === 'right') {
50286 shiftY = 60 - pos[1];
50288 else if (pos[1] + tip.height > h - 100) {
50289 shiftY = h - pos[1] - tip.height - 100;
50292 tooltip.selectAll('.tooltip-inner')
50293 .style('top', shiftY + 'px');
50297 .classed('in', false)
50298 .call(uiToggle(false));
50301 curtain.cut(box, options.duration);
50307 curtain.cut = function(datum, duration) {
50308 darkness.datum(datum)
50312 if (duration === 0) {
50313 selection$$1 = darkness;
50315 selection$$1 = darkness
50317 .duration(duration || 600)
50322 .attr('d', function(d) {
50323 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
50324 window.innerWidth + ',' + window.innerHeight + 'L' +
50325 window.innerWidth + ',0 Z';
50327 if (!d) return string;
50328 return string + 'M' +
50329 d.left + ',' + d.top + 'L' +
50330 d.left + ',' + (d.top + d.height) + 'L' +
50331 (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
50332 (d.left + d.width) + ',' + (d.top) + 'Z';
50338 curtain.remove = function() {
50341 d3_select(window).on('resize.curtain', null);
50345 // ClientRects are immutable, so copy them to an object,
50346 // in case we need to trim the height/width.
50347 function copyBox(src) {
50351 bottom: src.bottom,
50362 function uiIntroWelcome(context, reveal) {
50363 var dispatch$$1 = dispatch('done'),
50364 listener = clickListener();
50367 title: 'intro.welcome.title'
50371 function welcome() {
50372 context.map().centerZoom([-85.63591, 41.94285], 19);
50373 reveal('.intro-nav-wrap .chapter-welcome',
50374 t('intro.welcome.welcome'),
50375 { buttonText: t('intro.ok'), buttonCallback: practice }
50379 function practice() {
50380 reveal('.intro-nav-wrap .chapter-welcome',
50381 t('intro.welcome.practice'),
50382 { buttonText: t('intro.ok'), buttonCallback: words }
50387 reveal('.intro-nav-wrap .chapter-welcome',
50388 t('intro.welcome.words'),
50389 { buttonText: t('intro.ok'), buttonCallback: mouse }
50395 reveal('.intro-nav-wrap .chapter-welcome',
50396 t('intro.welcome.mouse'),
50397 { buttonText: t('intro.ok'), buttonCallback: leftClick }
50402 function leftClick() {
50406 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50407 t('intro.welcome.leftclick', { num: times }),
50408 { tooltipClass: 'intro-mouse' }
50411 tooltip.selectAll('.tooltip-inner')
50412 .insert('svg', 'span')
50413 .attr('class', 'tooltip-illustration')
50415 .attr('xlink:href', '#walkthrough-mouse');
50419 .attr('class', 'counter');
50421 tooltip.call(listener);
50423 listener.on('click', function(which) {
50424 if (which === 'left') {
50425 d3_select('.curtain-tooltip.intro-mouse .counter')
50426 .text(String(++counter));
50428 if (counter === times) {
50429 window.setTimeout(function() { continueTo(rightClick); }, 1000);
50434 function continueTo(nextStep) {
50435 listener.on('click', null);
50436 tooltip.call(listener.off);
50437 tooltip.select('.counter').remove();
50443 function rightClick() {
50447 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50448 t('intro.welcome.rightclick', { num: times }),
50449 { tooltipClass: 'intro-mouse' }
50452 tooltip.selectAll('.tooltip-inner')
50453 .insert('svg', 'span')
50454 .attr('class', 'tooltip-illustration')
50456 .attr('xlink:href', '#walkthrough-mouse');
50460 .attr('class', 'counter');
50462 tooltip.call(listener);
50464 listener.on('click', function(which) {
50465 if (which === 'right') {
50466 d3_select('.curtain-tooltip.intro-mouse .counter')
50467 .text(String(++counter));
50469 if (counter === times) {
50470 window.setTimeout(function() { continueTo(chapters); }, 1000);
50475 function continueTo(nextStep) {
50476 listener.on('click', null);
50477 tooltip.call(listener.off);
50478 tooltip.select('.counter').remove();
50484 function chapters() {
50485 dispatch$$1.call('done');
50486 reveal('.intro-nav-wrap .chapter-navigation',
50487 t('intro.welcome.chapters', { next: t('intro.navigation.title') })
50492 chapter.enter = function() {
50497 chapter.exit = function() {
50502 chapter.restart = function() {
50508 return utilRebind(chapter, dispatch$$1, 'on');
50513 function clickListener() {
50514 var dispatch$$1 = dispatch('click'),
50516 tooltip = d3_select(null),
50519 // `down` keeps track of which buttons/keys are down.
50520 // Setting a property in `down` happens immediately.
50521 // Unsetting a property in `down` is delayed because
50522 // on Windows a contextmenu event happens after keyup/mouseup
50524 function keydown() {
50525 if (event.keyCode === 93) { // context menu
50526 event.preventDefault();
50527 event.stopPropagation();
50528 down.menu = event.timeStamp;
50529 tooltip.classed('rightclick', true);
50535 if (event.keyCode === 93) { // context menu
50536 event.preventDefault();
50537 event.stopPropagation();
50538 var endTime = event.timeStamp,
50539 startTime = down.menu || endTime,
50540 delay = (endTime - startTime < minTime) ? minTime : 0;
50542 window.setTimeout(function() {
50543 tooltip.classed('rightclick', false);
50544 down.menu = undefined; // delayed, for Windows
50547 dispatch$$1.call('click', this, 'right');
50552 function mousedown() {
50553 var button = event.button;
50554 if (button === 0 && !event.ctrlKey) {
50555 tooltip.classed('leftclick', true);
50556 } else if (button === 2) {
50557 tooltip.classed('rightclick', true);
50559 down[button] = event.timeStamp;
50563 function mouseup() {
50564 var button = event.button,
50565 endTime = event.timeStamp,
50566 startTime = down[button] || endTime,
50567 delay = (endTime - startTime < minTime) ? minTime : 0;
50569 if (button === 0 && !event.ctrlKey) {
50570 window.setTimeout(function() {
50571 tooltip.classed('leftclick', false);
50572 down[button] = undefined; // delayed, for Windows
50575 dispatch$$1.call('click', this, 'left');
50577 } else if (button === 2) {
50578 window.setTimeout(function() {
50579 tooltip.classed('rightclick', false);
50580 down[button] = undefined; // delayed, for Windows
50583 dispatch$$1.call('click', this, 'right');
50586 window.setTimeout(function() {
50587 down[button] = undefined; // delayed, for Windows
50593 function contextmenu() {
50594 event.preventDefault();
50595 event.stopPropagation();
50596 if (!down[2] && !down.menu) {
50597 tooltip.classed('rightclick', true);
50598 window.setTimeout(function() {
50599 tooltip.classed('rightclick', false);
50601 dispatch$$1.call('click', this, 'right');
50606 var behavior = function(selection$$1) {
50607 tooltip = selection$$1;
50611 .on('keydown.intro', keydown)
50612 .on('keyup.intro', keyup)
50613 .on('mousedown.intro', mousedown)
50614 .on('mouseup.intro', mouseup)
50615 .on('contextmenu.intro', contextmenu);
50619 behavior.off = function() {
50621 .on('keydown.intro', null)
50622 .on('keyup.intro', null)
50623 .on('mousedown.intro', null)
50624 .on('mouseup.intro', null)
50625 .on('contextmenu.intro', null);
50628 .classed('leftclick', false)
50629 .classed('rightclick', false);
50632 return utilRebind(behavior, dispatch$$1, 'on');
50635 function uiIntroNavigation(context, reveal) {
50636 var dispatch$$1 = dispatch('done'),
50639 townHall = [-85.63591, 41.94285],
50640 springStreetId = 'w397',
50641 springStreetEndId = 'n1834',
50642 springStreet = [-85.63582, 41.94255],
50643 onewayField = context.presets().field('oneway'),
50644 maxspeedField = context.presets().field('maxspeed');
50648 title: 'intro.navigation.title'
50652 function timeout(f, t$$1) {
50653 timeouts.push(window.setTimeout(f, t$$1));
50657 function eventCancel() {
50658 event.stopPropagation();
50659 event.preventDefault();
50663 function isTownHallSelected() {
50664 var ids = context.selectedIDs();
50665 return ids.length === 1 && ids[0] === hallId;
50669 function dragMap() {
50670 context.enter(modeBrowse(context));
50671 context.history().reset('initial');
50673 var msec = transitionTime(townHall, context.map().center());
50674 if (msec) { reveal(null, null, { duration: 0 }); }
50675 context.map().zoom(19).centerEase(townHall, msec);
50677 timeout(function() {
50678 var centerStart = context.map().center();
50680 reveal('#surface', t('intro.navigation.drag'));
50681 context.map().on('drawn.intro', function() {
50682 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
50685 context.map().on('move.intro', function() {
50686 var centerNow = context.map().center();
50687 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
50688 context.map().on('move.intro', null);
50689 timeout(function() { continueTo(zoomMap); }, 3000);
50695 function continueTo(nextStep) {
50696 context.map().on('move.intro drawn.intro', null);
50702 function zoomMap() {
50703 var zoomStart = context.map().zoom();
50706 t('intro.navigation.zoom', {
50707 plus: icon('#icon-plus', 'pre-text'),
50708 minus: icon('#icon-minus', 'pre-text')
50712 context.map().on('drawn.intro', function() {
50714 t('intro.navigation.zoom', {
50715 plus: icon('#icon-plus', 'pre-text'),
50716 minus: icon('#icon-minus', 'pre-text')
50717 }), { duration: 0 }
50721 context.map().on('move.intro', function() {
50722 if (context.map().zoom() !== zoomStart) {
50723 context.map().on('move.intro', null);
50724 timeout(function() { continueTo(features); }, 3000);
50728 function continueTo(nextStep) {
50729 context.map().on('move.intro drawn.intro', null);
50735 function features() {
50736 var onClick = function() { continueTo(pointsLinesAreas); };
50738 reveal('#surface', t('intro.navigation.features'),
50739 { buttonText: t('intro.ok'), buttonCallback: onClick }
50742 context.map().on('drawn.intro', function() {
50743 reveal('#surface', t('intro.navigation.features'),
50744 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50748 function continueTo(nextStep) {
50749 context.map().on('drawn.intro', null);
50754 function pointsLinesAreas() {
50755 var onClick = function() { continueTo(nodesWays); };
50757 reveal('#surface', t('intro.navigation.points_lines_areas'),
50758 { buttonText: t('intro.ok'), buttonCallback: onClick }
50761 context.map().on('drawn.intro', function() {
50762 reveal('#surface', t('intro.navigation.points_lines_areas'),
50763 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50767 function continueTo(nextStep) {
50768 context.map().on('drawn.intro', null);
50773 function nodesWays() {
50774 var onClick = function() { continueTo(clickTownHall); };
50776 reveal('#surface', t('intro.navigation.nodes_ways'),
50777 { buttonText: t('intro.ok'), buttonCallback: onClick }
50780 context.map().on('drawn.intro', function() {
50781 reveal('#surface', t('intro.navigation.nodes_ways'),
50782 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50786 function continueTo(nextStep) {
50787 context.map().on('drawn.intro', null);
50792 function clickTownHall() {
50793 context.enter(modeBrowse(context));
50794 context.history().reset('initial');
50796 reveal(null, null, { duration: 0 });
50797 context.map().zoomEase(19, 500);
50799 timeout(function() {
50800 var entity = context.hasEntity(hallId);
50801 if (!entity) return;
50802 context.map().centerEase(entity.loc, 500);
50804 timeout(function() {
50805 var entity = context.hasEntity(hallId);
50806 if (!entity) return;
50807 var box = pointBox(entity.loc, context);
50808 reveal(box, t('intro.navigation.click_townhall'));
50810 context.map().on('move.intro drawn.intro', function() {
50811 var entity = context.hasEntity(hallId);
50812 if (!entity) return;
50813 var box = pointBox(entity.loc, context);
50814 reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50817 context.on('enter.intro', function() {
50818 if (isTownHallSelected()) continueTo(selectedTownHall);
50821 }, 550); // after centerEase
50823 }, 550); // after zoomEase
50825 context.history().on('change.intro', function() {
50826 if (!context.hasEntity(hallId)) {
50827 continueTo(clickTownHall);
50831 function continueTo(nextStep) {
50832 context.on('enter.intro', null);
50833 context.map().on('move.intro drawn.intro', null);
50834 context.history().on('change.intro', null);
50840 function selectedTownHall() {
50841 if (!isTownHallSelected()) return clickTownHall();
50843 var entity = context.hasEntity(hallId);
50844 if (!entity) return clickTownHall();
50846 var box = pointBox(entity.loc, context);
50847 var onClick = function() { continueTo(editorTownHall); };
50849 reveal(box, t('intro.navigation.selected_townhall'),
50850 { buttonText: t('intro.ok'), buttonCallback: onClick }
50853 context.map().on('move.intro drawn.intro', function() {
50854 var entity = context.hasEntity(hallId);
50855 if (!entity) return;
50856 var box = pointBox(entity.loc, context);
50857 reveal(box, t('intro.navigation.selected_townhall'),
50858 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50862 context.history().on('change.intro', function() {
50863 if (!context.hasEntity(hallId)) {
50864 continueTo(clickTownHall);
50868 function continueTo(nextStep) {
50869 context.map().on('move.intro drawn.intro', null);
50870 context.history().on('change.intro', null);
50876 function editorTownHall() {
50877 if (!isTownHallSelected()) return clickTownHall();
50879 // disallow scrolling
50880 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50882 var onClick = function() { continueTo(presetTownHall); };
50884 reveal('.entity-editor-pane',
50885 t('intro.navigation.editor_townhall'),
50886 { buttonText: t('intro.ok'), buttonCallback: onClick }
50889 context.on('exit.intro', function() {
50890 continueTo(clickTownHall);
50893 context.history().on('change.intro', function() {
50894 if (!context.hasEntity(hallId)) {
50895 continueTo(clickTownHall);
50899 function continueTo(nextStep) {
50900 context.on('exit.intro', null);
50901 context.history().on('change.intro', null);
50902 d3_select('.inspector-wrap').on('wheel.intro', null);
50908 function presetTownHall() {
50909 if (!isTownHallSelected()) return clickTownHall();
50911 // reset pane, in case user happened to change it..
50912 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50913 // disallow scrolling
50914 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50916 // preset match, in case the user happened to change it.
50917 var entity = context.entity(context.selectedIDs()[0]);
50918 var preset = context.presets().match(entity, context.graph());
50920 var onClick = function() { continueTo(fieldsTownHall); };
50922 context.on('exit.intro', function() {
50923 continueTo(clickTownHall);
50926 context.history().on('change.intro', function() {
50927 if (!context.hasEntity(hallId)) {
50928 continueTo(clickTownHall);
50932 reveal('.inspector-body .preset-list-item.inspector-inner',
50933 t('intro.navigation.preset_townhall', { preset: preset.name() }),
50934 { buttonText: t('intro.ok'), buttonCallback: onClick }
50937 function continueTo(nextStep) {
50938 context.on('exit.intro', null);
50939 context.history().on('change.intro', null);
50940 d3_select('.inspector-wrap').on('wheel.intro', null);
50946 function fieldsTownHall() {
50947 if (!isTownHallSelected()) return clickTownHall();
50949 // reset pane, in case user happened to change it..
50950 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50951 // disallow scrolling
50952 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50954 var onClick = function() { continueTo(closeTownHall); };
50956 reveal('.inspector-body .preset-editor',
50957 t('intro.navigation.fields_townhall'),
50958 { buttonText: t('intro.ok'), buttonCallback: onClick }
50961 context.on('exit.intro', function() {
50962 continueTo(clickTownHall);
50965 context.history().on('change.intro', function() {
50966 if (!context.hasEntity(hallId)) {
50967 continueTo(clickTownHall);
50971 function continueTo(nextStep) {
50972 context.on('exit.intro', null);
50973 context.history().on('change.intro', null);
50974 d3_select('.inspector-wrap').on('wheel.intro', null);
50980 function closeTownHall() {
50981 if (!isTownHallSelected()) return clickTownHall();
50983 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50984 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50986 reveal('.entity-editor-pane',
50987 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50990 context.on('exit.intro', function() {
50991 continueTo(searchStreet);
50994 context.history().on('change.intro', function() {
50995 // update the close icon in the tooltip if the user edits something.
50996 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50997 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50999 reveal('.entity-editor-pane',
51000 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
51005 function continueTo(nextStep) {
51006 context.on('exit.intro', null);
51007 context.history().on('change.intro', null);
51013 function searchStreet() {
51014 context.enter(modeBrowse(context));
51015 context.history().reset('initial'); // ensure spring street exists
51017 var msec = transitionTime(springStreet, context.map().center());
51018 if (msec) { reveal(null, null, { duration: 0 }); }
51019 context.map().zoom(19).centerEase(springStreet, msec); // ..and user can see it
51021 timeout(function() {
51022 reveal('.search-header input',
51023 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
51026 d3_select('.search-header input')
51027 .on('keyup.intro', checkSearchResult);
51032 function checkSearchResult() {
51033 var first = d3_select('.feature-list-item:nth-child(0n+2)'), // skip "No Results" item
51034 firstName = first.select('.entity-name'),
51035 name = t('intro.graph.name.spring-street');
51037 if (!firstName.empty() && firstName.text() === name) {
51038 reveal(first.node(),
51039 t('intro.navigation.choose_street', { name: name }),
51043 context.on('exit.intro', function() {
51044 continueTo(selectedStreet);
51047 d3_select('.search-header input')
51048 .on('keydown.intro', eventCancel, true)
51049 .on('keyup.intro', null);
51052 function continueTo(nextStep) {
51053 context.on('exit.intro', null);
51054 d3_select('.search-header input')
51055 .on('keydown.intro', null)
51056 .on('keyup.intro', null);
51062 function selectedStreet() {
51063 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
51064 return searchStreet();
51067 var onClick = function() { continueTo(editorStreet); };
51068 var entity = context.entity(springStreetEndId);
51069 var box = pointBox(entity.loc, context);
51073 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
51074 { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
51077 timeout(function() {
51078 context.map().on('move.intro drawn.intro', function() {
51079 var entity = context.hasEntity(springStreetEndId);
51080 if (!entity) return;
51081 var box = pointBox(entity.loc, context);
51084 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
51085 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51088 }, 600); // after reveal.
51090 context.on('enter.intro', function(mode) {
51091 if (!context.hasEntity(springStreetId)) {
51092 return continueTo(searchStreet);
51094 var ids = context.selectedIDs();
51095 if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
51096 // keep Spring Street selected..
51097 context.enter(modeSelect(context, [springStreetId]));
51101 context.history().on('change.intro', function() {
51102 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
51103 timeout(function() {
51104 continueTo(searchStreet);
51105 }, 300); // after any transition (e.g. if user deleted intersection)
51109 function continueTo(nextStep) {
51110 context.map().on('move.intro drawn.intro', null);
51111 context.on('enter.intro', null);
51112 context.history().on('change.intro', null);
51118 function editorStreet() {
51119 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51120 var href = d3_select(selector$$1).attr('href') || '#icon-close';
51122 reveal('.entity-editor-pane',
51123 t('intro.navigation.editor_street', {
51124 button: icon(href, 'pre-text'),
51125 field1: onewayField.label(),
51126 field2: maxspeedField.label()
51130 context.on('exit.intro', function() {
51134 context.history().on('change.intro', function() {
51135 // update the close icon in the tooltip if the user edits something.
51136 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51137 var href = d3_select(selector$$1).attr('href') || '#icon-close';
51139 reveal('.entity-editor-pane',
51140 t('intro.navigation.editor_street', {
51141 button: icon(href, 'pre-text'),
51142 field1: onewayField.label().toLowerCase(),
51143 field2: maxspeedField.label().toLowerCase()
51144 }), { duration: 0 }
51148 function continueTo(nextStep) {
51149 context.on('exit.intro', null);
51150 context.history().on('change.intro', null);
51157 dispatch$$1.call('done');
51158 reveal('#id-container',
51159 t('intro.navigation.play', { next: t('intro.points.title') }), {
51160 tooltipBox: '.intro-nav-wrap .chapter-point',
51161 buttonText: t('intro.ok'),
51162 buttonCallback: function() { reveal('#id-container'); }
51168 chapter.enter = function() {
51173 chapter.exit = function() {
51174 timeouts.forEach(window.clearTimeout);
51175 context.on('enter.intro exit.intro', null);
51176 context.map().on('move.intro drawn.intro', null);
51177 context.history().on('change.intro', null);
51178 d3_select('.inspector-wrap').on('wheel.intro', null);
51179 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
51183 chapter.restart = function() {
51189 return utilRebind(chapter, dispatch$$1, 'on');
51192 function uiIntroPoint(context, reveal) {
51193 var dispatch$$1 = dispatch('done'),
51195 intersection = [-85.63279, 41.94394],
51196 building = [-85.632422, 41.944045],
51197 cafePreset = context.presets().item('amenity/cafe'),
51202 title: 'intro.points.title'
51206 function timeout(f, t$$1) {
51207 timeouts.push(window.setTimeout(f, t$$1));
51211 function revealEditMenu(loc, text, options) {
51212 var rect = context.surfaceRect();
51213 var point = context.curtainProjection(loc);
51215 var width = 250 + (2 * pad);
51217 var startX = rect.left + point[0];
51218 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51221 top: point[1] + rect.top - 60,
51225 reveal(box, text, options);
51229 function eventCancel() {
51230 event.stopPropagation();
51231 event.preventDefault();
51235 function addPoint() {
51236 context.enter(modeBrowse(context));
51237 context.history().reset('initial');
51239 var msec = transitionTime(intersection, context.map().center());
51240 if (msec) { reveal(null, null, { duration: 0 }); }
51241 context.map().zoom(19).centerEase(intersection, msec);
51243 timeout(function() {
51244 var tooltip = reveal('button.add-point',
51245 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
51249 tooltip.selectAll('.tooltip-inner')
51250 .insert('svg', 'span')
51251 .attr('class', 'tooltip-illustration')
51253 .attr('xlink:href', '#poi-images');
51255 context.on('enter.intro', function(mode) {
51256 if (mode.id !== 'add-point') return;
51257 continueTo(placePoint);
51261 function continueTo(nextStep) {
51262 context.on('enter.intro', null);
51268 function placePoint() {
51269 if (context.mode().id !== 'add-point') {
51270 return chapter.restart();
51273 var pointBox$$1 = pad$1(building, 150, context);
51274 reveal(pointBox$$1, t('intro.points.place_point'));
51276 context.map().on('move.intro drawn.intro', function() {
51277 pointBox$$1 = pad$1(building, 150, context);
51278 reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
51281 context.on('enter.intro', function(mode) {
51282 if (mode.id !== 'select') return chapter.restart();
51283 pointId = context.mode().selectedIDs()[0];
51284 continueTo(searchPreset);
51287 function continueTo(nextStep) {
51288 context.map().on('move.intro drawn.intro', null);
51289 context.on('enter.intro', null);
51295 function searchPreset() {
51296 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51300 // disallow scrolling
51301 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51303 d3_select('.preset-search-input')
51304 .on('keydown.intro', null)
51305 .on('keyup.intro', checkPresetSearch);
51307 reveal('.preset-search-input',
51308 t('intro.points.search_cafe', { preset: cafePreset.name() })
51311 context.on('enter.intro', function(mode) {
51312 if (!pointId || !context.hasEntity(pointId)) {
51313 return continueTo(addPoint);
51316 var ids = context.selectedIDs();
51317 if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
51318 // keep the user's point selected..
51319 context.enter(modeSelect(context, [pointId]));
51321 // disallow scrolling
51322 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51324 d3_select('.preset-search-input')
51325 .on('keydown.intro', null)
51326 .on('keyup.intro', checkPresetSearch);
51328 reveal('.preset-search-input',
51329 t('intro.points.search_cafe', { preset: cafePreset.name() })
51332 context.history().on('change.intro', null);
51337 function checkPresetSearch() {
51338 var first = d3_select('.preset-list-item:first-child');
51340 if (first.classed('preset-amenity-cafe')) {
51341 d3_select('.preset-search-input')
51342 .on('keydown.intro', eventCancel, true)
51343 .on('keyup.intro', null);
51345 reveal(first.select('.preset-list-button').node(),
51346 t('intro.points.choose_cafe', { preset: cafePreset.name() }),
51350 context.history().on('change.intro', function() {
51351 continueTo(aboutFeatureEditor);
51356 function continueTo(nextStep) {
51357 context.on('enter.intro', null);
51358 context.history().on('change.intro', null);
51359 d3_select('.inspector-wrap').on('wheel.intro', null);
51360 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51366 function aboutFeatureEditor() {
51367 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51371 timeout(function() {
51372 reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
51373 tooltipClass: 'intro-points-describe',
51374 buttonText: t('intro.ok'),
51375 buttonCallback: function() { continueTo(addName); }
51379 context.on('exit.intro', function() {
51380 // if user leaves select mode here, just continue with the tutorial.
51381 continueTo(reselectPoint);
51384 function continueTo(nextStep) {
51385 context.on('exit.intro', null);
51391 function addName() {
51392 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51396 // reset pane, in case user happened to change it..
51397 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51399 timeout(function() {
51400 // It's possible for the user to add a name in a previous step..
51401 // If so, don't tell them to add the name in this step.
51402 // Give them an OK button instead.
51403 var entity = context.entity(pointId);
51404 if (entity.tags.name) {
51405 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
51406 tooltipClass: 'intro-points-describe',
51407 buttonText: t('intro.ok'),
51408 buttonCallback: function() { continueTo(addCloseEditor); }
51410 tooltip.select('.instruction').style('display', 'none');
51413 reveal('.entity-editor-pane', t('intro.points.add_name'),
51414 { tooltipClass: 'intro-points-describe' }
51419 context.history().on('change.intro', function() {
51420 continueTo(addCloseEditor);
51423 context.on('exit.intro', function() {
51424 // if user leaves select mode here, just continue with the tutorial.
51425 continueTo(reselectPoint);
51428 function continueTo(nextStep) {
51429 context.on('exit.intro', null);
51430 context.history().on('change.intro', null);
51436 function addCloseEditor() {
51437 // reset pane, in case user happened to change it..
51438 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51440 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51441 var href = d3_select(selector$$1).attr('href') || '#icon-close';
51443 context.on('exit.intro', function() {
51444 continueTo(reselectPoint);
51447 reveal('.entity-editor-pane',
51448 t('intro.points.add_close', { button: icon(href, 'pre-text') })
51451 function continueTo(nextStep) {
51452 context.on('exit.intro', null);
51458 function reselectPoint() {
51459 if (!pointId) return chapter.restart();
51460 var entity = context.hasEntity(pointId);
51461 if (!entity) return chapter.restart();
51463 // make sure it's still a cafe, in case user somehow changed it..
51464 var oldPreset = context.presets().match(entity, context.graph());
51465 context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
51467 context.enter(modeBrowse(context));
51469 var msec = transitionTime(entity.loc, context.map().center());
51470 if (msec) { reveal(null, null, { duration: 0 }); }
51471 context.map().centerEase(entity.loc, msec);
51473 timeout(function() {
51474 var box = pointBox(entity.loc, context);
51475 reveal(box, t('intro.points.reselect'), { duration: 600 });
51477 timeout(function() {
51478 context.map().on('move.intro drawn.intro', function() {
51479 var entity = context.hasEntity(pointId);
51480 if (!entity) return chapter.restart();
51481 var box = pointBox(entity.loc, context);
51482 reveal(box, t('intro.points.reselect'), { duration: 0 });
51484 }, 600); // after reveal..
51486 context.on('enter.intro', function(mode) {
51487 if (mode.id !== 'select') return;
51488 continueTo(updatePoint);
51493 function continueTo(nextStep) {
51494 context.map().on('move.intro drawn.intro', null);
51495 context.on('enter.intro', null);
51501 function updatePoint() {
51502 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51503 return continueTo(reselectPoint);
51506 // reset pane, in case user happened to untag the point..
51507 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51509 context.on('exit.intro', function() {
51510 continueTo(reselectPoint);
51513 context.history().on('change.intro', function() {
51514 continueTo(updateCloseEditor);
51517 timeout(function() {
51518 reveal('.entity-editor-pane', t('intro.points.update'),
51519 { tooltipClass: 'intro-points-describe' }
51523 function continueTo(nextStep) {
51524 context.on('exit.intro', null);
51525 context.history().on('change.intro', null);
51531 function updateCloseEditor() {
51532 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51533 return continueTo(reselectPoint);
51536 // reset pane, in case user happened to change it..
51537 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51539 context.on('exit.intro', function() {
51540 continueTo(rightClickPoint);
51543 timeout(function() {
51544 reveal('.entity-editor-pane',
51545 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
51549 function continueTo(nextStep) {
51550 context.on('exit.intro', null);
51556 function rightClickPoint() {
51557 if (!pointId) return chapter.restart();
51558 var entity = context.hasEntity(pointId);
51559 if (!entity) return chapter.restart();
51561 context.enter(modeBrowse(context));
51563 var box = pointBox(entity.loc, context);
51564 reveal(box, t('intro.points.rightclick'), { duration: 600 });
51566 timeout(function() {
51567 context.map().on('move.intro drawn.intro', function() {
51568 var entity = context.hasEntity(pointId);
51569 if (!entity) return chapter.restart();
51570 var box = pointBox(entity.loc, context);
51571 reveal(box, t('intro.points.rightclick'), { duration: 0 });
51573 }, 600); // after reveal
51575 context.on('enter.intro', function(mode) {
51576 if (mode.id !== 'select') return;
51577 var ids = context.selectedIDs();
51578 if (ids.length !== 1 || ids[0] !== pointId) return;
51580 timeout(function() {
51581 var node = selectMenuItem('delete').node();
51583 continueTo(enterDelete);
51584 }, 300); // after menu visible
51587 function continueTo(nextStep) {
51588 context.on('enter.intro', null);
51589 context.map().on('move.intro drawn.intro', null);
51595 function enterDelete() {
51596 if (!pointId) return chapter.restart();
51597 var entity = context.hasEntity(pointId);
51598 if (!entity) return chapter.restart();
51600 var node = selectMenuItem('delete').node();
51601 if (!node) { return continueTo(rightClickPoint); }
51603 revealEditMenu(entity.loc,
51604 t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
51607 timeout(function() {
51608 context.map().on('move.intro drawn.intro', function() {
51609 revealEditMenu(entity.loc,
51610 t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
51614 }, 300); // after menu visible
51616 context.on('exit.intro', function() {
51617 if (!pointId) return chapter.restart();
51618 var entity = context.hasEntity(pointId);
51619 if (entity) return continueTo(rightClickPoint); // point still exists
51622 context.history().on('change.intro', function(changed) {
51623 if (changed.deleted().length) {
51628 function continueTo(nextStep) {
51629 context.map().on('move.intro drawn.intro', null);
51630 context.history().on('change.intro', null);
51631 context.on('exit.intro', null);
51638 context.history().on('change.intro', function() {
51642 var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
51643 reveal('#bar button.undo-button',
51644 t('intro.points.undo', { button: icon(iconName, 'pre-text') })
51647 function continueTo(nextStep) {
51648 context.history().on('change.intro', null);
51655 dispatch$$1.call('done');
51656 reveal('#id-container',
51657 t('intro.points.play', { next: t('intro.areas.title') }), {
51658 tooltipBox: '.intro-nav-wrap .chapter-area',
51659 buttonText: t('intro.ok'),
51660 buttonCallback: function() { reveal('#id-container'); }
51666 chapter.enter = function() {
51671 chapter.exit = function() {
51672 timeouts.forEach(window.clearTimeout);
51673 context.on('enter.intro exit.intro', null);
51674 context.map().on('move.intro drawn.intro', null);
51675 context.history().on('change.intro', null);
51676 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51677 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51681 chapter.restart = function() {
51687 return utilRebind(chapter, dispatch$$1, 'on');
51690 function uiIntroArea(context, reveal) {
51691 var dispatch$$1 = dispatch('done'),
51692 playground = [-85.63552, 41.94159],
51693 playgroundPreset = context.presets().item('leisure/playground'),
51694 descriptionField = context.presets().field('description'),
51700 title: 'intro.areas.title'
51704 function timeout(f, t$$1) {
51705 timeouts.push(window.setTimeout(f, t$$1));
51709 function eventCancel() {
51710 event.stopPropagation();
51711 event.preventDefault();
51715 function revealPlayground(center, text, options) {
51716 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
51717 var box = pad$1(center, padding, context);
51718 reveal(box, text, options);
51722 function addArea() {
51723 context.enter(modeBrowse(context));
51724 context.history().reset('initial');
51727 var msec = transitionTime(playground, context.map().center());
51728 if (msec) { reveal(null, null, { duration: 0 }); }
51729 context.map().zoom(19).centerEase(playground, msec);
51731 timeout(function() {
51732 var tooltip = reveal('button.add-area',
51733 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
51735 tooltip.selectAll('.tooltip-inner')
51736 .insert('svg', 'span')
51737 .attr('class', 'tooltip-illustration')
51739 .attr('xlink:href', '#landuse-images');
51741 context.on('enter.intro', function(mode) {
51742 if (mode.id !== 'add-area') return;
51743 continueTo(startPlayground);
51747 function continueTo(nextStep) {
51748 context.on('enter.intro', null);
51754 function startPlayground() {
51755 if (context.mode().id !== 'add-area') {
51756 return chapter.restart();
51760 context.map().zoomEase(19.5, 500);
51762 timeout(function() {
51763 revealPlayground(playground,
51764 t('intro.areas.start_playground'), { duration: 250 }
51767 timeout(function() {
51768 context.map().on('move.intro drawn.intro', function() {
51769 revealPlayground(playground,
51770 t('intro.areas.start_playground'), { duration: 0 }
51773 context.on('enter.intro', function(mode) {
51774 if (mode.id !== 'draw-area') return chapter.restart();
51775 continueTo(continuePlayground);
51777 }, 250); // after reveal
51779 }, 550); // after easing
51781 function continueTo(nextStep) {
51782 context.map().on('move.intro drawn.intro', null);
51783 context.on('enter.intro', null);
51789 function continuePlayground() {
51790 if (context.mode().id !== 'draw-area') {
51791 return chapter.restart();
51795 revealPlayground(playground,
51796 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51800 timeout(function() {
51801 context.map().on('move.intro drawn.intro', function() {
51802 revealPlayground(playground,
51803 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51807 }, 250); // after reveal
51809 context.on('enter.intro', function(mode) {
51810 if (mode.id === 'draw-area') {
51811 var entity = context.hasEntity(context.selectedIDs()[0]);
51812 if (entity && entity.nodes.length >= 6) {
51813 return continueTo(finishPlayground);
51817 } else if (mode.id === 'select') {
51818 areaId = context.selectedIDs()[0];
51819 return continueTo(searchPresets);
51821 return chapter.restart();
51825 function continueTo(nextStep) {
51826 context.map().on('move.intro drawn.intro', null);
51827 context.on('enter.intro', null);
51833 function finishPlayground() {
51834 if (context.mode().id !== 'draw-area') {
51835 return chapter.restart();
51839 revealPlayground(playground,
51840 t('intro.areas.finish_playground'), { duration: 250 }
51843 timeout(function() {
51844 context.map().on('move.intro drawn.intro', function() {
51845 revealPlayground(playground,
51846 t('intro.areas.finish_playground'), { duration: 0 }
51849 }, 250); // after reveal
51851 context.on('enter.intro', function(mode) {
51852 if (mode.id === 'draw-area') {
51854 } else if (mode.id === 'select') {
51855 areaId = context.selectedIDs()[0];
51856 return continueTo(searchPresets);
51858 return chapter.restart();
51862 function continueTo(nextStep) {
51863 context.map().on('move.intro drawn.intro', null);
51864 context.on('enter.intro', null);
51870 function searchPresets() {
51871 if (!areaId || !context.hasEntity(areaId)) {
51874 var ids = context.selectedIDs();
51875 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51876 context.enter(modeSelect(context, [areaId]));
51879 // disallow scrolling
51880 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51882 timeout(function() {
51883 // reset pane, in case user somehow happened to change it..
51884 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51886 d3_select('.preset-search-input')
51887 .on('keydown.intro', null)
51888 .on('keyup.intro', checkPresetSearch);
51890 reveal('.preset-search-input',
51891 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51893 }, 400); // after preset list pane visible..
51895 context.on('enter.intro', function(mode) {
51896 if (!areaId || !context.hasEntity(areaId)) {
51897 return continueTo(addArea);
51900 var ids = context.selectedIDs();
51901 if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51902 // keep the user's area selected..
51903 context.enter(modeSelect(context, [areaId]));
51905 // reset pane, in case user somehow happened to change it..
51906 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51907 // disallow scrolling
51908 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51910 d3_select('.preset-search-input')
51911 .on('keydown.intro', null)
51912 .on('keyup.intro', checkPresetSearch);
51914 reveal('.preset-search-input',
51915 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51918 context.history().on('change.intro', null);
51922 function checkPresetSearch() {
51923 var first = d3_select('.preset-list-item:first-child');
51925 if (first.classed('preset-leisure-playground')) {
51926 reveal(first.select('.preset-list-button').node(),
51927 t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51931 d3_select('.preset-search-input')
51932 .on('keydown.intro', eventCancel, true)
51933 .on('keyup.intro', null);
51935 context.history().on('change.intro', function() {
51936 continueTo(clickAddField);
51941 function continueTo(nextStep) {
51942 d3_select('.inspector-wrap').on('wheel.intro', null);
51943 context.on('enter.intro', null);
51944 context.history().on('change.intro', null);
51945 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51951 function clickAddField() {
51952 if (!areaId || !context.hasEntity(areaId)) {
51955 var ids = context.selectedIDs();
51956 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51957 return searchPresets();
51960 if (!d3_select('.form-field-description').empty()) {
51961 return continueTo(describePlayground);
51964 // disallow scrolling
51965 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51967 timeout(function() {
51968 // reset pane, in case user somehow happened to change it..
51969 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51971 // It's possible for the user to add a description in a previous step..
51972 // If they did this already, just continue to next step.
51973 var entity = context.entity(areaId);
51974 if (entity.tags.description) {
51975 return continueTo(play);
51978 // scroll "Add field" into view
51979 var box = d3_select('.more-fields').node().getBoundingClientRect();
51980 if (box.top > 300) {
51981 var pane = d3_select('.entity-editor-pane .inspector-body');
51982 var start = pane.node().scrollTop;
51983 var end = start + (box.top - 300);
51988 .tween('scroll.inspector', function() {
51990 var i = d3_interpolateNumber(start, end);
51991 return function(t$$1) {
51992 node.scrollTop = i(t$$1);
51997 timeout(function() {
51998 reveal('.more-fields .combobox-input',
51999 t('intro.areas.add_field'),
52003 d3_select('.more-fields .combobox-input')
52004 .on('click.intro', function() {
52005 continueTo(chooseDescriptionField);
52007 }, 300); // after "Add Field" visible
52009 }, 400); // after editor pane visible
52011 context.on('exit.intro', function() {
52012 return continueTo(searchPresets);
52015 function continueTo(nextStep) {
52016 d3_select('.inspector-wrap').on('wheel.intro', null);
52017 d3_select('.more-fields .combobox-input').on('click.intro', null);
52018 context.on('exit.intro', null);
52024 function chooseDescriptionField() {
52025 if (!areaId || !context.hasEntity(areaId)) {
52028 var ids = context.selectedIDs();
52029 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52030 return searchPresets();
52033 if (!d3_select('.form-field-description').empty()) {
52034 return continueTo(describePlayground);
52037 // Make sure combobox is ready..
52038 if (d3_select('div.combobox').empty()) {
52039 return continueTo(clickAddField);
52041 // Watch for the combobox to go away..
52043 watcher = window.setInterval(function() {
52044 if (d3_select('div.combobox').empty()) {
52045 window.clearInterval(watcher);
52046 timeout(function() {
52047 if (d3_select('.form-field-description').empty()) {
52048 continueTo(retryChooseDescription);
52050 continueTo(describePlayground);
52052 }, 300); // after description field added.
52056 reveal('div.combobox',
52057 t('intro.areas.choose_field', { field: descriptionField.label() }),
52061 context.on('exit.intro', function() {
52062 return continueTo(searchPresets);
52065 function continueTo(nextStep) {
52066 if (watcher) window.clearInterval(watcher);
52067 context.on('exit.intro', null);
52073 function describePlayground() {
52074 if (!areaId || !context.hasEntity(areaId)) {
52077 var ids = context.selectedIDs();
52078 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52079 return searchPresets();
52082 // reset pane, in case user happened to change it..
52083 d3_select('.inspector-wrap .panewrap').style('right', '0%');
52085 if (d3_select('.form-field-description').empty()) {
52086 return continueTo(retryChooseDescription);
52089 context.on('exit.intro', function() {
52093 reveal('.entity-editor-pane',
52094 t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
52098 function continueTo(nextStep) {
52099 context.on('exit.intro', null);
52105 function retryChooseDescription() {
52106 if (!areaId || !context.hasEntity(areaId)) {
52109 var ids = context.selectedIDs();
52110 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52111 return searchPresets();
52114 // reset pane, in case user happened to change it..
52115 d3_select('.inspector-wrap .panewrap').style('right', '0%');
52117 reveal('.entity-editor-pane',
52118 t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
52119 buttonText: t('intro.ok'),
52120 buttonCallback: function() { continueTo(clickAddField); }
52123 context.on('exit.intro', function() {
52124 return continueTo(searchPresets);
52127 function continueTo(nextStep) {
52128 context.on('exit.intro', null);
52135 dispatch$$1.call('done');
52136 reveal('#id-container',
52137 t('intro.areas.play', { next: t('intro.lines.title') }), {
52138 tooltipBox: '.intro-nav-wrap .chapter-line',
52139 buttonText: t('intro.ok'),
52140 buttonCallback: function() { reveal('#id-container'); }
52146 chapter.enter = function() {
52151 chapter.exit = function() {
52152 timeouts.forEach(window.clearTimeout);
52153 context.on('enter.intro exit.intro', null);
52154 context.map().on('move.intro drawn.intro', null);
52155 context.history().on('change.intro', null);
52156 d3_select('.inspector-wrap').on('wheel.intro', null);
52157 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
52158 d3_select('.more-fields .combobox-input').on('click.intro', null);
52162 chapter.restart = function() {
52168 return utilRebind(chapter, dispatch$$1, 'on');
52171 function uiIntroLine(context, reveal) {
52172 var dispatch$$1 = dispatch('done'),
52174 tulipRoadId = null,
52175 flowerRoadId = 'w646',
52176 tulipRoadStart = [-85.6297754121684, 41.95805253325314],
52177 tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
52178 tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
52179 roadCategory = context.presets().item('category-road'),
52180 residentialPreset = context.presets().item('highway/residential'),
52181 woodRoadId = 'w525',
52182 woodRoadEndId = 'n2862',
52183 woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
52184 woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
52185 woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
52186 washingtonStreetId = 'w522',
52187 twelfthAvenueId = 'w1',
52188 eleventhAvenueEndId = 'n3550',
52189 twelfthAvenueEndId = 'n5',
52190 washingtonSegmentId = null,
52191 eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
52192 twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
52193 deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
52194 twelfthAvenue = [-85.62219310052491, 41.952505413152956];
52198 title: 'intro.lines.title'
52202 function timeout(f, t$$1) {
52203 timeouts.push(window.setTimeout(f, t$$1));
52207 function eventCancel() {
52208 event.stopPropagation();
52209 event.preventDefault();
52213 function revealEditMenu(loc, text, options) {
52214 var rect = context.surfaceRect();
52215 var point = context.curtainProjection(loc);
52217 var width = 250 + (2 * pad);
52219 var startX = rect.left + point[0];
52220 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52223 top: point[1] + rect.top - 60,
52227 reveal(box, text, options);
52231 function addLine() {
52232 context.enter(modeBrowse(context));
52233 context.history().reset('initial');
52235 var msec = transitionTime(tulipRoadStart, context.map().center());
52236 if (msec) { reveal(null, null, { duration: 0 }); }
52237 context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
52239 timeout(function() {
52240 var tooltip = reveal('button.add-line',
52241 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
52243 tooltip.selectAll('.tooltip-inner')
52244 .insert('svg', 'span')
52245 .attr('class', 'tooltip-illustration')
52247 .attr('xlink:href', '#feature-images');
52249 context.on('enter.intro', function(mode) {
52250 if (mode.id !== 'add-line') return;
52251 continueTo(startLine);
52255 function continueTo(nextStep) {
52256 context.on('enter.intro', null);
52262 function startLine() {
52263 if (context.mode().id !== 'add-line') {
52264 return chapter.restart();
52267 tulipRoadId = null;
52269 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
52270 var box = pad$1(tulipRoadStart, padding, context);
52271 box.height = box.height + 100;
52272 reveal(box, t('intro.lines.start_line'));
52274 context.map().on('move.intro drawn.intro', function() {
52275 padding = 70 * Math.pow(2, context.map().zoom() - 18);
52276 box = pad$1(tulipRoadStart, padding, context);
52277 box.height = box.height + 100;
52278 reveal(box, t('intro.lines.start_line'), { duration: 0 });
52281 context.on('enter.intro', function(mode) {
52282 if (mode.id !== 'draw-line') return chapter.restart();
52283 continueTo(drawLine);
52286 function continueTo(nextStep) {
52287 context.map().on('move.intro drawn.intro', null);
52288 context.on('enter.intro', null);
52294 function drawLine() {
52295 if (context.mode().id !== 'draw-line') {
52296 return chapter.restart();
52299 tulipRoadId = context.mode().selectedIDs()[0];
52300 context.map().centerEase(tulipRoadMidpoint, 500);
52302 timeout(function() {
52303 var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
52304 var box = pad$1(tulipRoadMidpoint, padding, context);
52305 box.height = box.height * 2;
52307 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
52310 context.map().on('move.intro drawn.intro', function() {
52311 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
52312 box = pad$1(tulipRoadMidpoint, padding, context);
52313 box.height = box.height * 2;
52315 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
52319 }, 550); // after easing..
52321 context.history().on('change.intro', function() {
52322 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52323 if (!entity) return chapter.restart();
52325 if (isLineConnected()) {
52326 continueTo(continueLine);
52330 context.on('enter.intro', function(mode) {
52331 if (mode.id === 'draw-line')
52333 else if (mode.id === 'select') {
52334 continueTo(retryIntersect);
52338 return chapter.restart();
52341 function continueTo(nextStep) {
52342 context.map().on('move.intro drawn.intro', null);
52343 context.history().on('change.intro', null);
52344 context.on('enter.intro', null);
52350 function isLineConnected() {
52351 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52352 if (!entity) return false;
52354 var drawNodes = context.graph().childNodes(entity);
52355 return some(drawNodes, function(node) {
52356 return some(context.graph().parentWays(node), function(parent) {
52357 return parent.id === flowerRoadId;
52363 function retryIntersect() {
52364 d3_select(window).on('mousedown.intro', eventCancel, true);
52366 var box = pad$1(tulipRoadIntersection, 80, context);
52368 t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
52371 timeout(chapter.restart, 3000);
52375 function continueLine() {
52376 if (context.mode().id !== 'draw-line') return chapter.restart();
52377 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52378 if (!entity) return chapter.restart();
52380 context.map().centerEase(tulipRoadIntersection, 500);
52382 reveal('#surface', t('intro.lines.continue_line'));
52384 context.on('enter.intro', function(mode) {
52385 if (mode.id === 'draw-line')
52387 else if (mode.id === 'select')
52388 return continueTo(chooseCategoryRoad);
52390 return chapter.restart();
52393 function continueTo(nextStep) {
52394 context.on('enter.intro', null);
52400 function chooseCategoryRoad() {
52401 if (context.mode().id !== 'select') {
52402 return chapter.restart();
52405 context.on('exit.intro', function() {
52406 return chapter.restart();
52409 var button = d3_select('.preset-category-road .preset-list-button');
52410 if (button.empty()) return chapter.restart();
52412 // disallow scrolling
52413 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52415 timeout(function() {
52416 // reset pane, in case user somehow happened to change it..
52417 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52419 reveal(button.node(),
52420 t('intro.lines.choose_category_road', { category: roadCategory.name() })
52423 button.on('click.intro', function() {
52424 continueTo(choosePresetResidential);
52427 }, 400); // after editor pane visible
52429 function continueTo(nextStep) {
52430 d3_select('.inspector-wrap').on('wheel.intro', null);
52431 d3_select('.preset-list-button').on('click.intro', null);
52432 context.on('exit.intro', null);
52438 function choosePresetResidential() {
52439 if (context.mode().id !== 'select') {
52440 return chapter.restart();
52443 context.on('exit.intro', function() {
52444 return chapter.restart();
52447 var subgrid = d3_select('.preset-category-road .subgrid');
52448 if (subgrid.empty()) return chapter.restart();
52450 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
52451 .on('click.intro', function() {
52452 continueTo(retryPresetResidential);
52455 subgrid.selectAll('.preset-highway-residential .preset-list-button')
52456 .on('click.intro', function() {
52457 continueTo(nameRoad);
52460 timeout(function() {
52461 reveal(subgrid.node(),
52462 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
52463 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
52467 function continueTo(nextStep) {
52468 d3_select('.preset-list-button').on('click.intro', null);
52469 context.on('exit.intro', null);
52475 // selected wrong road type
52476 function retryPresetResidential() {
52477 if (context.mode().id !== 'select') {
52478 return chapter.restart();
52481 context.on('exit.intro', function() {
52482 return chapter.restart();
52485 // disallow scrolling
52486 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52488 timeout(function() {
52489 var button = d3_select('.entity-editor-pane .preset-list-button');
52491 reveal(button.node(),
52492 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
52495 button.on('click.intro', function() {
52496 continueTo(chooseCategoryRoad);
52501 function continueTo(nextStep) {
52502 d3_select('.inspector-wrap').on('wheel.intro', null);
52503 d3_select('.preset-list-button').on('click.intro', null);
52504 context.on('exit.intro', null);
52510 function nameRoad() {
52511 context.on('exit.intro', function() {
52512 continueTo(didNameRoad);
52515 timeout(function() {
52516 reveal('.entity-editor-pane',
52517 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
52518 { tooltipClass: 'intro-lines-name_road' }
52522 function continueTo(nextStep) {
52523 context.on('exit.intro', null);
52529 function didNameRoad() {
52530 context.history().checkpoint('doneAddLine');
52532 timeout(function() {
52533 reveal('#surface', t('intro.lines.did_name_road'), {
52534 buttonText: t('intro.ok'),
52535 buttonCallback: function() { continueTo(updateLine); }
52539 function continueTo(nextStep) {
52545 function updateLine() {
52546 context.history().reset('doneAddLine');
52547 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52548 return chapter.restart();
52551 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
52552 if (msec) { reveal(null, null, { duration: 0 }); }
52553 context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
52555 timeout(function() {
52556 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52557 var box = pad$1(woodRoadDragMidpoint, padding, context);
52558 var advance = function() { continueTo(addNode); };
52560 reveal(box, t('intro.lines.update_line'),
52561 { buttonText: t('intro.ok'), buttonCallback: advance }
52564 context.map().on('move.intro drawn.intro', function() {
52565 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52566 var box = pad$1(woodRoadDragMidpoint, padding, context);
52567 reveal(box, t('intro.lines.update_line'),
52568 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52573 function continueTo(nextStep) {
52574 context.map().on('move.intro drawn.intro', null);
52580 function addNode() {
52581 context.history().reset('doneAddLine');
52582 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52583 return chapter.restart();
52586 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52587 var box = pad$1(woodRoadAddNode, padding, context);
52588 reveal(box, t('intro.lines.add_node'));
52590 context.map().on('move.intro drawn.intro', function() {
52591 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52592 var box = pad$1(woodRoadAddNode, padding, context);
52593 reveal(box, t('intro.lines.add_node'), { duration: 0 });
52596 context.history().on('change.intro', function(changed) {
52597 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52598 return continueTo(updateLine);
52600 if (changed.created().length === 1) {
52601 timeout(function() { continueTo(startDragEndpoint); }, 500);
52605 context.on('enter.intro', function(mode) {
52606 if (mode.id !== 'select') {
52607 continueTo(updateLine);
52611 function continueTo(nextStep) {
52612 context.map().on('move.intro drawn.intro', null);
52613 context.history().on('change.intro', null);
52614 context.on('enter.intro', null);
52620 function startDragEndpoint() {
52621 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52622 return continueTo(updateLine);
52624 if (context.selectedIDs().indexOf(woodRoadId) === -1) {
52625 context.enter(modeSelect(context, [woodRoadId]));
52628 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52629 var box = pad$1(woodRoadDragEndpoint, padding, context);
52630 reveal(box, t('intro.lines.start_drag_endpoint'));
52632 context.map().on('move.intro drawn.intro', function() {
52633 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52634 return continueTo(updateLine);
52636 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52637 var box = pad$1(woodRoadDragEndpoint, padding, context);
52638 reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
52640 var entity = context.entity(woodRoadEndId);
52641 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
52642 continueTo(finishDragEndpoint);
52646 context.on('enter.intro', function(mode) {
52647 if (mode.id !== 'select') {
52648 // keep Wood Road selected so endpoint stays draggable..
52649 context.enter(modeSelect(context, [woodRoadId]));
52653 function continueTo(nextStep) {
52654 context.map().on('move.intro drawn.intro', null);
52655 context.on('enter.intro', null);
52661 function finishDragEndpoint() {
52662 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52663 return continueTo(updateLine);
52666 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52667 var box = pad$1(woodRoadDragEndpoint, padding, context);
52668 reveal(box, t('intro.lines.finish_drag_endpoint'));
52670 context.map().on('move.intro drawn.intro', function() {
52671 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52672 return continueTo(updateLine);
52674 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52675 var box = pad$1(woodRoadDragEndpoint, padding, context);
52676 reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
52678 var entity = context.entity(woodRoadEndId);
52679 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
52680 continueTo(startDragEndpoint);
52684 context.on('enter.intro', function() {
52685 continueTo(startDragMidpoint);
52688 function continueTo(nextStep) {
52689 context.map().on('move.intro drawn.intro', null);
52690 context.on('enter.intro', null);
52696 function startDragMidpoint() {
52697 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52698 return continueTo(updateLine);
52700 if (context.selectedIDs().indexOf(woodRoadId) === -1) {
52701 context.enter(modeSelect(context, [woodRoadId]));
52704 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52705 var box = pad$1(woodRoadDragMidpoint, padding, context);
52706 reveal(box, t('intro.lines.start_drag_midpoint'));
52708 context.map().on('move.intro drawn.intro', function() {
52709 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52710 return continueTo(updateLine);
52712 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52713 var box = pad$1(woodRoadDragMidpoint, padding, context);
52714 reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
52717 context.history().on('change.intro', function(changed) {
52718 if (changed.created().length === 1) {
52719 continueTo(continueDragMidpoint);
52723 context.on('enter.intro', function(mode) {
52724 if (mode.id !== 'select') {
52725 // keep Wood Road selected so midpoint triangles are drawn..
52726 context.enter(modeSelect(context, [woodRoadId]));
52730 function continueTo(nextStep) {
52731 context.map().on('move.intro drawn.intro', null);
52732 context.history().on('change.intro', null);
52733 context.on('enter.intro', null);
52739 function continueDragMidpoint() {
52740 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52741 return continueTo(updateLine);
52744 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52745 var box = pad$1(woodRoadDragEndpoint, padding, context);
52748 var advance = function() {
52749 context.history().checkpoint('doneUpdateLine');
52750 continueTo(deleteLines);
52753 reveal(box, t('intro.lines.continue_drag_midpoint'),
52754 { buttonText: t('intro.ok'), buttonCallback: advance }
52757 context.map().on('move.intro drawn.intro', function() {
52758 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52759 return continueTo(updateLine);
52761 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52762 var box = pad$1(woodRoadDragEndpoint, padding, context);
52764 reveal(box, t('intro.lines.continue_drag_midpoint'),
52765 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52769 function continueTo(nextStep) {
52770 context.map().on('move.intro drawn.intro', null);
52776 function deleteLines() {
52777 context.history().reset('doneUpdateLine');
52778 context.enter(modeBrowse(context));
52780 if (!context.hasEntity(washingtonStreetId) ||
52781 !context.hasEntity(twelfthAvenueId) ||
52782 !context.hasEntity(eleventhAvenueEndId)) {
52783 return chapter.restart();
52786 var msec = transitionTime(deleteLinesLoc, context.map().center());
52787 if (msec) { reveal(null, null, { duration: 0 }); }
52788 context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52790 timeout(function() {
52791 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52792 var box = pad$1(deleteLinesLoc, padding, context);
52795 var advance = function() { continueTo(rightClickIntersection); };
52797 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52798 { buttonText: t('intro.ok'), buttonCallback: advance }
52801 context.map().on('move.intro drawn.intro', function() {
52802 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52803 var box = pad$1(deleteLinesLoc, padding, context);
52806 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52807 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52811 context.history().on('change.intro', function() {
52812 timeout(function() {
52813 continueTo(deleteLines);
52814 }, 500); // after any transition (e.g. if user deleted intersection)
52819 function continueTo(nextStep) {
52820 context.map().on('move.intro drawn.intro', null);
52821 context.history().on('change.intro', null);
52827 function rightClickIntersection() {
52828 context.history().reset('doneUpdateLine');
52829 context.enter(modeBrowse(context));
52831 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52833 timeout(function() {
52834 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52835 var box = pad$1(eleventhAvenueEnd, padding, context);
52836 reveal(box, t('intro.lines.rightclick_intersection',
52837 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52840 context.map().on('move.intro drawn.intro', function() {
52841 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52842 var box = pad$1(eleventhAvenueEnd, padding, context);
52843 reveal(box, t('intro.lines.rightclick_intersection',
52844 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52849 context.on('enter.intro', function(mode) {
52850 if (mode.id !== 'select') return;
52851 var ids = context.selectedIDs();
52852 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52854 timeout(function() {
52855 var node = selectMenuItem('split').node();
52857 continueTo(splitIntersection);
52858 }, 300); // after menu visible
52861 context.history().on('change.intro', function() {
52862 timeout(function() {
52863 continueTo(deleteLines);
52864 }, 300); // after any transition (e.g. if user deleted intersection)
52869 function continueTo(nextStep) {
52870 context.map().on('move.intro drawn.intro', null);
52871 context.on('enter.intro', null);
52872 context.history().on('change.intro', null);
52878 function splitIntersection() {
52879 if (!context.hasEntity(washingtonStreetId) ||
52880 !context.hasEntity(twelfthAvenueId) ||
52881 !context.hasEntity(eleventhAvenueEndId)) {
52882 return continueTo(deleteLines);
52885 var node = selectMenuItem('split').node();
52886 if (!node) { return continueTo(rightClickIntersection); }
52888 var wasChanged = false;
52889 var menuCoords = context.map().mouseCoordinates();
52890 washingtonSegmentId = null;
52892 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52893 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52896 context.map().on('move.intro drawn.intro', function() {
52897 var node = selectMenuItem('split').node();
52898 if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52900 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52901 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52906 context.history().on('change.intro', function(changed) {
52908 timeout(function() {
52909 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52910 washingtonSegmentId = changed.created()[0].id;
52911 continueTo(didSplit);
52913 washingtonSegmentId = null;
52914 continueTo(retrySplit);
52916 }, 300); // after any transition (e.g. if user deleted intersection)
52919 function continueTo(nextStep) {
52920 context.map().on('move.intro drawn.intro', null);
52921 context.history().on('change.intro', null);
52927 function retrySplit() {
52928 context.enter(modeBrowse(context));
52929 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52930 var advance = function() { continueTo(rightClickIntersection); };
52932 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52933 var box = pad$1(eleventhAvenueEnd, padding, context);
52934 reveal(box, t('intro.lines.retry_split'),
52935 { buttonText: t('intro.ok'), buttonCallback: advance }
52938 context.map().on('move.intro drawn.intro', function() {
52939 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52940 var box = pad$1(eleventhAvenueEnd, padding, context);
52941 reveal(box, t('intro.lines.retry_split'),
52942 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52946 function continueTo(nextStep) {
52947 context.map().on('move.intro drawn.intro', null);
52953 function didSplit() {
52954 if (!washingtonSegmentId ||
52955 !context.hasEntity(washingtonSegmentId) ||
52956 !context.hasEntity(washingtonStreetId) ||
52957 !context.hasEntity(twelfthAvenueId) ||
52958 !context.hasEntity(eleventhAvenueEndId)) {
52959 return continueTo(rightClickIntersection);
52962 var ids = context.selectedIDs();
52963 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52964 var street = t('intro.graph.name.washington-street');
52966 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52967 var box = pad$1(twelfthAvenue, padding, context);
52968 box.width = box.width / 2;
52969 reveal(box, t(string, { street1: street, street2: street }),
52973 timeout(function() {
52974 context.map().zoom(18).centerEase(twelfthAvenue, 500);
52976 context.map().on('move.intro drawn.intro', function() {
52977 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52978 var box = pad$1(twelfthAvenue, padding, context);
52979 box.width = box.width / 2;
52980 reveal(box, t(string, { street1: street, street2: street }),
52984 }, 600); // after initial reveal and curtain cut
52986 context.on('enter.intro', function() {
52987 var ids = context.selectedIDs();
52988 if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52989 continueTo(multiSelect);
52993 context.history().on('change.intro', function() {
52994 if (!washingtonSegmentId ||
52995 !context.hasEntity(washingtonSegmentId) ||
52996 !context.hasEntity(washingtonStreetId) ||
52997 !context.hasEntity(twelfthAvenueId) ||
52998 !context.hasEntity(eleventhAvenueEndId)) {
52999 return continueTo(rightClickIntersection);
53003 function continueTo(nextStep) {
53004 context.map().on('move.intro drawn.intro', null);
53005 context.on('enter.intro', null);
53006 context.history().on('change.intro', null);
53012 function multiSelect() {
53013 if (!washingtonSegmentId ||
53014 !context.hasEntity(washingtonSegmentId) ||
53015 !context.hasEntity(washingtonStreetId) ||
53016 !context.hasEntity(twelfthAvenueId) ||
53017 !context.hasEntity(eleventhAvenueEndId)) {
53018 return continueTo(rightClickIntersection);
53021 var ids = context.selectedIDs();
53022 var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
53023 var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
53025 if (hasWashington && hasTwelfth) {
53026 return continueTo(multiRightClick);
53027 } else if (!hasWashington && !hasTwelfth) {
53028 return continueTo(didSplit);
53031 context.map().zoom(18).centerEase(twelfthAvenue, 500);
53033 timeout(function() {
53034 var selected, other, padding, box;
53035 if (hasWashington) {
53036 selected = t('intro.graph.name.washington-street');
53037 other = t('intro.graph.name.12th-avenue');
53038 padding = 60 * Math.pow(2, context.map().zoom() - 18);
53039 box = pad$1(twelfthAvenueEnd, padding, context);
53042 selected = t('intro.graph.name.12th-avenue');
53043 other = t('intro.graph.name.washington-street');
53044 padding = 200 * Math.pow(2, context.map().zoom() - 18);
53045 box = pad$1(twelfthAvenue, padding, context);
53050 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
53053 context.map().on('move.intro drawn.intro', function() {
53054 if (hasWashington) {
53055 selected = t('intro.graph.name.washington-street');
53056 other = t('intro.graph.name.12th-avenue');
53057 padding = 60 * Math.pow(2, context.map().zoom() - 18);
53058 box = pad$1(twelfthAvenueEnd, padding, context);
53061 selected = t('intro.graph.name.12th-avenue');
53062 other = t('intro.graph.name.washington-street');
53063 padding = 200 * Math.pow(2, context.map().zoom() - 18);
53064 box = pad$1(twelfthAvenue, padding, context);
53069 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
53074 context.on('enter.intro', function() {
53075 continueTo(multiSelect);
53078 context.history().on('change.intro', function() {
53079 if (!washingtonSegmentId ||
53080 !context.hasEntity(washingtonSegmentId) ||
53081 !context.hasEntity(washingtonStreetId) ||
53082 !context.hasEntity(twelfthAvenueId) ||
53083 !context.hasEntity(eleventhAvenueEndId)) {
53084 return continueTo(rightClickIntersection);
53089 function continueTo(nextStep) {
53090 context.map().on('move.intro drawn.intro', null);
53091 context.on('enter.intro', null);
53092 context.history().on('change.intro', null);
53098 function multiRightClick() {
53099 if (!washingtonSegmentId ||
53100 !context.hasEntity(washingtonSegmentId) ||
53101 !context.hasEntity(washingtonStreetId) ||
53102 !context.hasEntity(twelfthAvenueId) ||
53103 !context.hasEntity(eleventhAvenueEndId)) {
53104 return continueTo(rightClickIntersection);
53107 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53108 var box = pad$1(twelfthAvenue, padding, context);
53109 reveal(box, t('intro.lines.multi_rightclick'));
53111 context.map().on('move.intro drawn.intro', function() {
53112 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53113 var box = pad$1(twelfthAvenue, padding, context);
53114 reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
53117 d3_select(window).on('click.intro contextmenu.intro', function() {
53118 timeout(function() {
53119 var ids = context.selectedIDs();
53120 if (ids.length === 2 &&
53121 ids.indexOf(twelfthAvenueId) !== -1 &&
53122 ids.indexOf(washingtonSegmentId) !== -1) {
53123 var node = selectMenuItem('delete').node();
53125 continueTo(multiDelete);
53126 } else if (ids.length === 1 &&
53127 ids.indexOf(washingtonSegmentId) !== -1) {
53128 return continueTo(multiSelect);
53130 return continueTo(didSplit);
53132 }, 300); // after edit menu visible
53135 context.history().on('change.intro', function() {
53136 if (!washingtonSegmentId ||
53137 !context.hasEntity(washingtonSegmentId) ||
53138 !context.hasEntity(washingtonStreetId) ||
53139 !context.hasEntity(twelfthAvenueId) ||
53140 !context.hasEntity(eleventhAvenueEndId)) {
53141 return continueTo(rightClickIntersection);
53145 function continueTo(nextStep) {
53146 context.map().on('move.intro drawn.intro', null);
53147 d3_select(window).on('click.intro contextmenu.intro', null, true);
53148 context.history().on('change.intro', null);
53154 function multiDelete() {
53155 if (!washingtonSegmentId ||
53156 !context.hasEntity(washingtonSegmentId) ||
53157 !context.hasEntity(washingtonStreetId) ||
53158 !context.hasEntity(twelfthAvenueId) ||
53159 !context.hasEntity(eleventhAvenueEndId)) {
53160 return continueTo(rightClickIntersection);
53163 var node = selectMenuItem('delete').node();
53164 if (!node) return continueTo(multiRightClick);
53166 var menuCoords = context.map().mouseCoordinates();
53167 revealEditMenu(menuCoords,
53168 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
53171 context.map().on('move.intro drawn.intro', function() {
53172 revealEditMenu(menuCoords,
53173 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
53178 context.on('exit.intro', function() {
53179 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
53180 return continueTo(multiSelect); // left select mode but roads still exist
53184 context.history().on('change.intro', function() {
53185 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
53186 continueTo(retryDelete); // changed something but roads still exist
53192 function continueTo(nextStep) {
53193 context.map().on('move.intro drawn.intro', null);
53194 context.on('exit.intro', null);
53195 context.history().on('change.intro', null);
53201 function retryDelete() {
53202 context.enter(modeBrowse(context));
53204 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53205 var box = pad$1(twelfthAvenue, padding, context);
53206 reveal(box, t('intro.lines.retry_delete'), {
53207 buttonText: t('intro.ok'),
53208 buttonCallback: function() { continueTo(multiSelect); }
53211 function continueTo(nextStep) {
53218 dispatch$$1.call('done');
53219 reveal('#id-container',
53220 t('intro.lines.play', { next: t('intro.buildings.title') }), {
53221 tooltipBox: '.intro-nav-wrap .chapter-building',
53222 buttonText: t('intro.ok'),
53223 buttonCallback: function() { reveal('#id-container'); }
53229 chapter.enter = function() {
53234 chapter.exit = function() {
53235 timeouts.forEach(window.clearTimeout);
53236 d3_select(window).on('mousedown.intro', null, true);
53237 context.on('enter.intro exit.intro', null);
53238 context.map().on('move.intro drawn.intro', null);
53239 context.history().on('change.intro', null);
53240 d3_select('.inspector-wrap').on('wheel.intro', null);
53241 d3_select('.preset-list-button').on('click.intro', null);
53245 chapter.restart = function() {
53251 return utilRebind(chapter, dispatch$$1, 'on');
53254 function uiIntroBuilding(context, reveal) {
53255 var dispatch$$1 = dispatch('done'),
53256 house = [-85.62815, 41.95638],
53257 tank = [-85.62732, 41.95347],
53258 buildingCatetory = context.presets().item('category-building'),
53259 housePreset = context.presets().item('building/house'),
53260 tankPreset = context.presets().item('man_made/storage_tank'),
53267 title: 'intro.buildings.title'
53271 function timeout(f, t$$1) {
53272 timeouts.push(window.setTimeout(f, t$$1));
53276 function eventCancel() {
53277 event.stopPropagation();
53278 event.preventDefault();
53282 function revealHouse(center, text, options) {
53283 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
53284 var box = pad$1(center, padding, context);
53285 reveal(box, text, options);
53289 function revealTank(center, text, options) {
53290 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
53291 var box = pad$1(center, padding, context);
53292 reveal(box, text, options);
53296 function revealEditMenu(loc, text, options) {
53297 var rect = context.surfaceRect();
53298 var point = context.curtainProjection(loc);
53300 var width = 250 + (2 * pad);
53302 var startX = rect.left + point[0];
53303 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
53306 top: point[1] + rect.top - 60,
53310 reveal(box, text, options);
53314 function addHouse() {
53315 context.enter(modeBrowse(context));
53316 context.history().reset('initial');
53319 var msec = transitionTime(house, context.map().center());
53320 if (msec) { reveal(null, null, { duration: 0 }); }
53321 context.map().zoom(19).centerEase(house, msec);
53323 timeout(function() {
53324 var tooltip = reveal('button.add-area',
53325 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
53327 tooltip.selectAll('.tooltip-inner')
53328 .insert('svg', 'span')
53329 .attr('class', 'tooltip-illustration')
53331 .attr('xlink:href', '#building-images');
53333 context.on('enter.intro', function(mode) {
53334 if (mode.id !== 'add-area') return;
53335 continueTo(startHouse);
53339 function continueTo(nextStep) {
53340 context.on('enter.intro', null);
53346 function startHouse() {
53347 if (context.mode().id !== 'add-area') {
53348 return continueTo(addHouse);
53352 context.map().zoomEase(20, 500);
53354 timeout(function() {
53355 revealHouse(house, t('intro.buildings.start_building'));
53357 context.map().on('move.intro drawn.intro', function() {
53358 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
53361 context.on('enter.intro', function(mode) {
53362 if (mode.id !== 'draw-area') return chapter.restart();
53363 continueTo(continueHouse);
53366 }, 550); // after easing
53368 function continueTo(nextStep) {
53369 context.map().on('move.intro drawn.intro', null);
53370 context.on('enter.intro', null);
53376 function continueHouse() {
53377 if (context.mode().id !== 'draw-area') {
53378 return continueTo(addHouse);
53383 revealHouse(house, t('intro.buildings.continue_building'));
53385 context.map().on('move.intro drawn.intro', function() {
53386 revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
53389 context.on('enter.intro', function(mode) {
53390 if (mode.id === 'draw-area') {
53392 } else if (mode.id === 'select') {
53393 var graph = context.graph(),
53394 way = context.entity(context.selectedIDs()[0]),
53395 nodes = graph.childNodes(way),
53396 points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
53398 if (isMostlySquare(points)) {
53400 return continueTo(chooseCategoryBuilding);
53402 return continueTo(retryHouse);
53406 return chapter.restart();
53410 function continueTo(nextStep) {
53411 context.map().on('move.intro drawn.intro', null);
53412 context.on('enter.intro', null);
53418 function retryHouse() {
53419 var onClick = function() { continueTo(addHouse); };
53421 revealHouse(house, t('intro.buildings.retry_building'),
53422 { buttonText: t('intro.ok'), buttonCallback: onClick }
53425 context.map().on('move.intro drawn.intro', function() {
53426 revealHouse(house, t('intro.buildings.retry_building'),
53427 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53431 function continueTo(nextStep) {
53432 context.map().on('move.intro drawn.intro', null);
53438 function chooseCategoryBuilding() {
53439 if (!houseId || !context.hasEntity(houseId)) {
53442 var ids = context.selectedIDs();
53443 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53444 context.enter(modeSelect(context, [houseId]));
53447 // disallow scrolling
53448 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53450 timeout(function() {
53451 // reset pane, in case user somehow happened to change it..
53452 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53454 var button = d3_select('.preset-category-building .preset-list-button');
53456 reveal(button.node(),
53457 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
53460 button.on('click.intro', function() {
53461 button.on('click.intro', null);
53462 continueTo(choosePresetHouse);
53465 }, 400); // after preset list pane visible..
53468 context.on('enter.intro', function(mode) {
53469 if (!houseId || !context.hasEntity(houseId)) {
53470 return continueTo(addHouse);
53472 var ids = context.selectedIDs();
53473 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53474 return continueTo(chooseCategoryBuilding);
53478 function continueTo(nextStep) {
53479 d3_select('.inspector-wrap').on('wheel.intro', null);
53480 d3_select('.preset-list-button').on('click.intro', null);
53481 context.on('enter.intro', null);
53487 function choosePresetHouse() {
53488 if (!houseId || !context.hasEntity(houseId)) {
53491 var ids = context.selectedIDs();
53492 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53493 context.enter(modeSelect(context, [houseId]));
53496 // disallow scrolling
53497 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53499 timeout(function() {
53500 // reset pane, in case user somehow happened to change it..
53501 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53503 var button = d3_select('.preset-building-house .preset-list-button');
53505 reveal(button.node(),
53506 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
53510 button.on('click.intro', function() {
53511 button.on('click.intro', null);
53512 continueTo(closeEditorHouse);
53516 }, 400); // after preset list pane visible..
53518 context.on('enter.intro', function(mode) {
53519 if (!houseId || !context.hasEntity(houseId)) {
53520 return continueTo(addHouse);
53522 var ids = context.selectedIDs();
53523 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53524 return continueTo(chooseCategoryBuilding);
53528 function continueTo(nextStep) {
53529 d3_select('.inspector-wrap').on('wheel.intro', null);
53530 d3_select('.preset-list-button').on('click.intro', null);
53531 context.on('enter.intro', null);
53537 function closeEditorHouse() {
53538 if (!houseId || !context.hasEntity(houseId)) {
53541 var ids = context.selectedIDs();
53542 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53543 context.enter(modeSelect(context, [houseId]));
53546 context.history().checkpoint('hasHouse');
53548 context.on('exit.intro', function() {
53549 continueTo(rightClickHouse);
53552 timeout(function() {
53553 reveal('.entity-editor-pane',
53554 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53558 function continueTo(nextStep) {
53559 context.on('exit.intro', null);
53565 function rightClickHouse() {
53566 if (!houseId) return chapter.restart();
53568 context.enter(modeBrowse(context));
53569 context.history().reset('hasHouse');
53570 context.map().centerEase(house, 500);
53572 timeout(function() {
53573 if (context.map().zoom() < 20) {
53574 context.map().zoomEase(20, 500);
53578 context.on('enter.intro', function(mode) {
53579 if (mode.id !== 'select') return;
53580 var ids = context.selectedIDs();
53581 if (ids.length !== 1 || ids[0] !== houseId) return;
53583 timeout(function() {
53584 var node = selectMenuItem('orthogonalize').node();
53586 continueTo(clickSquare);
53587 }, 300); // after menu visible
53590 context.map().on('move.intro drawn.intro', function() {
53591 revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
53594 context.history().on('change.intro', function() {
53595 continueTo(rightClickHouse);
53598 function continueTo(nextStep) {
53599 context.on('enter.intro', null);
53600 context.map().on('move.intro drawn.intro', null);
53601 context.history().on('change.intro', null);
53607 function clickSquare() {
53608 if (!houseId) return chapter.restart();
53609 var entity = context.hasEntity(houseId);
53610 if (!entity) return continueTo(rightClickHouse);
53612 var node = selectMenuItem('orthogonalize').node();
53613 if (!node) { return continueTo(rightClickHouse); }
53615 var wasChanged = false;
53616 var menuCoords = context.map().mouseCoordinates();
53618 revealEditMenu(menuCoords,
53619 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
53622 context.on('enter.intro', function(mode) {
53623 if (mode.id === 'browse') {
53624 continueTo(rightClickHouse);
53625 } else if (mode.id === 'move' || mode.id === 'rotate') {
53626 continueTo(retryClickSquare);
53630 context.map().on('move.intro drawn.intro', function() {
53631 var node = selectMenuItem('orthogonalize').node();
53632 if (!wasChanged && !node) { return continueTo(rightClickHouse); }
53634 revealEditMenu(menuCoords,
53635 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
53640 context.history().on('change.intro', function() {
53642 context.history().on('change.intro', null);
53644 // Something changed. Wait for transition to complete and check undo annotation.
53645 timeout(function() {
53646 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
53647 continueTo(doneSquare);
53649 continueTo(retryClickSquare);
53651 }, 500); // after transitioned actions
53654 function continueTo(nextStep) {
53655 context.on('enter.intro', null);
53656 context.map().on('move.intro drawn.intro', null);
53657 context.history().on('change.intro', null);
53663 function retryClickSquare() {
53664 context.enter(modeBrowse(context));
53666 revealHouse(house, t('intro.buildings.retry_square'), {
53667 buttonText: t('intro.ok'),
53668 buttonCallback: function() { continueTo(rightClickHouse); }
53671 function continueTo(nextStep) {
53677 function doneSquare() {
53678 context.history().checkpoint('doneSquare');
53680 revealHouse(house, t('intro.buildings.done_square'), {
53681 buttonText: t('intro.ok'),
53682 buttonCallback: function() { continueTo(addTank); }
53685 function continueTo(nextStep) {
53691 function addTank() {
53692 context.enter(modeBrowse(context));
53693 context.history().reset('doneSquare');
53696 var msec = transitionTime(tank, context.map().center());
53697 if (msec) { reveal(null, null, { duration: 0 }); }
53698 context.map().zoom(19.5).centerEase(tank, msec);
53700 timeout(function() {
53701 reveal('button.add-area',
53702 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
53705 context.on('enter.intro', function(mode) {
53706 if (mode.id !== 'add-area') return;
53707 continueTo(startTank);
53711 function continueTo(nextStep) {
53712 context.on('enter.intro', null);
53718 function startTank() {
53719 if (context.mode().id !== 'add-area') {
53720 return continueTo(addTank);
53725 timeout(function() {
53726 revealTank(tank, t('intro.buildings.start_tank'));
53728 context.map().on('move.intro drawn.intro', function() {
53729 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
53732 context.on('enter.intro', function(mode) {
53733 if (mode.id !== 'draw-area') return chapter.restart();
53734 continueTo(continueTank);
53737 }, 550); // after easing
53739 function continueTo(nextStep) {
53740 context.map().on('move.intro drawn.intro', null);
53741 context.on('enter.intro', null);
53747 function continueTank() {
53748 if (context.mode().id !== 'draw-area') {
53749 return continueTo(addTank);
53754 revealTank(tank, t('intro.buildings.continue_tank'));
53756 context.map().on('move.intro drawn.intro', function() {
53757 revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53760 context.on('enter.intro', function(mode) {
53761 if (mode.id === 'draw-area') {
53763 } else if (mode.id === 'select') {
53764 tankId = context.selectedIDs()[0];
53765 return continueTo(searchPresetTank);
53767 return continueTo(addTank);
53771 function continueTo(nextStep) {
53772 context.map().on('move.intro drawn.intro', null);
53773 context.on('enter.intro', null);
53779 function searchPresetTank() {
53780 if (!tankId || !context.hasEntity(tankId)) {
53783 var ids = context.selectedIDs();
53784 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53785 context.enter(modeSelect(context, [tankId]));
53788 // disallow scrolling
53789 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53791 timeout(function() {
53792 // reset pane, in case user somehow happened to change it..
53793 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53795 d3_select('.preset-search-input')
53796 .on('keydown.intro', null)
53797 .on('keyup.intro', checkPresetSearch);
53799 reveal('.preset-search-input',
53800 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53802 }, 400); // after preset list pane visible..
53804 context.on('enter.intro', function(mode) {
53805 if (!tankId || !context.hasEntity(tankId)) {
53806 return continueTo(addTank);
53809 var ids = context.selectedIDs();
53810 if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53811 // keep the user's area selected..
53812 context.enter(modeSelect(context, [tankId]));
53814 // reset pane, in case user somehow happened to change it..
53815 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53816 // disallow scrolling
53817 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53819 d3_select('.preset-search-input')
53820 .on('keydown.intro', null)
53821 .on('keyup.intro', checkPresetSearch);
53823 reveal('.preset-search-input',
53824 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53827 context.history().on('change.intro', null);
53831 function checkPresetSearch() {
53832 var first = d3_select('.preset-list-item:first-child');
53834 if (first.classed('preset-man_made-storage_tank')) {
53835 reveal(first.select('.preset-list-button').node(),
53836 t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53840 d3_select('.preset-search-input')
53841 .on('keydown.intro', eventCancel, true)
53842 .on('keyup.intro', null);
53844 context.history().on('change.intro', function() {
53845 continueTo(closeEditorTank);
53850 function continueTo(nextStep) {
53851 d3_select('.inspector-wrap').on('wheel.intro', null);
53852 context.on('enter.intro', null);
53853 context.history().on('change.intro', null);
53854 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53860 function closeEditorTank() {
53861 if (!tankId || !context.hasEntity(tankId)) {
53864 var ids = context.selectedIDs();
53865 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53866 context.enter(modeSelect(context, [tankId]));
53869 context.history().checkpoint('hasTank');
53871 context.on('exit.intro', function() {
53872 continueTo(rightClickTank);
53875 timeout(function() {
53876 reveal('.entity-editor-pane',
53877 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53881 function continueTo(nextStep) {
53882 context.on('exit.intro', null);
53888 function rightClickTank() {
53889 if (!tankId) return continueTo(addTank);
53891 context.enter(modeBrowse(context));
53892 context.history().reset('hasTank');
53893 context.map().centerEase(tank, 500);
53895 timeout(function() {
53896 context.on('enter.intro', function(mode) {
53897 if (mode.id !== 'select') return;
53898 var ids = context.selectedIDs();
53899 if (ids.length !== 1 || ids[0] !== tankId) return;
53901 timeout(function() {
53902 var node = selectMenuItem('circularize').node();
53904 continueTo(clickCircle);
53905 }, 300); // after menu visible
53908 revealTank(tank, t('intro.buildings.rightclick_tank'));
53910 context.map().on('move.intro drawn.intro', function() {
53911 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53914 context.history().on('change.intro', function() {
53915 continueTo(rightClickTank);
53920 function continueTo(nextStep) {
53921 context.on('enter.intro', null);
53922 context.map().on('move.intro drawn.intro', null);
53923 context.history().on('change.intro', null);
53929 function clickCircle() {
53930 if (!tankId) return chapter.restart();
53931 var entity = context.hasEntity(tankId);
53932 if (!entity) return continueTo(rightClickTank);
53934 var node = selectMenuItem('circularize').node();
53935 if (!node) { return continueTo(rightClickTank); }
53937 var wasChanged = false;
53938 var menuCoords = context.map().mouseCoordinates();
53940 revealEditMenu(menuCoords,
53941 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53944 context.on('enter.intro', function(mode) {
53945 if (mode.id === 'browse') {
53946 continueTo(rightClickTank);
53947 } else if (mode.id === 'move' || mode.id === 'rotate') {
53948 continueTo(retryClickCircle);
53952 context.map().on('move.intro drawn.intro', function() {
53953 var node = selectMenuItem('circularize').node();
53954 if (!wasChanged && !node) { return continueTo(rightClickTank); }
53956 revealEditMenu(menuCoords,
53957 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53962 context.history().on('change.intro', function() {
53964 context.history().on('change.intro', null);
53966 // Something changed. Wait for transition to complete and check undo annotation.
53967 timeout(function() {
53968 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53971 continueTo(retryClickCircle);
53973 }, 500); // after transitioned actions
53976 function continueTo(nextStep) {
53977 context.on('enter.intro', null);
53978 context.map().on('move.intro drawn.intro', null);
53979 context.history().on('change.intro', null);
53985 function retryClickCircle() {
53986 context.enter(modeBrowse(context));
53988 revealTank(tank, t('intro.buildings.retry_circle'), {
53989 buttonText: t('intro.ok'),
53990 buttonCallback: function() { continueTo(rightClickTank); }
53993 function continueTo(nextStep) {
54000 dispatch$$1.call('done');
54001 reveal('#id-container',
54002 t('intro.buildings.play', { next: t('intro.startediting.title') }), {
54003 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
54004 buttonText: t('intro.ok'),
54005 buttonCallback: function() { reveal('#id-container'); }
54011 chapter.enter = function() {
54016 chapter.exit = function() {
54017 timeouts.forEach(window.clearTimeout);
54018 context.on('enter.intro exit.intro', null);
54019 context.map().on('move.intro drawn.intro', null);
54020 context.history().on('change.intro', null);
54021 d3_select('.inspector-wrap').on('wheel.intro', null);
54022 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
54023 d3_select('.more-fields .combobox-input').on('click.intro', null);
54027 chapter.restart = function() {
54033 return utilRebind(chapter, dispatch$$1, 'on');
54036 function uiIntroStartEditing(context, reveal) {
54037 var dispatch$$1 = dispatch('done', 'startEditing'),
54038 modalSelection = d3_select(null);
54042 title: 'intro.startediting.title'
54045 function showHelp() {
54046 reveal('.map-control.help-control',
54047 t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
54048 buttonText: t('intro.ok'),
54049 buttonCallback: function() { shortcuts(); }
54054 function shortcuts() {
54055 reveal('.map-control.help-control',
54056 t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
54057 buttonText: t('intro.ok'),
54058 buttonCallback: function() { showSave(); }
54063 function showSave() {
54064 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
54065 reveal('#bar button.save',
54066 t('intro.startediting.save'), {
54067 buttonText: t('intro.ok'),
54068 buttonCallback: function() { showStart(); }
54073 function showStart() {
54074 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
54076 modalSelection = uiModal(context.container());
54078 modalSelection.select('.modal')
54079 .attr('class', 'modal-splash modal col6');
54081 modalSelection.selectAll('.close').remove();
54083 var startbutton = modalSelection.select('.content')
54084 .attr('class', 'fillL')
54086 .attr('class', 'modal-section huge-modal-button')
54087 .on('click', function() {
54088 modalSelection.remove();
54093 .attr('class', 'illustration')
54095 .attr('xlink:href', '#logo-walkthrough');
54099 .text(t('intro.startediting.start'));
54101 dispatch$$1.call('startEditing');
54105 chapter.enter = function() {
54110 chapter.exit = function() {
54111 modalSelection.remove();
54112 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
54116 return utilRebind(chapter, dispatch$$1, 'on');
54120 welcome: uiIntroWelcome,
54121 navigation: uiIntroNavigation,
54122 point: uiIntroPoint,
54125 building: uiIntroBuilding,
54126 startEditing: uiIntroStartEditing
54129 var chapterFlow = [
54140 function uiIntro(context) {
54141 var introGraph = {},
54145 // create entities for intro graph and localize names
54146 for (var id in dataIntroGraph) {
54147 introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
54151 function intro(selection$$1) {
54152 context.enter(modeBrowse(context));
54154 // Save current map state
54155 var osm = context.connection(),
54156 history = context.history().toJSON(),
54157 hash = window.location.hash,
54158 center = context.map().center(),
54159 zoom = context.map().zoom(),
54160 background = context.background().baseLayerSource(),
54161 overlays = context.background().overlayLayerSources(),
54162 opacity = d3_selectAll('#map .layer-background').style('opacity'),
54163 loadedTiles = osm && osm.loadedTiles(),
54164 baseEntities = context.history().graph().base().entities,
54165 countryCode = services.geocoder.countryCode;
54168 context.inIntro(true);
54170 // Load semi-real data used in intro
54171 if (osm) { osm.toggle(false).reset(); }
54172 context.history().reset();
54173 context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
54174 context.history().checkpoint('initial');
54176 var esri = context.background().findSource('EsriWorldImagery');
54178 context.background().baseLayerSource(esri);
54180 context.background().bing();
54182 overlays.forEach(function (d) {
54183 context.background().toggleOverlayLayer(d);
54187 services.geocoder.countryCode = function(location, callback) {
54188 callback(null, t('intro.graph.countrycode'));
54191 d3_selectAll('#map .layer-background').style('opacity', 1);
54193 var curtain = uiCurtain();
54194 selection$$1.call(curtain);
54196 // store that the user started the walkthrough..
54197 context.storage('walkthrough_started', 'yes');
54199 // restore previous walkthrough progress..
54200 var storedProgress = context.storage('walkthrough_progress') || '';
54201 var progress = storedProgress.split(';').filter(Boolean);
54203 var chapters = chapterFlow.map(function(chapter, i) {
54204 var s = chapterUi[chapter](context, curtain.reveal)
54205 .on('done', function() {
54206 context.presets().init(); // clear away "recent" presets
54208 buttons.filter(function(d) {
54209 return d.title === s.title;
54210 }).classed('finished', true);
54212 if (i < chapterFlow.length - 1) {
54213 var next = chapterFlow[i + 1];
54214 d3_select('button.chapter-' + next)
54215 .classed('next', true);
54218 // store walkthrough progress..
54219 progress.push(chapter);
54220 context.storage('walkthrough_progress', uniq(progress).join(';'));
54225 chapters[chapters.length - 1].on('startEditing', function() {
54226 // store walkthrough progress..
54227 progress.push('startEditing');
54228 context.storage('walkthrough_progress', uniq(progress).join(';'));
54230 // store if walkthrough is completed..
54231 var incomplete = difference(chapterFlow, progress);
54232 if (!incomplete.length) {
54233 context.storage('walkthrough_completed', 'yes');
54238 d3_selectAll('#map .layer-background').style('opacity', opacity);
54239 if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
54240 context.history().reset().merge(values$1(baseEntities));
54241 context.background().baseLayerSource(background);
54242 overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
54243 if (history) { context.history().fromJSON(history, false); }
54244 context.map().centerZoom(center, zoom);
54245 window.location.replace(hash);
54246 services.geocoder.countryCode = countryCode;
54247 context.inIntro(false);
54250 var navwrap = selection$$1
54252 .attr('class', 'intro-nav-wrap fillD');
54256 .attr('class', 'intro-nav-wrap-logo')
54258 .attr('xlink:href', '#logo-walkthrough');
54260 var buttonwrap = navwrap
54262 .attr('class', 'joined')
54263 .selectAll('button.chapter');
54265 var buttons = buttonwrap
54269 .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
54270 .on('click', enterChapter);
54274 .text(function(d) { return t(d.title); });
54278 .attr('class', 'status')
54279 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
54281 enterChapter(chapters[0]);
54284 function enterChapter(newChapter) {
54285 if (currChapter) { currChapter.exit(); }
54286 context.enter(modeBrowse(context));
54288 currChapter = newChapter;
54289 currChapter.enter();
54292 .classed('next', false)
54293 .classed('active', function(d) {
54294 return d.title === currChapter.title;
54303 function uiShortcuts() {
54304 var detected = utilDetect();
54306 var modalSelection;
54307 var savedSelection;
54310 var keybinding = d3keybinding('shortcuts')
54311 .on(t('shortcuts.toggle.key'), function () {
54312 if (d3_selectAll('.modal-shortcuts').size()) { // already showing
54313 if (modalSelection) {
54314 modalSelection.close();
54315 modalSelection = null;
54318 modalSelection = uiModal(savedSelection);
54319 shortcutsModal(modalSelection);
54323 d3_select(document)
54328 function shortcutsModal(modalSelection) {
54329 modalSelection.select('.modal')
54330 .classed('modal-shortcuts', true);
54332 var shortcutsModal = modalSelection.select('.content');
54336 .attr('class', 'modal-section')
54338 .text(t('shortcuts.title'));
54345 function render(selection$$1) {
54346 var wrapper = selection$$1
54347 .selectAll('.wrapper')
54350 var wrapperEnter = wrapper
54353 .attr('class', 'wrapper modal-section');
54355 var tabsBar = wrapperEnter
54357 .attr('class', 'tabs-bar');
54359 var shortcutsList = wrapperEnter
54361 .attr('class', 'shortcuts-list');
54363 wrapper = wrapper.merge(wrapperEnter);
54367 .data(dataShortcuts);
54369 var tabsEnter = tabs
54372 .attr('class', 'tab')
54373 .on('click', function (d, i) {
54375 render(selection$$1);
54380 .text(function (d) { return t(d.text); });
54386 wrapper.selectAll('.tab')
54387 .classed('active', function (d, i) {
54388 return i === activeTab;
54392 var shortcuts = shortcutsList
54393 .selectAll('.shortcut-tab')
54394 .data(dataShortcuts);
54396 var shortcutsEnter = shortcuts
54399 .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54401 var columnsEnter = shortcutsEnter
54402 .selectAll('.shortcut-column')
54403 .data(function (d) { return d.columns; })
54406 .attr('class', 'shortcut-column');
54408 var rowsEnter = columnsEnter
54409 .selectAll('.shortcut-row')
54410 .data(function (d) { return d.rows; })
54413 .attr('class', 'shortcut-row');
54416 var sectionRows = rowsEnter
54417 .filter(function (d) { return !d.shortcuts; });
54424 .attr('class', 'shortcut-section')
54426 .text(function (d) { return t(d.text); });
54429 var shortcutRows = rowsEnter
54430 .filter(function (d) { return d.shortcuts; });
54432 var shortcutKeys = shortcutRows
54434 .attr('class', 'shortcut-keys');
54436 var modifierKeys = shortcutKeys
54437 .filter(function (d) { return d.modifiers; });
54440 .selectAll('kbd.modifier')
54441 .data(function (d) {
54442 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54444 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54447 return d.modifiers;
54451 .each(function () {
54452 var selection$$1 = d3_select(this);
54456 .attr('class', 'modifier')
54457 .text(function (d) { return uiCmd.display(d); });
54466 .selectAll('kbd.shortcut')
54467 .data(function (d) {
54468 var arr = d.shortcuts;
54469 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54471 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54475 return arr.map(function(s) {
54478 separator: d.separator
54483 .each(function (d, i, nodes) {
54484 var selection$$1 = d3_select(this);
54485 var click = d.shortcut.toLowerCase().match(/(.*).click/);
54487 if (click && click[1]) {
54489 .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54493 .attr('class', 'shortcut')
54494 .text(function (d) {
54495 var key = d.shortcut;
54496 return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54500 if (i < nodes.length - 1) {
54503 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54509 .filter(function(d) { return d.gesture; })
54510 .each(function () {
54511 var selection$$1 = d3_select(this);
54519 .attr('class', 'gesture')
54520 .text(function (d) { return t(d.gesture); });
54526 .attr('class', 'shortcut-desc')
54527 .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54530 shortcuts = shortcuts
54531 .merge(shortcutsEnter);
54534 wrapper.selectAll('.shortcut-tab')
54535 .style('display', function (d, i) {
54536 return i === activeTab ? 'flex' : 'none';
54541 return function(selection$$1, show) {
54542 savedSelection = selection$$1;
54544 modalSelection = uiModal(selection$$1);
54545 shortcutsModal(modalSelection);
54550 function uiHelp(context) {
54551 var key = t('help.key');
54555 'help.editing_saving',
54564 var docs = docKeys.map(function(key) {
54567 title: text.split('\n')[0].replace('#', '').trim(),
54568 html: marked(text.split('\n').slice(1).join('\n'))
54573 function help(selection$$1) {
54580 function toggle() {
54581 if (event) event.preventDefault();
54582 tooltipBehavior.hide(button);
54583 setVisible(!button.classed('active'));
54587 function setVisible(show) {
54588 if (show !== shown) {
54589 button.classed('active', show);
54593 selection$$1.on('mousedown.help-inside', function() {
54594 return event.stopPropagation();
54596 pane.style('display', 'block')
54597 .style('right', '-500px')
54600 .style('right', '0px');
54602 pane.style('right', '0px')
54605 .style('right', '-500px')
54606 .on('end', function() {
54607 d3_select(this).style('display', 'none');
54609 selection$$1.on('mousedown.help-inside', null);
54615 function clickHelp(d, i) {
54616 var rtl = (textDirection === 'rtl');
54617 pane.property('scrollTop', 0);
54618 doctitle.html(d.title);
54621 body.selectAll('a')
54622 .attr('target', '_blank');
54623 menuItems.classed('selected', function(m) {
54624 return m.title === d.title;
54629 nav.call(drawNext).call(drawPrevious);
54631 nav.call(drawPrevious).call(drawNext);
54635 function drawNext(selection$$1) {
54636 if (i < docs.length - 1) {
54637 var nextLink = selection$$1
54639 .attr('class', 'next')
54640 .on('click', function() {
54641 clickHelp(docs[i + 1], i + 1);
54646 .text(docs[i + 1].title)
54647 .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
54652 function drawPrevious(selection$$1) {
54654 var prevLink = selection$$1
54656 .attr('class', 'previous')
54657 .on('click', function() {
54658 clickHelp(docs[i - 1], i - 1);
54662 .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
54664 .text(docs[i - 1].title);
54670 function clickWalkthrough() {
54671 if (context.inIntro()) return;
54672 context.container().call(uiIntro(context));
54677 function clickShortcuts() {
54678 context.container().call(uiShortcuts(context), true);
54682 var pane = selection$$1.append('div')
54683 .attr('class', 'help-wrap map-overlay fillL col5 content hide'),
54684 tooltipBehavior = tooltip()
54685 .placement((textDirection === 'rtl') ? 'right' : 'left')
54687 .title(uiTooltipHtml(t('help.title'), key)),
54688 button = selection$$1.append('button')
54689 .attr('tabindex', -1)
54690 .on('click', toggle)
54691 .call(svgIcon('#icon-help', 'light'))
54692 .call(tooltipBehavior),
54696 var toc = pane.append('ul')
54697 .attr('class', 'toc');
54699 var menuItems = toc.selectAll('li')
54704 .html(function(d) { return d.title; })
54705 .on('click', clickHelp);
54707 var shortcuts = toc
54709 .attr('class', 'shortcuts')
54712 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
54716 .on('click', clickShortcuts);
54720 .text(t('shortcuts.title'));
54722 var walkthrough = toc
54724 .attr('class', 'walkthrough')
54726 .on('click', clickWalkthrough);
54730 .attr('class', 'logo logo-walkthrough')
54732 .attr('xlink:href', '#logo-walkthrough');
54736 .text(t('splash.walkthrough'));
54739 var content = pane.append('div')
54740 .attr('class', 'left-content');
54742 var doctitle = content.append('h2')
54743 .text(t('help.title'));
54745 var body = content.append('div')
54746 .attr('class', 'body');
54748 var nav = content.append('div')
54749 .attr('class', 'nav');
54751 clickHelp(docs[0], 0);
54753 var keybinding = d3keybinding('help')
54755 .on([t('background.key'), t('map_data.key')], hide);
54757 d3_select(document)
54760 context.surface().on('mousedown.help-outside', hide);
54761 context.container().on('mousedown.help-outside', hide);
54767 function uiPanelBackground(context) {
54768 var background = context.background();
54769 var currSourceName = null;
54771 var metadataKeys = [
54772 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
54775 var debouncedRedraw = debounce$1(redraw, 250);
54777 function redraw(selection$$1) {
54778 if (currSourceName !== background.baseLayerSource().name()) {
54779 currSourceName = background.baseLayerSource().name();
54783 selection$$1.html('');
54785 var list = selection$$1
54787 .attr('class', 'background-info');
54791 .text(currSourceName);
54793 metadataKeys.forEach(function(k) {
54796 .attr('class', 'background-info-list-' + k)
54797 .classed('hide', !metadata[k])
54798 .text(t('info_panels.background.' + k) + ': ')
54800 .attr('class', 'background-info-span-' + k)
54801 .text(metadata[k]);
54804 debouncedGetMetadata(selection$$1);
54806 var toggle = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
54810 .text(t('info_panels.background.' + toggle))
54812 .attr('class', 'button button-toggle-tiles')
54813 .on('click', function() {
54814 event.preventDefault();
54815 context.setDebug('tile', !context.getDebug('tile'));
54816 selection$$1.call(redraw);
54821 var debouncedGetMetadata = debounce$1(getMetadata, 250);
54823 function getMetadata(selection$$1) {
54824 var tile = d3_select('.layer-background img.tile-center'); // tile near viewport center
54825 if (tile.empty()) return;
54827 var sourceName = currSourceName,
54829 zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
54830 center = context.map().center();
54833 metadata.zoom = String(zoom);
54834 selection$$1.selectAll('.background-info-list-zoom')
54835 .classed('hide', false)
54836 .selectAll('.background-info-span-zoom')
54837 .text(metadata.zoom);
54839 if (!d || !d.length >= 3) return;
54841 background.baseLayerSource().getMetadata(center, d, function(err, result) {
54842 if (err || currSourceName !== sourceName) return;
54845 var vintage = result.vintage;
54846 metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
54847 selection$$1.selectAll('.background-info-list-vintage')
54848 .classed('hide', false)
54849 .selectAll('.background-info-span-vintage')
54850 .text(metadata.vintage);
54852 // update other metdata
54853 without(metadataKeys, 'zoom', 'vintage')
54854 .forEach(function(k) {
54855 var val = result[k];
54857 selection$$1.selectAll('.background-info-list-' + k)
54858 .classed('hide', !val)
54859 .selectAll('.background-info-span-' + k)
54866 var panel = function(selection$$1) {
54867 selection$$1.call(redraw);
54870 .on('drawn.info-background', function() {
54871 selection$$1.call(debouncedRedraw);
54873 .on('move.info-background', function() {
54874 selection$$1.call(debouncedGetMetadata);
54879 panel.off = function() {
54881 .on('drawn.info-background', null)
54882 .on('move.info-background', null);
54885 panel.id = 'background';
54886 panel.title = t('info_panels.background.title');
54887 panel.key = t('info_panels.background.key');
54893 function uiPanelHistory(context) {
54896 function displayTimestamp(entity) {
54897 if (!entity.timestamp) return t('info_panels.history.unknown');
54899 var d = new Date(entity.timestamp);
54900 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
54902 return d.toLocaleString();
54906 function displayUser(selection, entity) {
54907 if (!entity.user) {
54910 .text(t('info_panels.history.unknown'));
54916 .attr('class', 'user-name')
54917 .text(entity.user);
54919 var links = selection
54921 .attr('class', 'links');
54926 .attr('class', 'user-osm-link')
54927 .attr('href', osm.userURL(entity.user))
54928 .attr('target', '_blank')
54929 .attr('tabindex', -1)
54935 .attr('class', 'user-hdyc-link')
54936 .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
54937 .attr('target', '_blank')
54938 .attr('tabindex', -1)
54943 function displayChangeset(selection, entity) {
54944 if (!entity.changeset) {
54947 .text(t('info_panels.history.unknown'));
54953 .attr('class', 'changeset-id')
54954 .text(entity.changeset);
54956 var links = selection
54958 .attr('class', 'links');
54963 .attr('class', 'changeset-osm-link')
54964 .attr('href', osm.changesetURL(entity.changeset))
54965 .attr('target', '_blank')
54966 .attr('tabindex', -1)
54972 .attr('class', 'changeset-osmcha-link')
54973 .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
54974 .attr('target', '_blank')
54975 .attr('tabindex', -1)
54980 function redraw(selection) {
54981 var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
54982 singular = selected.length === 1 ? selected[0] : null;
54984 osm = context.connection();
54986 selection.html('');
54990 .attr('class', 'history-heading')
54991 .text(singular || t('info_panels.history.selected', { n: selected.length }));
54993 if (!singular) return;
54995 var entity = context.entity(singular);
54997 var list = selection
55002 .text(t('info_panels.history.version') + ': ' + entity.version);
55006 .text(t('info_panels.history.last_edit') + ': ' + displayTimestamp(entity));
55010 .text(t('info_panels.history.edited_by') + ': ')
55011 .call(displayUser, entity);
55015 .text(t('info_panels.history.changeset') + ': ')
55016 .call(displayChangeset, entity);
55021 .attr('class', 'view-history-on-osm')
55022 .attr('target', '_blank')
55023 .attr('tabindex', -1)
55024 .attr('href', osm.historyURL(entity))
55025 .call(svgIcon('#icon-out-link', 'inline'))
55027 .text(t('info_panels.history.link_text'));
55032 var panel = function(selection) {
55033 selection.call(redraw);
55036 .on('drawn.info-history', function() {
55037 selection.call(redraw);
55041 panel.off = function() {
55043 .on('drawn.info-history', null);
55046 panel.id = 'history';
55047 panel.title = t('info_panels.history.title');
55048 panel.key = t('info_panels.history.key');
55054 function uiPanelLocation(context) {
55055 var currLocation = '';
55056 var OSM_PRECISION = 7;
55059 function wrap(x, min, max) {
55061 return ((x - min) % d + d) % d + min;
55065 function clamp(x, min, max) {
55066 return Math.max(min, Math.min(x, max));
55070 function redraw(selection) {
55071 selection.html('');
55073 var list = selection
55076 // Mouse coordinates
55077 var coord = context.map().mouseCoordinates();
55078 if (coord.some(isNaN)) {
55079 coord = context.map().center();
55083 clamp(coord[1], -90, 90).toFixed(OSM_PRECISION) + ', ' +
55084 wrap(coord[0], -180, 180).toFixed(OSM_PRECISION);
55093 .attr('class', 'location-info')
55094 .text(currLocation || ' ');
55096 debouncedGetLocation(selection, coord);
55100 var debouncedGetLocation = debounce$1(getLocation, 250);
55101 function getLocation(selection, coord) {
55102 if (!services.geocoder) {
55103 currLocation = t('info_panels.location.unknown_location');
55104 selection.selectAll('.location-info')
55105 .text(currLocation);
55107 services.geocoder.reverse(coord, function(err, result) {
55108 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
55109 selection.selectAll('.location-info')
55110 .text(currLocation);
55116 var panel = function(selection) {
55117 selection.call(redraw);
55120 .on('mousemove.info-location', function() {
55121 selection.call(redraw);
55125 panel.off = function() {
55127 .on('mousemove.info-location', null);
55130 panel.id = 'location';
55131 panel.title = t('info_panels.location.title');
55132 panel.key = t('info_panels.location.key');
55138 function uiPanelMeasurement(context) {
55139 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
55140 var OSM_PRECISION = 7;
55143 function radiansToMeters(r) {
55144 // using WGS84 authalic radius (6371007.1809 m)
55145 return r * 6371007.1809;
55148 function steradiansToSqmeters(r) {
55149 // http://gis.stackexchange.com/a/124857/40446
55150 return r / (4 * Math.PI) * 510065621724000;
55154 function toLineString(feature) {
55155 if (feature.type === 'LineString') return feature;
55157 var result = { type: 'LineString', coordinates: [] };
55158 if (feature.type === 'Polygon') {
55159 result.coordinates = feature.coordinates[0];
55160 } else if (feature.type === 'MultiPolygon') {
55161 result.coordinates = feature.coordinates[0][0];
55168 function displayLength(m) {
55169 var d = m * (isImperial ? 3.28084 : 1),
55188 // drop unnecessary precision
55189 p = d > 1000 ? 0 : d > 100 ? 1 : 2;
55191 return String(d.toFixed(p)) + ' ' + unit;
55195 function displayArea(m2) {
55196 var d = m2 * (isImperial ? 10.7639111056 : 1),
55197 d1, d2, p1, p2, unit1, unit2;
55200 if (d >= 6969600) { // > 0.25mi² show mi²
55208 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
55214 if (d >= 250000) { // > 0.25km² show km²
55222 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
55228 // drop unnecessary precision
55229 p1 = d1 > 1000 ? 0 : d1 > 100 ? 1 : 2;
55230 p2 = d2 > 1000 ? 0 : d2 > 100 ? 1 : 2;
55232 return String(d1.toFixed(p1)) + ' ' + unit1 +
55233 (d2 ? ' (' + String(d2.toFixed(p2)) + ' ' + unit2 + ')' : '');
55237 function redraw(selection$$1) {
55238 var resolver = context.graph(),
55239 selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
55240 singular = selected.length === 1 ? selected[0] : null,
55241 extent = geoExtent$$1(),
55244 selection$$1.html('');
55248 .attr('class', 'measurement-heading')
55249 .text(singular || t('info_panels.measurement.selected', { n: selected.length }));
55251 if (!selected.length) return;
55254 for (var i = 0; i < selected.length; i++) {
55255 entity = context.entity(selected[i]);
55256 extent._extend(entity.extent(resolver));
55258 center = extent.center();
55261 var list = selection$$1
55264 // multiple features, just display extent center..
55268 .text(t('info_panels.measurement.center') + ': ' +
55269 center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
55274 // single feature, display details..
55275 if (!entity) return;
55276 var geometry = entity.geometry(resolver);
55278 if (geometry === 'line' || geometry === 'area') {
55279 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
55280 feature = entity.asGeoJSON(resolver),
55281 length = radiansToMeters(d3_geoLength(toLineString(feature))),
55282 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
55283 centroid = d3_geoCentroid(feature);
55287 .text(t('info_panels.measurement.geometry') + ': ' +
55288 (closed ? t('info_panels.measurement.closed') + ' ' : '') + t('geometry.' + geometry) );
55291 var area = steradiansToSqmeters(entity.area(resolver));
55294 .text(t('info_panels.measurement.area') + ': ' + displayArea(area));
55299 .text(lengthLabel + ': ' + displayLength(length));
55303 .text(t('info_panels.measurement.centroid') + ': ' +
55304 centroid[1].toFixed(OSM_PRECISION) + ', ' + centroid[0].toFixed(OSM_PRECISION)
55308 var toggle = isImperial ? 'imperial' : 'metric';
55312 .text(t('info_panels.measurement.' + toggle))
55314 .attr('class', 'button button-toggle-units')
55315 .on('click', function() {
55316 event.preventDefault();
55317 isImperial = !isImperial;
55318 selection$$1.call(redraw);
55322 var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
55326 .text(t('info_panels.measurement.geometry') + ': ' + t('geometry.' + geometry));
55330 .text(centerLabel + ': ' +
55331 center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
55337 var panel = function(selection$$1) {
55338 selection$$1.call(redraw);
55341 .on('drawn.info-measurement', function() {
55342 selection$$1.call(redraw);
55346 panel.off = function() {
55348 .on('drawn.info-measurement', null);
55351 panel.id = 'measurement';
55352 panel.title = t('info_panels.measurement.title');
55353 panel.key = t('info_panels.measurement.key');
55359 var uiInfoPanels = {
55360 background: uiPanelBackground,
55361 history: uiPanelHistory,
55362 location: uiPanelLocation,
55363 measurement: uiPanelMeasurement,
55366 function uiInfo(context) {
55367 var ids = Object.keys(uiInfoPanels),
55368 wasActive = ['measurement'],
55373 ids.forEach(function(k) {
55375 panels[k] = uiInfoPanels[k](context);
55381 function info(selection$$1) {
55383 function redraw() {
55384 var activeids = ids.filter(function(k) { return active[k]; }).sort();
55386 var containers = infoPanels.selectAll('.panel-container')
55387 .data(activeids, function(k) { return k; });
55390 .style('opacity', 1)
55393 .style('opacity', 0)
55394 .on('end', function(d) {
55396 .call(panels[d].off)
55400 var enter = containers.enter()
55402 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
55405 .style('opacity', 0)
55408 .style('opacity', 1);
55412 .attr('class', 'panel-title fillD2');
55416 .text(function(d) { return panels[d].title; });
55420 .attr('class', 'close')
55421 .on('click', function (d) { toggle(d); })
55422 .call(svgIcon('#icon-close'));
55426 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
55429 // redraw the panels
55430 infoPanels.selectAll('.panel-content')
55431 .each(function(d) {
55432 d3_select(this).call(panels[d]);
55437 function toggle(which) {
55439 event.stopImmediatePropagation();
55440 event.preventDefault();
55443 var activeids = ids.filter(function(k) { return active[k]; });
55445 if (which) { // toggle one
55446 active[which] = !active[which];
55447 if (activeids.length === 1 && activeids[0] === which) { // none active anymore
55448 wasActive = [which];
55450 } else { // toggle all
55451 if (activeids.length) {
55452 wasActive = activeids;
55453 activeids.forEach(function(k) { active[k] = false; });
55455 wasActive.forEach(function(k) { active[k] = true; });
55463 var infoPanels = selection$$1.selectAll('.info-panels')
55466 infoPanels = infoPanels.enter()
55468 .attr('class', 'info-panels')
55469 .merge(infoPanels);
55473 var keybinding = d3keybinding('info')
55474 .on(uiCmd('⌘' + t('info_panels.key')), toggle);
55476 ids.forEach(function(k) {
55477 var key = t('info_panels.' + k + '.key', { default: null });
55480 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
55483 d3_select(document)
55490 function uiMapData(context) {
55491 var key = t('map_data.key'),
55492 features = context.features().keys(),
55493 layers = context.layers(),
55494 fills = ['wireframe', 'partial', 'full'],
55495 fillDefault = context.storage('area-fill') || 'partial',
55496 fillSelected = fillDefault;
55499 function map_data(selection$$1) {
55501 function showsFeature(d) {
55502 return context.features().enabled(d);
55506 function autoHiddenFeature(d) {
55507 return context.features().autoHidden(d);
55511 function clickFeature(d) {
55512 context.features().toggle(d);
55517 function showsFill(d) {
55518 return fillSelected === d;
55522 function setFill(d) {
55523 fills.forEach(function(opt) {
55524 context.surface().classed('fill-' + opt, Boolean(opt === d));
55528 if (d !== 'wireframe') {
55530 context.storage('area-fill', d);
55536 function showsLayer(which) {
55537 var layer = layers.layer(which);
55539 return layer.enabled();
55545 function setLayer(which, enabled) {
55546 var layer = layers.layer(which);
55548 layer.enabled(enabled);
55554 function toggleLayer(which) {
55555 setLayer(which, !showsLayer(which));
55559 function clickMapillaryImages() {
55560 toggleLayer('mapillary-images');
55561 if (!showsLayer('mapillary-images')) {
55562 setLayer('mapillary-signs', false);
55567 function clickMapillarySigns() {
55568 toggleLayer('mapillary-signs');
55572 function drawMapillaryItems(selection$$1) {
55573 var mapillaryImages = layers.layer('mapillary-images'),
55574 mapillarySigns = layers.layer('mapillary-signs'),
55575 supportsMapillaryImages = mapillaryImages && mapillaryImages.supported(),
55576 supportsMapillarySigns = mapillarySigns && mapillarySigns.supported(),
55577 showsMapillaryImages = supportsMapillaryImages && mapillaryImages.enabled(),
55578 showsMapillarySigns = supportsMapillarySigns && mapillarySigns.enabled();
55580 var mapillaryList = selection$$1
55581 .selectAll('.layer-list-mapillary')
55584 mapillaryList = mapillaryList.enter()
55586 .attr('class', 'layer-list layer-list-mapillary')
55587 .merge(mapillaryList);
55590 var mapillaryImageLayerItem = mapillaryList
55591 .selectAll('.list-item-mapillary-images')
55592 .data(supportsMapillaryImages ? [0] : []);
55594 mapillaryImageLayerItem.exit()
55597 var enterImages = mapillaryImageLayerItem.enter()
55599 .attr('class', 'list-item-mapillary-images');
55601 var labelImages = enterImages
55604 .title(t('mapillary_images.tooltip'))
55605 .placement('top'));
55609 .attr('type', 'checkbox')
55610 .on('change', clickMapillaryImages);
55614 .text(t('mapillary_images.title'));
55617 var mapillarySignLayerItem = mapillaryList
55618 .selectAll('.list-item-mapillary-signs')
55619 .data(supportsMapillarySigns ? [0] : []);
55621 mapillarySignLayerItem.exit()
55624 var enterSigns = mapillarySignLayerItem.enter()
55626 .attr('class', 'list-item-mapillary-signs');
55628 var labelSigns = enterSigns
55631 .title(t('mapillary_signs.tooltip'))
55632 .placement('top'));
55636 .attr('type', 'checkbox')
55637 .on('change', clickMapillarySigns);
55641 .text(t('mapillary_signs.title'));
55645 mapillaryImageLayerItem = mapillaryImageLayerItem
55646 .merge(enterImages);
55648 mapillaryImageLayerItem
55649 .classed('active', showsMapillaryImages)
55650 .selectAll('input')
55651 .property('checked', showsMapillaryImages);
55654 mapillarySignLayerItem = mapillarySignLayerItem
55655 .merge(enterSigns);
55657 mapillarySignLayerItem
55658 .classed('active', showsMapillarySigns)
55659 .selectAll('input')
55660 .property('disabled', !showsMapillaryImages)
55661 .property('checked', showsMapillarySigns);
55663 mapillarySignLayerItem
55664 .selectAll('label')
55665 .classed('deemphasize', !showsMapillaryImages);
55669 function drawOsmItem(selection$$1) {
55670 var osm = layers.layer('osm'),
55671 showsOsm = osm.enabled();
55673 var ul = selection$$1
55674 .selectAll('.layer-list-osm')
55675 .data(osm ? [0] : []);
55682 var ulEnter = ul.enter()
55684 .attr('class', 'layer-list layer-list-osm');
55686 var liEnter = ulEnter
55688 .attr('class', 'list-item-osm');
55690 var labelEnter = liEnter
55693 .title(t('map_data.layers.osm.tooltip'))
55699 .attr('type', 'checkbox')
55700 .on('change', function() { toggleLayer('osm'); });
55704 .text(t('map_data.layers.osm.title'));
55710 ul.selectAll('.list-item-osm')
55711 .classed('active', showsOsm)
55712 .selectAll('input')
55713 .property('checked', showsOsm);
55717 function drawGpxItem(selection$$1) {
55718 var gpx = layers.layer('gpx'),
55719 hasGpx = gpx && gpx.hasGpx(),
55720 showsGpx = hasGpx && gpx.enabled();
55722 var ul = selection$$1
55723 .selectAll('.layer-list-gpx')
55724 .data(gpx ? [0] : []);
55731 var ulEnter = ul.enter()
55733 .attr('class', 'layer-list layer-list-gpx');
55735 var liEnter = ulEnter
55737 .attr('class', 'list-item-gpx');
55741 .attr('class', 'list-item-gpx-extent')
55743 .title(t('gpx.zoom'))
55744 .placement((textDirection === 'rtl') ? 'right' : 'left'))
55745 .on('click', function() {
55746 event.preventDefault();
55747 event.stopPropagation();
55750 .call(svgIcon('#icon-search'));
55754 .attr('class', 'list-item-gpx-browse')
55756 .title(t('gpx.browse'))
55757 .placement((textDirection === 'rtl') ? 'right' : 'left')
55759 .on('click', function() {
55760 d3_select(document.createElement('input'))
55761 .attr('type', 'file')
55762 .on('change', function() {
55763 gpx.files(event.target.files);
55767 .call(svgIcon('#icon-geolocate'));
55769 var labelEnter = liEnter
55772 .title(t('gpx.drag_drop'))
55778 .attr('type', 'checkbox')
55779 .on('change', function() { toggleLayer('gpx'); });
55783 .text(t('gpx.local_layer'));
55789 ul.selectAll('.list-item-gpx')
55790 .classed('active', showsGpx)
55791 .selectAll('label')
55792 .classed('deemphasize', !hasGpx)
55793 .selectAll('input')
55794 .property('disabled', !hasGpx)
55795 .property('checked', showsGpx);
55799 function drawList(selection$$1, data, type, name, change, active) {
55800 var items = selection$$1.selectAll('li')
55808 var enter = items.enter()
55810 .attr('class', 'layer')
55813 .title(function(d) {
55814 var tip = t(name + '.' + d + '.tooltip'),
55815 key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
55817 if (name === 'feature' && autoHiddenFeature(d)) {
55818 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
55819 tip += '<div>' + msg + '</div>';
55821 return uiTooltipHtml(tip, key);
55831 .attr('type', type)
55832 .attr('name', name)
55833 .on('change', change);
55837 .text(function(d) { return t(name + '.' + d + '.description'); });
55844 .classed('active', active)
55845 .selectAll('input')
55846 .property('checked', active)
55847 .property('indeterminate', function(d) {
55848 return (name === 'feature' && autoHiddenFeature(d));
55853 function update() {
55856 .call(drawMapillaryItems)
55857 .call(drawGpxItem);
55860 .call(drawList, fills, 'radio', 'area_fill', setFill, showsFill);
55863 .call(drawList, features, 'checkbox', 'feature', clickFeature, showsFeature);
55867 function hidePanel() {
55872 function togglePanel() {
55873 if (event) event.preventDefault();
55874 tooltipBehavior.hide(button);
55875 setVisible(!button.classed('active'));
55879 function toggleWireframe() {
55881 event.preventDefault();
55882 event.stopPropagation();
55884 setFill((fillSelected === 'wireframe' ? fillDefault : 'wireframe'));
55885 context.map().pan([0,0]); // trigger a redraw
55889 function setVisible(show) {
55890 if (show !== shown) {
55891 button.classed('active', show);
55896 selection$$1.on('mousedown.map_data-inside', function() {
55897 return event.stopPropagation();
55899 content.style('display', 'block')
55900 .style('right', '-300px')
55903 .style('right', '0px');
55905 content.style('display', 'block')
55906 .style('right', '0px')
55909 .style('right', '-300px')
55910 .on('end', function() {
55911 d3_select(this).style('display', 'none');
55913 selection$$1.on('mousedown.map_data-inside', null);
55919 var content = selection$$1
55921 .attr('class', 'fillL map-overlay col3 content hide'),
55922 tooltipBehavior = tooltip()
55923 .placement((textDirection === 'rtl') ? 'right' : 'left')
55925 .title(uiTooltipHtml(t('map_data.description'), key)),
55926 button = selection$$1
55928 .attr('tabindex', -1)
55929 .on('click', togglePanel)
55930 .call(svgIcon('#icon-data', 'light'))
55931 .call(tooltipBehavior),
55936 .text(t('map_data.title'));
55942 .text(t('map_data.data_layers'))
55944 .classed('hide-toggle', true)
55945 .classed('expanded', true)
55946 .on('click', function() {
55947 var exp = d3_select(this).classed('expanded');
55948 dataLayerContainer.style('display', exp ? 'none' : 'block');
55949 d3_select(this).classed('expanded', !exp);
55950 event.preventDefault();
55953 var dataLayerContainer = content
55955 .attr('class', 'data-data-layers')
55956 .style('display', 'block');
55962 .text(t('map_data.fill_area'))
55964 .classed('hide-toggle', true)
55965 .classed('expanded', false)
55966 .on('click', function() {
55967 var exp = d3_select(this).classed('expanded');
55968 fillContainer.style('display', exp ? 'none' : 'block');
55969 d3_select(this).classed('expanded', !exp);
55970 event.preventDefault();
55973 var fillContainer = content
55975 .attr('class', 'data-area-fills')
55976 .style('display', 'none');
55978 var fillList = fillContainer
55980 .attr('class', 'layer-list layer-fill-list');
55986 .text(t('map_data.map_features'))
55988 .classed('hide-toggle', true)
55989 .classed('expanded', false)
55990 .on('click', function() {
55991 var exp = d3_select(this).classed('expanded');
55992 featureContainer.style('display', exp ? 'none' : 'block');
55993 d3_select(this).classed('expanded', !exp);
55994 event.preventDefault();
55997 var featureContainer = content
55999 .attr('class', 'data-feature-filters')
56000 .style('display', 'none');
56002 var featureList = featureContainer
56004 .attr('class', 'layer-list layer-feature-list');
56008 .on('change.map_data-update', update);
56010 setFill(fillDefault);
56012 var keybinding = d3keybinding('features')
56013 .on(key, togglePanel)
56014 .on(t('area_fill.wireframe.key'), toggleWireframe)
56015 .on([t('background.key'), t('help.key')], hidePanel);
56017 d3_select(document)
56020 context.surface().on('mousedown.map_data-outside', hidePanel);
56021 context.container().on('mousedown.map_data-outside', hidePanel);
56028 function uiModes(context) {
56030 modeAddPoint$$1(context),
56031 modeAddLine$$1(context),
56032 modeAddArea$$1(context)
56036 function editable() {
56037 return context.editable() && context.mode().id !== 'save';
56041 return function(selection$$1) {
56042 var buttons = selection$$1.selectAll('button.add-button')
56045 buttons = buttons.enter()
56047 .attr('tabindex', -1)
56048 .attr('class', function(mode) { return mode.id + ' add-button col4'; })
56049 .on('click.mode-buttons', function(mode) {
56050 // When drawing, ignore accidental clicks on mode buttons - #4042
56051 var currMode = context.mode().id;
56052 if (currMode.match(/^draw/) !== null) return;
56054 if (mode.id === currMode) {
56055 context.enter(modeBrowse(context));
56057 context.enter(mode);
56061 .placement('bottom')
56063 .title(function(mode) {
56064 return uiTooltipHtml(mode.description, mode.key);
56069 .each(function(d) {
56071 .call(svgIcon('#icon-' + d.button, 'pre-text'));
56076 .attr('class', 'label')
56077 .text(function(mode) { return mode.title; });
56080 .on('enter.editor', function(entered) {
56081 selection$$1.selectAll('button.add-button')
56082 .classed('active', function(mode) { return entered.button === mode.button; });
56083 context.container()
56084 .classed('mode-' + entered.id, true);
56088 .on('exit.editor', function(exited) {
56089 context.container()
56090 .classed('mode-' + exited.id, false);
56093 var keybinding = d3keybinding('mode-buttons');
56095 modes.forEach(function(mode) {
56096 keybinding.on(mode.key, function() {
56098 if (mode.id === context.mode().id) {
56099 context.enter(modeBrowse(context));
56101 context.enter(mode);
56107 d3_select(document)
56111 var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
56114 .on('move.modes', debouncedUpdate)
56115 .on('drawn.modes', debouncedUpdate);
56118 .on('enter.modes', update);
56122 function update() {
56123 selection$$1.selectAll('button.add-button')
56124 .property('disabled', !editable());
56129 function uiNotice(context) {
56131 return function(selection) {
56132 var div = selection
56134 .attr('class', 'notice');
56138 .attr('class', 'zoom-to notice fillD')
56139 .on('click', function() {
56140 context.map().zoom(context.minEditableZoom());
56144 .call(svgIcon('#icon-plus', 'pre-text'))
56146 .attr('class', 'label')
56147 .text(t('zoom_in_edit'));
56150 function disableTooHigh() {
56151 var canEdit = context.map().zoom() >= context.minEditableZoom();
56152 div.style('display', canEdit ? 'none' : 'block');
56156 .on('move.notice', debounce$1(disableTooHigh, 500));
56162 function uiRestore(context) {
56164 return function(selection) {
56165 if (!context.history().lock() || !context.history().restorableChanges())
56168 var modalSelection = uiModal(selection, true);
56170 modalSelection.select('.modal')
56171 .attr('class', 'modal fillL col6');
56173 var introModal = modalSelection.select('.content');
56176 .attr('class','cf');
56180 .attr('class', 'modal-section')
56182 .text(t('restore.heading'));
56186 .attr('class','modal-section')
56188 .text(t('restore.description'));
56190 var buttonWrap = introModal
56192 .attr('class', 'modal-actions cf');
56194 var restore = buttonWrap
56196 .attr('class', 'restore col6')
56197 .on('click', function() {
56198 context.history().restore();
56199 modalSelection.remove();
56204 .attr('class', 'logo logo-restore')
56206 .attr('xlink:href', '#logo-restore');
56210 .text(t('restore.restore'));
56212 var reset = buttonWrap
56214 .attr('class', 'reset col6')
56215 .on('click', function() {
56216 context.history().clearSaved();
56217 modalSelection.remove();
56222 .attr('class', 'logo logo-reset')
56224 .attr('xlink:href', '#logo-reset');
56228 .text(t('restore.reset'));
56230 restore.node().focus();
56234 function uiSave(context) {
56235 var history = context.history(),
56239 function saving() {
56240 return context.mode().id === 'save';
56245 event.preventDefault();
56246 if (!context.inIntro() && !saving() && history.hasChanges()) {
56247 context.enter(modeSave$$1(context));
56252 function getBackground(numChanges) {
56254 if (numChanges === 0) {
56256 } else if (numChanges <= 50) {
56257 step = numChanges / 50;
56258 return d3_interpolateRgb('#fff', '#ff8')(step); // white -> yellow
56260 step = Math.min((numChanges - 50) / 50, 1.0);
56261 return d3_interpolateRgb('#ff8', '#f88')(step); // yellow -> red
56266 return function(selection$$1) {
56267 var numChanges = 0;
56269 function updateCount() {
56270 var _ = history.difference().summary().length;
56271 if (_ === numChanges) return;
56275 .title(uiTooltipHtml(
56276 t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
56279 var background = getBackground(numChanges);
56282 .classed('disabled', numChanges === 0)
56283 .classed('has-count', numChanges > 0)
56284 .style('background', background);
56286 button.select('span.count')
56288 .style('background', background)
56289 .style('border-color', background);
56293 var tooltipBehavior = tooltip()
56294 .placement('bottom')
56296 .title(uiTooltipHtml(t('save.no_changes'), key));
56298 var button = selection$$1
56300 .attr('class', 'save col12 disabled')
56301 .attr('tabindex', -1)
56303 .call(tooltipBehavior);
56306 .call(svgIcon('#icon-save', 'pre-text'))
56308 .attr('class', 'label')
56309 .text(t('save.title'));
56313 .attr('class', 'count')
56319 var keybinding = d3keybinding('save')
56320 .on(key, save, true);
56322 d3_select(document)
56326 .on('change.save', updateCount);
56329 .on('enter.save', function() {
56330 button.property('disabled', saving());
56331 if (saving()) button.call(tooltipBehavior.hide);
56336 function uiScale(context) {
56337 var projection = context.projection,
56338 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
56343 function scaleDefs(loc1, loc2) {
56344 var lat = (loc2[1] + loc1[1]) / 2,
56345 conversion = (isImperial ? 3.28084 : 1),
56346 dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
56347 scale = { dist: 0, px: 0, text: '' },
56348 buckets, i, val, dLon;
56351 buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
56353 buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
56356 // determine a user-friendly endpoint for the scale
56357 for (i = 0; i < buckets.length; i++) {
56360 scale.dist = Math.floor(dist / val) * val;
56363 scale.dist = +dist.toFixed(2);
56367 dLon = geoMetersToLon(scale.dist / conversion, lat);
56368 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
56371 if (scale.dist >= 5280) {
56372 scale.dist /= 5280;
56373 scale.text = String(scale.dist) + ' mi';
56375 scale.text = String(scale.dist) + ' ft';
56378 if (scale.dist >= 1000) {
56379 scale.dist /= 1000;
56380 scale.text = String(scale.dist) + ' km';
56382 scale.text = String(scale.dist) + ' m';
56390 function update(selection) {
56391 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
56392 var dims = context.map().dimensions(),
56393 loc1 = projection.invert([0, dims[1]]),
56394 loc2 = projection.invert([maxLength, dims[1]]),
56395 scale = scaleDefs(loc1, loc2);
56397 selection.select('#scale-path')
56398 .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
56400 selection.select('#scale-textgroup')
56401 .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
56403 selection.select('#scale-text')
56408 return function(selection) {
56409 function switchUnits() {
56410 isImperial = !isImperial;
56411 selection.call(update);
56414 var scalegroup = selection.append('svg')
56415 .attr('id', 'scale')
56416 .on('click', switchUnits)
56418 .attr('transform', 'translate(10,11)');
56422 .attr('id', 'scale-path');
56426 .attr('id', 'scale-textgroup')
56428 .attr('id', 'scale-text');
56430 selection.call(update);
56432 context.map().on('move.scale', function() {
56438 var pair_1 = pair$1;
56439 function search(x, dims, r) {
56440 if (!dims) dims = 'NSEW';
56441 if (typeof x !== 'string') return { val: null, regex: r };
56443 r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
56446 if (!m) return { val: null, regex: r };
56448 var dim = m[1] || m[5];
56449 if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
56452 val: (((m[2]) ? parseFloat(m[2]) : 0) +
56453 ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
56454 ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
56455 ((dim === 'S' || dim === 'W') ? -1 : 1),
56462 function pair$1(x, dims) {
56464 var one = search(x, dims);
56465 if (one.val === null) return null;
56466 var two = search(x, dims, one.regex);
56467 if (two.val === null) return null;
56468 // null if one/two are not contiguous.
56469 if (one.raw + two.raw !== x) return null;
56471 return swapdim(one.val, two.val, one.dim);
56473 return [one.val, two.val];
56477 function swapdim(a, b, dim) {
56478 if (dim === 'N' || dim === 'S') return [a, b];
56479 if (dim === 'W' || dim === 'E') return [b, a];
56482 function uiFeatureList(context) {
56483 var geocodeResults;
56486 function featureList(selection$$1) {
56487 var header = selection$$1
56489 .attr('class', 'header fillL cf');
56491 header.append('h3')
56492 .text(t('inspector.feature_list'));
56494 var searchWrap = selection$$1
56496 .attr('class', 'search-header');
56498 var search = searchWrap
56500 .attr('placeholder', t('inspector.search'))
56501 .attr('type', 'search')
56503 .on('keypress', keypress)
56504 .on('input', inputevent);
56507 .call(svgIcon('#icon-search', 'pre-text'));
56509 var listWrap = selection$$1
56511 .attr('class', 'inspector-body');
56513 var list = listWrap
56515 .attr('class', 'feature-list cf');
56518 .on('exit.feature-list', clearSearch);
56520 .on('drawn.feature-list', mapDrawn);
56523 function keypress() {
56524 var q = search.property('value'),
56525 items = list.selectAll('.feature-list-item');
56526 if (event.keyCode === 13 && q.length && items.size()) {
56527 click(items.datum());
56532 function inputevent() {
56533 geocodeResults = undefined;
56538 function clearSearch() {
56539 search.property('value', '');
56544 function mapDrawn(e) {
56551 function features() {
56554 graph = context.graph(),
56555 q = search.property('value').toLowerCase();
56557 if (!q) return result;
56559 var idMatch = q.match(/^([nwr])([0-9]+)$/);
56564 geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
56565 type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
56570 var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
56572 if (locationMatch) {
56573 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
56577 type: t('inspector.location'),
56578 name: loc[0].toFixed(6) + ', ' + loc[1].toFixed(6),
56583 function addEntity(entity) {
56584 if (entity.id in entities || result.length > 200)
56587 entities[entity.id] = true;
56589 var name = utilDisplayName(entity) || '';
56590 if (name.toLowerCase().indexOf(q) >= 0) {
56591 var matched = context.presets().match(entity, graph),
56592 type = (matched && matched.name()) || utilDisplayType(entity.id);
56596 geometry: context.geometry(entity.id),
56602 graph.parentRelations(entity).forEach(function(parent) {
56607 var visible = context.surface().selectAll('.point, .line, .area').nodes();
56608 for (var i = 0; i < visible.length && result.length <= 200; i++) {
56609 addEntity(visible[i].__data__);
56612 (geocodeResults || []).forEach(function(d) {
56613 // https://github.com/openstreetmap/iD/issues/1890
56614 if (d.osm_type && d.osm_id) {
56616 id: osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id),
56617 geometry: d.osm_type === 'relation' ? 'relation' : d.osm_type === 'way' ? 'line' : 'point',
56618 type: d.type !== 'yes' ? (d.type.charAt(0).toUpperCase() + d.type.slice(1)).replace('_', ' ')
56619 : (d.class.charAt(0).toUpperCase() + d.class.slice(1)).replace('_', ' '),
56620 name: d.display_name,
56621 extent: new geoExtent$$1(
56622 [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
56623 [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
56632 function drawList() {
56633 var value = search.property('value'),
56634 results = features();
56636 list.classed('filtered', value.length);
56638 var noResultsWorldwide = geocodeResults && geocodeResults.length === 0;
56640 var resultsIndicator = list.selectAll('.no-results-item')
56642 .enter().append('button')
56643 .property('disabled', true)
56644 .attr('class', 'no-results-item')
56645 .call(svgIcon('#icon-alert', 'pre-text'));
56647 resultsIndicator.append('span')
56648 .attr('class', 'entity-name');
56650 list.selectAll('.no-results-item .entity-name')
56651 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
56653 if (services.geocoder) {
56654 list.selectAll('.geocode-item')
56656 .enter().append('button')
56657 .attr('class', 'geocode-item')
56658 .on('click', geocoderSearch)
56660 .attr('class', 'label')
56662 .attr('class', 'entity-name')
56663 .text(t('geocoder.search'));
56666 list.selectAll('.no-results-item')
56667 .style('display', (value.length && !results.length) ? 'block' : 'none');
56669 list.selectAll('.geocode-item')
56670 .style('display', (value && geocodeResults === undefined) ? 'block' : 'none');
56672 list.selectAll('.feature-list-item')
56676 var items = list.selectAll('.feature-list-item')
56677 .data(results, function(d) { return d.id; });
56679 var enter = items.enter()
56680 .insert('button', '.geocode-item')
56681 .attr('class', 'feature-list-item')
56682 .on('mouseover', mouseover)
56683 .on('mouseout', mouseout)
56684 .on('click', click);
56688 .attr('class', 'label');
56690 label.each(function(d) {
56692 .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
56695 label.append('span')
56696 .attr('class', 'entity-type')
56697 .text(function(d) { return d.type; });
56699 label.append('span')
56700 .attr('class', 'entity-name')
56701 .text(function(d) { return d.name; });
56703 enter.style('opacity', 0)
56705 .style('opacity', 1);
56714 function mouseover(d) {
56715 if (d.id === -1) return;
56717 context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
56718 .classed('hover', true);
56722 function mouseout() {
56723 context.surface().selectAll('.hover')
56724 .classed('hover', false);
56728 function click(d) {
56729 event.preventDefault();
56731 context.map().centerZoom([d.location[1], d.location[0]], 20);
56733 else if (d.entity) {
56734 if (d.entity.type === 'node') {
56735 context.map().center(d.entity.loc);
56736 } else if (d.entity.type === 'way') {
56737 var center = context.projection(context.map().center()),
56738 edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
56739 context.map().center(edge.loc);
56741 context.enter(modeSelect(context, [d.entity.id]));
56743 context.zoomToEntity(d.id);
56748 function geocoderSearch() {
56749 services.geocoder.search(search.property('value'), function (err, resp) {
56750 geocodeResults = resp || [];
56757 return featureList;
56760 function uiPresetIcon() {
56761 var preset, geometry;
56764 function presetIcon(selection$$1) {
56765 selection$$1.each(render);
56769 function getIcon(p, geom) {
56772 else if (geom === 'line')
56773 return 'other-line';
56774 else if (geom === 'vertex')
56775 return p.isFallback() ? '' : 'poi-vertex';
56777 return 'marker-stroked';
56781 function render() {
56782 var selection$$1 = d3_select(this),
56783 p = preset.apply(this, arguments),
56784 geom = geometry.apply(this, arguments),
56785 picon = getIcon(p, geom),
56786 isPoi = picon.match(/^poi-/) !== null,
56787 isMaki = dataFeatureIcons.indexOf(picon) !== -1,
56788 isFramed = (geom === 'area' || geom === 'verex');
56791 function tag_classes(p) {
56793 for (var i in p.tags) {
56795 if (p.tags[i] !== '*') {
56796 s += ' tag-' + i + '-' + p.tags[i];
56803 var fill = selection$$1.selectAll('.preset-icon-fill')
56806 fill = fill.enter()
56811 .attr('class', function() {
56812 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
56816 var areaFrame = selection$$1.selectAll('.preset-icon-frame')
56817 .data((geom === 'area') ? [0] : []);
56822 areaFrame = areaFrame.enter()
56824 .attr('class', 'preset-icon-frame')
56825 .call(svgIcon('#preset-icon-frame'));
56828 var icon = selection$$1.selectAll('.preset-icon')
56831 icon = icon.enter()
56833 .attr('class', 'preset-icon')
56838 .attr('class', 'preset-icon preset-icon-' +
56839 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
56842 icon.selectAll('svg')
56843 .attr('class', function() {
56844 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
56847 icon.selectAll('use')
56848 .attr('href', '#' + picon + (isMaki ? '-15' : ''));
56852 presetIcon.preset = function(_) {
56853 if (!arguments.length) return preset;
56854 preset = utilFunctor(_);
56859 presetIcon.geometry = function(_) {
56860 if (!arguments.length) return geometry;
56861 geometry = utilFunctor(_);
56868 function d3combobox() {
56869 var dispatch$$1 = dispatch('accept'),
56870 container = d3_select(document.body),
56874 caseSensitive = false;
56876 var fetcher = function(val, cb) {
56877 cb(data.filter(function(d) {
56881 .indexOf(val.toLowerCase()) !== -1;
56885 var combobox = function(input, attachTo) {
56887 wrapper = container
56888 .selectAll('div.combobox')
56889 .filter(function(d) { return d === input.node(); }),
56890 shown = !wrapper.empty();
56893 .classed('combobox-input', true)
56894 .on('focus.typeahead', focus)
56895 .on('blur.typeahead', blur)
56896 .on('keydown.typeahead', keydown)
56897 .on('keyup.typeahead', keyup)
56898 .on('input.typeahead', change)
56900 var parent = this.parentNode,
56901 sibling = this.nextSibling;
56903 var caret = d3_select(parent).selectAll('.combobox-caret')
56904 .filter(function(d) { return d === input.node(); })
56905 .data([input.node()]);
56907 caret = caret.enter()
56908 .insert('div', function() { return sibling; })
56909 .attr('class', 'combobox-caret')
56913 .on('mousedown', function () {
56914 // prevent the form element from blurring. it blurs
56916 event.stopPropagation();
56917 event.preventDefault();
56919 input.node().focus();
56928 fetch(value(), render);
56932 window.setTimeout(hide, 150);
56937 wrapper = container
56938 .insert('div', ':first-child')
56939 .datum(input.node())
56940 .attr('class', 'combobox')
56941 .style('position', 'absolute')
56942 .style('display', 'block')
56943 .style('left', '0px')
56944 .on('mousedown', function () {
56945 // prevent moving focus out of the text field
56946 event.preventDefault();
56950 .on('scroll.combobox', render, true);
56962 .on('scroll.combobox', null);
56968 function keydown() {
56969 switch (event.keyCode) {
56970 // backspace, delete
56973 input.on('input.typeahead', function() {
56976 var start = input.property('selectionStart');
56977 input.node().setSelectionRange(start, start);
56978 input.on('input.typeahead', change);
56983 wrapper.selectAll('a.selected').each(function (d) {
56984 dispatch$$1.call('accept', this, d);
56990 event.preventDefault();
56995 event.preventDefault();
57000 event.preventDefault();
57003 event.stopPropagation();
57007 switch (event.keyCode) {
57014 wrapper.selectAll('a.selected').each(function (d) {
57015 dispatch$$1.call('accept', this, d);
57022 function change() {
57023 fetch(value(), function() {
57024 if (input.property('selectionEnd') === input.property('value').length) {
57031 function nav(dir) {
57032 if (!suggestions.length) return;
57033 idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0);
57034 input.property('value', suggestions[idx].value);
57040 var value = input.property('value'),
57041 start = input.property('selectionStart'),
57042 end = input.property('selectionEnd');
57044 if (start && end) {
57045 value = value.substring(0, start);
57051 function fetch(v, cb) {
57052 fetcher.call(input, v, function(_) {
57058 function autocomplete() {
57059 var v = caseSensitive ? value() : value().toLowerCase();
57063 for (var i = 0; i < suggestions.length; i++) {
57064 var suggestion = suggestions[i].value,
57065 compare = caseSensitive ? suggestion : suggestion.toLowerCase();
57067 if (compare.indexOf(v) === 0) {
57069 input.property('value', suggestion);
57070 input.node().setSelectionRange(v.length, suggestion.length);
57076 function render() {
57077 if (suggestions.length >= minItems && document.activeElement === input.node()) {
57084 var options = wrapper
57085 .selectAll('a.combobox-option')
57086 .data(suggestions, function(d) { return d.value; });
57093 .attr('class', 'combobox-option')
57094 .text(function(d) { return d.value; })
57096 .attr('title', function(d) { return d.title; })
57097 .classed('selected', function(d, i) { return i === idx; })
57098 .on('mouseover', select)
57099 .on('click', accept)
57103 var node = attachTo ? attachTo.node() : input.node(),
57104 rect = node.getBoundingClientRect();
57107 .style('left', rect.left + 'px')
57108 .style('width', rect.width + 'px')
57109 .style('top', rect.height + rect.top + 'px');
57112 function select(d, i) {
57117 function ensureVisible() {
57118 var node = wrapper.selectAll('a.selected').node();
57119 if (node) node.scrollIntoView();
57122 function accept(d) {
57123 if (!shown) return;
57124 input.property('value', d.value);
57125 utilTriggerEvent(input, 'change');
57126 dispatch$$1.call('accept', this, d);
57131 combobox.fetcher = function(_) {
57132 if (!arguments.length) return fetcher;
57137 combobox.data = function(_) {
57138 if (!arguments.length) return data;
57143 combobox.minItems = function(_) {
57144 if (!arguments.length) return minItems;
57149 combobox.caseSensitive = function(_) {
57150 if (!arguments.length) return caseSensitive;
57155 combobox.container = function(_) {
57156 if (!arguments.length) return container;
57161 return utilRebind(combobox, dispatch$$1, 'on');
57165 d3combobox.off = function(input) {
57167 .on('focus.typeahead', null)
57168 .on('blur.typeahead', null)
57169 .on('keydown.typeahead', null)
57170 .on('keyup.typeahead', null)
57171 .on('input.typeahead', null)
57173 d3_select(this.parentNode).selectAll('.combobox-caret')
57174 .filter(function(d) { return d === input.node(); })
57175 .on('mousedown', null);
57179 .on('scroll.combobox', null);
57182 function uiDisclosure() {
57183 var dispatch$$1 = dispatch('toggled'),
57186 content = function () {};
57189 var disclosure = function(selection) {
57190 var hideToggle = selection.selectAll('.hide-toggle')
57193 hideToggle = hideToggle.enter()
57196 .attr('class', 'hide-toggle')
57197 .merge(hideToggle);
57201 .on('click', toggle)
57202 .classed('expanded', expanded);
57205 var wrap = selection.selectAll('div')
57208 wrap = wrap.enter()
57213 .classed('hide', !expanded)
57217 function toggle() {
57218 expanded = !expanded;
57219 hideToggle.classed('expanded', expanded);
57220 wrap.call(uiToggle(expanded));
57221 dispatch$$1.call('toggled', this, expanded);
57226 disclosure.title = function(_) {
57227 if (!arguments.length) return title;
57233 disclosure.expanded = function(_) {
57234 if (!arguments.length) return expanded;
57240 disclosure.content = function(_) {
57241 if (!arguments.length) return content;
57247 return utilRebind(disclosure, dispatch$$1, 'on');
57250 function uiRawMemberEditor(context) {
57252 taginfo = services.taginfo;
57255 function selectMember(d) {
57256 event.preventDefault();
57257 context.enter(modeSelect(context, [d.id]));
57261 function changeRole(d) {
57262 var role = d3_select(this).property('value');
57263 var member = { id: d.id, type: d.type, role: role };
57265 actionChangeMember(d.relation.id, member, d.index),
57266 t('operations.change_role.annotation')
57271 function deleteMember(d) {
57273 actionDeleteMember(d.relation.id, d.index),
57274 t('operations.delete_member.annotation')
57277 if (!context.hasEntity(d.relation.id)) {
57278 context.enter(modeBrowse(context));
57283 function rawMemberEditor(selection$$1) {
57284 var entity = context.entity(id),
57287 entity.members.slice(0, 1000).forEach(function(member, index) {
57294 member: context.hasEntity(member.id)
57298 var gt = entity.members.length > 1000 ? '>' : '';
57299 selection$$1.call(uiDisclosure()
57300 .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
57302 .on('toggled', toggled)
57307 function toggled(expanded) {
57309 selection$$1.node().parentNode.scrollTop += 200;
57314 function content(wrap) {
57315 var list = wrap.selectAll('.member-list')
57318 list = list.enter()
57320 .attr('class', 'member-list')
57324 var items = list.selectAll('li')
57325 .data(memberships, function(d) {
57326 return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
57327 (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
57334 var enter = items.enter()
57336 .attr('class', 'member-row form-field')
57337 .classed('member-incomplete', function(d) { return !d.member; });
57340 .each(function(d) {
57342 var label = d3_select(this).append('label')
57343 .attr('class', 'form-label')
57346 .on('click', selectMember);
57348 label.append('span')
57349 .attr('class', 'member-entity-type')
57350 .text(function(d) {
57351 var matched = context.presets().match(d.member, context.graph());
57352 return (matched && matched.name()) || utilDisplayType(d.member.id);
57355 label.append('span')
57356 .attr('class', 'member-entity-name')
57357 .text(function(d) { return utilDisplayName(d.member); });
57360 d3_select(this).append('label')
57361 .attr('class', 'form-label')
57362 .text(t('inspector.incomplete', { id: d.id }));
57368 .attr('class', 'member-role')
57369 .property('type', 'text')
57370 .attr('maxlength', 255)
57371 .attr('placeholder', t('inspector.role'))
57373 .property('value', function(d) { return d.role; })
57374 .on('change', changeRole);
57378 .attr('tabindex', -1)
57379 .attr('class', 'remove button-input-action member-delete minor')
57380 .on('click', deleteMember)
57381 .call(svgIcon('#operation-delete'));
57384 enter.each(bindTypeahead);
57388 function bindTypeahead(d) {
57389 var row = d3_select(this),
57390 role = row.selectAll('input.member-role');
57392 function sort(value, data) {
57393 var sameletter = [],
57395 for (var i = 0; i < data.length; i++) {
57396 if (data[i].value.substring(0, value.length) === value) {
57397 sameletter.push(data[i]);
57399 other.push(data[i]);
57402 return sameletter.concat(other);
57405 role.call(d3combobox()
57406 .container(context.container())
57407 .fetcher(function(role, callback) {
57408 var rtype = entity.tags.type;
57411 rtype: rtype || '',
57412 geometry: context.geometry(d.member.id),
57414 }, function(err, data) {
57415 if (!err) callback(sort(role, data));
57421 function unbind() {
57422 var row = d3_select(this);
57424 row.selectAll('input.member-role')
57425 .call(d3combobox.off);
57431 rawMemberEditor.entityID = function(_) {
57432 if (!arguments.length) return id;
57434 return rawMemberEditor;
57438 return rawMemberEditor;
57441 function uiRawMembershipEditor(context) {
57442 var taginfo = services.taginfo,
57446 function selectRelation(d) {
57447 event.preventDefault();
57448 context.enter(modeSelect(context, [d.relation.id]));
57452 function changeRole(d) {
57453 var role = d3_select(this).property('value');
57455 actionChangeMember(d.relation.id, assignIn$1({}, d.member, { role: role }), d.index),
57456 t('operations.change_role.annotation')
57461 function addMembership(d, role) {
57466 actionAddMember(d.relation.id, { id: id, type: context.entity(id).type, role: role }),
57467 t('operations.add_member.annotation')
57471 var relation = osmRelation();
57473 actionAddEntity(relation),
57474 actionAddMember(relation.id, { id: id, type: context.entity(id).type, role: role }),
57475 t('operations.add.annotation.relation')
57478 context.enter(modeSelect(context, [relation.id]));
57483 function deleteMembership(d) {
57485 actionDeleteMember(d.relation.id, d.index),
57486 t('operations.delete_member.annotation')
57491 function relations(q) {
57492 var newRelation = {
57494 value: t('inspector.new_relation')
57497 graph = context.graph();
57499 context.intersects(context.extent()).forEach(function(entity) {
57500 if (entity.type !== 'relation' || entity.id === id)
57503 var matched = context.presets().match(entity, graph),
57504 presetName = (matched && matched.name()) || t('inspector.relation'),
57505 entityName = utilDisplayName(entity) || '';
57507 var value = presetName + ' ' + entityName;
57508 if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
57517 result.sort(function(a, b) {
57518 return osmRelation.creationOrder(a.relation, b.relation);
57521 // Dedupe identical names by appending relation id - see #2891
57522 var dupeGroups = filter(
57523 groupBy(result, 'value'),
57524 function(v) { return v.length > 1; }
57527 dupeGroups.forEach(function(group) {
57528 group.forEach(function(obj) {
57529 obj.value += ' ' + obj.relation.id;
57533 result.unshift(newRelation);
57538 function rawMembershipEditor(selection$$1) {
57539 var entity = context.entity(id),
57540 parents = context.graph().parentRelations(entity),
57543 parents.slice(0, 1000).forEach(function(relation) {
57544 relation.members.forEach(function(member, index) {
57545 if (member.id === entity.id) {
57546 memberships.push({ relation: relation, member: member, index: index });
57551 var gt = parents.length > 1000 ? '>' : '';
57552 selection$$1.call(uiDisclosure()
57553 .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
57555 .on('toggled', toggled)
57560 function toggled(expanded) {
57562 selection$$1.node().parentNode.scrollTop += 200;
57567 function content(wrap) {
57568 var list = wrap.selectAll('.member-list')
57571 list = list.enter()
57573 .attr('class', 'member-list')
57577 var items = list.selectAll('li.member-row-normal')
57578 .data(memberships, function(d) {
57579 return osmEntity$$1.key(d.relation) + ',' + d.index;
57586 var enter = items.enter()
57588 .attr('class', 'member-row member-row-normal form-field');
57592 .attr('class', 'form-label')
57595 .on('click', selectRelation);
57599 .attr('class', 'member-entity-type')
57600 .text(function(d) {
57601 var matched = context.presets().match(d.relation, context.graph());
57602 return (matched && matched.name()) || t('inspector.relation');
57607 .attr('class', 'member-entity-name')
57608 .text(function(d) { return utilDisplayName(d.relation); });
57612 .attr('class', 'member-role')
57613 .property('type', 'text')
57614 .attr('maxlength', 255)
57615 .attr('placeholder', t('inspector.role'))
57617 .property('value', function(d) { return d.member.role; })
57618 .on('change', changeRole);
57622 .attr('tabindex', -1)
57623 .attr('class', 'remove button-input-action member-delete minor')
57624 .on('click', deleteMembership)
57625 .call(svgIcon('#operation-delete'));
57628 enter.each(bindTypeahead);
57632 var newrow = list.selectAll('.member-row-new')
57633 .data(showBlank ? [0] : []);
57638 enter = newrow.enter()
57640 .attr('class', 'member-row member-row-new form-field');
57644 .attr('type', 'text')
57645 .attr('class', 'member-entity-input')
57650 .attr('class', 'member-role')
57651 .property('type', 'text')
57652 .attr('maxlength', 255)
57653 .attr('placeholder', t('inspector.role'))
57655 .on('change', changeRole);
57659 .attr('tabindex', -1)
57660 .attr('class', 'remove button-input-action member-delete minor')
57661 .on('click', deleteMembership)
57662 .call(svgIcon('#operation-delete'));
57667 newrow.selectAll('.member-entity-input')
57669 .container(context.container())
57671 .fetcher(function(value, callback) { callback(relations(value)); })
57672 .on('accept', onAccept)
57676 var addrel = wrap.selectAll('.add-relation')
57679 addrel = addrel.enter()
57681 .attr('class', 'add-relation')
57685 .call(svgIcon('#icon-plus', 'light'))
57686 .on('click', function() {
57689 list.selectAll('.member-entity-input').node().focus();
57693 function onAccept(d) {
57694 var role = list.selectAll('.member-row-new .member-role').property('value');
57695 addMembership(d, role);
57699 function bindTypeahead(d) {
57700 var row = d3_select(this),
57701 role = row.selectAll('input.member-role');
57703 function sort(value, data) {
57704 var sameletter = [],
57706 for (var i = 0; i < data.length; i++) {
57707 if (data[i].value.substring(0, value.length) === value) {
57708 sameletter.push(data[i]);
57710 other.push(data[i]);
57713 return sameletter.concat(other);
57716 role.call(d3combobox()
57717 .container(context.container())
57718 .fetcher(function(role, callback) {
57719 var rtype = d.relation.tags.type;
57722 rtype: rtype || '',
57723 geometry: context.geometry(id),
57725 }, function(err, data) {
57726 if (!err) callback(sort(role, data));
57732 function unbind() {
57733 var row = d3_select(this);
57735 row.selectAll('input.member-role')
57736 .call(d3combobox.off);
57742 rawMembershipEditor.entityID = function(_) {
57743 if (!arguments.length) return id;
57745 return rawMembershipEditor;
57749 return rawMembershipEditor;
57752 function uiTagReference(tag) {
57753 var taginfo = services.taginfo,
57755 button = d3_select(null),
57756 body = d3_select(null),
57761 function findLocal(data) {
57762 var locale = utilDetect().locale.toLowerCase(),
57765 if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br'
57766 localized = find$1(data, function(d) {
57767 return d.lang.toLowerCase() === locale;
57769 if (localized) return localized;
57772 // try the non-regional version of a language, like
57773 // 'en' if the language is 'en-US'
57774 if (locale.indexOf('-') !== -1) {
57775 var first = locale.split('-')[0];
57776 localized = find$1(data, function(d) {
57777 return d.lang.toLowerCase() === first;
57779 if (localized) return localized;
57782 // finally fall back to english
57783 return find$1(data, function(d) {
57784 return d.lang.toLowerCase() === 'en';
57789 function load(param) {
57790 if (!taginfo) return;
57793 .classed('tag-reference-loading', true);
57795 taginfo.docs(param, function show(err, data) {
57797 if (!err && data) {
57798 docs = findLocal(data);
57803 if (!docs || !docs.title) {
57804 if (param.hasOwnProperty('value')) {
57805 load(omit(param, 'value')); // retry with key only
57809 .attr('class', 'tag-reference-description')
57810 .text(t('inspector.no_documentation_key'));
57816 if (docs.image && docs.image.thumb_url_prefix) {
57819 .attr('class', 'tag-reference-wiki-image')
57820 .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
57821 .on('load', function() { done(); })
57822 .on('error', function() { d3_select(this).remove(); done(); });
57829 .attr('class', 'tag-reference-description')
57830 .text(docs.description || t('inspector.documentation_redirect'));
57834 .attr('class', 'tag-reference-link')
57835 .attr('target', '_blank')
57836 .attr('tabindex', -1)
57837 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
57838 .call(svgIcon('#icon-out-link', 'inline'))
57840 .text(t('inspector.reference'));
57842 // Add link to info about "good changeset comments" - #2923
57843 if (param.key === 'comment') {
57846 .attr('class', 'tag-reference-comment-link')
57847 .attr('target', '_blank')
57848 .attr('tabindex', -1)
57849 .call(svgIcon('#icon-out-link', 'inline'))
57850 .attr('href', t('commit.about_changeset_comments_link'))
57852 .text(t('commit.about_changeset_comments'));
57862 .classed('tag-reference-loading', false);
57865 .classed('expanded', true)
57868 .style('max-height', '200px')
57869 .style('opacity', '1');
57879 .style('max-height', '0px')
57880 .style('opacity', '0')
57881 .on('end', function () {
57882 body.classed('expanded', false);
57889 tagReference.button = function(selection$$1) {
57890 button = selection$$1.selectAll('.tag-reference-button')
57893 button = button.enter()
57895 .attr('class', 'tag-reference-button')
57896 .attr('tabindex', -1)
57897 .call(svgIcon('#icon-inspect'))
57901 .on('click', function () {
57902 event.stopPropagation();
57903 event.preventDefault();
57906 } else if (loaded) {
57915 tagReference.body = function(selection$$1) {
57917 var tagid = tag.rtype || (tag.key + '-' + tag.value);
57919 body = selection$$1.selectAll('.tag-reference-body')
57920 .data([tagid], function(d) { return d; });
57925 body = body.enter()
57927 .attr('class', 'tag-reference-body cf')
57928 .style('max-height', '0')
57929 .style('opacity', '0')
57932 if (showing === false) {
57938 tagReference.showing = function(_) {
57939 if (!arguments.length) return showing;
57941 return tagReference;
57945 return tagReference;
57948 function uiRawTagEditor(context) {
57949 var taginfo = services.taginfo,
57950 dispatch$$1 = dispatch('change'),
57951 expandedPreference = (context.storage('raw_tag_editor.expanded') === 'true'),
57952 expandedCurrent = expandedPreference,
57953 updatePreference = true,
57963 function rawTagEditor(selection$$1) {
57964 var count = Object.keys(tags).filter(function(d) { return d; }).length;
57966 selection$$1.call(uiDisclosure()
57967 .title(t('inspector.all_tags') + ' (' + count + ')')
57968 .expanded(expandedCurrent)
57969 .on('toggled', toggled)
57973 function toggled(expanded) {
57974 expandedCurrent = expanded;
57975 if (updatePreference) {
57976 expandedPreference = expanded;
57977 context.storage('raw_tag_editor.expanded', expanded);
57980 selection$$1.node().parentNode.scrollTop += 200;
57986 function content(wrap) {
57987 var entries = map$4(tags, function(v, k) {
57988 return { key: k, value: v };
57991 if (!entries.length || showBlank) {
57993 entries.push({key: '', value: ''});
57997 var list = wrap.selectAll('.tag-list')
58000 list = list.enter()
58002 .attr('class', 'tag-list')
58005 var newTag = wrap.selectAll('.add-tag')
58010 .attr('class', 'add-tag')
58011 .on('click', addTag)
58012 .call(svgIcon('#icon-plus', 'light'));
58015 var items = list.selectAll('.tag-row')
58016 .data(entries, function(d) { return d.key; });
58024 var enter = items.enter()
58026 .attr('class', 'tag-row cf')
58027 .classed('readonly', isReadOnly);
58031 .attr('class', 'key-wrap')
58033 .property('type', 'text')
58034 .attr('class', 'key')
58035 .attr('maxlength', 255)
58037 .on('blur', keyChange)
58038 .on('change', keyChange);
58042 .attr('class', 'input-wrap-position')
58044 .property('type', 'text')
58045 .attr('class', 'value')
58046 .attr('maxlength', 255)
58048 .on('blur', valueChange)
58049 .on('change', valueChange)
58050 .on('keydown.push-more', pushMore);
58054 .attr('tabindex', -1)
58055 .attr('class', 'remove minor')
58056 .call(svgIcon('#operation-delete'));
58063 .sort(function(a, b) {
58064 return (a.key === newRow && b.key !== newRow) ? 1
58065 : (a.key !== newRow && b.key === newRow) ? -1
58066 : d3_ascending(a.key, b.key);
58070 .each(function(tag) {
58071 var row = d3_select(this),
58072 key = row.select('input.key'), // propagate bound data to child
58073 value = row.select('input.value'); // propagate bound data to child
58075 if (id && taginfo) {
58076 bindTypeahead(key, value);
58079 var isRelation = (id && context.entity(id).type === 'relation'),
58082 if (isRelation && tag.key === 'type') {
58083 reference = uiTagReference({ rtype: tag.value }, context);
58085 reference = uiTagReference({ key: tag.key, value: tag.value }, context);
58088 if (state === 'hover') {
58089 reference.showing(false);
58093 .call(reference.button)
58094 .call(reference.body);
58097 items.selectAll('input.key')
58098 .attr('title', function(d) { return d.key; })
58099 .call(utilGetSetValue, function(d) { return d.key; })
58100 .property('disabled', isReadOnly);
58102 items.selectAll('input.value')
58103 .attr('title', function(d) { return d.value; })
58104 .call(utilGetSetValue, function(d) { return d.value; })
58105 .property('disabled', isReadOnly);
58107 items.selectAll('button.remove')
58108 .on('click', removeTag);
58112 function isReadOnly(d) {
58113 for (var i = 0; i < readOnlyTags.length; i++) {
58114 if (d.key.match(readOnlyTags[i]) !== null) {
58122 function pushMore() {
58123 if (event.keyCode === 9 && !event.shiftKey &&
58124 list.selectAll('li:last-child input.value').node() === this) {
58130 function bindTypeahead(key, value) {
58131 if (isReadOnly({ key: key })) return;
58132 var geometry = context.geometry(id);
58134 key.call(d3combobox()
58135 .container(context.container())
58136 .fetcher(function(value, callback) {
58139 geometry: geometry,
58141 }, function(err, data) {
58142 if (!err) callback(sort(value, data));
58146 value.call(d3combobox()
58147 .container(context.container())
58148 .fetcher(function(value, callback) {
58151 key: utilGetSetValue(key),
58152 geometry: geometry,
58154 }, function(err, data) {
58155 if (!err) callback(sort(value, data));
58160 function sort(value, data) {
58161 var sameletter = [],
58163 for (var i = 0; i < data.length; i++) {
58164 if (data[i].value.substring(0, value.length) === value) {
58165 sameletter.push(data[i]);
58167 other.push(data[i]);
58170 return sameletter.concat(other);
58175 function unbind() {
58176 var row = d3_select(this);
58178 row.selectAll('input.key')
58179 .call(d3combobox.off);
58181 row.selectAll('input.value')
58182 .call(d3combobox.off);
58186 function keyChange(d) {
58188 kNew = this.value.trim(),
58192 if (isReadOnly({ key: kNew })) {
58197 if (kNew && kNew !== kOld) {
58198 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
58200 suffix = +(match[2] || 1);
58201 while (tags[kNew]) { // rename key if already in use
58202 kNew = base + '_' + suffix++;
58205 tag[kOld] = undefined;
58206 tag[kNew] = d.value;
58208 d.key = kNew; // Maintain DOM identity through the subsequent update.
58210 if (newRow === kOld) { // see if this row is still a new row
58211 newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
58215 dispatch$$1.call('change', this, tag);
58219 function valueChange(d) {
58220 if (isReadOnly(d)) return;
58222 tag[d.key] = this.value;
58224 if (newRow === d.key && d.key !== '' && d.value !== '') { // not a new row anymore
58225 newRow = undefined;
58228 dispatch$$1.call('change', this, tag);
58232 function removeTag(d) {
58233 if (isReadOnly(d)) return;
58235 tag[d.key] = undefined;
58236 dispatch$$1.call('change', this, tag);
58237 d3_select(this.parentNode).remove();
58241 function addTag() {
58242 // Wrapped in a setTimeout in case it's being called from a blur
58243 // handler. Without the setTimeout, the call to `content` would
58244 // wipe out the pending value change.
58245 setTimeout(function() {
58248 list.selectAll('li:last-child input.key').node().focus();
58254 rawTagEditor.state = function(_) {
58255 if (!arguments.length) return state;
58257 return rawTagEditor;
58261 rawTagEditor.preset = function(_) {
58262 if (!arguments.length) return preset;
58264 if (preset.isFallback()) {
58265 expandedCurrent = true;
58266 updatePreference = false;
58268 expandedCurrent = expandedPreference;
58269 updatePreference = true;
58271 return rawTagEditor;
58275 rawTagEditor.tags = function(_) {
58276 if (!arguments.length) return tags;
58278 return rawTagEditor;
58282 rawTagEditor.entityID = function(_) {
58283 if (!arguments.length) return id;
58285 return rawTagEditor;
58289 rawTagEditor.expanded = function(_) {
58290 if (!arguments.length) return expandedCurrent;
58291 expandedCurrent = _;
58292 updatePreference = false;
58293 return rawTagEditor;
58297 rawTagEditor.readOnlyTags = function(_) {
58298 if (!arguments.length) return readOnlyTags;
58300 return rawTagEditor;
58304 return utilRebind(rawTagEditor, dispatch$$1, 'on');
58307 function uiFieldCheck(field, context) {
58308 var dispatch$$1 = dispatch('change'),
58309 options = field.strings && field.strings.options,
58312 input = d3_select(null),
58313 text = d3_select(null),
58314 label = d3_select(null),
58315 reverser = d3_select(null),
58322 for (var k in options) {
58323 values.push(k === 'undefined' ? undefined : k);
58324 texts.push(field.t('options.' + k, { 'default': options[k] }));
58327 values = [undefined, 'yes'];
58328 texts = [t('inspector.unknown'), t('inspector.check.yes')];
58329 if (field.type !== 'defaultCheck') {
58331 texts.push(t('inspector.check.no'));
58336 // Checks tags to see whether an undefined value is "Assumed to be Yes"
58337 function checkImpliedYes() {
58338 impliedYes = (field.id === 'oneway_yes');
58340 // hack: pretend `oneway` field is a `oneway_yes` field
58341 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
58342 if (field.id === 'oneway') {
58343 var entity = context.entity(entityId);
58344 for (var key in entity.tags) {
58345 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
58347 texts[0] = t('presets.fields.oneway_yes.options.undefined');
58355 function reverserHidden() {
58356 if (!d3_select('div.inspector-hover').empty()) return true;
58357 return !(value === 'yes' || (impliedYes && !value));
58361 function reverserSetText(selection$$1) {
58362 var entity = context.hasEntity(entityId);
58363 if (reverserHidden() || !entity) return selection$$1;
58365 var first = entity.first(),
58366 last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last(),
58367 pseudoDirection = first < last,
58368 icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
58370 selection$$1.selectAll('.reverser-span')
58371 .text(t('inspector.check.reverser'))
58372 .call(svgIcon(icon, 'inline'));
58374 return selection$$1;
58378 var check = function(selection$$1) {
58380 selection$$1.classed('checkselect', 'true');
58382 label = selection$$1.selectAll('.preset-input-wrap')
58385 var enter = label.enter()
58387 .attr('class', 'preset-input-wrap');
58391 .property('indeterminate', field.type !== 'defaultCheck')
58392 .attr('type', 'checkbox')
58393 .attr('id', 'preset-input-' + field.id);
58398 .attr('class', 'value');
58400 if (field.type === 'onewayCheck') {
58403 .attr('id', 'preset-input-' + field.id + '-reverser')
58404 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
58407 .attr('class', 'reverser-span');
58410 label = label.merge(enter);
58411 input = label.selectAll('input');
58412 text = label.selectAll('span.value');
58415 .on('click', function() {
58417 t$$1[field.key] = values[(values.indexOf(value) + 1) % values.length];
58418 dispatch$$1.call('change', this, t$$1);
58419 event.stopPropagation();
58422 if (field.type === 'onewayCheck') {
58423 reverser = label.selectAll('.reverser');
58426 .call(reverserSetText)
58427 .on('click', function() {
58428 event.preventDefault();
58429 event.stopPropagation();
58431 actionReverse(entityId),
58432 t('operations.reverse.annotation')
58435 .call(reverserSetText);
58441 check.entity = function(_) {
58442 if (!arguments.length) return context.hasEntity(entityId);
58448 check.tags = function(tags) {
58450 value = tags[field.key] && tags[field.key].toLowerCase();
58452 if (field.type === 'onewayCheck' && (value === '1' || value === '-1')) {
58457 .property('indeterminate', field.type !== 'defaultCheck' && !value)
58458 .property('checked', value === 'yes');
58461 .text(texts[values.indexOf(value)]);
58464 .classed('set', !!value);
58466 if (field.type === 'onewayCheck') {
58468 .classed('hide', reverserHidden())
58469 .call(reverserSetText);
58474 check.focus = function() {
58475 input.node().focus();
58478 return utilRebind(check, dispatch$$1, 'on');
58481 /** Used for built-in method references. */
58482 var arrayProto$1 = Array.prototype;
58484 /** Built-in value references. */
58485 var splice$1 = arrayProto$1.splice;
58488 * The base implementation of `_.pullAt` without support for individual
58489 * indexes or capturing the removed elements.
58492 * @param {Array} array The array to modify.
58493 * @param {number[]} indexes The indexes of elements to remove.
58494 * @returns {Array} Returns `array`.
58496 function basePullAt(array, indexes) {
58497 var length = array ? indexes.length : 0,
58498 lastIndex = length - 1;
58501 var index = indexes[length];
58502 if (length == lastIndex || index !== previous) {
58503 var previous = index;
58504 if (isIndex(index)) {
58505 splice$1.call(array, index, 1);
58507 baseUnset(array, index);
58515 * Removes all elements from `array` that `predicate` returns truthy for
58516 * and returns an array of the removed elements. The predicate is invoked
58517 * with three arguments: (value, index, array).
58519 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
58520 * to pull elements from an array by value.
58526 * @param {Array} array The array to modify.
58527 * @param {Function} [predicate=_.identity] The function invoked per iteration.
58528 * @returns {Array} Returns the new array of removed elements.
58531 * var array = [1, 2, 3, 4];
58532 * var evens = _.remove(array, function(n) {
58533 * return n % 2 == 0;
58536 * console.log(array);
58539 * console.log(evens);
58542 function remove$8(array, predicate) {
58544 if (!(array && array.length)) {
58549 length = array.length;
58551 predicate = baseIteratee(predicate, 3);
58552 while (++index < length) {
58553 var value = array[index];
58554 if (predicate(value, index, array)) {
58555 result.push(value);
58556 indexes.push(index);
58559 basePullAt(array, indexes);
58563 function uiFieldCombo(field, context) {
58564 var dispatch$$1 = dispatch('change'),
58565 nominatim = services.geocoder,
58566 taginfo = services.taginfo,
58567 isMulti = (field.type === 'multiCombo'),
58568 isNetwork = (field.type === 'networkCombo'),
58569 isSemi = (field.type === 'semiCombo'),
58570 optstrings = field.strings && field.strings.options,
58571 optarray = field.options,
58572 snake_case = (field.snake_case || (field.snake_case === undefined)),
58573 combobox = d3combobox()
58574 .container(context.container())
58575 .minItems(isMulti || isSemi ? 1 : 2),
58583 // ensure multiCombo field.key ends with a ':'
58584 if (isMulti && field.key.match(/:$/) === null) {
58589 function snake(s) {
58590 return s.replace(/\s+/g, '_');
58593 function unsnake(s) {
58594 return s.replace(/_+/g, ' ');
58597 function clean(s) {
58598 return s.split(';')
58599 .map(function(s) { return s.trim(); })
58604 // returns the tag value for a display value
58605 // (for multiCombo, dval should be the key suffix, not the entire key)
58606 function tagValue(dval) {
58607 dval = clean(dval || '');
58610 var match = find$1(comboData, function(o) {
58611 return o.key && clean(o.value) === dval;
58618 if (field.type === 'typeCombo' && !dval) {
58622 return (snake_case ? snake(dval) : dval) || undefined;
58626 // returns the display value for a tag value
58627 // (for multiCombo, tval should be the key suffix, not the entire key)
58628 function displayValue(tval) {
58632 var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
58634 return match.value;
58638 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
58642 return snake_case ? unsnake(tval) : tval;
58646 function objectDifference(a, b) {
58647 return reject(a, function(d1) {
58648 return some(b, function(d2) { return d1.value === d2.value; });
58653 function initCombo(selection$$1, attachTo) {
58655 selection$$1.attr('readonly', 'readonly');
58656 selection$$1.call(combobox, attachTo);
58657 setStaticValues(setPlaceholder);
58659 } else if (optarray) {
58660 selection$$1.call(combobox, attachTo);
58661 setStaticValues(setPlaceholder);
58663 } else if (taginfo) {
58664 selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
58665 setTaginfoValues('', setPlaceholder);
58670 function setStaticValues(callback) {
58671 if (!(optstrings || optarray)) return;
58674 comboData = Object.keys(optstrings).map(function(k) {
58675 var v = field.t('options.' + k, { 'default': optstrings[k] });
58683 } else if (optarray) {
58684 comboData = optarray.map(function(k) {
58685 var v = snake_case ? unsnake(k) : k;
58694 combobox.data(objectDifference(comboData, multiData));
58695 if (callback) callback(comboData);
58699 function setTaginfoValues(q, callback) {
58700 var fn = isMulti ? 'multikeys' : 'values';
58701 var query = (isMulti ? field.key : '') + q;
58702 var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
58703 if (hasCountryPrefix) {
58704 query = country + ':';
58708 debounce: (q !== ''),
58714 params.geometry = context.geometry(entity.id);
58717 taginfo[fn](params, function(err, data) {
58719 if (hasCountryPrefix) {
58720 data = filter(data, function(d) {
58721 return d.value.toLowerCase().indexOf(country + ':') === 0;
58725 comboData = map$4(data, function(d) {
58727 if (isMulti) k = k.replace(field.key, '');
58728 var v = snake_case ? unsnake(k) : k;
58732 title: isMulti ? v : d.title
58736 comboData = objectDifference(comboData, multiData);
58737 if (callback) callback(comboData);
58742 function setPlaceholder(d) {
58745 if (isMulti || isSemi) {
58746 ph = field.placeholder() || t('inspector.add');
58748 var vals = map$4(d, 'value').filter(function(s) { return s.length < 20; }),
58749 placeholders = vals.length > 1 ? vals : map$4(d, 'key');
58750 ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
58753 if (ph.match(/(…|\.\.\.)$/) === null) {
58757 container.selectAll('input')
58758 .attr('placeholder', ph);
58762 function change() {
58763 var val = tagValue(utilGetSetValue(input)),
58766 if (isMulti || isSemi) {
58768 container.classed('active', false);
58769 utilGetSetValue(input, '');
58771 field.keys.push(field.key + val);
58772 t$$1[field.key + val] = 'yes';
58773 } else if (isSemi) {
58774 var arr = multiData.map(function(d) { return d.key; });
58776 t$$1[field.key] = compact(uniq(arr)).join(';');
58778 window.setTimeout(function() { input.node().focus(); }, 10);
58781 t$$1[field.key] = val;
58784 dispatch$$1.call('change', this, t$$1);
58788 function removeMultikey(d) {
58789 event.stopPropagation();
58792 t$$1[d.key] = undefined;
58793 } else if (isSemi) {
58794 remove$8(multiData, function(md) { return md.key === d.key; });
58795 var arr = multiData.map(function(md) { return md.key; });
58796 arr = compact(uniq(arr));
58797 t$$1[field.key] = arr.length ? arr.join(';') : undefined;
58799 dispatch$$1.call('change', this, t$$1);
58803 function combo(selection$$1) {
58804 if (isMulti || isSemi) {
58805 container = selection$$1.selectAll('ul').data([0]);
58807 container = container.enter()
58809 .attr('class', 'form-field-multicombo')
58810 .on('click', function() {
58811 window.setTimeout(function() { input.node().focus(); }, 10);
58816 container = selection$$1;
58819 input = container.selectAll('input')
58822 input = input.enter()
58824 .attr('type', 'text')
58825 .attr('id', 'preset-input-' + field.id)
58827 .call(initCombo, selection$$1)
58830 if (isNetwork && nominatim && entity) {
58831 var center = entity.extent(context.graph()).center();
58832 nominatim.countryCode(center, function (err, code) {
58838 .on('change', change)
58839 .on('blur', change);
58841 if (isMulti || isSemi) {
58843 .on('accept', function() {
58844 input.node().blur();
58845 input.node().focus();
58849 .on('focus', function() { container.classed('active', true); });
58854 combo.tags = function(tags) {
58855 if (isMulti || isSemi) {
58859 // Build multiData array containing keys already set..
58860 Object.keys(tags).forEach(function(key) {
58861 if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
58863 var suffix = key.substring(field.key.length);
58866 value: displayValue(suffix)
58870 // Set keys for form-field modified (needed for undo and reset buttons)..
58871 field.keys = map$4(multiData, 'key');
58873 } else if (isSemi) {
58874 var arr = compact(uniq((tags[field.key] || '').split(';')));
58875 multiData = arr.map(function(key) {
58878 value: displayValue(key)
58883 // Exclude existing multikeys from combo options..
58884 var available = objectDifference(comboData, multiData);
58885 combobox.data(available);
58887 // Hide 'Add' button if this field uses fixed set of
58888 // translateable optstrings and they're all currently used..
58889 container.selectAll('.combobox-input, .combobox-caret')
58890 .classed('hide', optstrings && !available.length);
58894 var chips = container.selectAll('.chips')
58900 var enter = chips.enter()
58901 .insert('li', 'input')
58902 .attr('class', 'chips');
58904 enter.append('span');
58907 chips = chips.merge(enter);
58909 chips.select('span')
58910 .text(function(d) { return d.value; });
58913 .on('click', removeMultikey)
58914 .attr('class', 'remove')
58918 utilGetSetValue(input, displayValue(tags[field.key]));
58923 combo.focus = function() {
58924 input.node().focus();
58928 combo.entity = function(_) {
58929 if (!arguments.length) return entity;
58935 return utilRebind(combo, dispatch$$1, 'on');
58938 function uiFieldText(field, context) {
58939 var dispatch$$1 = dispatch('change'),
58940 nominatim = services.geocoder,
58945 function i(selection$$1) {
58946 var fieldId = 'preset-input-' + field.id;
58948 input = selection$$1.selectAll('input')
58951 input = input.enter()
58953 .attr('type', field.type)
58954 .attr('id', fieldId)
58955 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
58960 .on('input', change(true))
58961 .on('blur', change())
58962 .on('change', change());
58964 if (field.type === 'tel' && nominatim && entity) {
58965 var center = entity.extent(context.graph()).center();
58966 nominatim.countryCode(center, function (err, countryCode) {
58967 if (err || !dataPhoneFormats[countryCode]) return;
58968 selection$$1.selectAll('#' + fieldId)
58969 .attr('placeholder', dataPhoneFormats[countryCode]);
58972 } else if (field.type === 'number') {
58973 var rtl = (textDirection === 'rtl');
58975 input.attr('type', 'text');
58977 var spinControl = selection$$1.selectAll('.spin-control')
58980 var enter = spinControl.enter()
58982 .attr('class', 'spin-control');
58986 .datum(rtl ? 1 : -1)
58987 .attr('class', rtl ? 'increment' : 'decrement')
58988 .attr('tabindex', -1);
58992 .datum(rtl ? -1 : 1)
58993 .attr('class', rtl ? 'decrement' : 'increment')
58994 .attr('tabindex', -1);
58996 spinControl = spinControl
58999 spinControl.selectAll('button')
59000 .on('click', function(d) {
59001 event.preventDefault();
59002 var num = parseInt(input.node().value || 0, 10);
59003 if (!isNaN(num)) input.node().value = num + d;
59010 function change(onInput) {
59011 return function() {
59013 t$$1[field.key] = utilGetSetValue(input) || undefined;
59014 dispatch$$1.call('change', this, t$$1, onInput);
59019 i.entity = function(_) {
59020 if (!arguments.length) return entity;
59026 i.tags = function(tags) {
59027 utilGetSetValue(input, tags[field.key] || '');
59031 i.focus = function() {
59032 var node = input.node();
59033 if (node) node.focus();
59036 return utilRebind(i, dispatch$$1, 'on');
59039 function uiFieldAccess(field, context) {
59040 var dispatch$$1 = dispatch('change'),
59043 function access(selection$$1) {
59044 var wrap = selection$$1.selectAll('.preset-input-wrap')
59047 wrap = wrap.enter()
59049 .attr('class', 'cf preset-input-wrap')
59053 var list = wrap.selectAll('ul')
59056 list = list.enter()
59061 items = list.selectAll('li')
59065 var enter = items.enter()
59067 .attr('class', function(d) { return 'cf preset-access-' + d; });
59071 .attr('class', 'col6 label preset-label-access')
59072 .attr('for', function(d) { return 'preset-input-access-' + d; })
59073 .text(function(d) { return field.t('types.' + d); });
59077 .attr('class', 'col6 preset-input-access-wrap')
59079 .attr('type', 'text')
59080 .attr('class', 'preset-input-access')
59081 .attr('id', function(d) { return 'preset-input-access-' + d; })
59083 .each(function(d) {
59086 .container(context.container())
59087 .data(access.options(d))
59093 items = items.merge(enter);
59095 wrap.selectAll('.preset-input-access')
59096 .on('change', change)
59097 .on('blur', change);
59101 function change(d) {
59103 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
59104 dispatch$$1.call('change', this, tag);
59108 access.options = function(type) {
59109 var options = ['no', 'permissive', 'private', 'destination'];
59111 if (type !== 'access') {
59112 options.unshift('yes');
59113 options.push('designated');
59115 if (type === 'bicycle') {
59116 options.push('dismount');
59120 return options.map(function(option) {
59122 title: field.t('options.' + option + '.description'),
59129 var placeholders = {
59131 foot: 'designated',
59132 motor_vehicle: 'no'
59136 motor_vehicle: 'no',
59142 motor_vehicle: 'no'
59145 motor_vehicle: 'no',
59146 bicycle: 'designated'
59149 motor_vehicle: 'no',
59150 horse: 'designated'
59154 motor_vehicle: 'no',
59160 motor_vehicle: 'yes',
59165 motor_vehicle: 'yes'
59169 motor_vehicle: 'yes',
59175 motor_vehicle: 'yes',
59181 motor_vehicle: 'yes',
59187 motor_vehicle: 'yes',
59193 motor_vehicle: 'yes',
59199 motor_vehicle: 'yes',
59205 motor_vehicle: 'yes',
59210 motor_vehicle: 'yes'
59214 motor_vehicle: 'yes',
59220 motor_vehicle: 'yes',
59226 motor_vehicle: 'yes',
59233 access.tags = function(tags) {
59234 utilGetSetValue(items.selectAll('.preset-input-access'),
59235 function(d) { return tags[d] || ''; })
59236 .attr('placeholder', function() {
59237 return tags.access ? tags.access : field.placeholder();
59240 items.selectAll('#preset-input-access-access')
59241 .attr('placeholder', 'yes');
59243 forEach(placeholders[tags.highway], function(v, k) {
59244 items.selectAll('#preset-input-access-' + k)
59245 .attr('placeholder', function() { return (tags.access || v); });
59250 access.focus = function() {
59251 items.selectAll('.preset-input-access')
59256 return utilRebind(access, dispatch$$1, 'on');
59259 function uiFieldAddress(field, context) {
59260 var dispatch$$1 = dispatch('init', 'change'),
59261 nominatim = services.geocoder,
59262 wrap = d3_select(null),
59263 isInitialized = false,
59266 function getNearStreets() {
59267 var extent = entity.extent(context.graph()),
59268 l = extent.center(),
59269 box = geoExtent$$1(l).padByMeters(200);
59271 var streets = context.intersects(box)
59272 .filter(isAddressable)
59274 var loc = context.projection([
59275 (extent[0][0] + extent[1][0]) / 2,
59276 (extent[0][1] + extent[1][1]) / 2]),
59277 choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
59279 title: d.tags.name,
59280 value: d.tags.name,
59281 dist: choice.distance
59284 .sort(function(a, b) {
59285 return a.dist - b.dist;
59288 return uniqBy(streets, 'value');
59290 function isAddressable(d) {
59291 return d.tags.highway && d.tags.name && d.type === 'way';
59296 function getNearCities() {
59297 var extent = entity.extent(context.graph()),
59298 l = extent.center(),
59299 box = geoExtent$$1(l).padByMeters(200);
59301 var cities = context.intersects(box)
59302 .filter(isAddressable)
59305 title: d.tags['addr:city'] || d.tags.name,
59306 value: d.tags['addr:city'] || d.tags.name,
59307 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
59310 .sort(function(a, b) {
59311 return a.dist - b.dist;
59314 return uniqBy(cities, 'value');
59317 function isAddressable(d) {
59319 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
59322 if (d.tags.place && d.tags.name && (
59323 d.tags.place === 'city' ||
59324 d.tags.place === 'town' ||
59325 d.tags.place === 'village'))
59328 if (d.tags['addr:city']) return true;
59334 function getNearValues(key) {
59335 var extent = entity.extent(context.graph()),
59336 l = extent.center(),
59337 box = geoExtent$$1(l).padByMeters(200);
59339 var results = context.intersects(box)
59340 .filter(function hasTag(d) {
59341 return d.tags[key];
59345 title: d.tags[key],
59346 value: d.tags[key],
59347 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
59350 .sort(function(a, b) {
59351 return a.dist - b.dist;
59354 return uniqBy(results, 'value');
59358 function initCallback(err, countryCode) {
59361 var addressFormat = find$1(dataAddressFormats, function (a) {
59362 return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
59363 }) || dataAddressFormats[0];
59365 var widths = addressFormat.widths || {
59366 housenumber: 1/3, street: 2/3,
59367 city: 2/3, state: 1/4, postcode: 1/3
59371 // Normalize widths.
59372 var total = reduce(r, function(sum, field) {
59373 return sum + (widths[field] || 0.5);
59376 return r.map(function (field) {
59379 width: (widths[field] || 0.5) / total
59384 wrap.selectAll('div.addr-row')
59385 .data(addressFormat.format)
59388 .attr('class', 'addr-row')
59389 .selectAll('input')
59393 .property('type', 'text')
59394 .attr('placeholder', function (d) {
59395 var localkey = d.id + '!' + countryCode.toLowerCase(),
59396 tkey = field.strings.placeholders[localkey] ? localkey : d.id;
59397 return field.t('placeholders.' + tkey);
59399 .attr('class', function (d) { return 'addr-' + d.id; })
59401 .style('width', function (d) { return d.width * 100 + '%'; });
59405 // setup dropdowns for common address tags
59406 var dropdowns = addressFormat.dropdowns || [
59407 'city', 'county', 'country', 'district', 'hamlet',
59408 'neighbourhood', 'place', 'postcode', 'province',
59409 'quarter', 'state', 'street', 'subdistrict', 'suburb'
59412 // If fields exist for any of these tags, create dropdowns to pick nearby values..
59413 dropdowns.forEach(function(tag) {
59414 var nearValues = (tag === 'street') ? getNearStreets
59415 : (tag === 'city') ? getNearCities
59418 wrap.selectAll('input.addr-' + tag)
59420 .container(context.container())
59422 .fetcher(function(value, callback) {
59423 callback(nearValues('addr:' + tag));
59428 wrap.selectAll('input')
59429 .on('blur', change())
59430 .on('change', change());
59432 wrap.selectAll('input:not(.combobox-input)')
59433 .on('input', change(true));
59435 dispatch$$1.call('init');
59436 isInitialized = true;
59440 function address(selection$$1) {
59441 isInitialized = false;
59443 wrap = selection$$1.selectAll('.preset-input-wrap')
59446 wrap = wrap.enter()
59448 .attr('class', 'preset-input-wrap')
59451 if (nominatim && entity) {
59452 var center = entity.extent(context.graph()).center();
59453 nominatim.countryCode(center, initCallback);
59458 function change(onInput) {
59459 return function() {
59462 wrap.selectAll('input')
59463 .each(function (field) {
59464 tags['addr:' + field.id] = this.value || undefined;
59467 dispatch$$1.call('change', this, tags, onInput);
59472 function updateTags(tags) {
59473 utilGetSetValue(wrap.selectAll('input'), function (field) {
59474 return tags['addr:' + field.id] || '';
59479 address.entity = function(_) {
59480 if (!arguments.length) return entity;
59486 address.tags = function(tags) {
59487 if (isInitialized) {
59490 dispatch$$1.on('init', function () {
59491 dispatch$$1.on('init', null);
59498 address.focus = function() {
59499 var node = wrap.selectAll('input').node();
59500 if (node) node.focus();
59504 return utilRebind(address, dispatch$$1, 'on');
59507 function uiFieldCycleway(field, context) {
59508 var dispatch$$1 = dispatch('change'),
59509 items = d3_select(null);
59512 function cycleway(selection$$1) {
59514 function stripcolon(s) {
59515 return s.replace(':', '');
59519 var wrap = selection$$1.selectAll('.preset-input-wrap')
59522 wrap = wrap.enter()
59524 .attr('class', 'cf preset-input-wrap')
59528 var div = wrap.selectAll('ul')
59536 items = div.selectAll('li')
59539 var enter = items.enter()
59541 .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
59545 .attr('class', 'col6 label preset-label-cycleway')
59546 .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
59547 .text(function(d) { return field.t('types.' + d); });
59551 .attr('class', 'col6 preset-input-cycleway-wrap')
59553 .attr('type', 'text')
59554 .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
59556 .each(function(d) {
59559 .container(context.container())
59560 .data(cycleway.options(d))
59566 wrap.selectAll('.preset-input-cycleway')
59567 .on('change', change)
59568 .on('blur', change);
59572 function change() {
59573 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
59574 right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
59577 if (left === 'none' || left === '') { left = undefined; }
59578 if (right === 'none' || right === '') { right = undefined; }
59580 // Always set both left and right as changing one can affect the other
59582 cycleway: undefined,
59583 'cycleway:left': left,
59584 'cycleway:right': right
59587 // If the left and right tags match, use the cycleway tag to tag both
59588 // sides the same way
59589 if (left === right) {
59592 'cycleway:left': undefined,
59593 'cycleway:right': undefined
59597 dispatch$$1.call('change', this, tag);
59601 cycleway.options = function() {
59602 return keys$1(field.strings.options).map(function(option) {
59604 title: field.t('options.' + option + '.description'),
59611 cycleway.tags = function(tags) {
59612 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
59613 // If cycleway is set, always return that
59614 if (tags.cycleway) {
59615 return tags.cycleway;
59617 return tags[d] || '';
59619 .attr('placeholder', field.placeholder());
59623 cycleway.focus = function() {
59624 items.selectAll('.preset-input-cycleway')
59629 return utilRebind(cycleway, dispatch$$1, 'on');
59632 function uiFieldLanes(field, context) {
59633 var dispatch$$1 = dispatch('change'),
59639 function lanes(selection$$1) {
59640 lanesData = context.entity(wayID).lanes();
59642 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
59643 selection$$1.call(lanes.off);
59647 var wrap = selection$$1.selectAll('.preset-input-wrap')
59650 wrap = wrap.enter()
59652 .attr('class', 'preset-input-wrap')
59655 var surface = wrap.selectAll('.surface')
59658 var d = utilGetDimensions(wrap);
59659 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
59661 surface = surface.enter()
59663 .attr('width', d[0])
59664 .attr('height', 300)
59665 .attr('class', 'surface')
59669 var lanesSelection = surface.selectAll('.lanes')
59672 lanesSelection = lanesSelection.enter()
59674 .attr('class', 'lanes')
59675 .merge(lanesSelection);
59678 .attr('transform', function () {
59679 return 'translate(' + (freeSpace / 2) + ', 0)';
59683 var lane = lanesSelection.selectAll('.lane')
59684 .data(lanesData.lanes);
59689 var enter = lane.enter()
59691 .attr('class', 'lane');
59697 .attr('width', LANE_WIDTH)
59698 .attr('height', LANE_HEIGHT);
59702 .attr('class', 'forward')
59710 .attr('class', 'bothways')
59718 .attr('class', 'backward')
59729 .attr('transform', function(d) {
59730 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
59733 lane.select('.forward')
59734 .style('visibility', function(d) {
59735 return d.direction === 'forward' ? 'visible' : 'hidden';
59738 lane.select('.bothways')
59739 .style('visibility', function(d) {
59740 return d.direction === 'bothways' ? 'visible' : 'hidden';
59743 lane.select('.backward')
59744 .style('visibility', function(d) {
59745 return d.direction === 'backward' ? 'visible' : 'hidden';
59750 lanes.entity = function(_) {
59751 if (!wayID || wayID !== _.id) {
59756 lanes.tags = function() {};
59757 lanes.focus = function() {};
59758 lanes.off = function() {};
59760 return utilRebind(lanes, dispatch$$1, 'on');
59763 function uiFieldLocalized(field, context) {
59764 var dispatch$$1 = dispatch('change', 'input'),
59765 wikipedia = services.wikipedia,
59766 input = d3_select(null),
59767 localizedInputs = d3_select(null),
59772 function localized(selection$$1) {
59773 input = selection$$1.selectAll('.localized-main')
59776 input = input.enter()
59778 .attr('type', 'text')
59779 .attr('id', 'preset-input-' + field.id)
59780 .attr('class', 'localized-main')
59781 .attr('placeholder', field.placeholder())
59785 if (field.id === 'name') {
59786 var preset = context.presets().match(entity, context.graph());
59789 .container(context.container())
59790 .fetcher(utilSuggestNames(preset, dataSuggestions))
59795 .on('input', change(true))
59796 .on('blur', change())
59797 .on('change', change());
59800 var translateButton = selection$$1.selectAll('.localized-add')
59803 translateButton = translateButton.enter()
59805 .attr('class', 'button-input-action localized-add minor')
59806 .attr('tabindex', -1)
59807 .call(svgIcon('#icon-plus'))
59809 .title(t('translate.translate'))
59810 .placement('left'))
59811 .merge(translateButton);
59814 .on('click', addNew);
59817 localizedInputs = selection$$1.selectAll('.localized-wrap')
59820 localizedInputs = localizedInputs.enter().append('div')
59821 .attr('class', 'localized-wrap')
59822 .merge(localizedInputs);
59826 function addNew() {
59827 event.preventDefault();
59828 var data$$1 = localizedInputs.selectAll('div.entry').data();
59829 var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
59830 var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
59831 var isLangEn = defaultLang.indexOf('en') > -1;
59832 if (isLangEn || langExists) {
59835 data$$1.push({ lang: defaultLang, value: '' });
59836 localizedInputs.call(render, data$$1);
59840 function change(onInput) {
59841 return function() {
59843 t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
59844 dispatch$$1.call('change', this, t$$1, onInput);
59849 function key(lang) {
59850 return field.key + ':' + lang;
59854 function changeLang(d) {
59855 var lang = utilGetSetValue(d3_select(this)),
59857 language = find$1(dataWikipedia, function(d) {
59858 return d[0].toLowerCase() === lang.toLowerCase() ||
59859 d[1].toLowerCase() === lang.toLowerCase();
59862 if (language) lang = language[2];
59864 if (d.lang && d.lang !== lang) {
59865 t$$1[key(d.lang)] = undefined;
59868 var value = utilGetSetValue(d3_select(this.parentNode)
59869 .selectAll('.localized-value'));
59871 if (lang && value) {
59872 t$$1[key(lang)] = value;
59873 } else if (lang && wikiTitles && wikiTitles[d.lang]) {
59874 t$$1[key(lang)] = wikiTitles[d.lang];
59878 dispatch$$1.call('change', this, t$$1);
59882 function changeValue(d) {
59883 if (!d.lang) return;
59885 t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
59886 dispatch$$1.call('change', this, t$$1);
59890 function fetcher(value, cb) {
59891 var v = value.toLowerCase();
59893 cb(dataWikipedia.filter(function(d) {
59894 return d[0].toLowerCase().indexOf(v) >= 0 ||
59895 d[1].toLowerCase().indexOf(v) >= 0 ||
59896 d[2].toLowerCase().indexOf(v) >= 0;
59897 }).map(function(d) {
59898 return { value: d[1] };
59903 function render(selection$$1, data$$1) {
59904 var wraps = selection$$1.selectAll('div.entry').
59905 data(data$$1, function(d) { return d.lang; });
59910 .style('max-height','0px')
59911 .style('opacity', '0')
59912 .style('top','-10px')
59915 var innerWrap = wraps.enter()
59916 .insert('div', ':first-child');
59918 innerWrap.attr('class', 'entry')
59920 var wrap = d3_select(this);
59921 var langcombo = d3combobox()
59922 .container(context.container())
59928 .attr('class','form-label')
59929 .text(t('translate.localized_translation_label'))
59930 .attr('for','localized-lang');
59934 .attr('class', 'minor remove')
59935 .on('click', function(d){
59936 event.preventDefault();
59938 t$$1[key(d.lang)] = undefined;
59939 dispatch$$1.call('change', this, t$$1);
59940 d3_select(this.parentNode.parentNode)
59942 .style('max-height','240px')
59944 .style('opacity', '0')
59945 .style('max-height','0px')
59948 .call(svgIcon('#operation-delete'));
59952 .attr('class', 'localized-lang')
59953 .attr('type', 'text')
59954 .attr('placeholder',t('translate.localized_translation_language'))
59955 .on('blur', changeLang)
59956 .on('change', changeLang)
59961 .on('blur', changeValue)
59962 .on('change', changeValue)
59963 .attr('type', 'text')
59964 .attr('placeholder', t('translate.localized_translation_name'))
59965 .attr('class', 'localized-value');
59969 .style('margin-top', '0px')
59970 .style('max-height', '0px')
59971 .style('opacity', '0')
59974 .style('margin-top', '10px')
59975 .style('max-height', '240px')
59976 .style('opacity', '1')
59977 .on('end', function() {
59979 .style('max-height', '')
59980 .style('overflow', 'visible');
59984 var entry = selection$$1.selectAll('.entry');
59986 utilGetSetValue(entry.select('.localized-lang'), function(d) {
59987 var lang = find$1(dataWikipedia, function(lang) { return lang[2] === d.lang; });
59988 return lang ? lang[1] : d.lang;
59991 utilGetSetValue(entry.select('.localized-value'),
59992 function(d) { return d.value; });
59996 localized.tags = function(tags) {
59997 // Fetch translations from wikipedia
59998 if (tags.wikipedia && !wikiTitles) {
60000 var wm = tags.wikipedia.match(/([^:]+):(.+)/);
60001 if (wm && wm[0] && wm[1]) {
60002 wikipedia.translations(wm[1], wm[2], function(d) {
60008 utilGetSetValue(input, tags[field.key] || '');
60010 var postfixed = [], k, m;
60012 m = k.match(/^(.*):([a-zA-Z_-]+)$/);
60013 if (m && m[1] === field.key && m[2]) {
60014 postfixed.push({ lang: m[2], value: tags[k] });
60018 localizedInputs.call(render, postfixed.reverse());
60022 localized.focus = function() {
60023 input.node().focus();
60027 localized.entity = function(_) {
60028 if (!arguments.length) return entity;
60033 return utilRebind(localized, dispatch$$1, 'on');
60036 function uiFieldMaxspeed(field, context) {
60037 var dispatch$$1 = dispatch('change'),
60040 unitInput = d3_select(null),
60041 input = d3_select(null),
60044 var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
60045 imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
60048 function maxspeed(selection$$1) {
60049 combobox = d3combobox()
60050 .container(context.container());
60052 var unitCombobox = d3combobox()
60053 .container(context.container())
60054 .data(['km/h', 'mph'].map(comboValues));
60056 input = selection$$1.selectAll('#preset-input-' + field.id)
60059 input = input.enter()
60061 .attr('type', 'text')
60062 .attr('id', 'preset-input-' + field.id)
60063 .attr('placeholder', field.placeholder())
60069 .on('change', change)
60070 .on('blur', change);
60072 var childNodes = context.graph().childNodes(context.entity(entity.id)),
60073 loc = childNodes[~~(childNodes.length/2)].loc;
60075 isImperial = some(dataImperial.features, function(f) {
60076 return some(f.geometry.coordinates, function(d) {
60077 return geoPointInPolygon(loc, d);
60081 unitInput = selection$$1.selectAll('input.maxspeed-unit')
60084 unitInput = unitInput.enter()
60086 .attr('type', 'text')
60087 .attr('class', 'maxspeed-unit')
60088 .call(unitCombobox)
60092 .on('blur', changeUnits)
60093 .on('change', changeUnits);
60096 function changeUnits() {
60097 isImperial = utilGetSetValue(unitInput) === 'mph';
60098 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
60105 function setSuggestions() {
60106 combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
60107 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
60111 function comboValues(d) {
60113 value: d.toString(),
60114 title: d.toString()
60119 function change() {
60121 value = utilGetSetValue(input);
60124 tag[field.key] = undefined;
60125 } else if (isNaN(value) || !isImperial) {
60126 tag[field.key] = value;
60128 tag[field.key] = value + ' mph';
60131 dispatch$$1.call('change', this, tag);
60135 maxspeed.tags = function(tags) {
60136 var value = tags[field.key];
60138 if (value && value.indexOf('mph') >= 0) {
60139 value = parseInt(value, 10);
60141 } else if (value) {
60142 isImperial = false;
60146 utilGetSetValue(input, value || '');
60150 maxspeed.focus = function() {
60151 input.node().focus();
60155 maxspeed.entity = function(_) {
60160 return utilRebind(maxspeed, dispatch$$1, 'on');
60164 * This function is like `baseIndexOf` except that it accepts a comparator.
60167 * @param {Array} array The array to inspect.
60168 * @param {*} value The value to search for.
60169 * @param {number} fromIndex The index to search from.
60170 * @param {Function} comparator The comparator invoked per element.
60171 * @returns {number} Returns the index of the matched value, else `-1`.
60173 function baseIndexOfWith(array, value, fromIndex, comparator) {
60174 var index = fromIndex - 1,
60175 length = array.length;
60177 while (++index < length) {
60178 if (comparator(array[index], value)) {
60185 /** Used for built-in method references. */
60186 var arrayProto$2 = Array.prototype;
60188 /** Built-in value references. */
60189 var splice$2 = arrayProto$2.splice;
60192 * The base implementation of `_.pullAllBy` without support for iteratee
60196 * @param {Array} array The array to modify.
60197 * @param {Array} values The values to remove.
60198 * @param {Function} [iteratee] The iteratee invoked per element.
60199 * @param {Function} [comparator] The comparator invoked per element.
60200 * @returns {Array} Returns `array`.
60202 function basePullAll(array, values, iteratee, comparator) {
60203 var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
60205 length = values.length,
60208 if (array === values) {
60209 values = copyArray(values);
60212 seen = arrayMap(array, baseUnary(iteratee));
60214 while (++index < length) {
60216 value = values[index],
60217 computed = iteratee ? iteratee(value) : value;
60219 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
60220 if (seen !== array) {
60221 splice$2.call(seen, fromIndex, 1);
60223 splice$2.call(array, fromIndex, 1);
60230 * This method is like `_.pull` except that it accepts an array of values to remove.
60232 * **Note:** Unlike `_.difference`, this method mutates `array`.
60238 * @param {Array} array The array to modify.
60239 * @param {Array} values The values to remove.
60240 * @returns {Array} Returns `array`.
60243 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
60245 * _.pullAll(array, ['a', 'c']);
60246 * console.log(array);
60249 function pullAll(array, values) {
60250 return (array && array.length && values && values.length)
60251 ? basePullAll(array, values)
60256 * Removes all given values from `array` using
60257 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
60258 * for equality comparisons.
60260 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
60261 * to remove elements from an array by predicate.
60267 * @param {Array} array The array to modify.
60268 * @param {...*} [values] The values to remove.
60269 * @returns {Array} Returns `array`.
60272 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
60274 * _.pull(array, 'a', 'c');
60275 * console.log(array);
60278 var pull = baseRest(pullAll);
60280 function uiFieldRadio(field, context) {
60281 var dispatch$$1 = dispatch('change'),
60282 placeholder = d3_select(null),
60283 wrap = d3_select(null),
60284 labels = d3_select(null),
60285 radios = d3_select(null),
60286 radioData = clone(field.options || field.keys),
60293 function selectedKey() {
60294 var node = wrap.selectAll('.toggle-list label.active input');
60295 return !node.empty() && node.datum();
60299 function radio(selection$$1) {
60300 selection$$1.classed('preset-radio', true);
60302 wrap = selection$$1.selectAll('.preset-input-wrap')
60305 var enter = wrap.enter()
60307 .attr('class', 'preset-input-wrap toggle-list');
60311 .attr('class', 'placeholder');
60317 placeholder = wrap.selectAll('.placeholder');
60319 labels = wrap.selectAll('label')
60322 enter = labels.enter()
60327 .attr('type', 'radio')
60328 .attr('name', field.id)
60329 .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
60330 .attr('checked', false);
60334 .text(function(d) { return field.t('options.' + d, { 'default': d }); });
60339 radios = labels.selectAll('input')
60340 .on('change', changeRadio);
60345 function structureExtras(selection$$1, tags) {
60346 var selected = selectedKey(),
60347 type = context.presets().field(selected),
60348 layer = context.presets().field('layer'),
60349 showLayer = (selected === 'bridge' || selected === 'tunnel');
60352 var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
60353 .data(selected ? [0] : []);
60358 extrasWrap = extrasWrap.enter()
60360 .attr('class', 'structure-extras-wrap')
60361 .merge(extrasWrap);
60363 var list = extrasWrap.selectAll('ul')
60366 list = list.enter()
60373 if (!typeField || typeField.id !== selected) {
60374 typeField = uiField(context, type, entity, { wrap: false })
60375 .on('change', changeType);
60377 typeField.tags(tags);
60382 var typeItem = list.selectAll('.structure-type-item')
60383 .data(typeField ? [typeField] : [], function(d) { return d.id; });
60390 var typeEnter = typeItem.enter()
60391 .insert('li', ':first-child')
60392 .attr('class', 'cf structure-type-item');
60396 .attr('class', 'col6 label structure-label-type')
60397 .attr('for', 'preset-input-' + selected)
60398 .text(t('inspector.radio.structure.type'));
60402 .attr('class', 'col6 structure-input-type-wrap');
60405 typeItem = typeItem
60409 typeItem.selectAll('.structure-input-type-wrap')
60410 .call(typeField.render);
60415 if (layer && showLayer) {
60417 layerField = uiField(context, layer, entity, { wrap: false })
60418 .on('change', changeLayer);
60420 layerField.tags(tags);
60421 field.keys = union(field.keys, ['layer']);
60424 pull(field.keys, 'layer');
60427 var layerItem = list.selectAll('.structure-layer-item')
60428 .data(layerField ? [layerField] : []);
60435 var layerEnter = layerItem.enter()
60437 .attr('class', 'cf structure-layer-item');
60441 .attr('class', 'col6 label structure-label-layer')
60442 .attr('for', 'preset-input-layer')
60443 .text(t('inspector.radio.structure.layer'));
60447 .attr('class', 'col6 structure-input-layer-wrap');
60450 layerItem = layerItem
60451 .merge(layerEnter);
60454 layerItem.selectAll('.structure-input-layer-wrap')
60455 .call(layerField.render);
60460 function changeType(t$$1, onInput) {
60461 var key = selectedKey();
60464 var val = t$$1[key];
60465 if (val !== 'no') {
60466 oldType[key] = val;
60469 if (field.type === 'structureRadio') {
60470 if (val === 'no' || (key !== 'bridge' && key !== 'tunnel')) {
60471 t$$1.layer = undefined;
60475 dispatch$$1.call('change', this, t$$1, onInput);
60479 function changeLayer(t$$1, onInput) {
60480 if (t$$1.layer === '0') {
60481 t$$1.layer = undefined;
60483 dispatch$$1.call('change', this, t$$1, onInput);
60487 function changeRadio() {
60492 t$$1[field.key] = undefined;
60495 radios.each(function(d) {
60496 var active = d3_select(this).property('checked');
60497 if (active) activeKey = d;
60500 if (active) t$$1[field.key] = d;
60502 var val = oldType[activeKey] || 'yes';
60503 t$$1[d] = active ? val : undefined;
60507 if (field.type === 'structureRadio') {
60508 if (activeKey === 'bridge') {
60510 } else if (activeKey === 'tunnel') {
60513 t$$1.layer = undefined;
60517 dispatch$$1.call('change', this, t$$1);
60521 radio.tags = function(tags) {
60522 function checked(d) {
60524 return tags[field.key] === d;
60526 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
60530 labels.classed('active', checked);
60531 radios.property('checked', checked);
60533 var selection$$1 = radios.filter(function() { return this.checked; });
60535 if (selection$$1.empty()) {
60536 placeholder.text(t('inspector.none'));
60538 placeholder.text(selection$$1.attr('value'));
60539 oldType[selection$$1.datum()] = tags[selection$$1.datum()];
60542 if (field.type === 'structureRadio') {
60543 // For waterways without a tunnel tag, set 'culvert' as
60544 // the oldType to default to if the user picks 'tunnel'
60545 if (!!tags.waterway && !oldType.tunnel) {
60546 oldType.tunnel = 'culvert';
60549 wrap.call(structureExtras, tags);
60554 radio.focus = function() {
60555 radios.node().focus();
60559 radio.entity = function(_) {
60560 if (!arguments.length) return entity;
60567 return utilRebind(radio, dispatch$$1, 'on');
60570 function uiFieldRestrictions(field, context) {
60571 var dispatch$$1 = dispatch('change'),
60572 breathe = behaviorBreathe(context),
60573 hover = behaviorHover(context),
60574 initialized = false,
60579 function restrictions(selection$$1) {
60580 // if form field is hidden or has detached from dom, clean up.
60581 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
60582 selection$$1.call(restrictions.off);
60586 var wrap = selection$$1.selectAll('.preset-input-wrap')
60589 var enter = wrap.enter()
60591 .attr('class', 'preset-input-wrap');
60595 .attr('class', 'restriction-help');
60598 var intersection = osmIntersection(context.graph(), vertexID),
60599 graph = intersection.graph,
60600 vertex = graph.entity(vertexID),
60601 filter = utilFunctor(true),
60602 extent = geoExtent$$1(),
60603 projection = geoRawMercator();
60605 var d = utilGetDimensions(wrap.merge(enter)),
60606 c = [d[0] / 2, d[1] / 2],
60610 .scale(256 * Math.pow(2, z) / (2 * Math.PI));
60612 var s = projection(vertex.loc);
60615 .translate([c[0] - s[0], c[1] - s[1]])
60616 .clipExtent([[0, 0], d]);
60618 var drawLayers = svgLayers(projection, context).only('osm').dimensions(d),
60619 drawVertices = svgVertices$$1(projection, context),
60620 drawLines = svgLines$$1(projection, context),
60621 drawTurns = svgTurns(projection, context);
60629 var surface = wrap.selectAll('.surface');
60631 if (!enter.empty()) {
60632 initialized = true;
60639 .call(utilSetDimensions, d)
60640 .call(drawVertices, graph, [vertex], filter, extent, z)
60641 .call(drawLines, graph, intersection.ways, filter)
60642 .call(drawTurns, graph, intersection.turns(fromNodeID));
60645 .on('click.restrictions', click)
60646 .on('mouseover.restrictions', mouseover)
60647 .on('mouseout.restrictions', mouseout);
60650 .selectAll('.selected')
60651 .classed('selected', false);
60655 .selectAll('.' + intersection.highways[fromNodeID].id)
60656 .classed('selected', true);
60662 .on('change.restrictions', render);
60665 .on('resize.restrictions', function() {
60666 utilSetDimensions(wrap, null);
60676 var datum = event.target.__data__;
60677 if (datum instanceof osmEntity$$1) {
60678 fromNodeID = intersection.adjacentNodeId(datum.id);
60680 } else if (datum instanceof osmTurn) {
60681 if (datum.restriction) {
60683 actionUnrestrictTurn(datum, projection),
60684 t('operations.restriction.annotation.delete')
60688 actionRestrictTurn(datum, projection),
60689 t('operations.restriction.annotation.create')
60696 function mouseover() {
60697 var datum = event.target.__data__;
60698 if (datum instanceof osmTurn) {
60699 var graph = context.graph(),
60700 presets = context.presets(),
60703 if (datum.restriction) {
60704 preset = presets.match(graph.entity(datum.restriction), graph);
60706 preset = presets.item('type/restriction/' +
60707 osmInferRestriction(
60717 wrap.selectAll('.restriction-help')
60718 .text(t('operations.restriction.help.' +
60719 (datum.restriction ? 'toggle_off' : 'toggle_on'),
60720 { restriction: preset.name() })
60726 function mouseout() {
60727 wrap.selectAll('.restriction-help')
60728 .text(t('operations.restriction.help.' +
60729 (fromNodeID ? 'toggle' : 'select'))
60734 function render() {
60735 if (context.hasEntity(vertexID)) {
60736 restrictions(selection$$1);
60742 restrictions.entity = function(_) {
60743 if (!vertexID || vertexID !== _.id) {
60750 restrictions.tags = function() {};
60751 restrictions.focus = function() {};
60754 restrictions.off = function(selection$$1) {
60755 if (!initialized) return;
60757 selection$$1.selectAll('.surface')
60760 .on('click.restrictions', null)
60761 .on('mouseover.restrictions', null)
60762 .on('mouseout.restrictions', null);
60765 .on('change.restrictions', null);
60768 .on('resize.restrictions', null);
60772 return utilRebind(restrictions, dispatch$$1, 'on');
60775 function uiFieldTextarea(field) {
60776 var dispatch$$1 = dispatch('change'),
60777 input = d3_select(null);
60780 function textarea(selection$$1) {
60781 input = selection$$1.selectAll('textarea')
60784 input = input.enter()
60785 .append('textarea')
60786 .attr('id', 'preset-input-' + field.id)
60787 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
60788 .attr('maxlength', 255)
60790 .on('input', change(true))
60791 .on('blur', change())
60792 .on('change', change())
60797 function change(onInput) {
60798 return function() {
60800 t$$1[field.key] = utilGetSetValue(input) || undefined;
60801 dispatch$$1.call('change', this, t$$1, onInput);
60806 textarea.tags = function(tags) {
60807 utilGetSetValue(input, tags[field.key] || '');
60811 textarea.focus = function() {
60812 input.node().focus();
60816 return utilRebind(textarea, dispatch$$1, 'on');
60819 function uiFieldWikipedia(field, context) {
60820 var dispatch$$1 = dispatch('change'),
60821 wikipedia = services.wikipedia,
60822 wikidata = services.wikidata,
60823 link = d3_select(null),
60824 lang = d3_select(null),
60825 title = d3_select(null),
60830 function wiki(selection$$1) {
60831 var langcombo = d3combobox()
60832 .container(context.container())
60833 .fetcher(function(value, cb) {
60834 var v = value.toLowerCase();
60836 cb(dataWikipedia.filter(function(d) {
60837 return d[0].toLowerCase().indexOf(v) >= 0 ||
60838 d[1].toLowerCase().indexOf(v) >= 0 ||
60839 d[2].toLowerCase().indexOf(v) >= 0;
60840 }).map(function(d) {
60841 return { value: d[1] };
60845 var titlecombo = d3combobox()
60846 .container(context.container())
60847 .fetcher(function(value, cb) {
60849 value = context.entity(entity.id).tags.name || '';
60852 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
60853 searchfn(language()[2], value, function(query, data$$1) {
60854 cb(data$$1.map(function(d) {
60855 return { value: d };
60861 lang = selection$$1.selectAll('input.wiki-lang')
60864 lang = lang.enter()
60866 .attr('type', 'text')
60867 .attr('class', 'wiki-lang')
60868 .attr('placeholder', t('translate.localized_translation_language'))
60872 utilGetSetValue(lang, language()[1]);
60876 .on('blur', changeLang)
60877 .on('change', changeLang);
60880 title = selection$$1.selectAll('input.wiki-title')
60883 title = title.enter()
60885 .attr('type', 'text')
60886 .attr('class', 'wiki-title')
60887 .attr('id', 'preset-input-' + field.id)
60894 .on('change', change);
60897 link = selection$$1.selectAll('.wiki-link')
60900 link = link.enter()
60902 .attr('class', 'button-input-action wiki-link minor')
60903 .attr('tabindex', -1)
60904 .call(svgIcon('#icon-out-link'))
60908 .on('click', function() {
60909 event.preventDefault();
60910 if (wikiURL) window.open(wikiURL, '_blank');
60915 function language() {
60916 var value = utilGetSetValue(lang).toLowerCase();
60917 var locale = utilDetect().locale.toLowerCase();
60918 var localeLanguage;
60919 return find$1(dataWikipedia, function(d) {
60920 if (d[2] === locale) localeLanguage = d;
60921 return d[0].toLowerCase() === value ||
60922 d[1].toLowerCase() === value ||
60924 }) || localeLanguage || ['English', 'English', 'en'];
60928 function changeLang() {
60929 utilGetSetValue(lang, language()[1]);
60939 function change(skipWikidata) {
60940 var value = utilGetSetValue(title),
60941 m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
60942 l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
60946 // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
60947 value = decodeURIComponent(m[2]).replace(/_/g, ' ');
60951 // Best-effort `anchordecode:` implementation
60952 anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
60954 anchor = decodeURIComponent(m[3]);
60956 value += '#' + anchor.replace(/_/g, ' ');
60958 value = value.slice(0, 1).toUpperCase() + value.slice(1);
60959 utilGetSetValue(lang, l[1]);
60960 utilGetSetValue(title, value);
60964 syncTags.wikipedia = language()[2] + ':' + value;
60966 syncTags.wikipedia = undefined;
60967 syncTags.wikidata = undefined;
60970 dispatch$$1.call('change', this, syncTags);
60973 if (skipWikidata || !value || !language()[2]) return;
60975 // attempt asynchronous update of wikidata tag..
60976 var initGraph = context.graph(),
60977 initEntityId = entity.id;
60979 wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
60980 // If graph has changed, we can't apply this update.
60981 if (context.graph() !== initGraph) return;
60983 if (!data$$1 || !Object.keys(data$$1).length) return;
60985 var qids = Object.keys(data$$1);
60986 var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
60987 var currTags = clone(context.entity(initEntityId).tags);
60989 currTags.wikidata = value;
60991 // Coalesce the update of wikidata tag into the previous tag change
60993 actionChangeTags(initEntityId, currTags),
60994 context.history().undoAnnotation()
60997 // do not dispatch.call('change') here, because entity_editor
60998 // changeTags() is not intended to be called asynchronously
61003 wiki.tags = function(tags) {
61004 var value = tags[field.key] || '',
61005 m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
61006 l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
61007 anchor = m && m[3];
61009 // value in correct format
61011 utilGetSetValue(lang, l[1]);
61012 utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
61015 // Best-effort `anchorencode:` implementation
61016 anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
61018 anchor = anchor.replace(/ /g, '_');
61021 wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
61022 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
61024 // unrecognized value format
61026 utilGetSetValue(title, value);
61027 if (value && value !== '') {
61028 utilGetSetValue(lang, '');
61029 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
61037 wiki.entity = function(_) {
61038 if (!arguments.length) return entity;
61044 wiki.focus = function() {
61045 title.node().focus();
61049 return utilRebind(wiki, dispatch$$1, 'on');
61053 access: uiFieldAccess,
61054 address: uiFieldAddress,
61055 check: uiFieldCheck,
61056 combo: uiFieldCombo,
61057 cycleway: uiFieldCycleway,
61058 defaultCheck: uiFieldCheck,
61059 email: uiFieldText,
61060 lanes: uiFieldLanes,
61061 localized: uiFieldLocalized,
61062 maxspeed: uiFieldMaxspeed,
61063 multiCombo: uiFieldCombo,
61064 networkCombo: uiFieldCombo,
61065 number: uiFieldText,
61066 onewayCheck: uiFieldCheck,
61067 radio: uiFieldRadio,
61068 restrictions: uiFieldRestrictions,
61069 semiCombo: uiFieldCombo,
61070 structureRadio: uiFieldRadio,
61073 textarea: uiFieldTextarea,
61074 typeCombo: uiFieldCombo,
61076 wikipedia: uiFieldWikipedia
61079 function uiField(context, presetField, entity, options) {
61080 options = assignIn$1({
61088 var dispatch$$1 = dispatch('change'),
61089 field = clone(presetField),
61090 show = options.show,
61095 field.impl = uiFields[field.type](field, context)
61096 .on('change', function(t$$1, onInput) {
61097 dispatch$$1.call('change', field, t$$1, onInput);
61100 if (entity && field.impl.entity) {
61101 field.impl.entity(entity);
61104 field.keys = field.keys || [field.key];
61107 function isModified() {
61108 if (!entity) return false;
61109 var original = context.graph().base().entities[entity.id];
61110 return some(field.keys, function(key) {
61111 return original ? tags[key] !== original.tags[key] : tags[key];
61116 function isPresent() {
61117 return some(field.keys, function(key) {
61123 function revert(d) {
61124 event.stopPropagation();
61125 event.preventDefault();
61126 if (!entity) return false;
61128 var original = context.graph().base().entities[entity.id],
61130 d.keys.forEach(function(key) {
61131 t$$1[key] = original ? original.tags[key] : undefined;
61134 dispatch$$1.call('change', d, t$$1);
61138 function remove(d) {
61139 event.stopPropagation();
61140 event.preventDefault();
61143 d.keys.forEach(function(key) {
61144 t$$1[key] = undefined;
61147 dispatch$$1.call('change', d, t$$1);
61151 field.render = function(selection$$1) {
61152 var container = selection$$1.selectAll('.form-field')
61156 var enter = container.enter()
61158 .attr('class', function(d) { return 'form-field form-field-' + d.id; })
61159 .classed('nowrap', !options.wrap);
61161 if (options.wrap) {
61164 .attr('class', 'form-label')
61165 .attr('for', function(d) { return 'preset-input-' + d.id; })
61166 .text(function(d) { return d.label(); });
61170 .attr('class', 'form-label-button-wrap');
61172 if (options.remove) {
61175 .attr('class', 'remove-icon')
61176 .attr('tabindex', -1)
61177 .call(svgIcon('#operation-delete'));
61180 if (options.revert) {
61183 .attr('class', 'modified-icon')
61184 .attr('tabindex', -1)
61186 (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
61193 container = container
61196 container.selectAll('.form-label-button-wrap .remove-icon')
61197 .on('click', remove);
61199 container.selectAll('.form-label-button-wrap .modified-icon')
61200 .on('click', revert);
61203 .classed('modified', isModified())
61204 .classed('present', isPresent())
61205 .each(function(d) {
61206 if (options.wrap && options.info) {
61207 var referenceKey = d.key;
61208 if (d.type === 'multiCombo') { // lookup key without the trailing ':'
61209 referenceKey = referenceKey.replace(/:$/, '');
61211 var reference = uiTagReference(d.reference || { key: referenceKey }, context);
61213 if (state === 'hover') {
61214 reference.showing(false);
61221 if (options.wrap && options.info) {
61223 .call(reference.body)
61224 .select('.form-label-button-wrap')
61225 .call(reference.button);
61233 field.state = function(_) {
61234 if (!arguments.length) return state;
61240 field.tags = function(_) {
61241 if (!arguments.length) return tags;
61247 field.show = function() {
61249 if (field.default && field.key && tags[field.key] !== field.default) {
61251 t$$1[field.key] = field.default;
61252 dispatch$$1.call('change', this, t$$1);
61257 field.isShown = function() {
61258 return show || some(field.keys, function(key) { return !!tags[key]; });
61262 field.focus = function() {
61263 field.impl.focus();
61267 return utilRebind(field, dispatch$$1, 'on');
61270 function uiFormFields(context) {
61274 function formFields(selection$$1, klass) {
61275 render(selection$$1, klass);
61279 function render(selection$$1, klass) {
61281 var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
61282 notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
61284 var container = selection$$1.selectAll('.form-fields-container')
61287 container = container.enter()
61289 .attr('class', 'form-fields-container ' + (klass || ''))
61293 var fields = container.selectAll('.wrap-form-field')
61294 .data(shown, function(d) { return d.id; });
61300 var enter = fields.enter()
61302 .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
61310 .each(function(d) {
61316 notShown = notShown.map(function(field) {
61318 title: field.label(),
61319 value: field.label(),
61325 var more = selection$$1.selectAll('.more-fields')
61326 .data((notShown.length > 0) ? [0] : []);
61331 more = more.enter()
61333 .attr('class', 'more-fields')
61335 .text(t('inspector.add_fields'))
61339 var input = more.selectAll('.value')
61345 input = input.enter()
61347 .attr('class', 'value')
61348 .attr('type', 'text')
61353 .call(utilGetSetValue, '')
61354 .attr('placeholder', function() {
61355 var placeholder = [];
61356 for (var field in notShown) {
61357 placeholder.push(notShown[field].title);
61359 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
61362 .container(context.container())
61365 .on('accept', function (d) {
61366 var field = d.field;
61368 render(selection$$1);
61369 if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
61377 formFields.fieldsArr = function(_) {
61378 if (!arguments.length) return fieldsArr;
61387 function uiPresetEditor(context) {
61388 var dispatch$$1 = dispatch('change'),
61389 formFields = uiFormFields(context),
61390 expandedPreference = (context.storage('preset_fields.expanded') !== 'false'),
61398 function presetEditor(selection$$1) {
61399 selection$$1.call(uiDisclosure()
61400 .title(t('inspector.all_fields'))
61401 .expanded(expandedPreference)
61402 .on('toggled', toggled)
61406 function toggled(expanded) {
61407 expandedPreference = expanded;
61408 context.storage('preset_fields.expanded', expanded);
61413 function render(selection$$1) {
61415 var entity = context.entity(entityId),
61416 geometry = context.geometry(entityId),
61417 presets = context.presets();
61421 preset.fields.forEach(function(field) {
61422 if (field.matchGeometry(geometry)) {
61424 uiField(context, field, entity)
61429 if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
61431 uiField(context, presets.field('restrictions'), entity)
61435 presets.universal().forEach(function(field) {
61436 if (preset.fields.indexOf(field) === -1) {
61438 uiField(context, field, entity, { show: false })
61443 fieldsArr.forEach(function(field) {
61445 .on('change', function(t$$1, onInput) {
61446 dispatch$$1.call('change', field, t$$1, onInput);
61451 fieldsArr.forEach(function(field) {
61459 .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
61462 selection$$1.selectAll('.wrap-form-field input')
61463 .on('keydown', function() {
61464 // if user presses enter, and combobox is not active, accept edits..
61465 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
61466 context.enter(modeBrowse(context));
61472 presetEditor.preset = function(_) {
61473 if (!arguments.length) return preset;
61474 if (preset && preset.id === _.id) return presetEditor;
61477 return presetEditor;
61481 presetEditor.state = function(_) {
61482 if (!arguments.length) return state;
61484 return presetEditor;
61488 presetEditor.tags = function(_) {
61489 if (!arguments.length) return tags;
61491 // Don't reset fieldsArr here.
61492 return presetEditor;
61496 presetEditor.entityID = function(_) {
61497 if (!arguments.length) return entityId;
61498 if (entityId === _) return presetEditor;
61501 return presetEditor;
61505 return utilRebind(presetEditor, dispatch$$1, 'on');
61508 function uiEntityEditor(context) {
61509 var dispatch$$1 = dispatch('choose'),
61511 coalesceChanges = false,
61518 var presetEditor = uiPresetEditor(context)
61519 .on('change', changeTags);
61520 var rawTagEditor = uiRawTagEditor(context)
61521 .on('change', changeTags);
61524 function entityEditor(selection$$1) {
61525 var entity = context.entity(entityId),
61526 tags = clone(entity.tags);
61529 var header = selection$$1.selectAll('.header')
61533 var enter = header.enter()
61535 .attr('class', 'header fillL cf');
61539 .attr('class', 'fl preset-reset preset-choose')
61540 .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
61544 .attr('class', 'fr preset-close')
61545 .on('click', function() { context.enter(modeBrowse(context)); })
61546 .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
61550 .text(t('inspector.edit'));
61556 header.selectAll('.preset-reset')
61557 .on('click', function() {
61558 dispatch$$1.call('choose', this, activePreset);
61563 var body = selection$$1.selectAll('.inspector-body')
61567 enter = body.enter()
61569 .attr('class', 'inspector-body');
61573 .attr('class', 'preset-list-item inspector-inner')
61575 .attr('class', 'preset-list-button-wrap')
61577 .attr('class', 'preset-list-button preset-reset')
61578 .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
61580 .attr('class', 'label');
61584 .attr('class', 'inspector-border preset-editor');
61588 .attr('class', 'inspector-border raw-tag-editor inspector-inner');
61592 .attr('class', 'inspector-border raw-member-editor inspector-inner');
61596 .attr('class', 'raw-membership-editor inspector-inner');
61600 .attr('type', 'text')
61601 .attr('class', 'key-trap');
61608 body.selectAll('.preset-list-button-wrap')
61609 .call(reference.button);
61611 body.selectAll('.preset-list-item')
61612 .call(reference.body);
61614 body.selectAll('.preset-reset')
61615 .on('click', function() {
61616 dispatch$$1.call('choose', this, activePreset);
61619 body.select('.preset-list-item button')
61620 .call(uiPresetIcon()
61621 .geometry(context.geometry(entityId))
61622 .preset(activePreset)
61625 body.select('.preset-list-item .label')
61626 .text(activePreset.name());
61628 body.select('.preset-editor')
61630 .preset(activePreset)
61631 .entityID(entityId)
61636 body.select('.raw-tag-editor')
61638 .preset(activePreset)
61639 .entityID(entityId)
61644 if (entity.type === 'relation') {
61645 body.select('.raw-member-editor')
61646 .style('display', 'block')
61647 .call(uiRawMemberEditor(context)
61648 .entityID(entityId)
61651 body.select('.raw-member-editor')
61652 .style('display', 'none');
61655 body.select('.raw-membership-editor')
61656 .call(uiRawMembershipEditor(context)
61657 .entityID(entityId)
61660 body.select('.key-trap')
61661 .on('keydown.key-trap', function() {
61662 // On tabbing, send focus back to the first field on the inspector-body
61663 // (probably the `name` field) #4159
61664 if (event.keyCode === 9 && !event.shiftKey) {
61665 event.preventDefault();
61666 body.select('input').node().focus();
61671 .on('change.entity-editor', historyChanged);
61674 function historyChanged() {
61675 if (state === 'hide') return;
61677 var entity = context.hasEntity(entityId);
61678 var graph = context.graph();
61679 if (!entity) return;
61681 var match = context.presets().match(entity, graph);
61682 var activePreset = entityEditor.preset();
61683 var weakPreset = activePreset && isEmpty(activePreset.addTags);
61685 // A "weak" preset doesn't set any tags. (e.g. "Address")
61686 // Don't replace a weak preset with a fallback preset (e.g. "Point")
61687 if (!(weakPreset && match.isFallback())) {
61688 entityEditor.preset(match);
61690 entityEditor.modified(base !== graph);
61691 entityEditor(selection$$1);
61696 function clean(o) {
61698 function cleanVal(k, v) {
61699 function keepSpaces(k) {
61700 return k.match(/_hours|_times/) !== null;
61703 var blacklist = ['description', 'note', 'fixme'];
61704 if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
61706 var cleaned = v.split(';')
61707 .map(function(s) { return s.trim(); })
61708 .join(keepSpaces(k) ? '; ' : ';');
61710 // The code below is not intended to validate websites and emails.
61711 // It is only intended to prevent obvious copy-paste errors. (#2323)
61712 // clean website- and email-like tags
61713 if (k.indexOf('website') !== -1 ||
61714 k.indexOf('email') !== -1 ||
61715 cleaned.indexOf('http') === 0) {
61717 .replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
61724 var out = {}, k, v;
61726 if (k && (v = o[k]) !== undefined) {
61727 out[k] = cleanVal(k, v);
61734 // Tag changes that fire on input can all get coalesced into a single
61735 // history operation when the user leaves the field. #2342
61736 function changeTags(changed, onInput) {
61737 var entity = context.entity(entityId),
61738 annotation = t('operations.change_tags.annotation'),
61739 tags = clone(entity.tags);
61741 forEach(changed, function(v, k) {
61742 if (v !== undefined || tags.hasOwnProperty(k)) {
61748 tags = clean(tags);
61751 if (!isEqual(entity.tags, tags)) {
61752 if (coalesceChanges) {
61753 context.overwrite(actionChangeTags(entityId, tags), annotation);
61755 context.perform(actionChangeTags(entityId, tags), annotation);
61756 coalesceChanges = !!onInput;
61762 entityEditor.modified = function(_) {
61763 if (!arguments.length) return modified;
61765 d3_selectAll('button.preset-close use')
61766 .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
61770 entityEditor.state = function(_) {
61771 if (!arguments.length) return state;
61773 return entityEditor;
61777 entityEditor.entityID = function(_) {
61778 if (!arguments.length) return entityId;
61780 base = context.graph();
61781 entityEditor.preset(context.presets().match(context.entity(entityId), base));
61782 entityEditor.modified(false);
61783 coalesceChanges = false;
61784 return entityEditor;
61788 entityEditor.preset = function(_) {
61789 if (!arguments.length) return activePreset;
61790 if (_ !== activePreset) {
61792 reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
61795 return entityEditor;
61799 return utilRebind(entityEditor, dispatch$$1, 'on');
61802 function uiPresetList(context) {
61803 var dispatch$$1 = dispatch('choose'),
61809 function presetList(selection$$1) {
61810 var entity = context.entity(id),
61811 geometry = context.geometry(id);
61813 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
61814 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
61815 geometry = 'point';
61818 var presets = context.presets().matchGeometry(geometry);
61820 selection$$1.html('');
61822 var messagewrap = selection$$1
61824 .attr('class', 'header fillL cf');
61826 var message = messagewrap
61828 .text(t('inspector.choose'));
61830 if (context.entity(id).isUsed(context.graph())) {
61833 .attr('class', 'preset-choose')
61834 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
61835 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
61839 .attr('class', 'close')
61840 .on('click', function() {
61841 context.enter(modeBrowse(context));
61843 .call(svgIcon('#icon-close'));
61846 function keydown() {
61847 // hack to let delete shortcut work when search is autofocused
61848 if (search.property('value').length === 0 &&
61849 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
61850 event.keyCode === d3keybinding.keyCodes['⌦'])) {
61851 event.preventDefault();
61852 event.stopPropagation();
61853 operationDelete([id], context)();
61854 } else if (search.property('value').length === 0 &&
61855 (event.ctrlKey || event.metaKey) &&
61856 event.keyCode === d3keybinding.keyCodes.z) {
61857 event.preventDefault();
61858 event.stopPropagation();
61860 } else if (!event.ctrlKey && !event.metaKey) {
61861 d3_select(this).on('keydown', null);
61865 function keypress() {
61867 var value = search.property('value');
61868 if (event.keyCode === 13 && value.length) {
61869 list.selectAll('.preset-list-item:first-child').datum().choose();
61873 function inputevent() {
61874 var value = search.property('value');
61875 list.classed('filtered', value.length);
61876 if (value.length) {
61877 var results = presets.search(value, geometry);
61878 message.text(t('inspector.results', {
61879 n: results.collection.length,
61882 list.call(drawList, results);
61884 list.call(drawList, context.presets().defaults(geometry, 36));
61885 message.text(t('inspector.choose'));
61889 var searchWrap = selection$$1
61891 .attr('class', 'search-header');
61893 var search = searchWrap
61895 .attr('class', 'preset-search-input')
61896 .attr('placeholder', t('inspector.search'))
61897 .attr('type', 'search')
61899 .on('keydown', keydown)
61900 .on('keypress', keypress)
61901 .on('input', inputevent);
61904 .call(svgIcon('#icon-search', 'pre-text'));
61907 search.node().focus();
61910 var listWrap = selection$$1
61912 .attr('class', 'inspector-body');
61914 var list = listWrap
61916 .attr('class', 'preset-list fillL cf')
61917 .call(drawList, context.presets().defaults(geometry, 36));
61921 function drawList(list, presets) {
61922 var collection = presets.collection.map(function(preset) {
61923 return preset.members ? CategoryItem(preset) : PresetItem(preset);
61926 var items = list.selectAll('.preset-list-item')
61927 .data(collection, function(d) { return d.preset.id; });
61936 .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
61937 .classed('current', function(item) { return item.preset === currentPreset; })
61938 .each(function(item) { d3_select(this).call(item); })
61939 .style('opacity', 0)
61941 .style('opacity', 1);
61945 function CategoryItem(preset) {
61946 var box, sublist, shown = false;
61948 function item(selection$$1) {
61949 var wrap = selection$$1.append('div')
61950 .attr('class', 'preset-list-button-wrap category col12');
61954 .attr('class', 'preset-list-button')
61955 .classed('expanded', false)
61956 .call(uiPresetIcon()
61957 .geometry(context.geometry(id))
61959 .on('click', function() {
61960 var isExpanded = d3_select(this).classed('expanded');
61961 var iconName = isExpanded ?
61962 (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
61964 .classed('expanded', !isExpanded);
61965 d3_select(this).selectAll('div.label svg.icon use')
61966 .attr('href', iconName);
61972 .attr('class', 'label');
61975 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
61977 .html(function() { return preset.name() + '…'; });
61979 box = selection$$1.append('div')
61980 .attr('class', 'subgrid col12')
61981 .style('max-height', '0px')
61982 .style('opacity', 0);
61985 .attr('class', 'arrow');
61987 sublist = box.append('div')
61988 .attr('class', 'preset-list fillL3 cf fl');
61992 item.choose = function() {
61993 if (!box || !sublist) return;
61999 .style('opacity', '0')
62000 .style('max-height', '0px')
62001 .style('padding-bottom', '0px');
62004 sublist.call(drawList, preset.members);
62007 .style('opacity', '1')
62008 .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
62009 .style('padding-bottom', '20px');
62013 item.preset = preset;
62019 function PresetItem(preset) {
62020 function item(selection$$1) {
62021 var wrap = selection$$1.append('div')
62022 .attr('class', 'preset-list-button-wrap col12');
62024 wrap.append('button')
62025 .attr('class', 'preset-list-button')
62026 .call(uiPresetIcon()
62027 .geometry(context.geometry(id))
62029 .on('click', item.choose)
62031 .attr('class', 'label')
62032 .text(preset.name());
62034 wrap.call(item.reference.button);
62035 selection$$1.call(item.reference.body);
62038 item.choose = function() {
62039 context.presets().choose(preset);
62042 actionChangePreset(id, currentPreset, preset),
62043 t('operations.change_tags.annotation')
62046 dispatch$$1.call('choose', this, preset);
62049 item.help = function() {
62050 event.stopPropagation();
62051 item.reference.toggle();
62054 item.preset = preset;
62055 item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
62061 presetList.autofocus = function(_) {
62062 if (!arguments.length) return autofocus;
62068 presetList.entityID = function(_) {
62069 if (!arguments.length) return id;
62071 presetList.preset(context.presets().match(context.entity(id), context.graph()));
62076 presetList.preset = function(_) {
62077 if (!arguments.length) return currentPreset;
62083 return utilRebind(presetList, dispatch$$1, 'on');
62086 function uiViewOnOSM(context) {
62089 function viewOnOSM(selection) {
62090 var entity = context.entity(id);
62092 selection.style('display', entity.isNew() ? 'none' : null);
62094 var link = selection.selectAll('.view-on-osm')
62097 var enter = link.enter()
62099 .attr('class', 'view-on-osm')
62100 .attr('target', '_blank')
62101 .call(svgIcon('#icon-out-link', 'inline'));
62105 .text(t('inspector.view_on_osm'));
62109 .attr('href', context.connection().entityURL(entity));
62113 viewOnOSM.entityID = function(_) {
62114 if (!arguments.length) return id;
62122 function uiInspector(context) {
62123 var presetList = uiPresetList(context),
62124 entityEditor = uiEntityEditor(context),
62127 newFeature = false;
62130 function inspector(selection) {
62132 .entityID(entityID)
62133 .autofocus(newFeature)
62134 .on('choose', setPreset);
62138 .entityID(entityID)
62139 .on('choose', showList);
62141 var wrap = selection.selectAll('.panewrap')
62144 var enter = wrap.enter()
62146 .attr('class', 'panewrap');
62150 .attr('class', 'preset-list-pane pane');
62154 .attr('class', 'entity-editor-pane pane');
62156 wrap = wrap.merge(enter);
62157 var presetPane = wrap.selectAll('.preset-list-pane');
62158 var editorPane = wrap.selectAll('.entity-editor-pane');
62160 var graph = context.graph(),
62161 entity = context.entity(entityID),
62162 showEditor = state === 'hover' ||
62163 entity.isUsed(graph) ||
62164 entity.isHighwayIntersection(graph);
62167 wrap.style('right', '0%');
62168 editorPane.call(entityEditor);
62170 wrap.style('right', '-100%');
62171 presetPane.call(presetList);
62174 var footer = selection.selectAll('.footer')
62177 footer = footer.enter()
62179 .attr('class', 'footer')
62183 .call(uiViewOnOSM(context).entityID(entityID));
62186 function showList(preset) {
62188 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
62191 .call(presetList.preset(preset).autofocus(true));
62195 function setPreset(preset) {
62197 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
62200 .call(entityEditor.preset(preset));
62205 inspector.state = function(_) {
62206 if (!arguments.length) return state;
62208 entityEditor.state(state);
62213 inspector.entityID = function(_) {
62214 if (!arguments.length) return entityID;
62220 inspector.newFeature = function(_) {
62221 if (!arguments.length) return newFeature;
62230 function uiSidebar(context) {
62231 var inspector = uiInspector(context),
62235 function sidebar(selection) {
62236 var featureListWrap = selection
62238 .attr('class', 'feature-list-pane')
62239 .call(uiFeatureList(context));
62242 var inspectorWrap = selection
62244 .attr('class', 'inspector-hidden inspector-wrap fr');
62247 function hover(id) {
62248 if (!current && context.hasEntity(id)) {
62250 .classed('inspector-hidden', true);
62253 .classed('inspector-hidden', false)
62254 .classed('inspector-hover', true);
62256 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
62265 } else if (!current) {
62267 .classed('inspector-hidden', false);
62269 .classed('inspector-hidden', true);
62276 sidebar.hover = throttle(hover, 200);
62279 sidebar.select = function(id, newFeature) {
62280 if (!current && id) {
62282 .classed('inspector-hidden', true);
62285 .classed('inspector-hidden', false)
62286 .classed('inspector-hover', false);
62288 if (inspector.entityID() !== id || inspector.state() !== 'select') {
62292 .newFeature(newFeature);
62298 } else if (!current) {
62300 .classed('inspector-hidden', false);
62302 .classed('inspector-hidden', true);
62309 sidebar.show = function(component) {
62311 .classed('inspector-hidden', true);
62313 .classed('inspector-hidden', true);
62315 if (current) current.remove();
62316 current = selection
62318 .attr('class', 'sidebar-component')
62323 sidebar.hide = function() {
62325 .classed('inspector-hidden', false);
62327 .classed('inspector-hidden', true);
62329 if (current) current.remove();
62335 sidebar.hover = function() {};
62336 sidebar.hover.cancel = function() {};
62337 sidebar.select = function() {};
62338 sidebar.show = function() {};
62339 sidebar.hide = function() {};
62344 function uiSpinner(context) {
62345 var osm = context.connection();
62348 return function(selection) {
62349 var img = selection
62351 .attr('src', context.imagePath('loader-black.gif'))
62352 .style('opacity', 0);
62356 .on('loading.spinner', function() {
62358 .style('opacity', 1);
62360 .on('loaded.spinner', function() {
62362 .style('opacity', 0);
62368 function uiSplash(context) {
62370 return function(selection) {
62371 if (context.storage('sawSplash'))
62374 context.storage('sawSplash', true);
62376 var modalSelection = uiModal(selection);
62378 modalSelection.select('.modal')
62379 .attr('class', 'modal-splash modal col6');
62381 var introModal = modalSelection.select('.content')
62383 .attr('class', 'fillL');
62387 .attr('class','modal-section cf')
62388 .append('h3').text(t('splash.welcome'));
62392 .attr('class','modal-section')
62394 .html(t('splash.text', {
62395 version: context.version,
62396 website: '<a href="http://ideditor.com/">ideditor.com</a>',
62397 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
62400 var buttonWrap = introModal
62402 .attr('class', 'modal-actions cf');
62404 var walkthrough = buttonWrap
62406 .attr('class', 'walkthrough col6')
62407 .on('click', function() {
62408 context.container().call(uiIntro(context));
62409 modalSelection.close();
62414 .attr('class', 'logo logo-walkthrough')
62416 .attr('xlink:href', '#logo-walkthrough');
62420 .text(t('splash.walkthrough'));
62422 var startEditing = buttonWrap
62424 .attr('class', 'start-editing col6')
62425 .on('click', modalSelection.close);
62429 .attr('class', 'logo logo-features')
62431 .attr('xlink:href', '#logo-features');
62435 .text(t('splash.start'));
62438 modalSelection.select('button.close')
62439 .attr('class','hide');
62444 function uiStatus(context) {
62445 var osm = context.connection();
62448 return function(selection$$1) {
62451 function update() {
62452 osm.status(function(err, apiStatus) {
62453 selection$$1.html('');
62456 if (apiStatus === 'rateLimited') {
62458 .text(t('status.rateLimit'))
62460 .attr('class', 'api-status-login')
62461 .attr('target', '_blank')
62462 .call(svgIcon('#icon-out-link', 'inline'))
62465 .on('click.login', function() {
62466 event.preventDefault();
62467 osm.authenticate();
62470 // eslint-disable-next-line no-warning-comments
62471 // TODO: nice messages for different error types
62472 selection$$1.text(t('status.error'));
62475 } else if (apiStatus === 'readonly') {
62476 selection$$1.text(t('status.readonly'));
62477 } else if (apiStatus === 'offline') {
62478 selection$$1.text(t('status.offline'));
62481 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
62485 osm.on('change', function() { update(selection$$1); });
62487 window.setInterval(update, 90000);
62488 update(selection$$1);
62492 function uiUndoRedo(context) {
62496 action: function() { if (editable()) context.undo(); },
62497 annotation: function() { return context.history().undoAnnotation(); }
62501 action: function() { if (editable()) context.redo(); },
62502 annotation: function() { return context.history().redoAnnotation(); }
62506 function editable() {
62507 return context.editable() && context.mode().id !== 'save';
62511 return function(selection$$1) {
62512 var tooltipBehavior = tooltip()
62513 .placement('bottom')
62515 .title(function (d) {
62516 return uiTooltipHtml(d.annotation() ?
62517 t(d.id + '.tooltip', {action: d.annotation()}) :
62518 t(d.id + '.nothing'), d.cmd);
62521 var buttons = selection$$1.selectAll('button')
62525 .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
62526 .on('click', function(d) { return d.action(); })
62527 .call(tooltipBehavior);
62529 buttons.each(function(d) {
62530 var iconName = d.id;
62531 if (textDirection === 'rtl') {
62532 if (iconName === 'undo') {
62534 } else if (iconName === 'redo') {
62539 .call(svgIcon('#icon-' + iconName));
62542 var keybinding = d3keybinding('undo')
62543 .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
62544 .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
62546 d3_select(document)
62550 var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
62553 .on('move.undo_redo', debouncedUpdate)
62554 .on('drawn.undo_redo', debouncedUpdate);
62557 .on('change.undo_redo', update);
62560 .on('enter.undo_redo', update);
62563 function update() {
62565 .property('disabled', !editable())
62566 .classed('disabled', function(d) { return !d.annotation(); })
62568 var selection$$1 = d3_select(this);
62569 if (selection$$1.property('tooltipVisible')) {
62570 selection$$1.call(tooltipBehavior.show);
62577 // these are module variables so they are preserved through a ui.restart()
62578 var sawVersion = null;
62579 var isNewVersion = false;
62580 var isNewUser = false;
62583 function uiVersion(context) {
62585 var currVersion = context.version,
62586 matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
62588 if (sawVersion === null && matchedVersion !== null) {
62589 isNewVersion = (context.storage('sawVersion') !== currVersion);
62590 isNewUser = !context.storage('sawSplash');
62591 context.storage('sawVersion', currVersion);
62592 sawVersion = currVersion;
62595 return function(selection) {
62598 .attr('target', '_blank')
62599 .attr('tabindex', -1)
62600 .attr('href', 'https://github.com/openstreetmap/iD')
62601 .text(currVersion);
62603 // only show new version indicator to users that have used iD before
62604 if (isNewVersion && !isNewUser) {
62607 .attr('class', 'badge')
62609 .attr('target', '_blank')
62610 .attr('tabindex', -1)
62611 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
62612 .call(svgIcon('#gift-11'))
62614 .title(t('version.whats_new', { version: currVersion }))
62621 function uiZoom(context) {
62625 title: t('zoom.in'),
62626 action: context.zoomIn,
62631 title: t('zoom.out'),
62632 action: context.zoomOut,
62637 function zoomIn() {
62638 event.preventDefault();
62643 function zoomOut() {
62644 event.preventDefault();
62649 function zoomInFurther() {
62650 event.preventDefault();
62651 context.zoomInFurther();
62655 function zoomOutFurther() {
62656 event.preventDefault();
62657 context.zoomOutFurther();
62661 return function(selection$$1) {
62662 var button = selection$$1.selectAll('button')
62666 .attr('tabindex', -1)
62667 .attr('class', function(d) { return d.id; })
62668 .on('click.editor', function(d) { d.action(); })
62670 .placement((textDirection === 'rtl') ? 'right' : 'left')
62672 .title(function(d) {
62673 return uiTooltipHtml(d.title, d.key);
62677 button.each(function(d) {
62679 .call(svgIcon('#icon-' + d.icon, 'light'));
62682 var keybinding = d3keybinding('zoom');
62684 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
62685 keybinding.on([key], zoomIn);
62686 keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
62689 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
62690 keybinding.on([key], zoomOut);
62691 keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
62694 d3_select(document)
62699 function uiInit(context) {
62700 var uiInitCounter = 0;
62703 function render(container) {
62705 .attr('dir', textDirection);
62707 var map = context.map();
62709 var hash = behaviorHash(context);
62712 if (!hash.hadHash) {
62713 map.centerZoom([0, 0], 2);
62718 .attr('id', 'defs')
62719 .call(svgDefs(context));
62723 .attr('id', 'sidebar')
62724 .attr('class', 'col4')
62727 var content = container
62729 .attr('id', 'content')
62730 .attr('class', 'active');
62735 .attr('class', 'fillD');
62740 .attr('dir', 'ltr')
62744 .call(uiMapInMap(context))
62745 .call(uiInfo(context))
62746 .call(uiNotice(context));
62750 .attr('class', 'spacer col4');
62752 var limiter = bar.append('div')
62753 .attr('class', 'limiter');
62757 .attr('class', 'button-wrap joined col3')
62758 .call(uiModes(context), limiter);
62762 .attr('class', 'button-wrap joined col1')
62763 .call(uiUndoRedo(context));
62767 .attr('class', 'button-wrap col1')
62768 .call(uiSave(context));
62772 .attr('class', 'full-screen')
62773 .call(uiFullScreen(context));
62777 .attr('class', 'spinner')
62778 .call(uiSpinner(context));
62783 .attr('class', 'map-controls');
62787 .attr('class', 'map-control zoombuttons')
62788 .call(uiZoom(context));
62792 .attr('class', 'map-control geolocate-control')
62793 .call(uiGeolocate(context));
62797 .attr('class', 'map-control background-control')
62798 .call(uiBackground(context));
62802 .attr('class', 'map-control map-data-control')
62803 .call(uiMapData(context));
62807 .attr('class', 'map-control help-control')
62808 .call(uiHelp(context));
62811 var about = content
62813 .attr('id', 'about');
62817 .attr('id', 'attrib')
62818 .attr('dir', 'ltr')
62819 .call(uiAttribution(context));
62823 .attr('class', 'api-status')
62824 .call(uiStatus(context));
62829 .attr('id', 'footer')
62830 .attr('class', 'fillD');
62834 .attr('id', 'flash-wrap')
62835 .attr('class', 'footer-hide');
62837 var footerWrap = footer
62839 .attr('id', 'footer-wrap')
62840 .attr('class', 'footer-show');
62844 .attr('id', 'scale-block')
62845 .call(uiScale(context));
62847 var aboutList = footerWrap
62849 .attr('id', 'info-block')
62851 .attr('id', 'about-list');
62853 if (!context.embed()) {
62855 .call(uiAccount(context));
62860 .attr('class', 'version')
62861 .call(uiVersion(context));
62863 var issueLinks = aboutList
62868 .attr('target', '_blank')
62869 .attr('tabindex', -1)
62870 .attr('href', 'https://github.com/openstreetmap/iD/issues')
62871 .call(svgIcon('#icon-bug', 'light'))
62872 .call(tooltip().title(t('report_a_bug')).placement('top'));
62876 .attr('target', '_blank')
62877 .attr('tabindex', -1)
62878 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
62879 .call(svgIcon('#icon-translate', 'light'))
62880 .call(tooltip().title(t('help_translate')).placement('top'));
62884 .attr('class', 'feature-warning')
62885 .attr('tabindex', -1)
62886 .call(uiFeatureInfo(context));
62890 .attr('class', 'user-list')
62891 .attr('tabindex', -1)
62892 .call(uiContributors(context));
62895 window.onbeforeunload = function() {
62896 return context.save();
62899 window.onunload = function() {
62900 context.history().unlock();
62903 var mapDimensions = map.dimensions();
62906 function onResize() {
62907 mapDimensions = utilGetDimensions(content, true);
62908 map.dimensions(mapDimensions);
62912 .on('resize.editor', onResize);
62917 return function() {
62918 event.preventDefault();
62919 context.pan(d, 100);
62927 var keybinding = d3keybinding('main')
62928 .on('⌫', function() { event.preventDefault(); })
62929 .on('←', pan([pa, 0]))
62930 .on('↑', pan([0, pa]))
62931 .on('→', pan([-pa, 0]))
62932 .on('↓', pan([0, -pa]))
62933 .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
62934 .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
62935 .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
62936 .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
62938 d3_select(document)
62941 context.enter(modeBrowse(context));
62943 if (!uiInitCounter++) {
62944 if (!hash.startWalkthrough) {
62945 context.container()
62946 .call(uiSplash(context))
62947 .call(uiRestore(context));
62950 context.container()
62951 .call(uiShortcuts(context));
62954 var osm = context.connection(),
62955 auth = uiLoading(context).message(t('loading_auth')).blocking(true);
62959 .on('authLoading.ui', function() {
62960 context.container()
62963 .on('authDone.ui', function() {
62970 if (hash.startWalkthrough) {
62971 hash.startWalkthrough = false;
62972 context.container().call(uiIntro(context));
62977 var renderCallback;
62979 function ui(node, callback) {
62980 renderCallback = callback;
62981 var container = d3_select(node);
62982 context.container(container);
62983 context.loadLocale(function(err) {
62994 ui.restart = function(arg) {
62995 context.locale(arg);
62996 context.loadLocale(function(err) {
62998 context.container().selectAll('*').remove();
62999 render(context.container());
63000 if (renderCallback) renderCallback();
63006 ui.sidebar = uiSidebar(context);
63011 function uiChangesetEditor(context) {
63012 var dispatch$$1 = dispatch('change'),
63013 formFields = uiFormFields(context),
63020 function changesetEditor(selection) {
63025 function render(selection) {
63026 var initial = false;
63030 var presets = context.presets();
63033 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
63034 uiField(context, presets.field('source'), null, { show: false, revert: false }),
63035 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
63038 fieldsArr.forEach(function(field) {
63040 .on('change', function(t$$1, onInput) {
63041 dispatch$$1.call('change', field, t$$1, onInput);
63046 fieldsArr.forEach(function(field) {
63053 .call(formFields.fieldsArr(fieldsArr));
63057 var commentField = selection.select('#preset-input-comment'),
63058 commentNode = commentField.node();
63061 commentNode.focus();
63062 commentNode.select();
63065 // trigger a 'blur' event so that comment field can be cleaned
63066 // and checked for hashtags, even if retrieved from localstorage
63067 utilTriggerEvent(commentField, 'blur');
63069 var osm = context.connection();
63071 osm.userChangesets(function (err, changesets) {
63074 var comments = changesets.map(function(changeset) {
63076 title: changeset.tags.comment,
63077 value: changeset.tags.comment
63083 .container(context.container())
63084 .caseSensitive(true)
63085 .data(uniqBy(comments, 'title'))
63091 // Add warning if comment mentions Google
63092 var hasGoogle = tags.comment.match(/google/i);
63093 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
63094 .data(hasGoogle ? [0] : []);
63096 commentWarning.exit()
63099 .style('opacity', 0)
63102 var commentEnter = commentWarning.enter()
63103 .insert('div', '.tag-reference-body')
63104 .attr('class', 'field-warning comment-warning')
63105 .style('opacity', 0);
63109 .attr('target', '_blank')
63110 .attr('tabindex', -1)
63111 .call(svgIcon('#icon-alert', 'inline'))
63112 .attr('href', t('commit.google_warning_link'))
63114 .text(t('commit.google_warning'));
63119 .style('opacity', 1);
63123 changesetEditor.tags = function(_) {
63124 if (!arguments.length) return tags;
63126 // Don't reset fieldsArr here.
63127 return changesetEditor;
63131 changesetEditor.changesetID = function(_) {
63132 if (!arguments.length) return changesetId;
63133 if (changesetId === _) return changesetEditor;
63136 return changesetEditor;
63140 return utilRebind(changesetEditor, dispatch$$1, 'on');
63144 * This method is like `_.union` except that it accepts `iteratee` which is
63145 * invoked for each element of each `arrays` to generate the criterion by
63146 * which uniqueness is computed. Result values are chosen from the first
63147 * array in which the value occurs. The iteratee is invoked with one argument:
63154 * @param {...Array} [arrays] The arrays to inspect.
63155 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
63156 * @returns {Array} Returns the new array of combined values.
63159 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
63162 * // The `_.property` iteratee shorthand.
63163 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
63164 * // => [{ 'x': 1 }, { 'x': 2 }]
63166 var unionBy = baseRest(function(arrays) {
63167 var iteratee = last(arrays);
63168 if (isArrayLikeObject(iteratee)) {
63169 iteratee = undefined;
63171 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
63174 function uiCommitChanges(context) {
63175 var detected = utilDetect();
63178 function commitChanges(selection$$1) {
63180 var history = context.history(),
63181 summary = history.difference().summary();
63183 var container = selection$$1.selectAll('.modal-section.commit-section')
63186 var containerEnter = container.enter()
63188 .attr('class', 'commit-section modal-section fillL2');
63192 .text(t('commit.changes', { count: summary.length }));
63196 .attr('class', 'changeset-list');
63198 container = containerEnter
63202 var items = container.select('ul').selectAll('li')
63205 var itemsEnter = items.enter()
63207 .attr('class', 'change-item');
63210 .each(function(d) {
63212 .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
63217 .attr('class', 'change-type')
63218 .text(function(d) { return t('commit.' + d.changeType) + ' '; });
63222 .attr('class', 'entity-type')
63223 .text(function(d) {
63224 var matched = context.presets().match(d.entity, d.graph);
63225 return (matched && matched.name()) || utilDisplayType(d.entity.id);
63230 .attr('class', 'entity-name')
63231 .text(function(d) {
63232 var name = utilDisplayName(d.entity) || '',
63237 return string += ' ' + name;
63241 .style('opacity', 0)
63243 .style('opacity', 1);
63249 .on('mouseover', mouseover)
63250 .on('mouseout', mouseout)
63251 .on('click', zoomToEntity);
63254 // Download changeset link
63255 var changeset = new osmChangeset().update({ id: undefined }),
63256 changes = history.changes(actionDiscardTags(history.difference()));
63258 delete changeset.id; // Export without chnageset_id
63260 var data = JXON.stringify(changeset.osmChangeJXON(changes)),
63261 blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
63262 fileName = 'changes.osc';
63264 var linkEnter = container.selectAll('.download-changes')
63268 .attr('class', 'download-changes');
63270 if (detected.download) { // All except IE11 and Edge
63271 linkEnter // download the data as a file
63272 .attr('href', window.URL.createObjectURL(blob))
63273 .attr('download', fileName);
63275 } else { // IE11 and Edge
63276 linkEnter // open data uri in a new tab
63277 .attr('target', '_blank')
63278 .on('click.download', function() {
63279 navigator.msSaveBlob(blob, fileName);
63284 .call(svgIcon('#icon-load', 'inline'))
63286 .text(t('commit.download_changes'));
63289 function mouseover(d) {
63291 context.surface().selectAll(
63292 utilEntityOrMemberSelector([d.entity.id], context.graph())
63293 ).classed('hover', true);
63298 function mouseout() {
63299 context.surface().selectAll('.hover')
63300 .classed('hover', false);
63304 function zoomToEntity(change) {
63305 var entity = change.entity;
63306 if (change.changeType !== 'deleted' &&
63307 context.graph().entity(entity.id).geometry(context.graph()) !== 'vertex') {
63308 context.map().zoomTo(entity);
63309 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
63310 .classed('hover', true);
63316 return commitChanges;
63319 function uiCommitWarnings(context) {
63321 function commitWarnings(selection) {
63323 var changes = context.history().changes();
63324 var warnings = context.history().validate(changes);
63326 var container = selection.selectAll('.warning-section')
63327 .data(warnings.length ? [0] : []);
63332 var containerEnter = container.enter()
63334 .attr('class', 'modal-section warning-section fillL2');
63338 .text(t('commit.warnings'));
63342 .attr('class', 'changeset-list');
63344 container = containerEnter
63348 var items = container.select('ul').selectAll('li')
63354 var itemsEnter = items.enter()
63356 .attr('class', 'warning-item');
63359 .call(svgIcon('#icon-alert', 'pre-text'));
63363 .text(function(d) { return d.message; });
63365 itemsEnter.filter(function(d) { return d.tooltip; })
63367 .title(function(d) { return d.tooltip; })
63375 .on('mouseover', mouseover)
63376 .on('mouseout', mouseout)
63377 .on('click', warningClick);
63380 function mouseover(d) {
63382 context.surface().selectAll(
63383 utilEntityOrMemberSelector([d.entity.id], context.graph())
63384 ).classed('hover', true);
63389 function mouseout() {
63390 context.surface().selectAll('.hover')
63391 .classed('hover', false);
63395 function warningClick(d) {
63397 context.map().zoomTo(d.entity);
63398 context.enter(modeSelect(context, [d.entity.id]));
63405 return commitWarnings;
63409 var readOnlyTags = [
63410 /^changesets_count$/,
63418 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
63419 // from https://stackoverflow.com/a/25575009
63420 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
63423 function uiCommit(context) {
63424 var dispatch$$1 = dispatch('cancel', 'save'),
63428 var changesetEditor = uiChangesetEditor(context)
63429 .on('change', changeTags);
63430 var rawTagEditor = uiRawTagEditor(context)
63431 .on('change', changeTags);
63432 var commitChanges = uiCommitChanges(context);
63433 var commitWarnings = uiCommitWarnings(context);
63436 function commit(selection$$1) {
63437 _selection = selection$$1;
63439 var osm = context.connection();
63442 // expire stored comment and hashtags after cutoff datetime - #3947
63443 var commentDate = +context.storage('commentDate') || 0,
63444 currDate = Date.now(),
63445 cutoff = 2 * 86400 * 1000; // 2 days
63446 if (commentDate > currDate || currDate - commentDate > cutoff) {
63447 context.storage('comment', null);
63448 context.storage('hashtags', null);
63453 var detected = utilDetect();
63455 comment: context.storage('comment') || '',
63456 created_by: ('iD ' + context.version).substr(0, 255),
63457 imagery_used: context.history().imageryUsed().join(';').substr(0, 255),
63458 host: detected.host.substr(0, 255),
63459 locale: detected.locale.substr(0, 255)
63462 // call findHashtags initially - this will remove stored
63463 // hashtags if any hashtags are found in the comment - #4304
63464 findHashtags(tags, true);
63466 var hashtags = context.storage('hashtags');
63468 tags.hashtags = hashtags;
63471 changeset = new osmChangeset({ tags: tags });
63474 tags = clone(changeset.tags);
63476 var header = selection$$1.selectAll('.header')
63481 .attr('class', 'header fillL')
63483 .text(t('commit.title'));
63485 var body = selection$$1.selectAll('.body')
63488 body = body.enter()
63490 .attr('class', 'body')
63494 // Changeset Section
63495 var changesetSection = body.selectAll('.changeset-editor')
63498 changesetSection = changesetSection.enter()
63500 .attr('class', 'modal-section changeset-editor')
63501 .merge(changesetSection);
63504 .call(changesetEditor
63505 .changesetID(changeset.id)
63511 body.call(commitWarnings);
63514 // Upload Explanation
63515 var saveSection = body.selectAll('.save-section')
63518 saveSection = saveSection.enter()
63520 .attr('class','modal-section save-section fillL cf')
63521 .merge(saveSection);
63523 var prose = saveSection.selectAll('.commit-info')
63526 prose = prose.enter()
63528 .attr('class', 'commit-info')
63529 .text(t('commit.upload_explanation'))
63532 osm.userDetails(function(err, user) {
63535 var userLink = d3_select(document.createElement('div'));
63537 userDetails = user;
63539 if (user.image_url) {
63542 .attr('src', user.image_url)
63543 .attr('class', 'icon pre-text user-icon');
63548 .attr('class','user-info')
63549 .text(user.display_name)
63550 .attr('href', osm.userURL(user.display_name))
63551 .attr('tabindex', -1)
63552 .attr('target', '_blank');
63555 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
63560 var requestReview = saveSection.selectAll('.request-review')
63564 var requestReviewEnter = requestReview.enter()
63566 .attr('class', 'request-review');
63568 var labelEnter = requestReviewEnter
63570 .attr('for', 'commit-input-request-review');
63574 .attr('type', 'checkbox')
63575 .attr('id', 'commit-input-request-review');
63579 .text(t('commit.request_review'));
63582 requestReview = requestReview
63583 .merge(requestReviewEnter);
63585 var requestReviewInput = requestReview.selectAll('input')
63586 .property('checked', isReviewRequested(changeset.tags))
63587 .on('change', toggleRequestReview);
63591 var buttonSection = saveSection.selectAll('.buttons')
63595 var buttonEnter = buttonSection.enter()
63597 .attr('class', 'buttons fillL cf');
63601 .attr('class', 'secondary-action col5 button cancel-button')
63603 .attr('class', 'label')
63604 .text(t('commit.cancel'));
63608 .attr('class', 'action col5 button save-button')
63610 .attr('class', 'label')
63611 .text(t('commit.save'));
63614 buttonSection = buttonSection
63615 .merge(buttonEnter);
63617 buttonSection.selectAll('.cancel-button')
63618 .on('click.cancel', function() {
63619 dispatch$$1.call('cancel');
63622 buttonSection.selectAll('.save-button')
63623 .attr('disabled', function() {
63624 var n = d3_select('#preset-input-comment').node();
63625 return (n && n.value.length) ? null : true;
63627 .on('click.save', function() {
63628 dispatch$$1.call('save', this, changeset);
63633 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
63636 tagSection = tagSection.enter()
63638 .attr('class', 'modal-section tag-section raw-tag-editor')
63639 .merge(tagSection);
63641 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
63644 .expanded(expanded)
63645 .readOnlyTags(readOnlyTags)
63646 .tags(clone(changeset.tags))
63651 body.call(commitChanges);
63654 function toggleRequestReview() {
63655 var rr = requestReviewInput.property('checked');
63656 updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
63658 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
63662 .expanded(expanded)
63663 .readOnlyTags(readOnlyTags)
63664 .tags(clone(changeset.tags))
63670 function changeTags(changed, onInput) {
63671 if (changed.hasOwnProperty('comment')) {
63672 if (changed.comment === undefined) {
63673 changed.comment = '';
63676 context.storage('comment', changed.comment);
63677 context.storage('commentDate', Date.now());
63681 updateChangeset(changed, onInput);
63684 _selection.call(commit);
63689 function findHashtags(tags, commentOnly) {
63690 var inComment = commentTags(),
63691 inHashTags = hashTags();
63693 if (inComment !== null) { // when hashtags are detected in comment...
63694 context.storage('hashtags', null); // always remove stored hashtags - #4304
63695 if (commentOnly) { inHashTags = null; } // optionally override hashtags field
63697 return unionBy(inComment, inHashTags, function (s) {
63698 return s.toLowerCase();
63701 // Extract hashtags from `comment`
63702 function commentTags() {
63703 return tags.comment
63704 .replace(/http\S*/g, '') // drop anything that looks like a URL - #4289
63705 .match(hashtagRegex);
63708 // Extract and clean hashtags from `hashtags`
63709 function hashTags() {
63710 var t$$1 = tags.hashtags || '';
63713 .map(function (s) {
63714 if (s[0] !== '#') { s = '#' + s; } // prepend '#'
63715 var matched = s.match(hashtagRegex);
63716 return matched && matched[0];
63717 }).filter(Boolean); // exclude falsey
63722 function isReviewRequested(tags) {
63723 var rr = tags.review_requested;
63724 if (rr === undefined) return false;
63725 rr = rr.trim().toLowerCase();
63726 return !(rr === '' || rr === 'no');
63730 function updateChangeset(changed, onInput) {
63731 var tags = clone(changeset.tags);
63733 forEach(changed, function(v, k) {
63734 k = k.trim().substr(0, 255);
63735 if (readOnlyTags.indexOf(k) !== -1) return;
63737 if (k !== '' && v !== undefined) {
63741 tags[k] = v.trim().substr(0, 255);
63749 // when changing the comment, override hashtags with any found in comment.
63750 var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
63751 var arr = findHashtags(tags, commentOnly);
63753 tags.hashtags = arr.join(';').substr(0, 255);
63754 context.storage('hashtags', tags.hashtags);
63756 delete tags.hashtags;
63757 context.storage('hashtags', null);
63761 // always update userdetails, just in case user reauthenticates as someone else
63762 if (userDetails && userDetails.changesets_count !== undefined) {
63763 var changesetsCount = parseInt(userDetails.changesets_count, 10) + 1; // #4283
63764 tags.changesets_count = String(changesetsCount);
63766 // first 100 edits - new user
63767 if (changesetsCount <= 100) {
63769 s = context.storage('walkthrough_completed');
63771 tags['ideditor:walkthrough_completed'] = s;
63774 s = context.storage('walkthrough_progress');
63776 tags['ideditor:walkthrough_progress'] = s;
63779 s = context.storage('walkthrough_started');
63781 tags['ideditor:walkthrough_started'] = s;
63785 delete tags.changesets_count;
63788 if (!isEqual(changeset.tags, tags)) {
63789 changeset = changeset.update({ tags: tags });
63794 commit.reset = function() {
63799 return utilRebind(commit, dispatch$$1, 'on');
63802 function uiConfirm(selection) {
63803 var modalSelection = uiModal(selection);
63805 modalSelection.select('.modal')
63806 .classed('modal-alert', true);
63808 var section = modalSelection.select('.content');
63810 section.append('div')
63811 .attr('class', 'modal-section header');
63813 section.append('div')
63814 .attr('class', 'modal-section message-text');
63816 var buttons = section.append('div')
63817 .attr('class', 'modal-section buttons cf');
63820 modalSelection.okButton = function() {
63823 .attr('class', 'action col4')
63824 .on('click.confirm', function() {
63825 modalSelection.remove();
63827 .text(t('confirm.okay'));
63829 return modalSelection;
63833 return modalSelection;
63836 function uiConflicts(context) {
63837 var dispatch$$1 = dispatch('cancel', 'save'),
63842 function conflicts(selection$$1) {
63843 var header = selection$$1
63845 .attr('class', 'header fillL');
63849 .attr('class', 'fr')
63850 .on('click', function() { dispatch$$1.call('cancel'); })
63851 .call(svgIcon('#icon-close'));
63855 .text(t('save.conflict.header'));
63857 var body = selection$$1
63859 .attr('class', 'body fillL');
63861 var conflictsHelp = body
63863 .attr('class', 'conflicts-help')
63864 .text(t('save.conflict.help'));
63867 // Download changes link
63868 var detected = utilDetect(),
63869 changeset = new osmChangeset();
63871 delete changeset.id; // Export without chnageset_id
63873 var data = JXON.stringify(changeset.osmChangeJXON(origChanges)),
63874 blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
63875 fileName = 'changes.osc';
63877 var linkEnter = conflictsHelp.selectAll('.download-changes')
63881 .attr('class', 'download-changes');
63883 if (detected.download) { // All except IE11 and Edge
63884 linkEnter // download the data as a file
63885 .attr('href', window.URL.createObjectURL(blob))
63886 .attr('download', fileName);
63888 } else { // IE11 and Edge
63889 linkEnter // open data uri in a new tab
63890 .attr('target', '_blank')
63891 .on('click.download', function() {
63892 navigator.msSaveBlob(blob, fileName);
63897 .call(svgIcon('#icon-load', 'inline'))
63899 .text(t('save.conflict.download_changes'));
63904 .attr('class', 'conflict-container fillL3')
63905 .call(showConflict, 0);
63909 .attr('class', 'conflicts-done')
63910 .attr('opacity', 0)
63911 .style('display', 'none')
63912 .text(t('save.conflict.done'));
63916 .attr('class','buttons col12 joined conflicts-buttons');
63920 .attr('disabled', conflictList.length > 1)
63921 .attr('class', 'action conflicts-button col6')
63922 .text(t('save.title'))
63923 .on('click.try_again', function() { dispatch$$1.call('save'); });
63927 .attr('class', 'secondary-action conflicts-button col6')
63928 .text(t('confirm.cancel'))
63929 .on('click.cancel', function() { dispatch$$1.call('cancel'); });
63933 function showConflict(selection$$1, index) {
63934 if (index < 0 || index >= conflictList.length) return;
63936 var parent = d3_select(selection$$1.node().parentNode);
63938 // enable save button if this is the last conflict being reviewed..
63939 if (index === conflictList.length - 1) {
63940 window.setTimeout(function() {
63941 parent.select('.conflicts-button')
63942 .attr('disabled', null);
63944 parent.select('.conflicts-done')
63946 .attr('opacity', 1)
63947 .style('display', 'block');
63951 var item = selection$$1
63952 .selectAll('.conflict')
63953 .data([conflictList[index]]);
63955 var enter = item.enter()
63957 .attr('class', 'conflict');
63961 .attr('class', 'conflict-count')
63962 .text(t('save.conflict.count', { num: index + 1, total: conflictList.length }));
63966 .attr('class', 'conflict-description')
63968 .text(function(d) { return d.name; })
63969 .on('click', function(d) {
63970 zoomToEntity(d.id);
63971 event.preventDefault();
63974 var details = enter
63976 .attr('class', 'conflict-detail-container');
63980 .attr('class', 'conflict-detail-list')
63982 .data(function(d) { return d.details || []; })
63985 .attr('class', 'conflict-detail-item')
63986 .html(function(d) { return d; });
63990 .attr('class', 'conflict-choices')
63995 .attr('class', 'conflict-nav-buttons joined cf')
63996 .selectAll('button')
63997 .data(['previous', 'next'])
64000 .text(function(d) { return t('save.conflict.' + d); })
64001 .attr('class', 'conflict-nav-button action col6')
64002 .attr('disabled', function(d, i) {
64003 return (i === 0 && index === 0) ||
64004 (i === 1 && index === conflictList.length - 1) || null;
64006 .on('click', function(d, i) {
64007 var container = parent.select('.conflict-container'),
64008 sign = (i === 0 ? -1 : 1);
64011 .selectAll('.conflict')
64015 .call(showConflict, index + sign);
64017 event.preventDefault();
64025 function addChoices(selection$$1) {
64026 var choices = selection$$1
64028 .attr('class', 'layer-list')
64030 .data(function(d) { return d.choices || []; });
64032 var enter = choices.enter()
64034 .attr('class', 'layer');
64041 .attr('type', 'radio')
64042 .attr('name', function(d) { return d.id; })
64043 .on('change', function(d, i) {
64044 var ul = this.parentNode.parentNode.parentNode;
64045 ul.__data__.chosen = i;
64051 .text(function(d) { return d.text; });
64054 .each(function(d, i) {
64055 var ul = this.parentNode;
64056 if (ul.__data__.chosen === i) choose(ul, d);
64061 function choose(ul, datum) {
64062 if (event) event.preventDefault();
64066 .classed('active', function(d) { return d === datum; })
64067 .selectAll('input')
64068 .property('checked', function(d) { return d === datum; });
64070 var extent = geoExtent$$1(),
64073 entity = context.graph().hasEntity(datum.id);
64074 if (entity) extent._extend(entity.extent(context.graph()));
64078 entity = context.graph().hasEntity(datum.id);
64079 if (entity) extent._extend(entity.extent(context.graph()));
64081 zoomToEntity(datum.id, extent);
64085 function zoomToEntity(id, extent) {
64086 context.surface().selectAll('.hover')
64087 .classed('hover', false);
64089 var entity = context.graph().hasEntity(id);
64092 context.map().trimmedExtent(extent);
64094 context.map().zoomTo(entity);
64096 context.surface().selectAll(
64097 utilEntityOrMemberSelector([entity.id], context.graph()))
64098 .classed('hover', true);
64103 // The conflict list should be an array of objects like:
64106 // name: entityName(local),
64107 // details: merge.conflicts(),
64110 // choice(id, keepMine, forceLocal),
64111 // choice(id, keepTheirs, forceRemote)
64114 conflicts.list = function(_) {
64115 if (!arguments.length) return conflictList;
64121 conflicts.origChanges = function(_) {
64122 if (!arguments.length) return origChanges;
64128 return utilRebind(conflicts, dispatch$$1, 'on');
64131 function uiEditMenu(context, operations) {
64137 var p = 8, // top padding
64138 m = 4, // top margin
64139 h = 15, // height of icon
64140 vpBottomMargin = 45, // viewport bottom margin
64141 vpSideMargin = 35, // viewport side margin
64143 buttonHeight = (2 * p + h),
64144 menuWidth = buttonWidth,
64145 menuHeight = (2 * m) + operations.length * buttonHeight,
64146 menuSideMargin = 10,
64147 tooltipWidth = 200,
64148 tooltipHeight = 200; // a reasonable guess, real height depends on tooltip contents
64151 var editMenu = function (selection$$1) {
64152 if (!operations.length) return;
64154 selection$$1.node().parentNode.focus();
64156 var isRTL = textDirection === 'rtl',
64157 viewport = context.surfaceRect();
64159 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
64160 // menu is going left-to-right and near right viewport edge, go left instead
64162 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
64163 // menu is going right-to-left and near left viewport edge, go right instead
64167 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
64169 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
64170 // menu is near bottom viewport edge, shift upwards
64171 offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
64174 var origin = [ center[0] + offset[0], center[1] + offset[1] ];
64176 menu = selection$$1
64178 .attr('class', 'edit-menu')
64179 .attr('transform', 'translate(' + origin + ')')
64180 .attr('opacity', 0);
64184 .attr('opacity', 1);
64188 .attr('class', 'edit-menu-background')
64192 .attr('width', menuWidth)
64193 .attr('height', menuHeight)
64194 .attr('stroke-linecap', 'round');
64197 var button = menu.selectAll('.edit-menu-item')
64201 .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
64202 .classed('disabled', function (d) { return d.disabled(); })
64203 .attr('transform', function (d, i) {
64204 return 'translate(' + geoRoundCoords([
64206 m + i * buttonHeight
64207 ]).join(',') + ')';
64213 .attr('width', buttonWidth)
64214 .attr('height', buttonHeight)
64215 .on('click', click)
64216 .on('mousedown', mousedown)
64217 .on('mouseover', mouseover)
64218 .on('mouseout', mouseout);
64222 .attr('width', '20')
64223 .attr('height', '20')
64224 .attr('transform', function () {
64225 return 'translate(' + [2 * p, 5] + ')';
64227 .attr('xlink:href', function (d) { return '#operation-' + d.id; });
64229 tooltip = d3_select(document.body)
64231 .attr('class', 'tooltip-inner edit-menu-tooltip');
64234 function click(operation) {
64235 event.stopPropagation();
64236 if (operation.disabled()) return;
64241 function mousedown() {
64242 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
64245 function mouseover(d, i) {
64249 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
64251 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
64254 if (tipX + tooltipWidth > viewport.right) {
64255 // tip is going left-to-right and near right viewport edge, go left instead
64256 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
64257 } else if (tipX < viewport.left) {
64258 // tip is going right-to-left and near left viewport edge, go right instead
64259 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
64262 tipY = viewport.top + origin[1] + (i * buttonHeight);
64263 if (tipY + tooltipHeight > viewport.bottom) {
64264 // tip is near bottom viewport edge, shift upwards
64265 tipY -= tipY + tooltipHeight - viewport.bottom;
64269 .style('left', tipX + 'px')
64270 .style('top', tipY + 'px')
64271 .style('display', 'block')
64272 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
64275 function mouseout() {
64276 tooltip.style('display', 'none');
64281 editMenu.close = function () {
64284 .style('pointer-events', 'none')
64286 .attr('opacity', 0)
64296 editMenu.center = function (_) {
64297 if (!arguments.length) return center;
64309 function uiFlash(showDuration) {
64310 showDuration = showDuration || 1500;
64316 d3_select('#footer-wrap')
64317 .attr('class', 'footer-hide');
64318 d3_select('#flash-wrap')
64319 .attr('class', 'footer-show');
64321 var content = d3_select('#flash-wrap').selectAll('.content')
64324 content = content.enter()
64326 .attr('class', 'content')
64329 timer$1 = d3_timeout(function() {
64331 d3_select('#footer-wrap')
64332 .attr('class', 'footer-show');
64333 d3_select('#flash-wrap')
64334 .attr('class', 'footer-hide');
64341 function uiLasso(context) {
64342 var group, polygon;
64344 lasso.coordinates = [];
64346 function lasso(selection$$1) {
64347 context.container()
64348 .classed('lasso', true);
64350 group = selection$$1
64352 .attr('class', 'lasso hide');
64356 .attr('class', 'lasso-path');
64359 .call(uiToggle(true));
64365 polygon.data([lasso.coordinates])
64366 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
64371 lasso.extent = function () {
64372 return lasso.coordinates.reduce(function(extent, point) {
64373 return extent.extend(geoExtent$$1(point));
64374 }, geoExtent$$1());
64378 lasso.p = function(_) {
64379 if (!arguments.length) return lasso;
64380 lasso.coordinates.push(_);
64386 lasso.close = function() {
64388 group.call(uiToggle(false, function() {
64389 d3_select(this).remove();
64392 context.container().classed('lasso', false);
64399 function uiRadialMenu(context, operations) {
64405 var radialMenu = function(selection$$1) {
64406 if (!operations.length) return;
64408 selection$$1.node().parentNode.focus();
64410 function click(operation) {
64411 event.stopPropagation();
64412 if (operation.disabled()) return;
64414 radialMenu.close();
64417 menu = selection$$1
64419 .attr('class', 'radial-menu')
64420 .attr('transform', 'translate(' + center + ')')
64421 .attr('opacity', 0);
64425 .attr('opacity', 1);
64430 a1 = a0 + (operations.length - 1) * a;
64434 .attr('class', 'radial-menu-background')
64435 .attr('d', 'M' + r * Math.sin(a0) + ',' +
64437 ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
64438 (r * Math.sin(a1) + 1e-3) + ',' +
64439 (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
64440 .attr('stroke-width', 50)
64441 .attr('stroke-linecap', 'round');
64443 var button = menu.selectAll()
64447 .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
64448 .classed('disabled', function(d) { return d.disabled(); })
64449 .attr('transform', function(d, i) {
64450 return 'translate(' + geoRoundCoords([
64451 r * Math.sin(a0 + i * a),
64452 r * Math.cos(a0 + i * a)]).join(',') + ')';
64458 .on('click', click)
64459 .on('mousedown', mousedown)
64460 .on('mouseover', mouseover)
64461 .on('mouseout', mouseout);
64465 .attr('transform', 'translate(-10,-10)')
64466 .attr('width', '20')
64467 .attr('height', '20')
64468 .attr('xlink:href', function(d) { return '#operation-' + d.id; });
64470 tooltip = d3_select(document.body)
64472 .attr('class', 'tooltip-inner radial-menu-tooltip');
64474 function mousedown() {
64475 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
64478 function mouseover(d, i) {
64479 var rect = context.surfaceRect(),
64480 angle = a0 + i * a,
64481 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
64482 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
64483 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
64484 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
64487 .style('top', null)
64488 .style('left', null)
64489 .style('bottom', null)
64490 .style('right', null)
64491 .style('display', 'block')
64492 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
64496 .style('right', right)
64497 .style('top', top);
64498 } else if (i >= 4) {
64500 .style('left', left)
64501 .style('bottom', bottom);
64504 .style('left', left)
64505 .style('top', top);
64509 function mouseout() {
64510 tooltip.style('display', 'none');
64515 radialMenu.close = function() {
64518 .style('pointer-events', 'none')
64520 .attr('opacity', 0)
64530 radialMenu.center = function(_) {
64531 if (!arguments.length) return center;
64540 function uiSelectionList(context, selectedIDs) {
64542 function selectEntity(entity) {
64543 context.enter(modeSelect(context, [entity.id]));
64547 function deselectEntity(entity) {
64548 event.stopPropagation();
64549 var index = selectedIDs.indexOf(entity.id);
64551 selectedIDs.splice(index, 1);
64553 context.enter(modeSelect(context, selectedIDs));
64557 function selectionList(selection$$1) {
64558 selection$$1.classed('selection-list-pane', true);
64560 var header = selection$$1
64562 .attr('class', 'header fillL cf');
64566 .text(t('inspector.multiselect'));
64568 var listWrap = selection$$1
64570 .attr('class', 'inspector-body');
64572 var list = listWrap
64574 .attr('class', 'feature-list cf');
64576 context.history().on('change.selection-list', drawList);
64580 function drawList() {
64581 var entities = selectedIDs
64582 .map(function(id) { return context.hasEntity(id); })
64583 .filter(function(entity) { return entity; });
64585 var items = list.selectAll('.feature-list-item')
64586 .data(entities, osmEntity$$1.key);
64592 var enter = items.enter()
64594 .attr('class', 'feature-list-item')
64595 .on('click', selectEntity);
64599 .attr('class', 'label');
64603 .attr('class', 'close')
64604 .on('click', deselectEntity)
64605 .call(svgIcon('#icon-close'));
64609 .attr('class', 'entity-geom-icon')
64610 .call(svgIcon('', 'pre-text'));
64614 .attr('class', 'entity-type');
64618 .attr('class', 'entity-name');
64621 items = items.merge(enter);
64623 items.selectAll('.entity-geom-icon use')
64624 .attr('href', function() {
64625 var entity = this.parentNode.parentNode.__data__;
64626 return '#icon-' + context.geometry(entity.id);
64629 items.selectAll('.entity-type')
64630 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
64632 items.selectAll('.entity-name')
64633 .text(function(entity) { return utilDisplayName(entity); });
64637 return selectionList;
64640 function uiSourceSwitch(context) {
64645 event.preventDefault();
64646 if (context.inIntro()) return;
64648 if (context.history().hasChanges() &&
64649 !window.confirm(t('source_switch.lose_changes'))) return;
64651 var live = d3_select(this)
64654 context.history().clearSaved();
64655 context.connection().switch(live ? keys[1] : keys[0]);
64656 context.enter(modeBrowse(context));
64660 .text(live ? t('source_switch.dev') : t('source_switch.live'))
64661 .classed('live', !live);
64664 var sourceSwitch = function(selection$$1) {
64668 .text(t('source_switch.live'))
64669 .classed('live', true)
64670 .attr('tabindex', -1)
64671 .on('click', click);
64675 sourceSwitch.keys = function(_) {
64676 if (!arguments.length) return keys;
64678 return sourceSwitch;
64682 return sourceSwitch;
64685 function uiSuccess(context) {
64686 var dispatch$$1 = dispatch('cancel'),
64690 function success(selection$$1) {
64691 var header = selection$$1
64693 .attr('class', 'header fillL');
64697 .attr('class', 'fr')
64698 .on('click', function() { dispatch$$1.call('cancel'); })
64699 .call(svgIcon('#icon-close'));
64703 .text(t('success.just_edited'));
64705 var body = selection$$1
64707 .attr('class', 'body save-success fillL');
64711 .html(t('success.help_html'));
64715 .attr('class', 'details')
64716 .attr('target', '_blank')
64717 .attr('tabindex', -1)
64718 .call(svgIcon('#icon-out-link', 'inline'))
64719 .attr('href', t('success.help_link_url'))
64721 .text(t('success.help_link_text'));
64723 var osm = context.connection();
64726 var changesetURL = osm.changesetURL(changeset.id);
64728 var viewOnOsm = body
64730 .attr('class', 'button col12 osm')
64731 .attr('target', '_blank')
64732 .attr('href', changesetURL);
64736 .attr('class', 'logo logo-osm')
64738 .attr('xlink:href', '#logo-osm');
64742 .text(t('success.view_on_osm'));
64744 var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
64745 ' ' + changesetURL;
64748 { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
64749 { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
64750 { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
64753 body.selectAll('.button.social')
64757 .attr('class', 'button social col4')
64758 .attr('target', '_blank')
64759 .attr('href', function(d) { return d.value; })
64761 .title(function(d) { return t('success.' + d.key); })
64762 .placement('bottom'))
64763 .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
64767 success.changeset = function(_) {
64768 if (!arguments.length) return changeset;
64774 return utilRebind(success, dispatch$$1, 'on');
64777 function coreHistory(context) {
64778 var imageryUsed = ['Bing'],
64779 dispatch$$1 = dispatch('change', 'undone', 'redone'),
64780 lock = utilSessionMutex('lock'),
64783 stack, index, tree;
64786 // internal _act, accepts list of actions and eased time
64787 function _act(actions, t) {
64788 actions = Array.prototype.slice.call(actions);
64792 if (!isFunction(actions[actions.length - 1])) {
64793 annotation = actions.pop();
64796 stack[index].transform = context.projection.transform();
64797 stack[index].selectedIDs = context.selectedIDs();
64799 var graph = stack[index].graph;
64800 for (var i = 0; i < actions.length; i++) {
64801 graph = actions[i](graph, t);
64806 annotation: annotation,
64807 imageryUsed: imageryUsed
64812 // internal _perform with eased time
64813 function _perform(args, t) {
64814 var previous = stack[index].graph;
64815 stack = stack.slice(0, index + 1);
64816 stack.push(_act(args, t));
64818 return change(previous);
64822 // internal _replace with eased time
64823 function _replace(args, t) {
64824 var previous = stack[index].graph;
64825 // assert(index == stack.length - 1)
64826 stack[index] = _act(args, t);
64827 return change(previous);
64831 // internal _overwrite with eased time
64832 function _overwrite(args, t) {
64833 var previous = stack[index].graph;
64838 stack = stack.slice(0, index + 1);
64839 stack.push(_act(args, t));
64841 return change(previous);
64845 // determine diffrence and dispatch a change event
64846 function change(previous) {
64847 var difference$$1 = coreDifference(previous, history.graph());
64848 dispatch$$1.call('change', this, difference$$1);
64849 return difference$$1;
64853 // iD uses namespaced keys so multiple installations do not conflict
64854 function getKey(n) {
64855 return 'iD_' + window.location.origin + '_' + n;
64861 graph: function() {
64862 return stack[index].graph;
64867 return stack[0].graph;
64871 merge: function(entities, extent) {
64872 stack[0].graph.rebase(entities, map$4(stack, 'graph'), false);
64873 tree.rebase(entities, false);
64875 dispatch$$1.call('change', this, undefined, extent);
64879 perform: function() {
64880 // complete any transition already in progress
64881 d3_select(document).interrupt('history.perform');
64883 var transitionable = false,
64884 action0 = arguments[0];
64886 if (arguments.length === 1 ||
64887 arguments.length === 2 && !isFunction(arguments[1])) {
64888 transitionable = !!action0.transitionable;
64891 if (transitionable) {
64892 var origArguments = arguments;
64893 d3_select(document)
64894 .transition('history.perform')
64895 .duration(duration)
64897 .tween('history.tween', function() {
64898 return function(t) {
64899 if (t < 1) _overwrite([action0], t);
64902 .on('start', function() {
64903 _perform([action0], 0);
64905 .on('end interrupt', function() {
64906 _overwrite(origArguments, 1);
64910 return _perform(arguments);
64915 replace: function() {
64916 d3_select(document).interrupt('history.perform');
64917 return _replace(arguments, 1);
64921 // Same as calling pop and then perform
64922 overwrite: function() {
64923 d3_select(document).interrupt('history.perform');
64924 return _overwrite(arguments, 1);
64929 d3_select(document).interrupt('history.perform');
64931 var previous = stack[index].graph;
64932 if (isNaN(+n) || +n < 0) {
64935 while (n-- > 0 && index > 0) {
64939 return change(previous);
64943 // Back to the previous annotated state or index = 0.
64945 d3_select(document).interrupt('history.perform');
64947 var previous = stack[index].graph;
64948 while (index > 0) {
64950 if (stack[index].annotation) break;
64953 dispatch$$1.call('undone', this, stack[index]);
64954 return change(previous);
64958 // Forward to the next annotated state.
64960 d3_select(document).interrupt('history.perform');
64962 var previous = stack[index].graph;
64963 var tryIndex = index;
64964 while (tryIndex < stack.length - 1) {
64966 if (stack[tryIndex].annotation) {
64968 dispatch$$1.call('redone', this, stack[index]);
64973 return change(previous);
64977 undoAnnotation: function() {
64980 if (stack[i].annotation) return stack[i].annotation;
64986 redoAnnotation: function() {
64988 while (i <= stack.length - 1) {
64989 if (stack[i].annotation) return stack[i].annotation;
64995 intersects: function(extent) {
64996 return tree.intersects(extent, stack[index].graph);
65000 difference: function() {
65001 var base = stack[0].graph,
65002 head = stack[index].graph;
65003 return coreDifference(base, head);
65007 changes: function(action) {
65008 var base = stack[0].graph,
65009 head = stack[index].graph;
65012 head = action(head);
65015 var difference$$1 = coreDifference(base, head);
65018 modified: difference$$1.modified(),
65019 created: difference$$1.created(),
65020 deleted: difference$$1.deleted()
65025 validate: function(changes) {
65027 map$4(Validations, function(fn) { return fn()(changes, stack[index].graph); })
65032 hasChanges: function() {
65033 return this.difference().length() > 0;
65037 imageryUsed: function(sources) {
65039 imageryUsed = sources;
65042 var arr = map$4(stack.slice(1, index + 1), 'imageryUsed');
65043 return without(uniq(flatten(arr)), 'Custom');
65048 // save the current history state
65049 checkpoint: function(key) {
65050 checkpoints[key] = {
65051 stack: cloneDeep(stack),
65058 // restore history state to a given checkpoint or reset completely
65059 reset: function(key) {
65060 if (key !== undefined && checkpoints.hasOwnProperty(key)) {
65061 stack = cloneDeep(checkpoints[key].stack);
65062 index = checkpoints[key].index;
65064 stack = [{graph: coreGraph$$1()}];
65066 tree = coreTree(stack[0].graph);
65069 dispatch$$1.call('change');
65074 toIntroGraph: function() {
65075 var nextId = { n: 0, r: 0, w: 0 },
65077 graph = this.graph(),
65080 // clone base entities..
65081 forEach(graph.base().entities, function(entity) {
65082 var copy = cloneDeepWith(entity, customizer);
65083 baseEntities[copy.id] = copy;
65086 // replace base entities with head entities..
65087 forEach(graph.entities, function(entity, id) {
65089 var copy = cloneDeepWith(entity, customizer);
65090 baseEntities[copy.id] = copy;
65092 delete baseEntities[id];
65096 // swap temporary for permanent ids..
65097 forEach(baseEntities, function(entity) {
65098 if (Array.isArray(entity.nodes)) {
65099 entity.nodes = entity.nodes.map(function(node) {
65100 return permIds[node] || node;
65103 if (Array.isArray(entity.members)) {
65104 entity.members = entity.members.map(function(member) {
65105 member.id = permIds[member.id] || member.id;
65111 return JSON.stringify({ dataIntroGraph: baseEntities });
65114 function customizer(src) {
65115 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
65116 if (isEmpty(copy.tags)) {
65120 if (Array.isArray(copy.loc)) {
65121 copy.loc[0] = +copy.loc[0].toFixed(6);
65122 copy.loc[1] = +copy.loc[1].toFixed(6);
65125 var match = src.id.match(/([nrw])-\d*/); // temporary id
65126 if (match !== null) {
65127 var nrw = match[1], permId;
65128 do { permId = nrw + (++nextId[nrw]); }
65129 while (baseEntities.hasOwnProperty(permId));
65131 copy.id = permIds[src.id] = permId;
65138 toJSON: function() {
65139 if (!this.hasChanges()) return;
65141 var allEntities = {},
65145 var s = stack.map(function(i) {
65146 var modified = [], deleted = [];
65148 forEach(i.graph.entities, function(entity, id) {
65150 var key = osmEntity$$1.key(entity);
65151 allEntities[key] = entity;
65152 modified.push(key);
65157 // make sure that the originals of changed or deleted entities get merged
65158 // into the base of the stack after restoring the data from JSON.
65159 if (id in base.graph.entities) {
65160 baseEntities[id] = base.graph.entities[id];
65162 // get originals of parent entities too
65163 forEach(base.graph._parentWays[id], function(parentId) {
65164 if (parentId in base.graph.entities) {
65165 baseEntities[parentId] = base.graph.entities[parentId];
65172 if (modified.length) x.modified = modified;
65173 if (deleted.length) x.deleted = deleted;
65174 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
65175 if (i.annotation) x.annotation = i.annotation;
65180 return JSON.stringify({
65182 entities: values$1(allEntities),
65183 baseEntities: values$1(baseEntities),
65185 nextIDs: osmEntity$$1.id.next,
65191 fromJSON: function(json, loadChildNodes) {
65192 var h = JSON.parse(json),
65193 loadComplete = true;
65195 osmEntity$$1.id.next = h.nextIDs;
65198 if (h.version === 2 || h.version === 3) {
65199 var allEntities = {};
65201 h.entities.forEach(function(entity) {
65202 allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
65205 if (h.version === 3) {
65206 // This merges originals for changed entities into the base of
65207 // the stack even if the current stack doesn't have them (for
65208 // example when iD has been restarted in a different region)
65209 var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
65210 stack[0].graph.rebase(baseEntities, map$4(stack, 'graph'), true);
65211 tree.rebase(baseEntities, true);
65213 // When we restore a modified way, we also need to fetch any missing
65214 // childnodes that would normally have been downloaded with it.. #2142
65215 if (loadChildNodes) {
65216 var osm = context.connection();
65217 var nodes = flatten(uniq(map$4(filter(baseEntities, { type: 'way' }), 'nodes')));
65218 var missing = reject(nodes, function(n) { return stack[0].graph.hasEntity(n); });
65220 if (!isEmpty(missing) && osm) {
65221 loadComplete = false;
65222 context.redrawEnable(false);
65224 var loading = uiLoading(context).blocking(true);
65225 context.container().call(loading);
65227 var childNodesLoaded = function(err, result) {
65229 var visible = groupBy(result.data, 'visible');
65230 if (!isEmpty(visible.true)) {
65231 missing = difference(missing, map$4(visible.true, 'id'));
65232 stack[0].graph.rebase(visible.true, map$4(stack, 'graph'), true);
65233 tree.rebase(visible.true, true);
65236 // fetch older versions of nodes that were deleted..
65237 forEach(visible.false, function(entity) {
65238 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
65242 if (err || isEmpty(missing)) {
65244 context.redrawEnable(true);
65245 dispatch$$1.call('change');
65249 osm.loadMultiple(missing, childNodesLoaded);
65254 stack = h.stack.map(function(d) {
65255 var entities = {}, entity;
65258 d.modified.forEach(function(key) {
65259 entity = allEntities[key];
65260 entities[entity.id] = entity;
65265 d.deleted.forEach(function(id) {
65266 entities[id] = undefined;
65271 graph: coreGraph$$1(stack[0].graph).load(entities),
65272 annotation: d.annotation,
65273 imageryUsed: d.imageryUsed
65277 } else { // original version
65278 stack = h.stack.map(function(d) {
65281 for (var i in d.entities) {
65282 var entity = d.entities[i];
65283 entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
65286 d.graph = coreGraph$$1(stack[0].graph).load(entities);
65291 if (loadComplete) {
65292 dispatch$$1.call('change');
65300 if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
65305 clearSaved: function() {
65306 context.debouncedSave.cancel();
65307 if (lock.locked()) context.storage(getKey('saved_history'), null);
65313 return lock.lock();
65317 unlock: function() {
65322 // is iD not open in another window and it detects that
65323 // there's a history stored in localStorage that's recoverable?
65324 restorableChanges: function() {
65325 return lock.locked() && !!context.storage(getKey('saved_history'));
65329 // load history from a version stored in localStorage
65330 restore: function() {
65331 if (!lock.locked()) return;
65333 var json = context.storage(getKey('saved_history'));
65334 if (json) history.fromJSON(json, true);
65345 return utilRebind(history, dispatch$$1, 'on');
65348 /** Used to store function metadata. */
65349 var metaMap = WeakMap && new WeakMap;
65352 * The base implementation of `setData` without support for hot loop shorting.
65355 * @param {Function} func The function to associate metadata with.
65356 * @param {*} data The metadata.
65357 * @returns {Function} Returns `func`.
65359 var baseSetData = !metaMap ? identity$8 : function(func, data) {
65360 metaMap.set(func, data);
65365 * Creates a function that produces an instance of `Ctor` regardless of
65366 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
65369 * @param {Function} Ctor The constructor to wrap.
65370 * @returns {Function} Returns the new wrapped function.
65372 function createCtor(Ctor) {
65373 return function() {
65374 // Use a `switch` statement to work with class constructors. See
65375 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
65376 // for more details.
65377 var args = arguments;
65378 switch (args.length) {
65379 case 0: return new Ctor;
65380 case 1: return new Ctor(args[0]);
65381 case 2: return new Ctor(args[0], args[1]);
65382 case 3: return new Ctor(args[0], args[1], args[2]);
65383 case 4: return new Ctor(args[0], args[1], args[2], args[3]);
65384 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
65385 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
65386 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
65388 var thisBinding = baseCreate(Ctor.prototype),
65389 result = Ctor.apply(thisBinding, args);
65391 // Mimic the constructor's `return` behavior.
65392 // See https://es5.github.io/#x13.2.2 for more details.
65393 return isObject(result) ? result : thisBinding;
65397 /** Used to compose bitmasks for function metadata. */
65398 var WRAP_BIND_FLAG$2 = 1;
65401 * Creates a function that wraps `func` to invoke it with the optional `this`
65402 * binding of `thisArg`.
65405 * @param {Function} func The function to wrap.
65406 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65407 * @param {*} [thisArg] The `this` binding of `func`.
65408 * @returns {Function} Returns the new wrapped function.
65410 function createBind(func, bitmask, thisArg) {
65411 var isBind = bitmask & WRAP_BIND_FLAG$2,
65412 Ctor = createCtor(func);
65414 function wrapper() {
65415 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
65416 return fn.apply(isBind ? thisArg : this, arguments);
65421 /* Built-in method references for those with the same name as other `lodash` methods. */
65422 var nativeMax$6 = Math.max;
65425 * Creates an array that is the composition of partially applied arguments,
65426 * placeholders, and provided arguments into a single array of arguments.
65429 * @param {Array} args The provided arguments.
65430 * @param {Array} partials The arguments to prepend to those provided.
65431 * @param {Array} holders The `partials` placeholder indexes.
65432 * @params {boolean} [isCurried] Specify composing for a curried function.
65433 * @returns {Array} Returns the new array of composed arguments.
65435 function composeArgs(args, partials, holders, isCurried) {
65436 var argsIndex = -1,
65437 argsLength = args.length,
65438 holdersLength = holders.length,
65440 leftLength = partials.length,
65441 rangeLength = nativeMax$6(argsLength - holdersLength, 0),
65442 result = Array(leftLength + rangeLength),
65443 isUncurried = !isCurried;
65445 while (++leftIndex < leftLength) {
65446 result[leftIndex] = partials[leftIndex];
65448 while (++argsIndex < holdersLength) {
65449 if (isUncurried || argsIndex < argsLength) {
65450 result[holders[argsIndex]] = args[argsIndex];
65453 while (rangeLength--) {
65454 result[leftIndex++] = args[argsIndex++];
65459 /* Built-in method references for those with the same name as other `lodash` methods. */
65460 var nativeMax$7 = Math.max;
65463 * This function is like `composeArgs` except that the arguments composition
65464 * is tailored for `_.partialRight`.
65467 * @param {Array} args The provided arguments.
65468 * @param {Array} partials The arguments to append to those provided.
65469 * @param {Array} holders The `partials` placeholder indexes.
65470 * @params {boolean} [isCurried] Specify composing for a curried function.
65471 * @returns {Array} Returns the new array of composed arguments.
65473 function composeArgsRight(args, partials, holders, isCurried) {
65474 var argsIndex = -1,
65475 argsLength = args.length,
65477 holdersLength = holders.length,
65479 rightLength = partials.length,
65480 rangeLength = nativeMax$7(argsLength - holdersLength, 0),
65481 result = Array(rangeLength + rightLength),
65482 isUncurried = !isCurried;
65484 while (++argsIndex < rangeLength) {
65485 result[argsIndex] = args[argsIndex];
65487 var offset = argsIndex;
65488 while (++rightIndex < rightLength) {
65489 result[offset + rightIndex] = partials[rightIndex];
65491 while (++holdersIndex < holdersLength) {
65492 if (isUncurried || argsIndex < argsLength) {
65493 result[offset + holders[holdersIndex]] = args[argsIndex++];
65500 * Gets the number of `placeholder` occurrences in `array`.
65503 * @param {Array} array The array to inspect.
65504 * @param {*} placeholder The placeholder to search for.
65505 * @returns {number} Returns the placeholder count.
65507 function countHolders(array, placeholder) {
65508 var length = array.length,
65512 if (array[length] === placeholder) {
65520 * The function whose prototype chain sequence wrappers inherit from.
65524 function baseLodash() {
65525 // No operation performed.
65528 /** Used as references for the maximum length and index of an array. */
65529 var MAX_ARRAY_LENGTH = 4294967295;
65532 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
65536 * @param {*} value The value to wrap.
65538 function LazyWrapper(value) {
65539 this.__wrapped__ = value;
65540 this.__actions__ = [];
65542 this.__filtered__ = false;
65543 this.__iteratees__ = [];
65544 this.__takeCount__ = MAX_ARRAY_LENGTH;
65545 this.__views__ = [];
65548 // Ensure `LazyWrapper` is an instance of `baseLodash`.
65549 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
65550 LazyWrapper.prototype.constructor = LazyWrapper;
65553 * Gets metadata for `func`.
65556 * @param {Function} func The function to query.
65557 * @returns {*} Returns the metadata for `func`.
65559 var getData = !metaMap ? noop$3 : function(func) {
65560 return metaMap.get(func);
65563 /** Used to lookup unminified function names. */
65564 var realNames = {};
65566 /** Used for built-in method references. */
65567 var objectProto$19 = Object.prototype;
65569 /** Used to check objects for own properties. */
65570 var hasOwnProperty$17 = objectProto$19.hasOwnProperty;
65573 * Gets the name of `func`.
65576 * @param {Function} func The function to query.
65577 * @returns {string} Returns the function name.
65579 function getFuncName(func) {
65580 var result = (func.name + ''),
65581 array = realNames[result],
65582 length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
65585 var data = array[length],
65586 otherFunc = data.func;
65587 if (otherFunc == null || otherFunc == func) {
65595 * The base constructor for creating `lodash` wrapper objects.
65598 * @param {*} value The value to wrap.
65599 * @param {boolean} [chainAll] Enable explicit method chain sequences.
65601 function LodashWrapper(value, chainAll) {
65602 this.__wrapped__ = value;
65603 this.__actions__ = [];
65604 this.__chain__ = !!chainAll;
65605 this.__index__ = 0;
65606 this.__values__ = undefined;
65609 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
65610 LodashWrapper.prototype.constructor = LodashWrapper;
65613 * Creates a clone of `wrapper`.
65616 * @param {Object} wrapper The wrapper to clone.
65617 * @returns {Object} Returns the cloned wrapper.
65619 function wrapperClone(wrapper) {
65620 if (wrapper instanceof LazyWrapper) {
65621 return wrapper.clone();
65623 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
65624 result.__actions__ = copyArray(wrapper.__actions__);
65625 result.__index__ = wrapper.__index__;
65626 result.__values__ = wrapper.__values__;
65630 /** Used for built-in method references. */
65631 var objectProto$20 = Object.prototype;
65633 /** Used to check objects for own properties. */
65634 var hasOwnProperty$18 = objectProto$20.hasOwnProperty;
65637 * Creates a `lodash` object which wraps `value` to enable implicit method
65638 * chain sequences. Methods that operate on and return arrays, collections,
65639 * and functions can be chained together. Methods that retrieve a single value
65640 * or may return a primitive value will automatically end the chain sequence
65641 * and return the unwrapped value. Otherwise, the value must be unwrapped
65644 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
65645 * enabled using `_.chain`.
65647 * The execution of chained methods is lazy, that is, it's deferred until
65648 * `_#value` is implicitly or explicitly called.
65650 * Lazy evaluation allows several methods to support shortcut fusion.
65651 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
65652 * the creation of intermediate arrays and can greatly reduce the number of
65653 * iteratee executions. Sections of a chain sequence qualify for shortcut
65654 * fusion if the section is applied to an array and iteratees accept only
65655 * one argument. The heuristic for whether a section qualifies for shortcut
65656 * fusion is subject to change.
65658 * Chaining is supported in custom builds as long as the `_#value` method is
65659 * directly or indirectly included in the build.
65661 * In addition to lodash methods, wrappers have `Array` and `String` methods.
65663 * The wrapper `Array` methods are:
65664 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
65666 * The wrapper `String` methods are:
65667 * `replace` and `split`
65669 * The wrapper methods that support shortcut fusion are:
65670 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
65671 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
65672 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
65674 * The chainable wrapper methods are:
65675 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
65676 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
65677 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
65678 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
65679 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
65680 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
65681 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
65682 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
65683 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
65684 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
65685 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
65686 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
65687 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
65688 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
65689 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
65690 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
65691 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
65692 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
65693 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
65694 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
65695 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
65696 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
65697 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
65698 * `zipObject`, `zipObjectDeep`, and `zipWith`
65700 * The wrapper methods that are **not** chainable by default are:
65701 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
65702 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
65703 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
65704 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
65705 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
65706 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
65707 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
65708 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
65709 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
65710 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
65711 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
65712 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
65713 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
65714 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
65715 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
65716 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
65717 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
65718 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
65719 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
65720 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
65721 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
65722 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
65723 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
65724 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
65725 * `upperFirst`, `value`, and `words`
65730 * @param {*} value The value to wrap in a `lodash` instance.
65731 * @returns {Object} Returns the new `lodash` wrapper instance.
65734 * function square(n) {
65738 * var wrapped = _([1, 2, 3]);
65740 * // Returns an unwrapped value.
65741 * wrapped.reduce(_.add);
65744 * // Returns a wrapped value.
65745 * var squares = wrapped.map(square);
65747 * _.isArray(squares);
65750 * _.isArray(squares.value());
65753 function lodash(value) {
65754 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
65755 if (value instanceof LodashWrapper) {
65758 if (hasOwnProperty$18.call(value, '__wrapped__')) {
65759 return wrapperClone(value);
65762 return new LodashWrapper(value);
65765 // Ensure wrappers are instances of `baseLodash`.
65766 lodash.prototype = baseLodash.prototype;
65767 lodash.prototype.constructor = lodash;
65770 * Checks if `func` has a lazy counterpart.
65773 * @param {Function} func The function to check.
65774 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
65777 function isLaziable(func) {
65778 var funcName = getFuncName(func),
65779 other = lodash[funcName];
65781 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
65784 if (func === other) {
65787 var data = getData(other);
65788 return !!data && func === data[0];
65792 * Sets metadata for `func`.
65794 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
65795 * period of time, it will trip its breaker and transition to an identity
65796 * function to avoid garbage collection pauses in V8. See
65797 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
65798 * for more details.
65801 * @param {Function} func The function to associate metadata with.
65802 * @param {*} data The metadata.
65803 * @returns {Function} Returns `func`.
65805 var setData = shortOut(baseSetData);
65807 /** Used to match wrap detail comments. */
65808 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/;
65809 var reSplitDetails = /,? & /;
65812 * Extracts wrapper details from the `source` body comment.
65815 * @param {string} source The source to inspect.
65816 * @returns {Array} Returns the wrapper details.
65818 function getWrapDetails(source) {
65819 var match = source.match(reWrapDetails);
65820 return match ? match[1].split(reSplitDetails) : [];
65823 /** Used to match wrap detail comments. */
65824 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
65827 * Inserts wrapper `details` in a comment at the top of the `source` body.
65830 * @param {string} source The source to modify.
65831 * @returns {Array} details The details to insert.
65832 * @returns {string} Returns the modified source.
65834 function insertWrapDetails(source, details) {
65835 var length = details.length;
65839 var lastIndex = length - 1;
65840 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
65841 details = details.join(length > 2 ? ', ' : ' ');
65842 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
65845 /** Used to compose bitmasks for function metadata. */
65846 var WRAP_BIND_FLAG$5 = 1;
65847 var WRAP_BIND_KEY_FLAG$3 = 2;
65848 var WRAP_CURRY_FLAG$3 = 8;
65849 var WRAP_CURRY_RIGHT_FLAG$2 = 16;
65850 var WRAP_PARTIAL_FLAG$3 = 32;
65851 var WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
65852 var WRAP_ARY_FLAG$1 = 128;
65853 var WRAP_REARG_FLAG = 256;
65854 var WRAP_FLIP_FLAG$1 = 512;
65856 /** Used to associate wrap methods with their bit flags. */
65858 ['ary', WRAP_ARY_FLAG$1],
65859 ['bind', WRAP_BIND_FLAG$5],
65860 ['bindKey', WRAP_BIND_KEY_FLAG$3],
65861 ['curry', WRAP_CURRY_FLAG$3],
65862 ['curryRight', WRAP_CURRY_RIGHT_FLAG$2],
65863 ['flip', WRAP_FLIP_FLAG$1],
65864 ['partial', WRAP_PARTIAL_FLAG$3],
65865 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG$2],
65866 ['rearg', WRAP_REARG_FLAG]
65870 * Updates wrapper `details` based on `bitmask` flags.
65873 * @returns {Array} details The details to modify.
65874 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65875 * @returns {Array} Returns `details`.
65877 function updateWrapDetails(details, bitmask) {
65878 arrayEach(wrapFlags, function(pair) {
65879 var value = '_.' + pair[0];
65880 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
65881 details.push(value);
65884 return details.sort();
65888 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
65889 * with wrapper details in a comment at the top of the source body.
65892 * @param {Function} wrapper The function to modify.
65893 * @param {Function} reference The reference function.
65894 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65895 * @returns {Function} Returns `wrapper`.
65897 function setWrapToString(wrapper, reference, bitmask) {
65898 var source = (reference + '');
65899 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
65902 /** Used to compose bitmasks for function metadata. */
65903 var WRAP_BIND_FLAG$4 = 1;
65904 var WRAP_BIND_KEY_FLAG$2 = 2;
65905 var WRAP_CURRY_BOUND_FLAG = 4;
65906 var WRAP_CURRY_FLAG$2 = 8;
65907 var WRAP_PARTIAL_FLAG$2 = 32;
65908 var WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
65911 * Creates a function that wraps `func` to continue currying.
65914 * @param {Function} func The function to wrap.
65915 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65916 * @param {Function} wrapFunc The function to create the `func` wrapper.
65917 * @param {*} placeholder The placeholder value.
65918 * @param {*} [thisArg] The `this` binding of `func`.
65919 * @param {Array} [partials] The arguments to prepend to those provided to
65920 * the new function.
65921 * @param {Array} [holders] The `partials` placeholder indexes.
65922 * @param {Array} [argPos] The argument positions of the new function.
65923 * @param {number} [ary] The arity cap of `func`.
65924 * @param {number} [arity] The arity of `func`.
65925 * @returns {Function} Returns the new wrapped function.
65927 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
65928 var isCurry = bitmask & WRAP_CURRY_FLAG$2,
65929 newHolders = isCurry ? holders : undefined,
65930 newHoldersRight = isCurry ? undefined : holders,
65931 newPartials = isCurry ? partials : undefined,
65932 newPartialsRight = isCurry ? undefined : partials;
65934 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$2 : WRAP_PARTIAL_RIGHT_FLAG$1);
65935 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$2);
65937 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
65938 bitmask &= ~(WRAP_BIND_FLAG$4 | WRAP_BIND_KEY_FLAG$2);
65941 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
65942 newHoldersRight, argPos, ary, arity
65945 var result = wrapFunc.apply(undefined, newData);
65946 if (isLaziable(func)) {
65947 setData(result, newData);
65949 result.placeholder = placeholder;
65950 return setWrapToString(result, func, bitmask);
65954 * Gets the argument placeholder value for `func`.
65957 * @param {Function} func The function to inspect.
65958 * @returns {*} Returns the placeholder value.
65960 function getHolder(func) {
65962 return object.placeholder;
65965 /* Built-in method references for those with the same name as other `lodash` methods. */
65966 var nativeMin$2 = Math.min;
65969 * Reorder `array` according to the specified indexes where the element at
65970 * the first index is assigned as the first element, the element at
65971 * the second index is assigned as the second element, and so on.
65974 * @param {Array} array The array to reorder.
65975 * @param {Array} indexes The arranged array indexes.
65976 * @returns {Array} Returns `array`.
65978 function reorder(array, indexes) {
65979 var arrLength = array.length,
65980 length = nativeMin$2(indexes.length, arrLength),
65981 oldArray = copyArray(array);
65984 var index = indexes[length];
65985 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
65990 /** Used as the internal argument placeholder. */
65991 var PLACEHOLDER = '__lodash_placeholder__';
65994 * Replaces all `placeholder` elements in `array` with an internal placeholder
65995 * and returns an array of their indexes.
65998 * @param {Array} array The array to modify.
65999 * @param {*} placeholder The placeholder to replace.
66000 * @returns {Array} Returns the new array of placeholder indexes.
66002 function replaceHolders(array, placeholder) {
66004 length = array.length,
66008 while (++index < length) {
66009 var value = array[index];
66010 if (value === placeholder || value === PLACEHOLDER) {
66011 array[index] = PLACEHOLDER;
66012 result[resIndex++] = index;
66018 /** Used to compose bitmasks for function metadata. */
66019 var WRAP_BIND_FLAG$3 = 1;
66020 var WRAP_BIND_KEY_FLAG$1 = 2;
66021 var WRAP_CURRY_FLAG$1 = 8;
66022 var WRAP_CURRY_RIGHT_FLAG$1 = 16;
66023 var WRAP_ARY_FLAG = 128;
66024 var WRAP_FLIP_FLAG = 512;
66027 * Creates a function that wraps `func` to invoke it with optional `this`
66028 * binding of `thisArg`, partial application, and currying.
66031 * @param {Function|string} func The function or method name to wrap.
66032 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66033 * @param {*} [thisArg] The `this` binding of `func`.
66034 * @param {Array} [partials] The arguments to prepend to those provided to
66035 * the new function.
66036 * @param {Array} [holders] The `partials` placeholder indexes.
66037 * @param {Array} [partialsRight] The arguments to append to those provided
66038 * to the new function.
66039 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
66040 * @param {Array} [argPos] The argument positions of the new function.
66041 * @param {number} [ary] The arity cap of `func`.
66042 * @param {number} [arity] The arity of `func`.
66043 * @returns {Function} Returns the new wrapped function.
66045 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
66046 var isAry = bitmask & WRAP_ARY_FLAG,
66047 isBind = bitmask & WRAP_BIND_FLAG$3,
66048 isBindKey = bitmask & WRAP_BIND_KEY_FLAG$1,
66049 isCurried = bitmask & (WRAP_CURRY_FLAG$1 | WRAP_CURRY_RIGHT_FLAG$1),
66050 isFlip = bitmask & WRAP_FLIP_FLAG,
66051 Ctor = isBindKey ? undefined : createCtor(func);
66053 function wrapper() {
66054 var length = arguments.length,
66055 args = Array(length),
66059 args[index] = arguments[index];
66062 var placeholder = getHolder(wrapper),
66063 holdersCount = countHolders(args, placeholder);
66066 args = composeArgs(args, partials, holders, isCurried);
66068 if (partialsRight) {
66069 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
66071 length -= holdersCount;
66072 if (isCurried && length < arity) {
66073 var newHolders = replaceHolders(args, placeholder);
66074 return createRecurry(
66075 func, bitmask, createHybrid, wrapper.placeholder, thisArg,
66076 args, newHolders, argPos, ary, arity - length
66079 var thisBinding = isBind ? thisArg : this,
66080 fn = isBindKey ? thisBinding[func] : func;
66082 length = args.length;
66084 args = reorder(args, argPos);
66085 } else if (isFlip && length > 1) {
66088 if (isAry && ary < length) {
66091 if (this && this !== root$2 && this instanceof wrapper) {
66092 fn = Ctor || createCtor(fn);
66094 return fn.apply(thisBinding, args);
66100 * Creates a function that wraps `func` to enable currying.
66103 * @param {Function} func The function to wrap.
66104 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66105 * @param {number} arity The arity of `func`.
66106 * @returns {Function} Returns the new wrapped function.
66108 function createCurry(func, bitmask, arity) {
66109 var Ctor = createCtor(func);
66111 function wrapper() {
66112 var length = arguments.length,
66113 args = Array(length),
66115 placeholder = getHolder(wrapper);
66118 args[index] = arguments[index];
66120 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
66122 : replaceHolders(args, placeholder);
66124 length -= holders.length;
66125 if (length < arity) {
66126 return createRecurry(
66127 func, bitmask, createHybrid, wrapper.placeholder, undefined,
66128 args, holders, undefined, undefined, arity - length);
66130 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
66131 return apply(fn, this, args);
66136 /** Used to compose bitmasks for function metadata. */
66137 var WRAP_BIND_FLAG$6 = 1;
66140 * Creates a function that wraps `func` to invoke it with the `this` binding
66141 * of `thisArg` and `partials` prepended to the arguments it receives.
66144 * @param {Function} func The function to wrap.
66145 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66146 * @param {*} thisArg The `this` binding of `func`.
66147 * @param {Array} partials The arguments to prepend to those provided to
66148 * the new function.
66149 * @returns {Function} Returns the new wrapped function.
66151 function createPartial(func, bitmask, thisArg, partials) {
66152 var isBind = bitmask & WRAP_BIND_FLAG$6,
66153 Ctor = createCtor(func);
66155 function wrapper() {
66156 var argsIndex = -1,
66157 argsLength = arguments.length,
66159 leftLength = partials.length,
66160 args = Array(leftLength + argsLength),
66161 fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
66163 while (++leftIndex < leftLength) {
66164 args[leftIndex] = partials[leftIndex];
66166 while (argsLength--) {
66167 args[leftIndex++] = arguments[++argsIndex];
66169 return apply(fn, isBind ? thisArg : this, args);
66174 /** Used as the internal argument placeholder. */
66175 var PLACEHOLDER$1 = '__lodash_placeholder__';
66177 /** Used to compose bitmasks for function metadata. */
66178 var WRAP_BIND_FLAG$7 = 1;
66179 var WRAP_BIND_KEY_FLAG$4 = 2;
66180 var WRAP_CURRY_BOUND_FLAG$1 = 4;
66181 var WRAP_CURRY_FLAG$4 = 8;
66182 var WRAP_ARY_FLAG$2 = 128;
66183 var WRAP_REARG_FLAG$1 = 256;
66185 /* Built-in method references for those with the same name as other `lodash` methods. */
66186 var nativeMin$3 = Math.min;
66189 * Merges the function metadata of `source` into `data`.
66191 * Merging metadata reduces the number of wrappers used to invoke a function.
66192 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
66193 * may be applied regardless of execution order. Methods like `_.ary` and
66194 * `_.rearg` modify function arguments, making the order in which they are
66195 * executed important, preventing the merging of metadata. However, we make
66196 * an exception for a safe combined case where curried functions have `_.ary`
66197 * and or `_.rearg` applied.
66200 * @param {Array} data The destination metadata.
66201 * @param {Array} source The source metadata.
66202 * @returns {Array} Returns `data`.
66204 function mergeData(data, source) {
66205 var bitmask = data[1],
66206 srcBitmask = source[1],
66207 newBitmask = bitmask | srcBitmask,
66208 isCommon = newBitmask < (WRAP_BIND_FLAG$7 | WRAP_BIND_KEY_FLAG$4 | WRAP_ARY_FLAG$2);
66211 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$4)) ||
66212 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
66213 ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$4));
66215 // Exit early if metadata can't be merged.
66216 if (!(isCommon || isCombo)) {
66219 // Use source `thisArg` if available.
66220 if (srcBitmask & WRAP_BIND_FLAG$7) {
66221 data[2] = source[2];
66222 // Set when currying a bound function.
66223 newBitmask |= bitmask & WRAP_BIND_FLAG$7 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
66225 // Compose partial arguments.
66226 var value = source[3];
66228 var partials = data[3];
66229 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
66230 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
66232 // Compose partial right arguments.
66235 partials = data[5];
66236 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
66237 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
66239 // Use source `argPos` if available.
66244 // Use source `ary` if it's smaller.
66245 if (srcBitmask & WRAP_ARY_FLAG$2) {
66246 data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
66248 // Use source `arity` if one is not provided.
66249 if (data[9] == null) {
66250 data[9] = source[9];
66252 // Use source `func` and merge bitmasks.
66253 data[0] = source[0];
66254 data[1] = newBitmask;
66259 /** Error message constants. */
66260 var FUNC_ERROR_TEXT$4 = 'Expected a function';
66262 /** Used to compose bitmasks for function metadata. */
66263 var WRAP_BIND_FLAG$1 = 1;
66264 var WRAP_BIND_KEY_FLAG = 2;
66265 var WRAP_CURRY_FLAG = 8;
66266 var WRAP_CURRY_RIGHT_FLAG = 16;
66267 var WRAP_PARTIAL_FLAG$1 = 32;
66268 var WRAP_PARTIAL_RIGHT_FLAG = 64;
66270 /* Built-in method references for those with the same name as other `lodash` methods. */
66271 var nativeMax$5 = Math.max;
66274 * Creates a function that either curries or invokes `func` with optional
66275 * `this` binding and partially applied arguments.
66278 * @param {Function|string} func The function or method name to wrap.
66279 * @param {number} bitmask The bitmask flags.
66282 * 4 - `_.curry` or `_.curryRight` of a bound function
66284 * 16 - `_.curryRight`
66286 * 64 - `_.partialRight`
66290 * @param {*} [thisArg] The `this` binding of `func`.
66291 * @param {Array} [partials] The arguments to be partially applied.
66292 * @param {Array} [holders] The `partials` placeholder indexes.
66293 * @param {Array} [argPos] The argument positions of the new function.
66294 * @param {number} [ary] The arity cap of `func`.
66295 * @param {number} [arity] The arity of `func`.
66296 * @returns {Function} Returns the new wrapped function.
66298 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
66299 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
66300 if (!isBindKey && typeof func != 'function') {
66301 throw new TypeError(FUNC_ERROR_TEXT$4);
66303 var length = partials ? partials.length : 0;
66305 bitmask &= ~(WRAP_PARTIAL_FLAG$1 | WRAP_PARTIAL_RIGHT_FLAG);
66306 partials = holders = undefined;
66308 ary = ary === undefined ? ary : nativeMax$5(toInteger(ary), 0);
66309 arity = arity === undefined ? arity : toInteger(arity);
66310 length -= holders ? holders.length : 0;
66312 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
66313 var partialsRight = partials,
66314 holdersRight = holders;
66316 partials = holders = undefined;
66318 var data = isBindKey ? undefined : getData(func);
66321 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
66326 mergeData(newData, data);
66329 bitmask = newData[1];
66330 thisArg = newData[2];
66331 partials = newData[3];
66332 holders = newData[4];
66333 arity = newData[9] = newData[9] === undefined
66334 ? (isBindKey ? 0 : func.length)
66335 : nativeMax$5(newData[9] - length, 0);
66337 if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
66338 bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
66340 if (!bitmask || bitmask == WRAP_BIND_FLAG$1) {
66341 var result = createBind(func, bitmask, thisArg);
66342 } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
66343 result = createCurry(func, bitmask, arity);
66344 } else if ((bitmask == WRAP_PARTIAL_FLAG$1 || bitmask == (WRAP_BIND_FLAG$1 | WRAP_PARTIAL_FLAG$1)) && !holders.length) {
66345 result = createPartial(func, bitmask, thisArg, partials);
66347 result = createHybrid.apply(undefined, newData);
66349 var setter = data ? baseSetData : setData;
66350 return setWrapToString(setter(result, newData), func, bitmask);
66353 /** Used to compose bitmasks for function metadata. */
66354 var WRAP_BIND_FLAG = 1;
66355 var WRAP_PARTIAL_FLAG = 32;
66358 * Creates a function that invokes `func` with the `this` binding of `thisArg`
66359 * and `partials` prepended to the arguments it receives.
66361 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
66362 * may be used as a placeholder for partially applied arguments.
66364 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
66365 * property of bound functions.
66370 * @category Function
66371 * @param {Function} func The function to bind.
66372 * @param {*} thisArg The `this` binding of `func`.
66373 * @param {...*} [partials] The arguments to be partially applied.
66374 * @returns {Function} Returns the new bound function.
66377 * function greet(greeting, punctuation) {
66378 * return greeting + ' ' + this.user + punctuation;
66381 * var object = { 'user': 'fred' };
66383 * var bound = _.bind(greet, object, 'hi');
66387 * // Bound with placeholders.
66388 * var bound = _.bind(greet, object, _, '!');
66392 var bind$2 = baseRest(function(func, thisArg, partials) {
66393 var bitmask = WRAP_BIND_FLAG;
66394 if (partials.length) {
66395 var holders = replaceHolders(partials, getHolder(bind$2));
66396 bitmask |= WRAP_PARTIAL_FLAG;
66398 return createWrap(func, bitmask, thisArg, partials, holders);
66401 // Assign default placeholders.
66402 bind$2.placeholder = {};
66404 function presetCollection(collection) {
66405 var maxSearchResults = 50,
66406 maxSuggestionResults = 10;
66410 collection: collection,
66413 item: function(id) {
66414 return find$1(this.collection, function(d) {
66415 return d.id === id;
66420 matchGeometry: function(geometry) {
66421 return presetCollection(this.collection.filter(function(d) {
66422 return d.matchGeometry(geometry);
66427 search: function(value, geometry) {
66428 if (!value) return this;
66430 function leading(a) {
66431 var index = a.indexOf(value);
66432 return index === 0 || a[index - 1] === ' ';
66435 function suggestionName(name) {
66436 var nameArray = name.split(' - ');
66437 if (nameArray.length > 1) {
66438 name = nameArray.slice(0, nameArray.length - 1).join(' - ');
66440 return name.toLowerCase();
66444 value = value.toLowerCase();
66446 var searchable = filter(this.collection, function(a) {
66447 return a.searchable !== false && a.suggestion !== true;
66449 suggestions = filter(this.collection, function(a) {
66450 return a.suggestion === true;
66454 // matches value to preset.name
66455 var leading_name = filter(searchable, function(a) {
66456 return leading(a.name().toLowerCase());
66457 }).sort(function(a, b) {
66458 var aCompare = a.name().toLowerCase(),
66459 bCompare = b.name().toLowerCase(),
66462 // priority if search string matches preset name exactly - #4325
66463 if (value === aCompare) return -1;
66464 if (value === bCompare) return 1;
66466 // priority for higher matchScore
66467 i = b.originalScore - a.originalScore;
66468 if (i !== 0) return i;
66470 // priority if search string appears earlier in preset name
66471 i = aCompare.indexOf(value) - bCompare.indexOf(value);
66472 if (i !== 0) return i;
66474 // priority for shorter preset names
66475 return a.name().length - b.name().length;
66478 // matches value to preset.terms values
66479 var leading_terms = filter(searchable, function(a) {
66480 return some(a.terms() || [], leading);
66483 // matches value to preset.tags values
66484 var leading_tag_values = filter(searchable, function(a) {
66485 return some(without(values$1(a.tags || {}), '*'), leading);
66489 // finds close matches to value in preset.name
66490 var similar_name = searchable.map(function(a) {
66493 dist: utilEditDistance(value, a.name())
66495 }).filter(function(a) {
66496 return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
66497 }).sort(function(a, b) {
66498 return a.dist - b.dist;
66499 }).map(function(a) {
66503 // finds close matches to value in preset.terms
66504 var similar_terms = filter(searchable, function(a) {
66505 return some(a.terms() || [], function(b) {
66506 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
66510 var leading_suggestions = filter(suggestions, function(a) {
66511 return leading(suggestionName(a.name()));
66512 }).sort(function(a, b) {
66513 a = suggestionName(a.name());
66514 b = suggestionName(b.name());
66515 var i = a.indexOf(value) - b.indexOf(value);
66516 if (i === 0) return a.length - b.length;
66520 var similar_suggestions = suggestions.map(function(a) {
66523 dist: utilEditDistance(value, suggestionName(a.name()))
66525 }).filter(function(a) {
66526 return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
66527 }).sort(function(a, b) {
66528 return a.dist - b.dist;
66529 }).map(function(a) {
66533 var other = presets.item(geometry);
66535 var results = leading_name.concat(
66537 leading_tag_values,
66538 leading_suggestions.slice(0, maxSuggestionResults + 5),
66541 similar_suggestions.slice(0, maxSuggestionResults)
66542 ).slice(0, maxSearchResults - 1);
66544 return presetCollection(uniq(results.concat(other)));
66552 function presetCategory(id, category, all) {
66553 category = clone(category);
66558 category.members = presetCollection(category.members.map(function(id) {
66559 return all.item(id);
66563 category.matchGeometry = function(geometry) {
66564 return category.geometry.indexOf(geometry) >= 0;
66568 category.matchScore = function() {
66573 category.name = function() {
66574 return t('presets.categories.' + id + '.name', {'default': id});
66578 category.terms = function() {
66586 function presetField(id, field) {
66587 field = clone(field);
66592 field.matchGeometry = function(geometry) {
66593 return !field.geometry || field.geometry === geometry;
66597 field.t = function(scope, options) {
66598 return t('presets.fields.' + id + '.' + scope, options);
66602 field.label = function() {
66603 return field.t('label', {'default': id});
66607 var placeholder = field.placeholder;
66608 field.placeholder = function() {
66609 return field.t('placeholder', {'default': placeholder});
66616 function presetPreset(id, preset, fields) {
66617 preset = clone(preset);
66620 preset.fields = (preset.fields || []).map(getFields);
66621 preset.geometry = (preset.geometry || []);
66624 function getFields(f) {
66629 preset.matchGeometry = function(geometry) {
66630 return preset.geometry.indexOf(geometry) >= 0;
66634 preset.originalScore = preset.matchScore || 1;
66637 preset.matchScore = function(entity) {
66638 var tags = preset.tags,
66641 for (var t$$1 in tags) {
66642 if (entity.tags[t$$1] === tags[t$$1]) {
66643 score += preset.originalScore;
66644 } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
66645 score += preset.originalScore / 2;
66655 preset.t = function(scope, options) {
66656 return t('presets.presets.' + id + '.' + scope, options);
66660 var origName = preset.name || '';
66661 preset.name = function() {
66662 if (preset.suggestion) {
66663 id = id.split('/');
66664 id = id[0] + '/' + id[1];
66665 return origName + ' - ' + t('presets.presets.' + id + '.name');
66667 return preset.t('name', { 'default': origName });
66670 var origTerms = (preset.terms || []).join();
66671 preset.terms = function() {
66672 return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
66676 preset.isFallback = function() {
66677 var tagCount = Object.keys(preset.tags).length;
66678 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
66682 var reference = preset.reference || {};
66683 preset.reference = function(geometry) {
66684 var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
66685 value = reference.value || preset.tags[key];
66687 if (geometry === 'relation' && key === 'type') {
66688 if (value in preset.tags) {
66690 value = preset.tags[key];
66692 return { rtype: value };
66696 if (value === '*') {
66697 return { key: key };
66699 return { key: key, value: value };
66704 var removeTags = preset.removeTags || preset.tags;
66705 preset.removeTags = function(tags, geometry) {
66706 tags = omit(tags, keys$1(removeTags));
66708 for (var f in preset.fields) {
66709 var field = preset.fields[f];
66710 if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
66711 delete tags[field.key];
66720 var applyTags = preset.addTags || preset.tags;
66721 preset.applyTags = function(tags, geometry) {
66724 tags = clone(tags);
66726 for (k in applyTags) {
66727 if (applyTags[k] === '*') {
66730 tags[k] = applyTags[k];
66734 // Add area=yes if necessary.
66735 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
66736 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
66737 // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
66739 if (geometry === 'area') {
66740 var needsAreaTag = true;
66741 if (preset.geometry.indexOf('line') === -1) {
66742 for (k in applyTags) {
66743 if (k in areaKeys) {
66744 needsAreaTag = false;
66749 if (needsAreaTag) {
66754 for (var f in preset.fields) {
66755 var field = preset.fields[f];
66756 if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
66757 tags[field.key] = field.default;
66768 function presetIndex() {
66769 // a presetCollection with methods for
66770 // loading new data and returning defaults
66772 var all = presetCollection([]),
66773 defaults = { area: all, line: all, point: all, vertex: all, relation: all },
66776 recent = presetCollection([]);
66778 // Index of presets by (geometry, tag key).
66787 all.match = function(entity, resolver) {
66788 var geometry = entity.geometry(resolver);
66791 // Treat entities on addr:interpolation lines as points, not vertices - #3241
66792 if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
66793 geometry = 'point';
66796 var geometryMatches = index[geometry],
66800 for (var k in entity.tags) {
66801 // If any part of an address is present,
66802 // allow fallback to "Address" preset - #4353
66803 if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
66804 address = geometryMatches['addr:*'][0];
66807 var keyMatches = geometryMatches[k];
66808 if (!keyMatches) continue;
66810 for (var i = 0; i < keyMatches.length; i++) {
66811 var score = keyMatches[i].matchScore(entity);
66812 if (score > best) {
66814 match = keyMatches[i];
66819 if (address && (!match || match.isFallback())) {
66823 return match || all.item(geometry);
66827 // Because of the open nature of tagging, iD will never have a complete
66828 // list of tags used in OSM, so we want it to have logic like "assume
66829 // that a closed way with an amenity tag is an area, unless the amenity
66830 // is one of these specific types". This function computes a structure
66831 // that allows testing of such conditions, based on the presets designated
66832 // as as supporting (or not supporting) the area geometry.
66834 // The returned object L is a whitelist/blacklist of tags. A closed way
66835 // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
66836 // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
66837 // and the subkeys form the blacklist.
66838 all.areaKeys = function() {
66840 ignore = ['barrier', 'highway', 'footway', 'railway', 'type'], // probably a line..
66841 presets = reject(all.collection, 'suggestion');
66844 presets.forEach(function(d) {
66845 for (var key in d.tags) break;
66847 if (ignore.indexOf(key) !== -1) return;
66849 if (d.geometry.indexOf('area') !== -1) { // probably an area..
66850 areaKeys[key] = areaKeys[key] || {};
66855 presets.forEach(function(d) {
66856 for (var key in d.tags) break;
66858 if (ignore.indexOf(key) !== -1) return;
66860 var value = d.tags[key];
66861 if (key in areaKeys && // probably an area...
66862 d.geometry.indexOf('line') !== -1 && // but sometimes a line
66864 areaKeys[key][value] = true;
66872 all.init = function() {
66873 var d = data.presets;
66875 all.collection = [];
66876 recent.collection = [];
66879 index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
66882 forEach(d.fields, function(d, id) {
66883 fields[id] = presetField(id, d);
66884 if (d.universal) universal.push(fields[id]);
66889 forEach(d.presets, function(d, id) {
66890 all.collection.push(presetPreset(id, d, fields));
66894 if (d.categories) {
66895 forEach(d.categories, function(d, id) {
66896 all.collection.push(presetCategory(id, d, all));
66901 var getItem = bind$2(all.item, all);
66903 area: presetCollection(d.defaults.area.map(getItem)),
66904 line: presetCollection(d.defaults.line.map(getItem)),
66905 point: presetCollection(d.defaults.point.map(getItem)),
66906 vertex: presetCollection(d.defaults.vertex.map(getItem)),
66907 relation: presetCollection(d.defaults.relation.map(getItem))
66911 for (var i = 0; i < all.collection.length; i++) {
66912 var preset = all.collection[i],
66913 geometry = preset.geometry;
66915 for (var j = 0; j < geometry.length; j++) {
66916 var g = index[geometry[j]];
66917 for (var k in preset.tags) {
66918 (g[k] = g[k] || []).push(preset);
66926 all.field = function(id) {
66930 all.universal = function() {
66934 all.defaults = function(geometry, n) {
66935 var rec = recent.matchGeometry(geometry).collection.slice(0, 4),
66936 def = uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
66937 return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
66940 all.choose = function(preset) {
66941 if (!preset.isFallback()) {
66942 recent = presetCollection(uniq([preset].concat(recent.collection)));
66952 function setAreaKeys(value) {
66957 function coreContext() {
66959 context.version = '2.4.3';
66961 // create a special translation that contains the keys in place of the strings
66962 var tkeys = cloneDeep(en);
66965 function traverser(v, k, obj) {
66968 forOwn(v, traverser);
66969 } else if (isString(v)) {
66970 obj[k] = parents.join('.');
66975 forOwn(tkeys, traverser);
66976 addTranslation('_tkeys_', tkeys);
66978 addTranslation('en', en);
66981 var dispatch$$1 = dispatch('enter', 'exit', 'change');
66983 // https://github.com/openstreetmap/iD/issues/772
66984 // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
66986 try { storage = localStorage; } catch (e) {} // eslint-disable-line no-empty
66987 storage = storage || (function() {
66990 getItem: function(k) { return s[k]; },
66991 setItem: function(k, v) { s[k] = v; },
66992 removeItem: function(k) { delete s[k]; }
66996 context.storage = function(k, v) {
66998 if (arguments.length === 1) return storage.getItem(k);
66999 else if (v === null) storage.removeItem(k);
67000 else storage.setItem(k, v);
67002 // localstorage quota exceeded
67003 /* eslint-disable no-console */
67004 if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
67005 /* eslint-enable no-console */
67010 /* Straight accessors. Avoid using these if you can. */
67011 var ui, connection, history;
67012 context.ui = function() { return ui; };
67013 context.connection = function() { return connection; };
67014 context.history = function() { return history; };
67018 var entitiesLoaded = utilCallWhenIdle(function entitiesLoaded(err, result) {
67019 if (!err) history.merge(result.data, result.extent);
67022 context.preauth = function(options) {
67024 connection.switch(options);
67029 context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
67030 function done(err, result) {
67031 entitiesLoaded(err, result);
67032 if (callback) callback(err, result);
67035 connection.loadTiles(projection, dimensions, done);
67039 context.loadEntity = function(id, callback) {
67040 function done(err, result) {
67041 entitiesLoaded(err, result);
67042 if (callback) callback(err, result);
67045 connection.loadEntity(id, done);
67049 context.zoomToEntity = function(id, zoomTo) {
67050 if (zoomTo !== false) {
67051 this.loadEntity(id, function(err, result) {
67053 var entity = find$1(result.data, function(e) { return e.id === id; });
67054 if (entity) { map.zoomTo(entity); }
67058 map.on('drawn.zoomToEntity', function() {
67059 if (!context.hasEntity(id)) return;
67060 map.on('drawn.zoomToEntity', null);
67061 context.on('enter.zoomToEntity', null);
67062 context.enter(modeSelect(context, [id]));
67065 context.on('enter.zoomToEntity', function() {
67066 if (mode.id !== 'browse') {
67067 map.on('drawn.zoomToEntity', null);
67068 context.on('enter.zoomToEntity', null);
67073 var minEditableZoom = 16;
67074 context.minEditableZoom = function(_) {
67075 if (!arguments.length) return minEditableZoom;
67076 minEditableZoom = _;
67078 connection.tileZoom(_);
67085 var inIntro = false;
67086 context.inIntro = function(_) {
67087 if (!arguments.length) return inIntro;
67092 context.save = function() {
67093 // no history save, no message onbeforeunload
67094 if (inIntro || d3_select('.modal').size()) return;
67097 if (mode && mode.id === 'save') {
67100 canSave = context.selectedIDs().every(function(id) {
67101 var entity = context.hasEntity(id);
67102 return entity && !entity.isDegenerate();
67109 if (history.hasChanges()) {
67110 return t('save.unsaved_changes');
67116 context.hasEntity = function(id) {
67117 return history.graph().hasEntity(id);
67119 context.entity = function(id) {
67120 return history.graph().entity(id);
67122 context.childNodes = function(way) {
67123 return history.graph().childNodes(way);
67125 context.geometry = function(id) {
67126 return context.entity(id).geometry(history.graph());
67132 context.mode = function() {
67135 context.enter = function(newMode) {
67138 dispatch$$1.call('exit', this, mode);
67143 dispatch$$1.call('enter', this, mode);
67146 context.selectedIDs = function() {
67147 if (mode && mode.selectedIDs) {
67148 return mode.selectedIDs();
67156 context.install = function(behavior) {
67157 context.surface().call(behavior);
67159 context.uninstall = function(behavior) {
67160 context.surface().call(behavior.off);
67165 var copyIDs = [], copyGraph;
67166 context.copyGraph = function() { return copyGraph; };
67167 context.copyIDs = function(_) {
67168 if (!arguments.length) return copyIDs;
67170 copyGraph = history.graph();
67177 context.background = function() { return background; };
67182 context.features = function() { return features; };
67183 context.hasHiddenConnections = function(id) {
67184 var graph = history.graph(),
67185 entity = graph.entity(id);
67186 return features.hasHiddenConnections(entity, graph);
67192 context.presets = function() { return presets; };
67197 context.map = function() { return map; };
67198 context.layers = function() { return map.layers; };
67199 context.surface = function() { return map.surface; };
67200 context.editable = function() { return map.editable(); };
67201 context.surfaceRect = function() {
67202 return map.surface.node().getBoundingClientRect();
67214 context.debugFlags = function() {
67217 context.setDebug = function(flag, val) {
67218 if (arguments.length === 1) val = true;
67219 debugFlags[flag] = val;
67220 dispatch$$1.call('change');
67223 context.getDebug = function(flag) {
67224 return flag && debugFlags[flag];
67229 var container = d3_select(document.body);
67230 context.container = function(_) {
67231 if (!arguments.length) return container;
67233 container.classed('id-container', true);
67237 context.embed = function(_) {
67238 if (!arguments.length) return embed;
67245 var assetPath = '';
67246 context.assetPath = function(_) {
67247 if (!arguments.length) return assetPath;
67253 context.assetMap = function(_) {
67254 if (!arguments.length) return assetMap;
67259 context.asset = function(_) {
67260 var filename = assetPath + _;
67261 return assetMap[filename] || filename;
67264 context.imagePath = function(_) {
67265 return context.asset('img/' + _);
67270 // `locale` variable contains a "requested locale".
67271 // It won't become the `currentLocale` until after loadLocale() is called.
67272 var locale, localePath;
67274 context.locale = function(loc, path) {
67275 if (!arguments.length) return currentLocale;
67281 context.loadLocale = function(callback) {
67282 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
67283 localePath = localePath || context.asset('locales/' + locale + '.json');
67284 d3_json(localePath, function(err, result) {
67286 addTranslation(locale, result[locale]);
67306 /* reset (aka flush) */
67307 context.reset = context.flush = function() {
67308 context.debouncedSave.cancel();
67309 forEach(services, function(service) {
67310 if (service && typeof service.reset === 'function') {
67311 service.reset(context);
67322 context.projection = geoRawMercator();
67323 context.curtainProjection = geoRawMercator();
67325 locale = utilDetect().locale;
67326 if (locale && !dataLocales.hasOwnProperty(locale)) {
67327 locale = locale.split('-')[0];
67330 history = coreHistory(context);
67331 context.graph = history.graph;
67332 context.changes = history.changes;
67333 context.intersects = history.intersects;
67335 // Debounce save, since it's a synchronous localStorage write,
67336 // and history changes can happen frequently (e.g. when dragging).
67337 context.debouncedSave = debounce$1(context.save, 350);
67338 function withDebouncedSave(fn) {
67339 return function() {
67340 var result = fn.apply(history, arguments);
67341 context.debouncedSave();
67346 context.perform = withDebouncedSave(history.perform);
67347 context.replace = withDebouncedSave(history.replace);
67348 context.pop = withDebouncedSave(history.pop);
67349 context.overwrite = withDebouncedSave(history.overwrite);
67350 context.undo = withDebouncedSave(history.undo);
67351 context.redo = withDebouncedSave(history.redo);
67353 ui = uiInit(context);
67355 connection = services.osm;
67356 background = rendererBackground(context);
67357 features = rendererFeatures(context);
67358 presets = presetIndex();
67360 map = rendererMap(context);
67361 context.mouse = map.mouse;
67362 context.extent = map.extent;
67363 context.pan = map.pan;
67364 context.zoomIn = map.zoomIn;
67365 context.zoomOut = map.zoomOut;
67366 context.zoomInFurther = map.zoomInFurther;
67367 context.zoomOutFurther = map.zoomOutFurther;
67368 context.redrawEnable = map.redrawEnable;
67370 forEach(services, function(service) {
67371 if (service && typeof service.init === 'function') {
67372 service.init(context);
67378 areaKeys = presets.areaKeys();
67381 return utilRebind(context, dispatch$$1, 'on');
67384 function osmWay() {
67385 if (!(this instanceof osmWay)) {
67386 return (new osmWay()).initialize(arguments);
67387 } else if (arguments.length) {
67388 this.initialize(arguments);
67393 osmEntity$$1.way = osmWay;
67395 osmWay.prototype = Object.create(osmEntity$$1.prototype);
67398 assignIn$1(osmWay.prototype, {
67403 copy: function(resolver, copies) {
67404 if (copies[this.id])
67405 return copies[this.id];
67407 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
67409 var nodes = this.nodes.map(function(id) {
67410 return resolver.entity(id).copy(resolver, copies).id;
67413 copy = copy.update({ nodes: nodes });
67414 copies[this.id] = copy;
67420 extent: function(resolver) {
67421 return resolver.transient(this, 'extent', function() {
67422 var extent = geoExtent$$1();
67423 for (var i = 0; i < this.nodes.length; i++) {
67424 var node = resolver.hasEntity(this.nodes[i]);
67426 extent._extend(node.extent());
67434 first: function() {
67435 return this.nodes[0];
67440 return this.nodes[this.nodes.length - 1];
67444 contains: function(node) {
67445 return this.nodes.indexOf(node) >= 0;
67449 affix: function(node) {
67450 if (this.nodes[0] === node) return 'prefix';
67451 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
67455 layer: function() {
67456 // explicit layer tag, clamp between -10, 10..
67457 if (isFinite(this.tags.layer)) {
67458 return Math.max(-10, Math.min(+(this.tags.layer), 10));
67461 // implied layer tag..
67462 if (this.tags.location === 'overground') return 1;
67463 if (this.tags.location === 'underground') return -1;
67464 if (this.tags.location === 'underwater') return -10;
67466 if (this.tags.power === 'line') return 10;
67467 if (this.tags.power === 'minor_line') return 10;
67468 if (this.tags.aerialway) return 10;
67469 if (this.tags.bridge) return 1;
67470 if (this.tags.cutting) return -1;
67471 if (this.tags.tunnel) return -1;
67472 if (this.tags.waterway) return -1;
67473 if (this.tags.man_made === 'pipeline') return -10;
67474 if (this.tags.boundary) return -10;
67479 isOneWay: function() {
67480 // explicit oneway tag..
67481 if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; }
67482 if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; }
67484 // implied oneway tag..
67485 for (var key in this.tags) {
67486 if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
67493 lanes: function() {
67494 return osmLanes(this);
67498 isClosed: function() {
67499 return this.nodes.length > 1 && this.first() === this.last();
67503 isConvex: function(resolver) {
67504 if (!this.isClosed() || this.isDegenerate()) return null;
67506 var nodes = uniq(resolver.childNodes(this)),
67507 coords = map$4(nodes, 'loc'),
67508 curr = 0, prev = 0;
67510 for (var i = 0; i < coords.length; i++) {
67511 var o = coords[(i+1) % coords.length],
67513 b = coords[(i+2) % coords.length],
67514 res = geoCross(o, a, b);
67516 curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
67519 } else if (prev && curr !== prev) {
67528 isArea: function() {
67529 // `highway` and `railway` are typically linear features, but there
67530 // are a few exceptions that should be treated as areas, even in the
67531 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
67546 if (this.tags.area === 'yes')
67548 if (!this.isClosed() || this.tags.area === 'no')
67550 for (var key in this.tags) {
67551 if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
67554 if (key in lineKeys && this.tags[key] in lineKeys[key]) {
67562 isDegenerate: function() {
67563 return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
67567 areAdjacent: function(n1, n2) {
67568 for (var i = 0; i < this.nodes.length; i++) {
67569 if (this.nodes[i] === n1) {
67570 if (this.nodes[i - 1] === n2) return true;
67571 if (this.nodes[i + 1] === n2) return true;
67578 geometry: function(graph) {
67579 return graph.transient(this, 'geometry', function() {
67580 return this.isArea() ? 'area' : 'line';
67585 // If this way is not closed, append the beginning node to the end of the nodelist to close it.
67586 close: function() {
67587 if (this.isClosed() || !this.nodes.length) return this;
67589 var nodes = this.nodes.slice();
67590 nodes = nodes.filter(noRepeatNodes);
67591 nodes.push(nodes[0]);
67592 return this.update({ nodes: nodes });
67596 // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
67597 unclose: function() {
67598 if (!this.isClosed()) return this;
67600 var nodes = this.nodes.slice(),
67601 connector = this.first(),
67602 i = nodes.length - 1;
67604 // remove trailing connectors..
67605 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67606 nodes.splice(i, 1);
67607 i = nodes.length - 1;
67610 nodes = nodes.filter(noRepeatNodes);
67611 return this.update({ nodes: nodes });
67615 // Adds a node (id) in front of the node which is currently at position index.
67616 // If index is undefined, the node will be added to the end of the way for linear ways,
67617 // or just before the final connecting node for circular ways.
67618 // Consecutive duplicates are eliminated including existing ones.
67619 // Circularity is always preserved when adding a node.
67620 addNode: function(id, index) {
67621 var nodes = this.nodes.slice(),
67622 isClosed = this.isClosed(),
67623 max = isClosed ? nodes.length - 1 : nodes.length;
67625 if (index === undefined) {
67629 if (index < 0 || index > max) {
67630 throw new RangeError('index ' + index + ' out of range 0..' + max);
67633 // If this is a closed way, remove all connector nodes except the first one
67634 // (there may be duplicates) and adjust index if necessary..
67636 var connector = this.first();
67638 // leading connectors..
67640 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
67641 nodes.splice(i, 1);
67642 if (index > i) index--;
67645 // trailing connectors..
67646 i = nodes.length - 1;
67647 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67648 nodes.splice(i, 1);
67649 if (index > i) index--;
67650 i = nodes.length - 1;
67654 nodes.splice(index, 0, id);
67655 nodes = nodes.filter(noRepeatNodes);
67657 // If the way was closed before, append a connector node to keep it closed..
67658 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67659 nodes.push(nodes[0]);
67662 return this.update({ nodes: nodes });
67666 // Replaces the node which is currently at position index with the given node (id).
67667 // Consecutive duplicates are eliminated including existing ones.
67668 // Circularity is preserved when updating a node.
67669 updateNode: function(id, index) {
67670 var nodes = this.nodes.slice(),
67671 isClosed = this.isClosed(),
67672 max = nodes.length - 1;
67674 if (index === undefined || index < 0 || index > max) {
67675 throw new RangeError('index ' + index + ' out of range 0..' + max);
67678 // If this is a closed way, remove all connector nodes except the first one
67679 // (there may be duplicates) and adjust index if necessary..
67681 var connector = this.first();
67683 // leading connectors..
67685 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
67686 nodes.splice(i, 1);
67687 if (index > i) index--;
67690 // trailing connectors..
67691 i = nodes.length - 1;
67692 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67693 nodes.splice(i, 1);
67694 if (index === i) index = 0; // update leading connector instead
67695 i = nodes.length - 1;
67699 nodes.splice(index, 1, id);
67700 nodes = nodes.filter(noRepeatNodes);
67702 // If the way was closed before, append a connector node to keep it closed..
67703 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67704 nodes.push(nodes[0]);
67707 return this.update({nodes: nodes});
67711 // Replaces each occurrence of node id needle with replacement.
67712 // Consecutive duplicates are eliminated including existing ones.
67713 // Circularity is preserved.
67714 replaceNode: function(needle, replacement) {
67715 var nodes = this.nodes.slice(),
67716 isClosed = this.isClosed();
67718 for (var i = 0; i < nodes.length; i++) {
67719 if (nodes[i] === needle) {
67720 nodes[i] = replacement;
67724 nodes = nodes.filter(noRepeatNodes);
67726 // If the way was closed before, append a connector node to keep it closed..
67727 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67728 nodes.push(nodes[0]);
67731 return this.update({nodes: nodes});
67735 // Removes each occurrence of node id needle with replacement.
67736 // Consecutive duplicates are eliminated including existing ones.
67737 // Circularity is preserved.
67738 removeNode: function(id) {
67739 var nodes = this.nodes.slice(),
67740 isClosed = this.isClosed();
67743 .filter(function(node) { return node !== id; })
67744 .filter(noRepeatNodes);
67746 // If the way was closed before, append a connector node to keep it closed..
67747 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67748 nodes.push(nodes[0]);
67751 return this.update({nodes: nodes});
67755 asJXON: function(changeset_id) {
67758 '@id': this.osmId(),
67759 '@version': this.version || 0,
67760 nd: map$4(this.nodes, function(id) {
67761 return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
67763 tag: map$4(this.tags, function(v, k) {
67764 return { keyAttributes: { k: k, v: v } };
67768 if (changeset_id) {
67769 r.way['@changeset'] = changeset_id;
67775 asGeoJSON: function(resolver) {
67776 return resolver.transient(this, 'GeoJSON', function() {
67777 var coordinates = map$4(resolver.childNodes(this), 'loc');
67778 if (this.isArea() && this.isClosed()) {
67781 coordinates: [coordinates]
67785 type: 'LineString',
67786 coordinates: coordinates
67793 area: function(resolver) {
67794 return resolver.transient(this, 'area', function() {
67795 var nodes = resolver.childNodes(this);
67799 coordinates: [map$4(nodes, 'loc')]
67802 if (!this.isClosed() && nodes.length) {
67803 json.coordinates[0].push(nodes[0].loc);
67806 var area = d3_geoArea(json);
67808 // Heuristic for detecting counterclockwise winding order. Assumes
67809 // that OpenStreetMap polygons are not hemisphere-spanning.
67810 if (area > 2 * Math.PI) {
67811 json.coordinates[0] = json.coordinates[0].reverse();
67812 area = d3_geoArea(json);
67815 return isNaN(area) ? 0 : area;
67821 // Filter function to eliminate consecutive duplicates.
67822 function noRepeatNodes(node, i, arr) {
67823 return i === 0 || node !== arr[i - 1];
67826 /* Built-in method references for those with the same name as other `lodash` methods. */
67827 var nativeMax$8 = Math.max;
67830 * Gets the index at which the first occurrence of `value` is found in `array`
67831 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
67832 * for equality comparisons. If `fromIndex` is negative, it's used as the
67833 * offset from the end of `array`.
67839 * @param {Array} array The array to inspect.
67840 * @param {*} value The value to search for.
67841 * @param {number} [fromIndex=0] The index to search from.
67842 * @returns {number} Returns the index of the matched value, else `-1`.
67845 * _.indexOf([1, 2, 1, 2], 2);
67848 * // Search from the `fromIndex`.
67849 * _.indexOf([1, 2, 1, 2], 2, 2);
67852 function indexOf(array, value, fromIndex) {
67853 var length = array == null ? 0 : array.length;
67857 var index = fromIndex == null ? 0 : toInteger(fromIndex);
67859 index = nativeMax$8(length + index, 0);
67861 return baseIndexOf(array, value, index);
67864 function osmTurn(turn) {
67865 if (!(this instanceof osmTurn))
67866 return new osmTurn(turn);
67867 assignIn$1(this, turn);
67871 function osmIntersection(graph, vertexId) {
67872 var vertex = graph.entity(vertexId),
67873 parentWays = graph.parentWays(vertex),
67877 function addHighway(way, adjacentNodeId) {
67878 if (highways[adjacentNodeId]) {
67879 coincident.push(adjacentNodeId);
67881 highways[adjacentNodeId] = way;
67885 // Pre-split ways that would need to be split in
67886 // order to add a restriction. The real split will
67887 // happen when the restriction is added.
67888 parentWays.forEach(function(way) {
67889 if (!way.tags.highway || way.isArea() || way.isDegenerate())
67892 var isFirst = (vertexId === way.first()),
67893 isLast = (vertexId === way.last()),
67894 isAffix = (isFirst || isLast),
67895 isClosingNode = (isFirst && isLast);
67897 if (isAffix && !isClosingNode) {
67898 var index = (isFirst ? 1 : way.nodes.length - 2);
67899 addHighway(way, way.nodes[index]);
67902 var splitIndex, wayA, wayB, indexA, indexB;
67903 if (isClosingNode) {
67904 splitIndex = Math.ceil(way.nodes.length / 2); // split at midpoint
67905 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)});
67906 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
67908 indexB = way.nodes.length - 2;
67910 splitIndex = indexOf(way.nodes, vertex.id, 1); // split at vertexid
67911 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)});
67912 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
67913 indexA = splitIndex - 1;
67914 indexB = splitIndex + 1;
67916 graph = graph.replace(wayA).replace(wayB);
67917 addHighway(wayA, way.nodes[indexA]);
67918 addHighway(wayB, way.nodes[indexB]);
67922 // remove any ways from this intersection that are coincident
67923 // (i.e. any adjacent node used by more than one intersecting way)
67924 coincident.forEach(function (n) {
67925 delete highways[n];
67929 var intersection = {
67930 highways: highways,
67931 ways: values$1(highways),
67936 intersection.adjacentNodeId = function(fromWayId) {
67937 return find$1(keys$1(highways), function(k) {
67938 return highways[k].id === fromWayId;
67943 intersection.turns = function(fromNodeId) {
67944 var start = highways[fromNodeId];
67948 if (start.first() === vertex.id && start.tags.oneway === 'yes')
67950 if (start.last() === vertex.id && start.tags.oneway === '-1')
67953 function withRestriction(turn) {
67954 graph.parentRelations(graph.entity(turn.from.way)).forEach(function(relation) {
67955 if (relation.tags.type !== 'restriction')
67958 var f = relation.memberByRole('from'),
67959 t = relation.memberByRole('to'),
67960 v = relation.memberByRole('via');
67962 if (f && f.id === turn.from.way &&
67963 v && v.id === turn.via.node &&
67964 t && t.id === turn.to.way) {
67965 turn.restriction = relation.id;
67966 } else if (/^only_/.test(relation.tags.restriction) &&
67967 f && f.id === turn.from.way &&
67968 v && v.id === turn.via.node &&
67969 t && t.id !== turn.to.way) {
67970 turn.restriction = relation.id;
67971 turn.indirect_restriction = true;
67975 return osmTurn(turn);
67981 way: start.id.split(/-(a|b)/)[0]
67983 via = { node: vertex.id },
67986 forEach(highways, function(end, adjacentNodeId) {
67991 if (end.first() !== vertex.id && end.tags.oneway !== 'yes') {
67992 turns.push(withRestriction({
67996 node: adjacentNodeId,
67997 way: end.id.split(/-(a|b)/)[0]
68003 if (end.last() !== vertex.id && end.tags.oneway !== '-1') {
68004 turns.push(withRestriction({
68008 node: adjacentNodeId,
68009 way: end.id.split(/-(a|b)/)[0]
68017 if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') {
68018 turns.push(withRestriction({
68029 return intersection;
68033 function osmInferRestriction(graph, from, via, to, projection) {
68034 var fromWay = graph.entity(from.way),
68035 fromNode = graph.entity(from.node),
68036 toWay = graph.entity(to.way),
68037 toNode = graph.entity(to.node),
68038 viaNode = graph.entity(via.node),
68039 fromOneWay = (fromWay.tags.oneway === 'yes' && fromWay.last() === via.node) ||
68040 (fromWay.tags.oneway === '-1' && fromWay.first() === via.node),
68041 toOneWay = (toWay.tags.oneway === 'yes' && toWay.first() === via.node) ||
68042 (toWay.tags.oneway === '-1' && toWay.last() === via.node),
68043 angle = geoAngle(viaNode, fromNode, projection) -
68044 geoAngle(viaNode, toNode, projection);
68046 angle = angle * 180 / Math.PI;
68051 if (fromNode === toNode)
68052 return 'no_u_turn';
68053 if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
68054 return 'no_u_turn';
68056 return 'no_right_turn';
68058 return 'no_left_turn';
68060 return 'no_straight_on';
68063 function actionAddMember(relationId, member, memberIndex) {
68064 return function(graph) {
68065 var relation = graph.entity(relationId);
68067 if (isNaN(memberIndex) && member.type === 'way') {
68068 var members = relation.indexedMembers();
68069 members.push(member);
68071 var joined = osmJoinWays(members, graph);
68072 for (var i = 0; i < joined.length; i++) {
68073 var segment = joined[i];
68074 for (var j = 0; j < segment.length && segment.length >= 2; j++) {
68075 if (segment[j] !== member)
68079 memberIndex = segment[j + 1].index;
68080 } else if (j === segment.length - 1) {
68081 memberIndex = segment[j - 1].index + 1;
68083 memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
68089 return graph.replace(relation.addMember(member, memberIndex));
68093 function actionAddMidpoint(midpoint, node) {
68094 return function(graph) {
68095 graph = graph.replace(node.move(midpoint.loc));
68097 var parents = intersection(
68098 graph.parentWays(graph.entity(midpoint.edge[0])),
68099 graph.parentWays(graph.entity(midpoint.edge[1])));
68101 parents.forEach(function(way) {
68102 for (var i = 0; i < way.nodes.length - 1; i++) {
68103 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
68104 graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
68106 // Add only one midpoint on doubled-back segments,
68107 // turning them into self-intersections.
68117 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
68118 function actionAddVertex(wayId, nodeId, index) {
68119 return function(graph) {
68120 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
68124 function actionChangeMember(relationId, member, memberIndex) {
68125 return function(graph) {
68126 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
68130 function actionChangePreset(entityId, oldPreset, newPreset) {
68131 return function(graph) {
68132 var entity = graph.entity(entityId),
68133 geometry = entity.geometry(graph),
68134 tags = entity.tags;
68136 if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
68137 if (newPreset) tags = newPreset.applyTags(tags, geometry);
68139 return graph.replace(entity.update({tags: tags}));
68143 function actionChangeTags(entityId, tags) {
68144 return function(graph) {
68145 var entity = graph.entity(entityId);
68146 return graph.replace(entity.update({tags: tags}));
68150 function actionCircularize(wayId, projection, maxAngle) {
68151 maxAngle = (maxAngle || 20) * Math.PI / 180;
68154 var action = function(graph, t) {
68155 if (t === null || !isFinite(t)) t = 1;
68156 t = Math.min(Math.max(+t, 0), 1);
68158 var way = graph.entity(wayId),
68161 graph.childNodes(way).forEach(function(node) {
68162 if (!origNodes[node.id]) origNodes[node.id] = node;
68165 if (!way.isConvex(graph)) {
68166 graph = action.makeConvex(graph);
68169 var nodes = uniq(graph.childNodes(way)),
68170 keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
68171 points = nodes.map(function(n) { return projection(n.loc); }),
68172 keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
68173 centroid = (points.length === 2) ? geoInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
68174 radius = d3_median(points, function(p) { return geoEuclideanDistance(centroid, p); }),
68175 sign = d3_polygonArea(points) > 0 ? 1 : -1,
68178 // we need atleast two key nodes for the algorithm to work
68179 if (!keyNodes.length) {
68180 keyNodes = [nodes[0]];
68181 keyPoints = [points[0]];
68184 if (keyNodes.length === 1) {
68185 var index = nodes.indexOf(keyNodes[0]),
68186 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
68188 keyNodes.push(nodes[oppositeIndex]);
68189 keyPoints.push(points[oppositeIndex]);
68192 // key points and nodes are those connected to the ways,
68193 // they are projected onto the circle, inbetween nodes are moved
68194 // to constant intervals between key nodes, extra inbetween nodes are
68195 // added if necessary.
68196 for (var i = 0; i < keyPoints.length; i++) {
68197 var nextKeyNodeIndex = (i + 1) % keyNodes.length,
68198 startNode = keyNodes[i],
68199 endNode = keyNodes[nextKeyNodeIndex],
68200 startNodeIndex = nodes.indexOf(startNode),
68201 endNodeIndex = nodes.indexOf(endNode),
68202 numberNewPoints = -1,
68203 indexRange = endNodeIndex - startNodeIndex,
68205 inBetweenNodes = [],
68206 startAngle, endAngle, totalAngle, eachAngle,
68207 angle, loc, node, origNode, j;
68209 if (indexRange < 0) {
68210 indexRange += nodes.length;
68213 // position this key node
68214 var distance = geoEuclideanDistance(centroid, keyPoints[i]);
68215 if (distance === 0) { distance = 1e-4; }
68217 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
68218 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
68220 loc = projection.invert(keyPoints[i]);
68221 node = keyNodes[i];
68222 origNode = origNodes[node.id];
68223 node = node.move(geoInterp(origNode.loc, loc, t));
68224 graph = graph.replace(node);
68226 // figure out the between delta angle we want to match to
68227 startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
68228 endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
68229 totalAngle = endAngle - startAngle;
68231 // detects looping around -pi/pi
68232 if (totalAngle * sign > 0) {
68233 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
68238 eachAngle = totalAngle / (indexRange + numberNewPoints);
68239 } while (Math.abs(eachAngle) > maxAngle);
68242 // move existing nodes
68243 for (j = 1; j < indexRange; j++) {
68244 angle = startAngle + j * eachAngle;
68245 loc = projection.invert([
68246 centroid[0] + Math.cos(angle) * radius,
68247 centroid[1] + Math.sin(angle) * radius
68250 node = nodes[(j + startNodeIndex) % nodes.length];
68251 origNode = origNodes[node.id];
68252 nearNodes[node.id] = angle;
68254 node = node.move(geoInterp(origNode.loc, loc, t));
68255 graph = graph.replace(node);
68258 // add new inbetween nodes if necessary
68259 for (j = 0; j < numberNewPoints; j++) {
68260 angle = startAngle + (indexRange + j) * eachAngle;
68261 loc = projection.invert([
68262 centroid[0] + Math.cos(angle) * radius,
68263 centroid[1] + Math.sin(angle) * radius
68266 // choose a nearnode to use as the original
68267 var min$$1 = Infinity;
68268 for (var nodeId in nearNodes) {
68269 var nearAngle = nearNodes[nodeId],
68270 dist = Math.abs(nearAngle - angle);
68271 if (dist < min$$1) {
68273 origNode = origNodes[nodeId];
68277 node = osmNode({ loc: geoInterp(origNode.loc, loc, t) });
68278 graph = graph.replace(node);
68280 nodes.splice(endNodeIndex + j, 0, node);
68281 inBetweenNodes.push(node.id);
68284 // Check for other ways that share these keyNodes..
68285 // If keyNodes are adjacent in both ways,
68286 // we can add inBetween nodes to that shared way too..
68287 if (indexRange === 1 && inBetweenNodes.length) {
68288 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
68289 endIndex1 = way.nodes.lastIndexOf(endNode.id),
68290 wayDirection1 = (endIndex1 - startIndex1);
68291 if (wayDirection1 < -1) { wayDirection1 = 1; }
68293 /* eslint-disable no-loop-func */
68294 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
68295 if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
68296 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
68297 endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
68298 wayDirection2 = (endIndex2 - startIndex2),
68299 insertAt = endIndex2;
68300 if (wayDirection2 < -1) { wayDirection2 = 1; }
68302 if (wayDirection1 !== wayDirection2) {
68303 inBetweenNodes.reverse();
68304 insertAt = startIndex2;
68306 for (j = 0; j < inBetweenNodes.length; j++) {
68307 sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
68309 graph = graph.replace(sharedWay);
68312 /* eslint-enable no-loop-func */
68317 // update the way to have all the new nodes
68318 ids = nodes.map(function(n) { return n.id; });
68321 way = way.update({nodes: ids});
68322 graph = graph.replace(way);
68328 action.makeConvex = function(graph) {
68329 var way = graph.entity(wayId),
68330 nodes = uniq(graph.childNodes(way)),
68331 points = nodes.map(function(n) { return projection(n.loc); }),
68332 sign = d3_polygonArea(points) > 0 ? 1 : -1,
68333 hull = d3_polygonHull(points);
68335 // D3 convex hulls go counterclockwise..
68341 for (var i = 0; i < hull.length - 1; i++) {
68342 var startIndex = points.indexOf(hull[i]),
68343 endIndex = points.indexOf(hull[i+1]),
68344 indexRange = (endIndex - startIndex);
68346 if (indexRange < 0) {
68347 indexRange += nodes.length;
68350 // move interior nodes to the surface of the convex hull..
68351 for (var j = 1; j < indexRange; j++) {
68352 var point = geoInterp(hull[i], hull[i+1], j / indexRange),
68353 node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
68354 graph = graph.replace(node);
68361 action.disabled = function(graph) {
68362 if (!graph.entity(wayId).isClosed())
68363 return 'not_closed';
68367 action.transitionable = true;
68373 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
68374 function actionDeleteWay(wayId) {
68377 function canDeleteNode(node, graph) {
68378 return !graph.parentWays(node).length &&
68379 !graph.parentRelations(node).length &&
68380 !node.hasInterestingTags();
68384 var action = function(graph) {
68385 var way = graph.entity(wayId);
68387 graph.parentRelations(way)
68388 .forEach(function(parent) {
68389 parent = parent.removeMembersWithID(wayId);
68390 graph = graph.replace(parent);
68392 if (parent.isDegenerate()) {
68393 graph = actionDeleteRelation(parent.id)(graph);
68397 uniq(way.nodes).forEach(function(nodeId) {
68398 graph = graph.replace(way.removeNode(nodeId));
68400 var node = graph.entity(nodeId);
68401 if (canDeleteNode(node, graph)) {
68402 graph = graph.remove(node);
68406 return graph.remove(way);
68413 function actionDeleteMultiple(ids) {
68415 way: actionDeleteWay,
68416 node: actionDeleteNode,
68417 relation: actionDeleteRelation
68421 var action = function(graph) {
68422 ids.forEach(function(id) {
68423 if (graph.hasEntity(id)) { // It may have been deleted aready.
68424 graph = actions[graph.entity(id).type](id)(graph);
68435 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
68436 function actionDeleteRelation(relationId) {
68439 function canDeleteEntity(entity, graph) {
68440 return !graph.parentWays(entity).length &&
68441 !graph.parentRelations(entity).length &&
68442 !entity.hasInterestingTags();
68446 var action = function(graph) {
68447 var relation = graph.entity(relationId);
68449 graph.parentRelations(relation)
68450 .forEach(function(parent) {
68451 parent = parent.removeMembersWithID(relationId);
68452 graph = graph.replace(parent);
68454 if (parent.isDegenerate()) {
68455 graph = actionDeleteRelation(parent.id)(graph);
68459 uniq(map$4(relation.members, 'id')).forEach(function(memberId) {
68460 graph = graph.replace(relation.removeMembersWithID(memberId));
68462 var entity = graph.entity(memberId);
68463 if (canDeleteEntity(entity, graph)) {
68464 graph = actionDeleteMultiple([memberId])(graph);
68468 return graph.remove(relation);
68475 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
68476 function actionDeleteNode(nodeId) {
68477 var action = function(graph) {
68478 var node = graph.entity(nodeId);
68480 graph.parentWays(node)
68481 .forEach(function(parent) {
68482 parent = parent.removeNode(nodeId);
68483 graph = graph.replace(parent);
68485 if (parent.isDegenerate()) {
68486 graph = actionDeleteWay(parent.id)(graph);
68490 graph.parentRelations(node)
68491 .forEach(function(parent) {
68492 parent = parent.removeMembersWithID(nodeId);
68493 graph = graph.replace(parent);
68495 if (parent.isDegenerate()) {
68496 graph = actionDeleteRelation(parent.id)(graph);
68500 return graph.remove(node);
68507 // Connect the ways at the given nodes.
68509 // The last node will survive. All other nodes will be replaced with
68510 // the surviving node in parent ways, and then removed.
68512 // Tags and relation memberships of of non-surviving nodes are merged
68513 // to the survivor.
68515 // This is the inverse of `iD.actionDisconnect`.
68518 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
68519 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
68521 function actionConnect(nodeIds) {
68522 return function(graph) {
68523 var last = nodeIds[nodeIds.length - 1];
68524 var survivor = graph.entity(last);
68526 for (var i = 0; i < nodeIds.length - 1; i++) {
68527 var node = graph.entity(nodeIds[i]);
68529 /* eslint-disable no-loop-func */
68530 graph.parentWays(node).forEach(function(parent) {
68531 if (!parent.areAdjacent(node.id, survivor.id)) {
68532 graph = graph.replace(parent.replaceNode(node.id, survivor.id));
68536 graph.parentRelations(node).forEach(function(parent) {
68537 graph = graph.replace(parent.replaceMember(node, survivor));
68539 /* eslint-enable no-loop-func */
68541 survivor = survivor.mergeTags(node.tags);
68542 graph = actionDeleteNode(node.id)(graph);
68545 graph = graph.replace(survivor);
68551 function actionCopyEntities(ids, fromGraph) {
68555 var action = function(graph) {
68556 ids.forEach(function(id) {
68557 fromGraph.entity(id).copy(fromGraph, copies);
68560 for (var id in copies) {
68561 graph = graph.replace(copies[id]);
68568 action.copies = function() {
68576 function actionDeleteMember(relationId, memberIndex) {
68577 return function(graph) {
68578 var relation = graph.entity(relationId)
68579 .removeMember(memberIndex);
68581 graph = graph.replace(relation);
68583 if (relation.isDegenerate())
68584 graph = actionDeleteRelation(relation.id)(graph);
68590 function actionDeprecateTags(entityId) {
68592 return function(graph) {
68593 var entity = graph.entity(entityId),
68594 newtags = clone(entity.tags),
68598 // This handles dataDeprecated tags with a single condition
68599 for (var i = 0; i < dataDeprecated.length; i++) {
68601 rule = dataDeprecated[i];
68602 var match = toPairs(rule.old)[0],
68603 replacements = rule.replace ? toPairs(rule.replace) : null;
68605 if (entity.tags[match[0]] && match[1] === '*') {
68607 var value = entity.tags[match[0]];
68608 if (replacements && !newtags[replacements[0][0]]) {
68609 newtags[replacements[0][0]] = value;
68611 delete newtags[match[0]];
68614 } else if (entity.tags[match[0]] === match[1]) {
68615 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
68621 return graph.replace(entity.update({tags: newtags}));
68628 function actionDiscardTags(difference) {
68630 return function(graph) {
68631 function discardTags(entity) {
68632 if (!isEmpty(entity.tags)) {
68634 forEach(entity.tags, function(v, k) {
68635 if (v) tags[k] = v;
68638 graph = graph.replace(entity.update({
68639 tags: omit(tags, dataDiscarded)
68644 difference.modified().forEach(discardTags);
68645 difference.created().forEach(discardTags);
68651 // Disconect the ways at the given node.
68653 // Optionally, disconnect only the given ways.
68655 // For testing convenience, accepts an ID to assign to the (first) new node.
68656 // Normally, this will be undefined and the way will automatically
68657 // be assigned a new ID.
68659 // This is the inverse of `iD.actionConnect`.
68662 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
68663 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
68665 function actionDisconnect(nodeId, newNodeId) {
68669 var action = function(graph) {
68670 var node = graph.entity(nodeId),
68671 connections = action.connections(graph);
68673 connections.forEach(function(connection) {
68674 var way = graph.entity(connection.wayID),
68675 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
68677 graph = graph.replace(newNode);
68678 if (connection.index === 0 && way.isArea()) {
68679 // replace shared node with shared node..
68680 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
68681 } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
68682 // replace closing node with new new node..
68683 graph = graph.replace(way.unclose().addNode(newNode.id));
68685 // replace shared node with multiple new nodes..
68686 graph = graph.replace(way.updateNode(newNode.id, connection.index));
68694 action.connections = function(graph) {
68695 var candidates = [],
68697 parentWays = graph.parentWays(graph.entity(nodeId));
68699 parentWays.forEach(function(way) {
68700 if (wayIds && wayIds.indexOf(way.id) === -1) {
68704 if (way.isArea() && (way.nodes[0] === nodeId)) {
68705 candidates.push({ wayID: way.id, index: 0 });
68707 way.nodes.forEach(function(waynode, index) {
68708 if (waynode === nodeId) {
68709 candidates.push({ wayID: way.id, index: index });
68715 return keeping ? candidates : candidates.slice(1);
68719 action.disabled = function(graph) {
68720 var connections = action.connections(graph);
68721 if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
68722 return 'not_connected';
68724 var parentWays = graph.parentWays(graph.entity(nodeId)),
68725 seenRelationIds = {},
68728 parentWays.forEach(function(way) {
68729 if (wayIds && wayIds.indexOf(way.id) === -1)
68732 var relations = graph.parentRelations(way);
68733 relations.forEach(function(relation) {
68734 if (relation.id in seenRelationIds) {
68735 sharedRelation = relation;
68737 seenRelationIds[relation.id] = true;
68742 if (sharedRelation)
68747 action.limitWays = function(_) {
68748 if (!arguments.length) return wayIds;
68757 // Join ways at the end node they share.
68759 // This is the inverse of `iD.actionSplit`.
68762 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
68763 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
68765 function actionJoin(ids) {
68767 function groupEntitiesByGeometry(graph) {
68768 var entities = ids.map(function(id) { return graph.entity(id); });
68769 return assignIn$1({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
68773 var action = function(graph) {
68774 var ways = ids.map(graph.entity, graph),
68775 survivor = ways[0];
68777 // Prefer to keep an existing way.
68778 for (var i = 0; i < ways.length; i++) {
68779 if (!ways[i].isNew()) {
68780 survivor = ways[i];
68785 var joined = osmJoinWays(ways, graph)[0];
68787 survivor = survivor.update({nodes: map$4(joined.nodes, 'id')});
68788 graph = graph.replace(survivor);
68790 joined.forEach(function(way) {
68791 if (way.id === survivor.id)
68794 graph.parentRelations(way).forEach(function(parent) {
68795 graph = graph.replace(parent.replaceMember(way, survivor));
68798 survivor = survivor.mergeTags(way.tags);
68800 graph = graph.replace(survivor);
68801 graph = actionDeleteWay(way.id)(graph);
68808 action.disabled = function(graph) {
68809 var geometries = groupEntitiesByGeometry(graph);
68810 if (ids.length < 2 || ids.length !== geometries.line.length)
68811 return 'not_eligible';
68813 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
68814 if (joined.length > 1)
68815 return 'not_adjacent';
68817 var nodeIds = map$4(joined[0].nodes, 'id').slice(1, -1),
68820 conflicting = false;
68822 joined[0].forEach(function(way) {
68823 var parents = graph.parentRelations(way);
68824 parents.forEach(function(parent) {
68825 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
68829 for (var k in way.tags) {
68830 if (!(k in tags)) {
68831 tags[k] = way.tags[k];
68832 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
68833 conflicting = true;
68839 return 'restriction';
68842 return 'conflicting_tags';
68849 function actionMerge(ids) {
68851 function groupEntitiesByGeometry(graph) {
68852 var entities = ids.map(function(id) { return graph.entity(id); });
68853 return assignIn$1({point: [], area: [], line: [], relation: []},
68854 groupBy(entities, function(entity) { return entity.geometry(graph); }));
68858 var action = function(graph) {
68859 var geometries = groupEntitiesByGeometry(graph),
68860 target = geometries.area[0] || geometries.line[0],
68861 points = geometries.point;
68863 points.forEach(function(point) {
68864 target = target.mergeTags(point.tags);
68865 graph = graph.replace(target);
68867 graph.parentRelations(point).forEach(function(parent) {
68868 graph = graph.replace(parent.replaceMember(point, target));
68871 var nodes = uniq(graph.childNodes(target)),
68872 removeNode = point;
68874 for (var i = 0; i < nodes.length; i++) {
68875 var node = nodes[i];
68876 if (graph.parentWays(node).length > 1 ||
68877 graph.parentRelations(node).length ||
68878 node.hasInterestingTags()) {
68882 // Found an uninteresting child node on the target way.
68883 // Move orig point into its place to preserve point's history. #3683
68884 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
68885 target = target.replaceNode(node.id, point.id);
68886 graph = graph.replace(target);
68891 graph = graph.remove(removeNode);
68898 action.disabled = function(graph) {
68899 var geometries = groupEntitiesByGeometry(graph);
68900 if (geometries.point.length === 0 ||
68901 (geometries.area.length + geometries.line.length) !== 1 ||
68902 geometries.relation.length !== 0)
68903 return 'not_eligible';
68910 function actionMergePolygon(ids, newRelationId) {
68912 function groupEntities(graph) {
68913 var entities = ids.map(function (id) { return graph.entity(id); });
68914 return assignIn$1({
68918 }, groupBy(entities, function(entity) {
68919 if (entity.type === 'way' && entity.isClosed()) {
68920 return 'closedWay';
68921 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
68922 return 'multipolygon';
68930 var action = function(graph) {
68931 var entities = groupEntities(graph);
68933 // An array representing all the polygons that are part of the multipolygon.
68935 // Each element is itself an array of objects with an id property, and has a
68936 // locs property which is an array of the locations forming the polygon.
68937 var polygons = entities.multipolygon.reduce(function(polygons, m) {
68938 return polygons.concat(osmJoinWays(m.members, graph));
68939 }, []).concat(entities.closedWay.map(function(d) {
68940 var member = [{id: d.id}];
68941 member.nodes = graph.childNodes(d);
68945 // contained is an array of arrays of boolean values,
68946 // where contained[j][k] is true iff the jth way is
68947 // contained by the kth way.
68948 var contained = polygons.map(function(w, i) {
68949 return polygons.map(function(d, n) {
68950 if (i === n) return null;
68951 return geoPolygonContainsPolygon(
68952 map$4(d.nodes, 'loc'),
68953 map$4(w.nodes, 'loc'));
68957 // Sort all polygons as either outer or inner ways
68961 while (polygons.length) {
68962 extractUncontained(polygons);
68963 polygons = polygons.filter(isContained);
68964 contained = contained.filter(isContained).map(filterContained);
68967 function isContained(d, i) {
68968 return some(contained[i]);
68971 function filterContained(d) {
68972 return d.filter(isContained);
68975 function extractUncontained(polygons) {
68976 polygons.forEach(function(d, i) {
68977 if (!isContained(d, i)) {
68978 d.forEach(function(member) {
68982 role: outer ? 'outer' : 'inner'
68990 // Move all tags to one relation
68991 var relation = entities.multipolygon[0] ||
68992 osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
68994 entities.multipolygon.slice(1).forEach(function(m) {
68995 relation = relation.mergeTags(m.tags);
68996 graph = graph.remove(m);
68999 entities.closedWay.forEach(function(way) {
69000 function isThisOuter(m) {
69001 return m.id === way.id && m.role !== 'inner';
69003 if (members.some(isThisOuter)) {
69004 relation = relation.mergeTags(way.tags);
69005 graph = graph.replace(way.update({ tags: {} }));
69009 return graph.replace(relation.update({
69011 tags: omit(relation.tags, 'area')
69016 action.disabled = function(graph) {
69017 var entities = groupEntities(graph);
69018 if (entities.other.length > 0 ||
69019 entities.closedWay.length + entities.multipolygon.length < 2)
69020 return 'not_eligible';
69021 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
69022 return 'incomplete_relation';
69029 // Copyright (c) 2006, 2008 Tony Garnock-Jones <tonyg@lshift.net>
69030 // Copyright (c) 2006, 2008 LShift Ltd. <query@lshift.net>
69032 // Permission is hereby granted, free of charge, to any person
69033 // obtaining a copy of this software and associated documentation files
69034 // (the "Software"), to deal in the Software without restriction,
69035 // including without limitation the rights to use, copy, modify, merge,
69036 // publish, distribute, sublicense, and/or sell copies of the Software,
69037 // and to permit persons to whom the Software is furnished to do so,
69038 // subject to the following conditions:
69040 // The above copyright notice and this permission notice shall be
69041 // included in all copies or substantial portions of the Software.
69043 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
69044 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
69045 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
69046 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
69047 // BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
69048 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
69049 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
69052 // source: https://bitbucket.org/lshift/synchrotron/src
69053 function longest_common_subsequence(file1, file2) {
69054 /* Text diff algorithm following Hunt and McIlroy 1976.
69055 * J. W. Hunt and M. D. McIlroy, An algorithm for differential file
69056 * comparison, Bell Telephone Laboratories CSTR #41 (1976)
69057 * http://www.cs.dartmouth.edu/~doug/
69059 * Expects two arrays of strings.
69061 var equivalenceClasses;
69066 var c, i, j, jX, r, s;
69068 equivalenceClasses = {};
69069 for (j = 0; j < file2.length; j++) {
69071 if (equivalenceClasses[line]) {
69072 equivalenceClasses[line].push(j);
69074 equivalenceClasses[line] = [j];
69078 candidates = [{file1index: -1,
69082 for (i = 0; i < file1.length; i++) {
69084 file2indices = equivalenceClasses[line] || [];
69089 for (jX = 0; jX < file2indices.length; jX++) {
69090 j = file2indices[jX];
69092 for (s = 0; s < candidates.length; s++) {
69093 if ((candidates[s].file2index < j) &&
69094 ((s === candidates.length - 1) ||
69095 (candidates[s + 1].file2index > j)))
69099 if (s < candidates.length) {
69100 newCandidate = {file1index: i,
69102 chain: candidates[s]};
69103 if (r === candidates.length) {
69104 candidates.push(c);
69110 if (r === candidates.length) {
69111 break; // no point in examining further (j)s
69119 // At this point, we know the LCS: it's in the reverse of the
69120 // linked-list through .chain of
69121 // candidates[candidates.length - 1].
69123 return candidates[candidates.length - 1];
69136 function diff_indices(file1, file2) {
69137 // We apply the LCS to give a simple representation of the
69138 // offsets and lengths of mismatched chunks in the input
69139 // files. This is used by diff3_merge_indices below.
69142 var tail1 = file1.length;
69143 var tail2 = file2.length;
69145 for (var candidate = longest_common_subsequence(file1, file2);
69146 candidate !== null;
69147 candidate = candidate.chain)
69149 var mismatchLength1 = tail1 - candidate.file1index - 1;
69150 var mismatchLength2 = tail2 - candidate.file2index - 1;
69151 tail1 = candidate.file1index;
69152 tail2 = candidate.file2index;
69154 if (mismatchLength1 || mismatchLength2) {
69155 result.push({file1: [tail1 + 1, mismatchLength1],
69156 file2: [tail2 + 1, mismatchLength2]});
69164 function diff3_merge_indices (a, o, b) {
69165 // Given three files, A, O, and B, where both A and B are
69166 // independently derived from O, returns a fairly complicated
69167 // internal representation of merge decisions it's taken. The
69168 // interested reader may wish to consult
69170 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce. "A
69171 // Formal Investigation of Diff3." In Arvind and Prasad,
69172 // editors, Foundations of Software Technology and Theoretical
69173 // Computer Science (FSTTCS), December 2007.
69175 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
69178 var m1 = diff_indices(o, a);
69179 var m2 = diff_indices(o, b);
69182 function addHunk(h, side) {
69183 hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
69185 for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
69186 for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
69190 var commonOffset = 0;
69191 function copyCommon(targetOffset) {
69192 if (targetOffset > commonOffset) {
69193 result.push([1, commonOffset, targetOffset - commonOffset]);
69194 commonOffset = targetOffset;
69198 for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
69199 var firstHunkIndex = hunkIndex;
69200 var hunk = hunks[hunkIndex];
69201 var regionLhs = hunk[0];
69202 var regionRhs = regionLhs + hunk[2];
69203 while (hunkIndex < hunks.length - 1) {
69204 var maybeOverlapping = hunks[hunkIndex + 1];
69205 var maybeLhs = maybeOverlapping[0];
69206 if (maybeLhs > regionRhs) break;
69207 regionRhs = maybeLhs + maybeOverlapping[2];
69211 copyCommon(regionLhs);
69212 if (firstHunkIndex === hunkIndex) {
69213 // The "overlap" was only one hunk long, meaning that
69214 // there's no conflict here. Either a and o were the
69215 // same, or b and o were the same.
69217 result.push([hunk[1], hunk[3], hunk[4]]);
69220 // A proper conflict. Determine the extents of the
69221 // regions involved from a, o and b. Effectively merge
69222 // all the hunks on the left into one giant hunk, and
69223 // do the same for the right; then, correct for skew
69224 // in the regions of o that each side changed, and
69225 // report appropriate spans for the three sides.
69227 0: [a.length, -1, o.length, -1],
69228 2: [b.length, -1, o.length, -1]
69230 for (i = firstHunkIndex; i <= hunkIndex; i++) {
69232 var side = hunk[1];
69233 var r = regions[side];
69234 var oLhs = hunk[0];
69235 var oRhs = oLhs + hunk[2];
69236 var abLhs = hunk[3];
69237 var abRhs = abLhs + hunk[4];
69238 r[0] = Math.min(abLhs, r[0]);
69239 r[1] = Math.max(abRhs, r[1]);
69240 r[2] = Math.min(oLhs, r[2]);
69241 r[3] = Math.max(oRhs, r[3]);
69243 var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
69244 var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
69245 var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
69246 var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
69249 regionLhs, regionRhs - regionLhs,
69250 bLhs, bRhs - bLhs]);
69252 commonOffset = regionRhs;
69255 copyCommon(o.length);
69259 function diff3_merge (a, o, b, excludeFalseConflicts) {
69260 // Applies the output of Diff3.diff3_merge_indices to actually
69261 // construct the merged file; the returned result alternates
69262 // between "ok" and "conflict" blocks.
69265 var files = [a, o, b];
69266 var indices = diff3_merge_indices(a, o, b);
69269 function flushOk() {
69270 if (okLines.length) {
69271 result.push({ok: okLines});
69275 function pushOk(xs) {
69276 for (var j = 0; j < xs.length; j++) {
69277 okLines.push(xs[j]);
69281 function isTrueConflict(rec) {
69282 if (rec[2] !== rec[6]) return true;
69285 for (var j = 0; j < rec[2]; j++) {
69286 if (a[j + aoff] !== b[j + boff]) return true;
69291 for (var i = 0; i < indices.length; i++) {
69292 var x = indices[i];
69295 if (excludeFalseConflicts && !isTrueConflict(x)) {
69296 pushOk(files[0].slice(x[1], x[1] + x[2]));
69299 result.push({conflict: {a: a.slice(x[1], x[1] + x[2]),
69301 o: o.slice(x[3], x[3] + x[4]),
69303 b: b.slice(x[5], x[5] + x[6]),
69307 pushOk(files[side].slice(x[1], x[1] + x[2]));
69315 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
69316 var option = 'safe', // 'safe', 'force_local', 'force_remote'
69321 return isFunction(formatUser) ? formatUser(d) : d;
69325 function mergeLocation(remote, target) {
69326 function pointEqual(a, b) {
69327 var epsilon = 1e-6;
69328 return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
69331 if (option === 'force_local' || pointEqual(target.loc, remote.loc)) {
69334 if (option === 'force_remote') {
69335 return target.update({loc: remote.loc});
69338 conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
69343 function mergeNodes(base, remote, target) {
69344 if (option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
69347 if (option === 'force_remote') {
69348 return target.update({nodes: remote.nodes});
69351 var ccount = conflicts.length,
69352 o = base.nodes || [],
69353 a = target.nodes || [],
69354 b = remote.nodes || [],
69356 hunks = diff3_merge(a, o, b, true);
69358 for (var i = 0; i < hunks.length; i++) {
69359 var hunk = hunks[i];
69361 nodes.push.apply(nodes, hunk.ok);
69363 // for all conflicts, we can assume c.a !== c.b
69364 // because `diff3_merge` called with `true` option to exclude false conflicts..
69365 var c = hunk.conflict;
69366 if (isEqual(c.o, c.a)) { // only changed remotely
69367 nodes.push.apply(nodes, c.b);
69368 } else if (isEqual(c.o, c.b)) { // only changed locally
69369 nodes.push.apply(nodes, c.a);
69370 } else { // changed both locally and remotely
69371 conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
69377 return (conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
69381 function mergeChildren(targetWay, children, updates, graph) {
69382 function isUsed(node, targetWay) {
69383 var parentWays = map$4(graph.parentWays(node), 'id');
69384 return node.hasInterestingTags() ||
69385 without(parentWays, targetWay.id).length > 0 ||
69386 graph.parentRelations(node).length > 0;
69389 var ccount = conflicts.length;
69391 for (var i = 0; i < children.length; i++) {
69392 var id = children[i],
69393 node = graph.hasEntity(id);
69395 // remove unused childNodes..
69396 if (targetWay.nodes.indexOf(id) === -1) {
69397 if (node && !isUsed(node, targetWay)) {
69398 updates.removeIds.push(id);
69403 // restore used childNodes..
69404 var local = localGraph.hasEntity(id),
69405 remote = remoteGraph.hasEntity(id),
69408 if (option === 'force_remote' && remote && remote.visible) {
69409 updates.replacements.push(remote);
69411 } else if (option === 'force_local' && local) {
69412 target = osmEntity$$1(local);
69414 target = target.update({ version: remote.version });
69416 updates.replacements.push(target);
69418 } else if (option === 'safe' && local && remote && local.version !== remote.version) {
69419 target = osmEntity$$1(local, { version: remote.version });
69420 if (remote.visible) {
69421 target = mergeLocation(remote, target);
69423 conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
69426 if (conflicts.length !== ccount) break;
69427 updates.replacements.push(target);
69435 function updateChildren(updates, graph) {
69436 for (var i = 0; i < updates.replacements.length; i++) {
69437 graph = graph.replace(updates.replacements[i]);
69439 if (updates.removeIds.length) {
69440 graph = actionDeleteMultiple(updates.removeIds)(graph);
69446 function mergeMembers(remote, target) {
69447 if (option === 'force_local' || isEqual(target.members, remote.members)) {
69450 if (option === 'force_remote') {
69451 return target.update({members: remote.members});
69454 conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
69459 function mergeTags(base, remote, target) {
69460 function ignoreKey(k) {
69461 return includes(dataDiscarded, k);
69464 if (option === 'force_local' || isEqual(target.tags, remote.tags)) {
69467 if (option === 'force_remote') {
69468 return target.update({tags: remote.tags});
69471 var ccount = conflicts.length,
69472 o = base.tags || {},
69473 a = target.tags || {},
69474 b = remote.tags || {},
69475 keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey),
69479 for (var i = 0; i < keys.length; i++) {
69482 if (o[k] !== b[k] && a[k] !== b[k]) { // changed remotely..
69483 if (o[k] !== a[k]) { // changed locally..
69484 conflicts.push(t('merge_remote_changes.conflict.tags',
69485 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
69487 } else { // unchanged locally, accept remote change..
69488 if (b.hasOwnProperty(k)) {
69498 return (changed && conflicts.length === ccount) ? target.update({tags: tags}) : target;
69502 // `graph.base()` is the common ancestor of the two graphs.
69503 // `localGraph` contains user's edits up to saving
69504 // `remoteGraph` contains remote edits to modified nodes
69505 // `graph` must be a descendent of `localGraph` and may include
69506 // some conflict resolution actions performed on it.
69508 // --- ... --- `localGraph` -- ... -- `graph`
69510 // `graph.base()` --- ... --- `remoteGraph`
69512 var action = function(graph) {
69513 var updates = { replacements: [], removeIds: [] },
69514 base = graph.base().entities[id],
69515 local = localGraph.entity(id),
69516 remote = remoteGraph.entity(id),
69517 target = osmEntity$$1(local, { version: remote.version });
69520 if (!remote.visible) {
69521 if (option === 'force_remote') {
69522 return actionDeleteMultiple([id])(graph);
69524 } else if (option === 'force_local') {
69525 if (target.type === 'way') {
69526 target = mergeChildren(target, uniq(local.nodes), updates, graph);
69527 graph = updateChildren(updates, graph);
69529 return graph.replace(target);
69532 conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
69533 return graph; // do nothing
69538 if (target.type === 'node') {
69539 target = mergeLocation(remote, target);
69541 } else if (target.type === 'way') {
69542 // pull in any child nodes that may not be present locally..
69543 graph.rebase(remoteGraph.childNodes(remote), [graph], false);
69544 target = mergeNodes(base, remote, target);
69545 target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
69547 } else if (target.type === 'relation') {
69548 target = mergeMembers(remote, target);
69551 target = mergeTags(base, remote, target);
69553 if (!conflicts.length) {
69554 graph = updateChildren(updates, graph).replace(target);
69561 action.withOption = function(opt) {
69567 action.conflicts = function() {
69575 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
69576 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
69577 function actionMove(moveIds, tryDelta, projection, cache) {
69578 var delta = tryDelta;
69580 function vecAdd(a, b) { return [a[0] + b[0], a[1] + b[1]]; }
69581 function vecSub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }
69583 function setupCache(graph) {
69584 function canMove(nodeId) {
69585 // Allow movement of any node that is in the selectedIDs list..
69586 if (moveIds.indexOf(nodeId) !== -1) return true;
69588 // Allow movement of a vertex where 2 ways meet..
69589 var parents = map$4(graph.parentWays(graph.entity(nodeId)), 'id');
69590 if (parents.length < 3) return true;
69592 // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
69593 var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
69594 if (!parentsMoving) delete cache.moving[nodeId];
69596 return parentsMoving;
69599 function cacheEntities(ids) {
69600 ids.forEach(function(id) {
69601 if (cache.moving[id]) return;
69602 cache.moving[id] = true;
69604 var entity = graph.hasEntity(id);
69605 if (!entity) return;
69607 if (entity.type === 'node') {
69608 cache.nodes.push(id);
69609 cache.startLoc[id] = entity.loc;
69610 } else if (entity.type === 'way') {
69611 cache.ways.push(id);
69612 cacheEntities(entity.nodes);
69614 cacheEntities(entity.members.map(function(member) {
69621 function cacheIntersections(ids) {
69622 function isEndpoint(way, id) { return !way.isClosed() && !!way.affix(id); }
69624 ids.forEach(function(id) {
69625 // consider only intersections with 1 moved and 1 unmoved way.
69626 var childNodes = graph.childNodes(graph.entity(id));
69627 childNodes.forEach(function(node) {
69628 var parents = graph.parentWays(node);
69629 if (parents.length !== 2) return;
69631 var moved = graph.entity(id),
69632 unmoved = find$1(parents, function(way) { return !cache.moving[way.id]; });
69633 if (!unmoved) return;
69635 // exclude ways that are overly connected..
69636 if (intersection(moved.nodes, unmoved.nodes).length > 2) return;
69638 if (moved.isArea() || unmoved.isArea()) return;
69640 cache.intersection[node.id] = {
69643 unmovedId: unmoved.id,
69644 movedIsEP: isEndpoint(moved, node.id),
69645 unmovedIsEP: isEndpoint(unmoved, node.id)
69657 cache.intersection = {};
69658 cache.replacedVertex = {};
69659 cache.startLoc = {};
69663 cacheEntities(moveIds);
69664 cacheIntersections(cache.ways);
69665 cache.nodes = filter(cache.nodes, canMove);
69672 // Place a vertex where the moved vertex used to be, to preserve way shape..
69673 function replaceMovedVertex(nodeId, wayId, graph, delta) {
69674 var way = graph.entity(wayId),
69675 moved = graph.entity(nodeId),
69676 movedIndex = way.nodes.indexOf(nodeId),
69677 len, prevIndex, nextIndex;
69679 if (way.isClosed()) {
69680 len = way.nodes.length - 1;
69681 prevIndex = (movedIndex + len - 1) % len;
69682 nextIndex = (movedIndex + len + 1) % len;
69684 len = way.nodes.length;
69685 prevIndex = movedIndex - 1;
69686 nextIndex = movedIndex + 1;
69689 var prev = graph.hasEntity(way.nodes[prevIndex]),
69690 next = graph.hasEntity(way.nodes[nextIndex]);
69692 // Don't add orig vertex at endpoint..
69693 if (!prev || !next) return graph;
69695 var key = wayId + '_' + nodeId,
69696 orig = cache.replacedVertex[key];
69699 cache.replacedVertex[key] = orig;
69700 cache.startLoc[orig.id] = cache.startLoc[nodeId];
69705 start = projection(cache.startLoc[nodeId]);
69706 end = projection.invert(vecAdd(start, delta));
69708 end = cache.startLoc[nodeId];
69710 orig = orig.move(end);
69712 var angle = Math.abs(geoAngle(orig, prev, projection) -
69713 geoAngle(orig, next, projection)) * 180 / Math.PI;
69715 // Don't add orig vertex if it would just make a straight line..
69716 if (angle > 175 && angle < 185) return graph;
69718 // Don't add orig vertex if another point is already nearby (within 10m)
69719 if (geoSphericalDistance(prev.loc, orig.loc) < 10 ||
69720 geoSphericalDistance(orig.loc, next.loc) < 10) return graph;
69722 // moving forward or backward along way?
69723 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection),
69724 p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection),
69725 d1 = geoPathLength(p1),
69726 d2 = geoPathLength(p2),
69727 insertAt = (d1 < d2) ? movedIndex : nextIndex;
69729 // moving around closed loop?
69730 if (way.isClosed() && insertAt === 0) insertAt = len;
69732 way = way.addNode(orig.id, insertAt);
69733 return graph.replace(orig).replace(way);
69737 // Reorder nodes around intersections that have moved..
69738 function unZorroIntersection(intersection$$1, graph) {
69739 var vertex = graph.entity(intersection$$1.nodeId),
69740 way1 = graph.entity(intersection$$1.movedId),
69741 way2 = graph.entity(intersection$$1.unmovedId),
69742 isEP1 = intersection$$1.movedIsEP,
69743 isEP2 = intersection$$1.unmovedIsEP;
69745 // don't move the vertex if it is the endpoint of both ways.
69746 if (isEP1 && isEP2) return graph;
69748 var nodes1 = without(graph.childNodes(way1), vertex),
69749 nodes2 = without(graph.childNodes(way2), vertex);
69751 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
69752 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
69754 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection),
69755 edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection),
69758 // snap vertex to nearest edge (or some point between them)..
69759 if (!isEP1 && !isEP2) {
69760 var epsilon = 1e-4, maxIter = 10;
69761 for (var i = 0; i < maxIter; i++) {
69762 loc = geoInterp(edge1.loc, edge2.loc, 0.5);
69763 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
69764 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
69765 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
69767 } else if (!isEP1) {
69773 graph = graph.replace(vertex.move(loc));
69775 // if zorro happened, reorder nodes..
69776 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
69777 way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
69778 graph = graph.replace(way1);
69780 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
69781 way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
69782 graph = graph.replace(way2);
69789 function cleanupIntersections(graph) {
69790 forEach(cache.intersection, function(obj) {
69791 graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, delta);
69792 graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
69793 graph = unZorroIntersection(obj, graph);
69800 // check if moving way endpoint can cross an unmoved way, if so limit delta..
69801 function limitDelta(graph) {
69802 forEach(cache.intersection, function(obj) {
69803 // Don't limit movement if this is vertex joins 2 endpoints..
69804 if (obj.movedIsEP && obj.unmovedIsEP) return;
69805 // Don't limit movement if this vertex is not an endpoint anyway..
69806 if (!obj.movedIsEP) return;
69808 var node = graph.entity(obj.nodeId),
69809 start = projection(node.loc),
69810 end = vecAdd(start, delta),
69811 movedNodes = graph.childNodes(graph.entity(obj.movedId)),
69812 movedPath = map$4(map$4(movedNodes, 'loc'),
69813 function(loc) { return vecAdd(projection(loc), delta); }),
69814 unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)),
69815 unmovedPath = map$4(map$4(unmovedNodes, 'loc'), projection),
69816 hits = geoPathIntersections(movedPath, unmovedPath);
69818 for (var i = 0; i < hits.length; i++) {
69819 if (isEqual(hits[i], end)) continue;
69820 var edge = geoChooseEdge(unmovedNodes, end, projection);
69821 delta = vecSub(projection(edge.loc), start);
69827 var action = function(graph) {
69828 if (delta[0] === 0 && delta[1] === 0) return graph;
69832 if (!isEmpty(cache.intersection)) {
69836 forEach(cache.nodes, function(id) {
69837 var node = graph.entity(id),
69838 start = projection(node.loc),
69839 end = vecAdd(start, delta);
69840 graph = graph.replace(node.move(projection.invert(end)));
69843 if (!isEmpty(cache.intersection)) {
69844 graph = cleanupIntersections(graph);
69851 action.delta = function() {
69859 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
69860 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
69861 function actionMoveNode(nodeId, loc) {
69862 return function(graph) {
69863 return graph.replace(graph.entity(nodeId).move(loc));
69867 function actionNoop() {
69868 return function(graph) {
69874 * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
69876 function actionOrthogonalize(wayId, projection) {
69877 var threshold = 12, // degrees within right or straight to alter
69878 lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
69879 upperThreshold = Math.cos(threshold * Math.PI / 180);
69882 var action = function(graph, t) {
69883 if (t === null || !isFinite(t)) t = 1;
69884 t = Math.min(Math.max(+t, 0), 1);
69886 var way = graph.entity(wayId),
69887 nodes = graph.childNodes(way),
69888 points = uniq(nodes).map(function(n) { return projection(n.loc); }),
69889 corner = {i: 0, dotp: 1},
69891 node, loc, score, motions, i, j;
69893 if (points.length === 3) { // move only one vertex for right triangle
69894 for (i = 0; i < 1000; i++) {
69895 motions = points.map(calcMotion);
69896 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
69897 score = corner.dotp;
69898 if (score < epsilon) {
69903 node = graph.entity(nodes[corner.i].id);
69904 loc = projection.invert(points[corner.i]);
69905 graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
69909 originalPoints = clone(points);
69912 for (i = 0; i < 1000; i++) {
69913 motions = points.map(calcMotion);
69914 for (j = 0; j < motions.length; j++) {
69915 points[j] = addPoints(points[j],motions[j]);
69917 var newScore = squareness(points);
69918 if (newScore < score) {
69919 best = clone(points);
69922 if (score < epsilon) {
69929 for (i = 0; i < points.length; i++) {
69930 // only move the points that actually moved
69931 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
69932 loc = projection.invert(points[i]);
69933 node = graph.entity(nodes[i].id);
69934 graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
69938 // remove empty nodes on straight sections
69939 for (i = 0; t === 1 && i < points.length; i++) {
69940 node = graph.entity(nodes[i].id);
69942 if (graph.parentWays(node).length > 1 ||
69943 graph.parentRelations(node).length ||
69944 node.hasInterestingTags()) {
69948 var dotp = normalizedDotProduct(i, points);
69949 if (dotp < -1 + epsilon) {
69950 graph = actionDeleteNode(node.id)(graph);
69958 function calcMotion(b, i, array) {
69959 var a = array[(i - 1 + array.length) % array.length],
69960 c = array[(i + 1) % array.length],
69961 p = subtractPoints(a, b),
69962 q = subtractPoints(c, b),
69965 scale = 2 * Math.min(geoEuclideanDistance(p, [0, 0]), geoEuclideanDistance(q, [0, 0]));
69966 p = normalizePoint(p, 1.0);
69967 q = normalizePoint(q, 1.0);
69969 dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
69971 // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
69972 if (array.length > 3) {
69973 if (dotp < -0.707106781186547) {
69976 } else if (dotp && Math.abs(dotp) < corner.dotp) {
69978 corner.dotp = Math.abs(dotp);
69981 return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
69986 function squareness(points) {
69987 return points.reduce(function(sum, val, i, array) {
69988 var dotp = normalizedDotProduct(i, array);
69990 dotp = filterDotProduct(dotp);
69991 return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
69996 function normalizedDotProduct(i, points) {
69997 var a = points[(i - 1 + points.length) % points.length],
69999 c = points[(i + 1) % points.length],
70000 p = subtractPoints(a, b),
70001 q = subtractPoints(c, b);
70003 p = normalizePoint(p, 1.0);
70004 q = normalizePoint(q, 1.0);
70006 return p[0] * q[0] + p[1] * q[1];
70010 function subtractPoints(a, b) {
70011 return [a[0] - b[0], a[1] - b[1]];
70015 function addPoints(a, b) {
70016 return [a[0] + b[0], a[1] + b[1]];
70020 function normalizePoint(point, scale) {
70021 var vector = [0, 0];
70022 var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
70023 if (length !== 0) {
70024 vector[0] = point[0] / length;
70025 vector[1] = point[1] / length;
70028 vector[0] *= scale;
70029 vector[1] *= scale;
70035 function filterDotProduct(dotp) {
70036 if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
70044 action.disabled = function(graph) {
70045 var way = graph.entity(wayId),
70046 nodes = graph.childNodes(way),
70047 points = uniq(nodes).map(function(n) { return projection(n.loc); });
70049 if (squareness(points)) {
70053 return 'not_squarish';
70057 action.transitionable = true;
70063 // Split a way at the given node.
70065 // Optionally, split only the given ways, if multiple ways share
70068 // This is the inverse of `iD.actionJoin`.
70070 // For testing convenience, accepts an ID to assign to the new way.
70071 // Normally, this will be undefined and the way will automatically
70072 // be assigned a new ID.
70075 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
70077 function actionSplit(nodeId, newWayIds) {
70080 // if the way is closed, we need to search for a partner node
70081 // to split the way at.
70083 // The following looks for a node that is both far away from
70084 // the initial node in terms of way segment length and nearby
70085 // in terms of beeline-distance. This assures that areas get
70086 // split on the most "natural" points (independent of the number
70088 // For example: bone-shaped areas get split across their waist
70089 // line, circles across the diameter.
70090 function splitArea(nodes, idxA, graph) {
70091 var lengths = new Array(nodes.length),
70097 function wrap(index) {
70098 return utilWrap(index, nodes.length);
70101 function dist(nA, nB) {
70102 return geoSphericalDistance(graph.entity(nA).loc, graph.entity(nB).loc);
70105 // calculate lengths
70107 for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
70108 length += dist(nodes[i], nodes[wrap(i-1)]);
70109 lengths[i] = length;
70113 for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
70114 length += dist(nodes[i], nodes[wrap(i+1)]);
70115 if (length < lengths[i])
70116 lengths[i] = length;
70119 // determine best opposite node to split
70120 for (i = 0; i < nodes.length; i++) {
70121 var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
70132 function split(graph, wayA, newWayId) {
70133 var wayB = osmWay({id: newWayId, tags: wayA.tags}),
70136 isArea = wayA.isArea(),
70137 isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
70139 if (wayA.isClosed()) {
70140 var nodes = wayA.nodes.slice(0, -1),
70141 idxA = indexOf(nodes, nodeId),
70142 idxB = splitArea(nodes, idxA, graph);
70145 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
70146 nodesB = nodes.slice(idxB, idxA + 1);
70148 nodesA = nodes.slice(idxA, idxB + 1);
70149 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
70152 var idx = indexOf(wayA.nodes, nodeId, 1);
70153 nodesA = wayA.nodes.slice(0, idx + 1);
70154 nodesB = wayA.nodes.slice(idx);
70157 wayA = wayA.update({nodes: nodesA});
70158 wayB = wayB.update({nodes: nodesB});
70160 graph = graph.replace(wayA);
70161 graph = graph.replace(wayB);
70163 graph.parentRelations(wayA).forEach(function(relation) {
70164 if (relation.isRestriction()) {
70165 var via = relation.memberByRole('via');
70166 if (via && wayB.contains(via.id)) {
70167 relation = relation.replaceMember(wayA, wayB);
70168 graph = graph.replace(relation);
70171 if (relation === isOuter) {
70172 graph = graph.replace(relation.mergeTags(wayA.tags));
70173 graph = graph.replace(wayA.update({tags: {}}));
70174 graph = graph.replace(wayB.update({tags: {}}));
70180 role: relation.memberById(wayA.id).role
70183 graph = actionAddMember(relation.id, member)(graph);
70187 if (!isOuter && isArea) {
70188 var multipolygon = osmRelation({
70189 tags: assignIn$1({}, wayA.tags, {type: 'multipolygon'}),
70191 {id: wayA.id, role: 'outer', type: 'way'},
70192 {id: wayB.id, role: 'outer', type: 'way'}
70195 graph = graph.replace(multipolygon);
70196 graph = graph.replace(wayA.update({tags: {}}));
70197 graph = graph.replace(wayB.update({tags: {}}));
70204 var action = function(graph) {
70205 var candidates = action.ways(graph);
70206 for (var i = 0; i < candidates.length; i++) {
70207 graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
70213 action.ways = function(graph) {
70214 var node = graph.entity(nodeId),
70215 parents = graph.parentWays(node),
70216 hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
70218 return parents.filter(function(parent) {
70219 if (wayIds && wayIds.indexOf(parent.id) === -1)
70222 if (!wayIds && hasLines && parent.geometry(graph) !== 'line')
70225 if (parent.isClosed()) {
70229 for (var i = 1; i < parent.nodes.length - 1; i++) {
70230 if (parent.nodes[i] === nodeId) {
70240 action.disabled = function(graph) {
70241 var candidates = action.ways(graph);
70242 if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
70243 return 'not_eligible';
70247 action.limitWays = function(_) {
70248 if (!arguments.length) return wayIds;
70257 // Create a restriction relation for `turn`, which must have the following structure:
70260 // from: { node: <node ID>, way: <way ID> },
70261 // via: { node: <node ID> },
70262 // to: { node: <node ID>, way: <way ID> },
70263 // restriction: <'no_right_turn', 'no_left_turn', etc.>
70266 // This specifies a restriction of type `restriction` when traveling from
70267 // `from.node` in `from.way` toward `to.node` in `to.way` via `via.node`.
70268 // (The action does not check that these entities form a valid intersection.)
70270 // If `restriction` is not provided, it is automatically determined by
70271 // osmInferRestriction.
70273 // If necessary, the `from` and `to` ways are split. In these cases, `from.node`
70274 // and `to.node` are used to determine which portion of the split ways become
70275 // members of the restriction.
70277 // For testing convenience, accepts an ID to assign to the new relation.
70278 // Normally, this will be undefined and the relation will automatically
70279 // be assigned a new ID.
70281 function actionRestrictTurn(turn, projection, restrictionId) {
70283 return function(graph) {
70284 var from = graph.entity(turn.from.way),
70285 via = graph.entity(turn.via.node),
70286 to = graph.entity(turn.to.way);
70288 function isClosingNode(way, nodeId) {
70289 return nodeId === way.first() && nodeId === way.last();
70292 function split(toOrFrom) {
70293 var newID = toOrFrom.newID || osmWay().id;
70294 graph = actionSplit(via.id, [newID])
70295 .limitWays([toOrFrom.way])(graph);
70297 var a = graph.entity(newID),
70298 b = graph.entity(toOrFrom.way);
70300 if (a.nodes.indexOf(toOrFrom.node) !== -1) {
70307 if (!from.affix(via.id) || isClosingNode(from, via.id)) {
70308 if (turn.from.node === turn.to.node) {
70310 from = to = split(turn.from)[0];
70311 } else if (turn.from.way === turn.to.way) {
70312 // Straight-on or circular
70313 var s = split(turn.from);
70318 from = split(turn.from)[0];
70322 if (!to.affix(via.id) || isClosingNode(to, via.id)) {
70323 to = split(turn.to)[0];
70326 return graph.replace(osmRelation({
70329 type: 'restriction',
70330 restriction: turn.restriction ||
70331 osmInferRestriction(
70339 {id: from.id, type: 'way', role: 'from'},
70340 {id: via.id, type: 'node', role: 'via'},
70341 {id: to.id, type: 'way', role: 'to'}
70347 function actionRevert(id) {
70348 var action = function(graph) {
70349 var entity = graph.hasEntity(id),
70350 base = graph.base().entities[id];
70352 if (entity && !base) { // entity will be removed..
70353 if (entity.type === 'node') {
70354 graph.parentWays(entity)
70355 .forEach(function(parent) {
70356 parent = parent.removeNode(id);
70357 graph = graph.replace(parent);
70359 if (parent.isDegenerate()) {
70360 graph = actionDeleteWay(parent.id)(graph);
70365 graph.parentRelations(entity)
70366 .forEach(function(parent) {
70367 parent = parent.removeMembersWithID(id);
70368 graph = graph.replace(parent);
70370 if (parent.isDegenerate()) {
70371 graph = actionDeleteRelation(parent.id)(graph);
70376 return graph.revert(id);
70382 function actionRotate(rotateIds, pivot, angle, projection) {
70384 var action = function(graph) {
70385 return graph.update(function(graph) {
70386 utilGetAllNodes(rotateIds, graph).forEach(function(node) {
70387 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
70388 graph = graph.replace(node.move(projection.invert(point)));
70397 * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
70399 function actionStraighten(wayId, projection) {
70401 function positionAlongWay(n, s, e) {
70402 return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
70403 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
70407 var action = function(graph, t) {
70408 if (t === null || !isFinite(t)) t = 1;
70409 t = Math.min(Math.max(+t, 0), 1);
70411 var way = graph.entity(wayId),
70412 nodes = graph.childNodes(way),
70413 points = nodes.map(function(n) { return projection(n.loc); }),
70414 startPoint = points[0],
70415 endPoint = points[points.length-1],
70419 for (i = 1; i < points.length-1; i++) {
70420 var node = nodes[i],
70423 if (t < 1 || graph.parentWays(node).length > 1 ||
70424 graph.parentRelations(node).length ||
70425 node.hasInterestingTags()) {
70427 var u = positionAlongWay(point, startPoint, endPoint),
70429 startPoint[0] + u * (endPoint[0] - startPoint[0]),
70430 startPoint[1] + u * (endPoint[1] - startPoint[1])
70432 loc2 = projection.invert(p);
70434 graph = graph.replace(node.move(geoInterp(node.loc, loc2, t)));
70438 if (toDelete.indexOf(node) === -1) {
70439 toDelete.push(node);
70444 for (i = 0; i < toDelete.length; i++) {
70445 graph = actionDeleteNode(toDelete[i].id)(graph);
70452 action.disabled = function(graph) {
70453 // check way isn't too bendy
70454 var way = graph.entity(wayId),
70455 nodes = graph.childNodes(way),
70456 points = nodes.map(function(n) { return projection(n.loc); }),
70457 startPoint = points[0],
70458 endPoint = points[points.length-1],
70459 threshold = 0.2 * geoEuclideanDistance(startPoint, endPoint),
70462 if (threshold === 0) {
70463 return 'too_bendy';
70466 for (i = 1; i < points.length-1; i++) {
70467 var point = points[i],
70468 u = positionAlongWay(point, startPoint, endPoint),
70469 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
70470 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
70471 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
70473 // to bendy if point is off by 20% of total start/end distance in projected space
70474 if (isNaN(dist) || dist > threshold) {
70475 return 'too_bendy';
70481 action.transitionable = true;
70487 // Remove the effects of `turn.restriction` on `turn`, which must have the
70488 // following structure:
70491 // from: { node: <node ID>, way: <way ID> },
70492 // via: { node: <node ID> },
70493 // to: { node: <node ID>, way: <way ID> },
70494 // restriction: <relation ID>
70497 // In the simple case, `restriction` is a reference to a `no_*` restriction
70498 // on the turn itself. In this case, it is simply deleted.
70500 // The more complex case is where `restriction` references an `only_*`
70501 // restriction on a different turn in the same intersection. In that case,
70502 // that restriction is also deleted, but at the same time restrictions on
70503 // the turns other than the first two are created.
70505 function actionUnrestrictTurn(turn) {
70506 return function(graph) {
70507 return actionDeleteRelation(turn.restriction)(graph);
70511 /* Reflect the given area around its axis of symmetry */
70512 function actionReflect(reflectIds, projection) {
70513 var useLongAxis = true;
70516 // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
70517 // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
70518 function getSmallestSurroundingRectangle(graph, nodes) {
70519 var points = nodes.map(function(n) { return projection(n.loc); }),
70520 hull = d3_polygonHull(points),
70521 centroid = d3_polygonCentroid(hull),
70522 minArea = Infinity,
70527 for (var i = 0; i <= hull.length - 1; i++) {
70528 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
70529 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
70530 poly = geoRotate(hull, -angle, centroid),
70531 extent = poly.reduce(function(extent, point) {
70532 return extent.extend(geoExtent$$1(point));
70533 }, geoExtent$$1()),
70534 area = extent.area();
70536 if (area < minArea) {
70538 ssrExtent = extent;
70545 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
70551 var action = function(graph, t) {
70552 if (t === null || !isFinite(t)) t = 1;
70553 t = Math.min(Math.max(+t, 0), 1);
70555 var nodes = utilGetAllNodes(reflectIds, graph),
70556 ssr = getSmallestSurroundingRectangle(graph, nodes);
70558 // Choose line pq = axis of symmetry.
70559 // The shape's surrounding rectangle has 2 axes of symmetry.
70560 // Reflect across the longer axis by default.
70561 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
70562 q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
70563 p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
70564 q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
70567 var isLong = (geoEuclideanDistance(p1, q1) > geoEuclideanDistance(p2, q2));
70568 if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
70576 // reflect c across pq
70577 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
70578 var dx = q[0] - p[0];
70579 var dy = q[1] - p[1];
70580 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
70581 var b = 2 * dx * dy / (dx * dx + dy * dy);
70582 for (var i = 0; i < nodes.length; i++) {
70583 var node = nodes[i];
70584 var c = projection(node.loc);
70586 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
70587 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
70589 var loc2 = projection.invert(c2);
70590 node = node.move(geoInterp(node.loc, loc2, t));
70591 graph = graph.replace(node);
70598 action.useLongAxis = function(_) {
70599 if (!arguments.length) return useLongAxis;
70605 action.transitionable = true;
70613 var index$4 = Object.freeze({
70614 d3combobox: d3combobox,
70615 d3geoTile: d3geoTile,
70616 d3keybinding: d3keybinding
70619 /* export some legacy symbols: */
70620 var Connection = services.osm;
70626 var iD = Object.freeze({
70627 Connection: Connection,
70631 Context: coreContext,
70632 setAreaKeys: setAreaKeys,
70633 Difference: coreDifference,
70634 Graph: coreGraph$$1,
70635 History: coreHistory,
70637 Entity: osmEntity$$1,
70639 Relation: osmRelation,
70641 BackgroundSource: rendererBackgroundSource,
70642 Background: rendererBackground,
70643 Features: rendererFeatures,
70645 TileLayer: rendererTileLayer,
70646 Detect: utilDetect,
70647 uiPreset: uiPresetEditor,
70648 actionAddEntity: actionAddEntity,
70649 actionAddMember: actionAddMember,
70650 actionAddMidpoint: actionAddMidpoint,
70651 actionAddVertex: actionAddVertex,
70652 actionChangeMember: actionChangeMember,
70653 actionChangePreset: actionChangePreset,
70654 actionChangeTags: actionChangeTags,
70655 actionCircularize: actionCircularize,
70656 actionConnect: actionConnect,
70657 actionCopyEntities: actionCopyEntities,
70658 actionDeleteMember: actionDeleteMember,
70659 actionDeleteMultiple: actionDeleteMultiple,
70660 actionDeleteNode: actionDeleteNode,
70661 actionDeleteRelation: actionDeleteRelation,
70662 actionDeleteWay: actionDeleteWay,
70663 actionDeprecateTags: actionDeprecateTags,
70664 actionDiscardTags: actionDiscardTags,
70665 actionDisconnect: actionDisconnect,
70666 actionJoin: actionJoin,
70667 actionMerge: actionMerge,
70668 actionMergePolygon: actionMergePolygon,
70669 actionMergeRemoteChanges: actionMergeRemoteChanges,
70670 actionMove: actionMove,
70671 actionMoveNode: actionMoveNode,
70672 actionNoop: actionNoop,
70673 actionOrthogonalize: actionOrthogonalize,
70674 actionRestrictTurn: actionRestrictTurn,
70675 actionReverse: actionReverse,
70676 actionRevert: actionRevert,
70677 actionRotate: actionRotate,
70678 actionSplit: actionSplit,
70679 actionStraighten: actionStraighten,
70680 actionUnrestrictTurn: actionUnrestrictTurn,
70681 actionReflect: actionReflect,
70682 behaviorAddWay: behaviorAddWay,
70683 behaviorBreathe: behaviorBreathe,
70684 behaviorCopy: behaviorCopy,
70685 behaviorDrag: behaviorDrag,
70686 behaviorDrawWay: behaviorDrawWay,
70687 behaviorDraw: behaviorDraw,
70688 behaviorEdit: behaviorEdit,
70689 behaviorHash: behaviorHash,
70690 behaviorHover: behaviorHover,
70691 behaviorLasso: behaviorLasso,
70692 behaviorOperation: behaviorOperation,
70693 behaviorPaste: behaviorPaste,
70694 behaviorSelect: behaviorSelect,
70695 behaviorTail: behaviorTail,
70696 coreContext: coreContext,
70697 coreDifference: coreDifference,
70698 coreGraph: coreGraph$$1,
70699 coreHistory: coreHistory,
70700 coreTree: coreTree,
70701 dataFeatureIcons: dataFeatureIcons,
70703 dataWikipedia: dataWikipedia,
70704 dataSuggestions: dataSuggestions,
70705 dataAddressFormats: dataAddressFormats,
70706 dataDeprecated: dataDeprecated,
70707 dataDiscarded: dataDiscarded,
70708 dataLocales: dataLocales,
70709 dataPhoneFormats: dataPhoneFormats,
70710 dataShortcuts: dataShortcuts,
70711 dataImperial: dataImperial,
70712 dataDriveLeft: dataDriveLeft,
70714 geoAngle: geoAngle,
70715 geoChooseEdge: geoChooseEdge,
70716 geoCross: geoCross,
70717 geoEdgeEqual: geoEdgeEqual,
70718 geoEuclideanDistance: geoEuclideanDistance,
70719 geoExtent: geoExtent$$1,
70720 geoInterp: geoInterp,
70721 geoRawMercator: geoRawMercator,
70722 geoRoundCoords: geoRoundCoords,
70723 geoRotate: geoRotate,
70724 geoLatToMeters: geoLatToMeters,
70725 geoLineIntersection: geoLineIntersection,
70726 geoLonToMeters: geoLonToMeters,
70727 geoMetersToLat: geoMetersToLat,
70728 geoMetersToLon: geoMetersToLon,
70729 geoMetersToOffset: geoMetersToOffset,
70730 geoOffsetToMeters: geoOffsetToMeters,
70731 geoPathIntersections: geoPathIntersections,
70732 geoPathLength: geoPathLength,
70733 geoPointInPolygon: geoPointInPolygon,
70734 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
70735 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
70736 geoSphericalDistance: geoSphericalDistance,
70737 modeAddArea: modeAddArea$$1,
70738 modeAddLine: modeAddLine$$1,
70739 modeAddPoint: modeAddPoint$$1,
70740 modeBrowse: modeBrowse,
70741 modeDragNode: modeDragNode$$1,
70742 modeDrawArea: modeDrawArea,
70743 modeDrawLine: modeDrawLine,
70744 modeMove: modeMove$$1,
70745 modeRotate: modeRotate$$1,
70746 modeSave: modeSave$$1,
70747 modeSelect: modeSelect,
70748 operationCircularize: operationCircularize,
70749 operationContinue: operationContinue,
70750 operationDelete: operationDelete,
70751 operationDisconnect: operationDisconnect,
70752 operationMerge: operationMerge,
70753 operationMove: operationMove,
70754 operationOrthogonalize: operationOrthogonalize,
70755 operationReflectShort: operationReflectShort,
70756 operationReflectLong: operationReflectLong,
70757 operationReverse: operationReverse,
70758 operationRotate: operationRotate,
70759 operationSplit: operationSplit,
70760 operationStraighten: operationStraighten,
70761 osmChangeset: osmChangeset,
70762 osmEntity: osmEntity$$1,
70764 osmRelation: osmRelation,
70766 osmIntersection: osmIntersection,
70768 osmInferRestriction: osmInferRestriction,
70769 osmLanes: osmLanes,
70770 osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
70771 osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
70772 osmJoinWays: osmJoinWays,
70773 osmOneWayTags: osmOneWayTags,
70774 osmPavedTags: osmPavedTags,
70775 osmIsInterestingTag: osmIsInterestingTag,
70776 presetCategory: presetCategory,
70777 presetCollection: presetCollection,
70778 presetField: presetField,
70779 presetPreset: presetPreset,
70780 presetIndex: presetIndex,
70781 rendererBackgroundSource: rendererBackgroundSource,
70782 rendererBackground: rendererBackground,
70783 rendererFeatures: rendererFeatures,
70784 rendererMap: rendererMap,
70785 rendererTileLayer: rendererTileLayer,
70786 services: services,
70787 serviceMapillary: serviceMapillary,
70788 serviceNominatim: serviceNominatim,
70789 serviceOsm: serviceOsm,
70790 serviceTaginfo: serviceTaginfo,
70791 serviceWikidata: serviceWikidata,
70792 serviceWikipedia: serviceWikipedia,
70793 svgAreas: svgAreas$$1,
70794 svgDebug: svgDebug,
70798 svgLabels: svgLabels,
70799 svgLayers: svgLayers,
70800 svgLines: svgLines$$1,
70801 svgMapillaryImages: svgMapillaryImages,
70802 svgMapillarySigns: svgMapillarySigns,
70803 svgMidpoints: svgMidpoints$$1,
70804 svgOneWaySegments: svgOneWaySegments,
70807 svgPointTransform: svgPointTransform,
70808 svgPoints: svgPoints$$1,
70809 svgRelationMemberTags: svgRelationMemberTags,
70810 svgTagClasses: svgTagClasses,
70811 svgTurns: svgTurns,
70812 svgVertices: svgVertices$$1,
70813 uiFields: uiFields,
70814 uiFieldDefaultCheck: uiFieldCheck,
70815 uiFieldOnewayCheck: uiFieldCheck,
70816 uiFieldCheck: uiFieldCheck,
70817 uiFieldMultiCombo: uiFieldCombo,
70818 uiFieldNetworkCombo: uiFieldCombo,
70819 uiFieldSemiCombo: uiFieldCombo,
70820 uiFieldTypeCombo: uiFieldCombo,
70821 uiFieldCombo: uiFieldCombo,
70822 uiFieldUrl: uiFieldText,
70823 uiFieldNumber: uiFieldText,
70824 uiFieldTel: uiFieldText,
70825 uiFieldEmail: uiFieldText,
70826 uiFieldText: uiFieldText,
70827 uiFieldAccess: uiFieldAccess,
70828 uiFieldAddress: uiFieldAddress,
70829 uiFieldCycleway: uiFieldCycleway,
70830 uiFieldLanes: uiFieldLanes,
70831 uiFieldLocalized: uiFieldLocalized,
70832 uiFieldMaxspeed: uiFieldMaxspeed,
70833 uiFieldStructureRadio: uiFieldRadio,
70834 uiFieldRadio: uiFieldRadio,
70835 uiFieldRestrictions: uiFieldRestrictions,
70836 uiFieldTextarea: uiFieldTextarea,
70837 uiFieldWikipedia: uiFieldWikipedia,
70839 uiInfoPanels: uiInfoPanels,
70840 uiPanelBackground: uiPanelBackground,
70841 uiPanelHistory: uiPanelHistory,
70842 uiPanelLocation: uiPanelLocation,
70843 uiPanelMeasurement: uiPanelMeasurement,
70845 uiAccount: uiAccount,
70846 uiAttribution: uiAttribution,
70847 uiBackground: uiBackground,
70848 uiChangesetEditor: uiChangesetEditor,
70850 uiCommit: uiCommit,
70851 uiCommitChanges: uiCommitChanges,
70852 uiCommitWarnings: uiCommitWarnings,
70853 uiConfirm: uiConfirm,
70854 uiConflicts: uiConflicts,
70855 uiContributors: uiContributors,
70856 uiCurtain: uiCurtain,
70857 uiDisclosure: uiDisclosure,
70858 uiEditMenu: uiEditMenu,
70859 uiEntityEditor: uiEntityEditor,
70860 uiFeatureInfo: uiFeatureInfo,
70861 uiFeatureList: uiFeatureList,
70864 uiFormFields: uiFormFields,
70865 uiFullScreen: uiFullScreen,
70866 uiGeolocate: uiGeolocate,
70869 uiInspector: uiInspector,
70871 uiLoading: uiLoading,
70872 uiMapData: uiMapData,
70873 uiMapInMap: uiMapInMap,
70876 uiNotice: uiNotice,
70877 uiPresetEditor: uiPresetEditor,
70878 uiPresetIcon: uiPresetIcon,
70879 uiPresetList: uiPresetList,
70880 uiRadialMenu: uiRadialMenu,
70881 uiRawMemberEditor: uiRawMemberEditor,
70882 uiRawMembershipEditor: uiRawMembershipEditor,
70883 uiRawTagEditor: uiRawTagEditor,
70884 uiRestore: uiRestore,
70887 uiSelectionList: uiSelectionList,
70888 uiSidebar: uiSidebar,
70889 uiSourceSwitch: uiSourceSwitch,
70890 uiSpinner: uiSpinner,
70891 uiSplash: uiSplash,
70892 uiStatus: uiStatus,
70893 uiSuccess: uiSuccess,
70894 uiTagReference: uiTagReference,
70895 uiToggle: uiToggle,
70896 uiTooltipHtml: uiTooltipHtml,
70897 uiUndoRedo: uiUndoRedo,
70898 uiVersion: uiVersion,
70899 uiViewOnOSM: uiViewOnOSM,
70901 utilAsyncMap: utilAsyncMap,
70902 utilCallWhenIdle: utilCallWhenIdle,
70903 utilDisplayName: utilDisplayName,
70904 utilDisplayNameForPath: utilDisplayNameForPath,
70905 utilDisplayType: utilDisplayType,
70906 utilEditDistance: utilEditDistance,
70907 utilEntitySelector: utilEntitySelector,
70908 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
70909 utilFastMouse: utilFastMouse,
70910 utilFunctor: utilFunctor,
70911 utilGetAllNodes: utilGetAllNodes,
70912 utilGetPrototypeOf: utilGetPrototypeOf,
70913 utilGetSetValue: utilGetSetValue,
70914 utilIdleWorker: utilIdleWorker,
70915 utilNoAuto: utilNoAuto,
70916 utilPrefixCSSProperty: utilPrefixCSSProperty,
70917 utilPrefixDOMProperty: utilPrefixDOMProperty,
70918 utilQsString: utilQsString,
70919 utilRebind: utilRebind,
70920 utilSetTransform: utilSetTransform,
70921 utilSessionMutex: utilSessionMutex,
70922 utilStringQs: utilStringQs,
70923 utilSuggestNames: utilSuggestNames,
70924 utilTagText: utilTagText,
70925 utilTriggerEvent: utilTriggerEvent,
70926 utilWrap: utilWrap,
70927 d3combobox: d3combobox,
70928 d3geoTile: d3geoTile,
70929 d3keybinding: d3keybinding,
70930 validationDeprecatedTag: validationDeprecatedTag,
70931 validationDisconnectedHighway: validationDisconnectedHighway,
70932 validationManyDeletions: validationManyDeletions,
70933 validationMissingTag: validationMissingTag,
70934 validationOldMultipolygon: validationOldMultipolygon,
70935 validationTagSuggestsArea: validationTagSuggestsArea
70941 //# sourceMappingURL=iD.js.map