2 var version = "4.13.0";
4 function d3_ascending(a, b) {
5 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
8 function d3_bisector(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 function pairs(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 function cross(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 function d3_descending(a, b) {
76 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
80 return x === null ? NaN : +x;
83 function variance(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 function deviation(array, f) {
116 var v = variance(array, f);
117 return v ? Math.sqrt(v) : v;
120 function extent(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 function constant(x) {
169 function identity(x) {
173 function d3_range(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),
191 function ticks(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 function sturges(values) {
240 return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
243 function histogram() {
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 function threshold(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 function freedmanDiaconis(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 function scott(values, min, max) {
329 return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
332 function max(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 function mean(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 function d3_median(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 function merge(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 function min(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 function permute(array, indexes) {
474 var i = indexes.length, permutes = new Array(i);
475 while (i--) permutes[i] = array[indexes[i]];
479 function scan(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 function shuffle(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 function sum(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 function transpose(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];
549 return transpose(arguments);
552 var slice$1 = Array.prototype.slice;
554 function identity$1(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 function namespace(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 function creator(name) {
846 var fullname = namespace(name);
847 return (fullname.local
849 : creatorInherit)(fullname);
854 function selector(selector) {
855 return selector == null ? none : function() {
856 return this.querySelector(selector);
860 function selection_select(select) {
861 if (typeof select !== "function") select = selector(select);
863 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
864 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
865 if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
866 if ("__data__" in node) subnode.__data__ = node.__data__;
867 subgroup[i] = subnode;
872 return new Selection(subgroups, this._parents);
879 function selectorAll(selector) {
880 return selector == null ? empty : function() {
881 return this.querySelectorAll(selector);
885 function selection_selectAll(select) {
886 if (typeof select !== "function") select = selectorAll(select);
888 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
889 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
890 if (node = group[i]) {
891 subgroups.push(select.call(node, node.__data__, i, group));
897 return new Selection(subgroups, parents);
900 var matcher = function(selector) {
902 return this.matches(selector);
906 if (typeof document !== "undefined") {
907 var element = document.documentElement;
908 if (!element.matches) {
909 var vendorMatches = element.webkitMatchesSelector
910 || element.msMatchesSelector
911 || element.mozMatchesSelector
912 || element.oMatchesSelector;
913 matcher = function(selector) {
915 return vendorMatches.call(this, selector);
921 var matcher$1 = matcher;
923 function selection_filter(match) {
924 if (typeof match !== "function") match = matcher$1(match);
926 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
927 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
928 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
934 return new Selection(subgroups, this._parents);
937 function sparse(update) {
938 return new Array(update.length);
941 function selection_enter() {
942 return new Selection(this._enter || this._groups.map(sparse), this._parents);
945 function EnterNode(parent, datum) {
946 this.ownerDocument = parent.ownerDocument;
947 this.namespaceURI = parent.namespaceURI;
949 this._parent = parent;
950 this.__data__ = datum;
953 EnterNode.prototype = {
954 constructor: EnterNode,
955 appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
956 insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
957 querySelector: function(selector) { return this._parent.querySelector(selector); },
958 querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
961 function constant$1(x) {
967 var keyPrefix = "$"; // Protect against keys like “__proto__”.
969 function bindIndex(parent, group, enter, update, exit, data) {
972 groupLength = group.length,
973 dataLength = data.length;
975 // Put any non-null nodes that fit into update.
976 // Put any null nodes into enter.
977 // Put any remaining data into enter.
978 for (; i < dataLength; ++i) {
979 if (node = group[i]) {
980 node.__data__ = data[i];
983 enter[i] = new EnterNode(parent, data[i]);
987 // Put any non-null nodes that don’t fit into exit.
988 for (; i < groupLength; ++i) {
989 if (node = group[i]) {
995 function bindKey(parent, group, enter, update, exit, data, key) {
999 groupLength = group.length,
1000 dataLength = data.length,
1001 keyValues = new Array(groupLength),
1004 // Compute the key for each node.
1005 // If multiple nodes have the same key, the duplicates are added to exit.
1006 for (i = 0; i < groupLength; ++i) {
1007 if (node = group[i]) {
1008 keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1009 if (keyValue in nodeByKeyValue) {
1012 nodeByKeyValue[keyValue] = node;
1017 // Compute the key for each datum.
1018 // If there a node associated with this key, join and add it to update.
1019 // If there is not (or the key is a duplicate), add it to enter.
1020 for (i = 0; i < dataLength; ++i) {
1021 keyValue = keyPrefix + key.call(parent, data[i], i, data);
1022 if (node = nodeByKeyValue[keyValue]) {
1024 node.__data__ = data[i];
1025 nodeByKeyValue[keyValue] = null;
1027 enter[i] = new EnterNode(parent, data[i]);
1031 // Add any remaining nodes that were not bound to data to exit.
1032 for (i = 0; i < groupLength; ++i) {
1033 if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1039 function selection_data(value, key) {
1041 data = new Array(this.size()), j = -1;
1042 this.each(function(d) { data[++j] = d; });
1046 var bind = key ? bindKey : bindIndex,
1047 parents = this._parents,
1048 groups = this._groups;
1050 if (typeof value !== "function") value = constant$1(value);
1052 for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1053 var parent = parents[j],
1055 groupLength = group.length,
1056 data = value.call(parent, parent && parent.__data__, j, parents),
1057 dataLength = data.length,
1058 enterGroup = enter[j] = new Array(dataLength),
1059 updateGroup = update[j] = new Array(dataLength),
1060 exitGroup = exit[j] = new Array(groupLength);
1062 bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1064 // Now connect the enter nodes to their following update node, such that
1065 // appendChild can insert the materialized enter node before this node,
1066 // rather than at the end of the parent node.
1067 for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1068 if (previous = enterGroup[i0]) {
1069 if (i0 >= i1) i1 = i0 + 1;
1070 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1071 previous._next = next || null;
1076 update = new Selection(update, parents);
1077 update._enter = enter;
1078 update._exit = exit;
1082 function selection_exit() {
1083 return new Selection(this._exit || this._groups.map(sparse), this._parents);
1086 function selection_merge(selection$$1) {
1088 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) {
1089 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1090 if (node = group0[i] || group1[i]) {
1096 for (; j < m0; ++j) {
1097 merges[j] = groups0[j];
1100 return new Selection(merges, this._parents);
1103 function selection_order() {
1105 for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1106 for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1107 if (node = group[i]) {
1108 if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1117 function selection_sort(compare) {
1118 if (!compare) compare = ascending;
1120 function compareNode(a, b) {
1121 return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1124 for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1125 for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1126 if (node = group[i]) {
1127 sortgroup[i] = node;
1130 sortgroup.sort(compareNode);
1133 return new Selection(sortgroups, this._parents).order();
1136 function ascending(a, b) {
1137 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1140 function selection_call() {
1141 var callback = arguments[0];
1142 arguments[0] = this;
1143 callback.apply(null, arguments);
1147 function selection_nodes() {
1148 var nodes = new Array(this.size()), i = -1;
1149 this.each(function() { nodes[++i] = this; });
1153 function selection_node() {
1155 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1156 for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1157 var node = group[i];
1158 if (node) return node;
1165 function selection_size() {
1167 this.each(function() { ++size; });
1171 function selection_empty() {
1172 return !this.node();
1175 function selection_each(callback) {
1177 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1178 for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1179 if (node = group[i]) callback.call(node, node.__data__, i, group);
1186 function attrRemove(name) {
1188 this.removeAttribute(name);
1192 function attrRemoveNS(fullname) {
1194 this.removeAttributeNS(fullname.space, fullname.local);
1198 function attrConstant(name, value) {
1200 this.setAttribute(name, value);
1204 function attrConstantNS(fullname, value) {
1206 this.setAttributeNS(fullname.space, fullname.local, value);
1210 function attrFunction(name, value) {
1212 var v = value.apply(this, arguments);
1213 if (v == null) this.removeAttribute(name);
1214 else this.setAttribute(name, v);
1218 function attrFunctionNS(fullname, value) {
1220 var v = value.apply(this, arguments);
1221 if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1222 else this.setAttributeNS(fullname.space, fullname.local, v);
1226 function selection_attr(name, value) {
1227 var fullname = namespace(name);
1229 if (arguments.length < 2) {
1230 var node = this.node();
1231 return fullname.local
1232 ? node.getAttributeNS(fullname.space, fullname.local)
1233 : node.getAttribute(fullname);
1236 return this.each((value == null
1237 ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1238 ? (fullname.local ? attrFunctionNS : attrFunction)
1239 : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1242 function defaultView(node) {
1243 return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1244 || (node.document && node) // node is a Window
1245 || node.defaultView; // node is a Document
1248 function styleRemove(name) {
1250 this.style.removeProperty(name);
1254 function styleConstant(name, value, priority) {
1256 this.style.setProperty(name, value, priority);
1260 function styleFunction(name, value, priority) {
1262 var v = value.apply(this, arguments);
1263 if (v == null) this.style.removeProperty(name);
1264 else this.style.setProperty(name, v, priority);
1268 function selection_style(name, value, priority) {
1269 return arguments.length > 1
1270 ? this.each((value == null
1271 ? styleRemove : typeof value === "function"
1273 : styleConstant)(name, value, priority == null ? "" : priority))
1274 : styleValue(this.node(), name);
1277 function styleValue(node, name) {
1278 return node.style.getPropertyValue(name)
1279 || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1282 function propertyRemove(name) {
1288 function propertyConstant(name, value) {
1294 function propertyFunction(name, value) {
1296 var v = value.apply(this, arguments);
1297 if (v == null) delete this[name];
1298 else this[name] = v;
1302 function selection_property(name, value) {
1303 return arguments.length > 1
1304 ? this.each((value == null
1305 ? propertyRemove : typeof value === "function"
1307 : propertyConstant)(name, value))
1308 : this.node()[name];
1311 function classArray(string) {
1312 return string.trim().split(/^|\s+/);
1315 function classList(node) {
1316 return node.classList || new ClassList(node);
1319 function ClassList(node) {
1321 this._names = classArray(node.getAttribute("class") || "");
1324 ClassList.prototype = {
1325 add: function(name) {
1326 var i = this._names.indexOf(name);
1328 this._names.push(name);
1329 this._node.setAttribute("class", this._names.join(" "));
1332 remove: function(name) {
1333 var i = this._names.indexOf(name);
1335 this._names.splice(i, 1);
1336 this._node.setAttribute("class", this._names.join(" "));
1339 contains: function(name) {
1340 return this._names.indexOf(name) >= 0;
1344 function classedAdd(node, names) {
1345 var list = classList(node), i = -1, n = names.length;
1346 while (++i < n) list.add(names[i]);
1349 function classedRemove(node, names) {
1350 var list = classList(node), i = -1, n = names.length;
1351 while (++i < n) list.remove(names[i]);
1354 function classedTrue(names) {
1356 classedAdd(this, names);
1360 function classedFalse(names) {
1362 classedRemove(this, names);
1366 function classedFunction(names, value) {
1368 (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1372 function selection_classed(name, value) {
1373 var names = classArray(name + "");
1375 if (arguments.length < 2) {
1376 var list = classList(this.node()), i = -1, n = names.length;
1377 while (++i < n) if (!list.contains(names[i])) return false;
1381 return this.each((typeof value === "function"
1382 ? classedFunction : value
1384 : classedFalse)(names, value));
1387 function textRemove() {
1388 this.textContent = "";
1391 function textConstant(value) {
1393 this.textContent = value;
1397 function textFunction(value) {
1399 var v = value.apply(this, arguments);
1400 this.textContent = v == null ? "" : v;
1404 function selection_text(value) {
1405 return arguments.length
1406 ? this.each(value == null
1407 ? textRemove : (typeof value === "function"
1409 : textConstant)(value))
1410 : this.node().textContent;
1413 function htmlRemove() {
1414 this.innerHTML = "";
1417 function htmlConstant(value) {
1419 this.innerHTML = value;
1423 function htmlFunction(value) {
1425 var v = value.apply(this, arguments);
1426 this.innerHTML = v == null ? "" : v;
1430 function selection_html(value) {
1431 return arguments.length
1432 ? this.each(value == null
1433 ? htmlRemove : (typeof value === "function"
1435 : htmlConstant)(value))
1436 : this.node().innerHTML;
1440 if (this.nextSibling) this.parentNode.appendChild(this);
1443 function selection_raise() {
1444 return this.each(raise);
1448 if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1451 function selection_lower() {
1452 return this.each(lower);
1455 function selection_append(name) {
1456 var create = typeof name === "function" ? name : creator(name);
1457 return this.select(function() {
1458 return this.appendChild(create.apply(this, arguments));
1462 function constantNull() {
1466 function selection_insert(name, before) {
1467 var create = typeof name === "function" ? name : creator(name),
1468 select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1469 return this.select(function() {
1470 return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1475 var parent = this.parentNode;
1476 if (parent) parent.removeChild(this);
1479 function selection_remove() {
1480 return this.each(remove);
1483 function selection_cloneShallow() {
1484 return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1487 function selection_cloneDeep() {
1488 return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1491 function selection_clone(deep) {
1492 return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1495 function selection_datum(value) {
1496 return arguments.length
1497 ? this.property("__data__", value)
1498 : this.node().__data__;
1501 var filterEvents = {};
1505 if (typeof document !== "undefined") {
1506 var element$1 = document.documentElement;
1507 if (!("onmouseenter" in element$1)) {
1508 filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1512 function filterContextListener(listener, index, group) {
1513 listener = contextListener(listener, index, group);
1514 return function(event) {
1515 var related = event.relatedTarget;
1516 if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
1517 listener.call(this, event);
1522 function contextListener(listener, index, group) {
1523 return function(event1) {
1524 var event0 = event; // Events can be reentrant (e.g., focus).
1527 listener.call(this, this.__data__, index, group);
1534 function parseTypenames$1(typenames) {
1535 return typenames.trim().split(/^|\s+/).map(function(t) {
1536 var name = "", i = t.indexOf(".");
1537 if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
1538 return {type: t, name: name};
1542 function onRemove(typename) {
1546 for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
1547 if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
1548 this.removeEventListener(o.type, o.listener, o.capture);
1553 if (++i) on.length = i;
1554 else delete this.__on;
1558 function onAdd(typename, value, capture) {
1559 var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
1560 return function(d, i, group) {
1561 var on = this.__on, o, listener = wrap(value, i, group);
1562 if (on) for (var j = 0, m = on.length; j < m; ++j) {
1563 if ((o = on[j]).type === typename.type && o.name === typename.name) {
1564 this.removeEventListener(o.type, o.listener, o.capture);
1565 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
1570 this.addEventListener(typename.type, listener, capture);
1571 o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
1572 if (!on) this.__on = [o];
1577 function selection_on(typename, value, capture) {
1578 var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1580 if (arguments.length < 2) {
1581 var on = this.node().__on;
1582 if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
1583 for (i = 0, o = on[j]; i < n; ++i) {
1584 if ((t = typenames[i]).type === o.type && t.name === o.name) {
1592 on = value ? onAdd : onRemove;
1593 if (capture == null) capture = false;
1594 for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1598 function customEvent(event1, listener, that, args) {
1600 event1.sourceEvent = event;
1603 return listener.apply(that, args);
1609 function dispatchEvent(node, type, params) {
1610 var window = defaultView(node),
1611 event = window.CustomEvent;
1613 if (typeof event === "function") {
1614 event = new event(type, params);
1616 event = window.document.createEvent("Event");
1617 if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1618 else event.initEvent(type, false, false);
1621 node.dispatchEvent(event);
1624 function dispatchConstant(type, params) {
1626 return dispatchEvent(this, type, params);
1630 function dispatchFunction(type, params) {
1632 return dispatchEvent(this, type, params.apply(this, arguments));
1636 function selection_dispatch(type, params) {
1637 return this.each((typeof params === "function"
1639 : dispatchConstant)(type, params));
1644 function Selection(groups, parents) {
1645 this._groups = groups;
1646 this._parents = parents;
1649 function selection() {
1650 return new Selection([[document.documentElement]], root);
1653 Selection.prototype = selection.prototype = {
1654 constructor: Selection,
1655 select: selection_select,
1656 selectAll: selection_selectAll,
1657 filter: selection_filter,
1658 data: selection_data,
1659 enter: selection_enter,
1660 exit: selection_exit,
1661 merge: selection_merge,
1662 order: selection_order,
1663 sort: selection_sort,
1664 call: selection_call,
1665 nodes: selection_nodes,
1666 node: selection_node,
1667 size: selection_size,
1668 empty: selection_empty,
1669 each: selection_each,
1670 attr: selection_attr,
1671 style: selection_style,
1672 property: selection_property,
1673 classed: selection_classed,
1674 text: selection_text,
1675 html: selection_html,
1676 raise: selection_raise,
1677 lower: selection_lower,
1678 append: selection_append,
1679 insert: selection_insert,
1680 remove: selection_remove,
1681 clone: selection_clone,
1682 datum: selection_datum,
1684 dispatch: selection_dispatch
1687 function d3_select(selector) {
1688 return typeof selector === "string"
1689 ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690 : new Selection([[selector]], root);
1693 function create(name) {
1694 return d3_select(creator(name).call(document.documentElement));
1704 this._ = "@" + (++nextId).toString(36);
1707 Local.prototype = local.prototype = {
1709 get: function(node) {
1711 while (!(id in node)) if (!(node = node.parentNode)) return;
1714 set: function(node, value) {
1715 return node[this._] = value;
1717 remove: function(node) {
1718 return this._ in node && delete node[this._];
1720 toString: function() {
1725 function sourceEvent() {
1726 var current = event, source;
1727 while (source = current.sourceEvent) current = source;
1731 function point(node, event) {
1732 var svg = node.ownerSVGElement || node;
1734 if (svg.createSVGPoint) {
1735 var point = svg.createSVGPoint();
1736 point.x = event.clientX, point.y = event.clientY;
1737 point = point.matrixTransform(node.getScreenCTM().inverse());
1738 return [point.x, point.y];
1741 var rect = node.getBoundingClientRect();
1742 return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1745 function d3_mouse(node) {
1746 var event = sourceEvent();
1747 if (event.changedTouches) event = event.changedTouches[0];
1748 return point(node, event);
1751 function d3_selectAll(selector) {
1752 return typeof selector === "string"
1753 ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1754 : new Selection([selector == null ? [] : selector], root);
1757 function touch(node, touches, identifier) {
1758 if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1760 for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1761 if ((touch = touches[i]).identifier === identifier) {
1762 return point(node, touch);
1769 function d3_touches(node, touches) {
1770 if (touches == null) touches = sourceEvent().touches;
1772 for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773 points[i] = point(node, touches[i]);
1779 function nopropagation() {
1780 event.stopImmediatePropagation();
1783 function noevent() {
1784 event.preventDefault();
1785 event.stopImmediatePropagation();
1788 function dragDisable(view) {
1789 var root = view.document.documentElement,
1790 selection$$1 = d3_select(view).on("dragstart.drag", noevent, true);
1791 if ("onselectstart" in root) {
1792 selection$$1.on("selectstart.drag", noevent, true);
1794 root.__noselect = root.style.MozUserSelect;
1795 root.style.MozUserSelect = "none";
1799 function yesdrag(view, noclick) {
1800 var root = view.document.documentElement,
1801 selection$$1 = d3_select(view).on("dragstart.drag", null);
1803 selection$$1.on("click.drag", noevent, true);
1804 setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1806 if ("onselectstart" in root) {
1807 selection$$1.on("selectstart.drag", null);
1809 root.style.MozUserSelect = root.__noselect;
1810 delete root.__noselect;
1814 function constant$2(x) {
1820 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821 this.target = target;
1823 this.subject = subject;
1824 this.identifier = id;
1825 this.active = active;
1833 DragEvent.prototype.on = function() {
1834 var value = this._.on.apply(this._, arguments);
1835 return value === this._ ? this : value;
1838 // Ignore right-click, since that should open the context menu.
1839 function defaultFilter() {
1840 return !event.button;
1843 function defaultContainer() {
1844 return this.parentNode;
1847 function defaultSubject(d) {
1848 return d == null ? {x: event.x, y: event.y} : d;
1851 function defaultTouchable() {
1852 return "ontouchstart" in this;
1856 var filter = defaultFilter,
1857 container = defaultContainer,
1858 subject = defaultSubject,
1859 touchable = defaultTouchable,
1861 listeners = dispatch("start", "drag", "end"),
1869 function drag(selection$$1) {
1871 .on("mousedown.drag", mousedowned)
1873 .on("touchstart.drag", touchstarted)
1874 .on("touchmove.drag", touchmoved)
1875 .on("touchend.drag touchcancel.drag", touchended)
1876 .style("touch-action", "none")
1877 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1880 function mousedowned() {
1881 if (touchending || !filter.apply(this, arguments)) return;
1882 var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
1883 if (!gesture) return;
1884 d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1885 dragDisable(event.view);
1887 mousemoving = false;
1888 mousedownx = event.clientX;
1889 mousedowny = event.clientY;
1893 function mousemoved() {
1896 var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897 mousemoving = dx * dx + dy * dy > clickDistance2;
1899 gestures.mouse("drag");
1902 function mouseupped() {
1903 d3_select(event.view).on("mousemove.drag mouseup.drag", null);
1904 yesdrag(event.view, mousemoving);
1906 gestures.mouse("end");
1909 function touchstarted() {
1910 if (!filter.apply(this, arguments)) return;
1911 var touches = event.changedTouches,
1912 c = container.apply(this, arguments),
1913 n = touches.length, i, gesture;
1915 for (i = 0; i < n; ++i) {
1916 if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1923 function touchmoved() {
1924 var touches = event.changedTouches,
1925 n = touches.length, i, gesture;
1927 for (i = 0; i < n; ++i) {
1928 if (gesture = gestures[touches[i].identifier]) {
1935 function touchended() {
1936 var touches = event.changedTouches,
1937 n = touches.length, i, gesture;
1939 if (touchending) clearTimeout(touchending);
1940 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1941 for (i = 0; i < n; ++i) {
1942 if (gesture = gestures[touches[i].identifier]) {
1949 function beforestart(id, container, point$$1, that, args) {
1950 var p = point$$1(container, id), s, dx, dy,
1951 sublisteners = listeners.copy();
1953 if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1954 if ((event.subject = s = subject.apply(that, args)) == null) return false;
1955 dx = s.x - p[0] || 0;
1956 dy = s.y - p[1] || 0;
1960 return function gesture(type) {
1963 case "start": gestures[id] = gesture, n = active++; break;
1964 case "end": delete gestures[id], --active; // nobreak
1965 case "drag": p = point$$1(container, id), n = active; break;
1967 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]);
1971 drag.filter = function(_) {
1972 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1975 drag.container = function(_) {
1976 return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1979 drag.subject = function(_) {
1980 return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1983 drag.touchable = function(_) {
1984 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1987 drag.on = function() {
1988 var value = listeners.on.apply(listeners, arguments);
1989 return value === listeners ? drag : value;
1992 drag.clickDistance = function(_) {
1993 return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1999 function define(constructor, factory, prototype) {
2000 constructor.prototype = factory.prototype = prototype;
2001 prototype.constructor = constructor;
2004 function extend(parent, definition) {
2005 var prototype = Object.create(parent.prototype);
2006 for (var key in definition) prototype[key] = definition[key];
2013 var brighter = 1 / darker;
2015 var reI = "\\s*([+-]?\\d+)\\s*",
2016 reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
2017 reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
2018 reHex3 = /^#([0-9a-f]{3})$/,
2019 reHex6 = /^#([0-9a-f]{6})$/,
2020 reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
2021 reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
2022 reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
2023 reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
2024 reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
2025 reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2028 aliceblue: 0xf0f8ff,
2029 antiquewhite: 0xfaebd7,
2031 aquamarine: 0x7fffd4,
2036 blanchedalmond: 0xffebcd,
2038 blueviolet: 0x8a2be2,
2040 burlywood: 0xdeb887,
2041 cadetblue: 0x5f9ea0,
2042 chartreuse: 0x7fff00,
2043 chocolate: 0xd2691e,
2045 cornflowerblue: 0x6495ed,
2051 darkgoldenrod: 0xb8860b,
2053 darkgreen: 0x006400,
2055 darkkhaki: 0xbdb76b,
2056 darkmagenta: 0x8b008b,
2057 darkolivegreen: 0x556b2f,
2058 darkorange: 0xff8c00,
2059 darkorchid: 0x9932cc,
2061 darksalmon: 0xe9967a,
2062 darkseagreen: 0x8fbc8f,
2063 darkslateblue: 0x483d8b,
2064 darkslategray: 0x2f4f4f,
2065 darkslategrey: 0x2f4f4f,
2066 darkturquoise: 0x00ced1,
2067 darkviolet: 0x9400d3,
2069 deepskyblue: 0x00bfff,
2072 dodgerblue: 0x1e90ff,
2073 firebrick: 0xb22222,
2074 floralwhite: 0xfffaf0,
2075 forestgreen: 0x228b22,
2077 gainsboro: 0xdcdcdc,
2078 ghostwhite: 0xf8f8ff,
2080 goldenrod: 0xdaa520,
2083 greenyellow: 0xadff2f,
2087 indianred: 0xcd5c5c,
2092 lavenderblush: 0xfff0f5,
2093 lawngreen: 0x7cfc00,
2094 lemonchiffon: 0xfffacd,
2095 lightblue: 0xadd8e6,
2096 lightcoral: 0xf08080,
2097 lightcyan: 0xe0ffff,
2098 lightgoldenrodyellow: 0xfafad2,
2099 lightgray: 0xd3d3d3,
2100 lightgreen: 0x90ee90,
2101 lightgrey: 0xd3d3d3,
2102 lightpink: 0xffb6c1,
2103 lightsalmon: 0xffa07a,
2104 lightseagreen: 0x20b2aa,
2105 lightskyblue: 0x87cefa,
2106 lightslategray: 0x778899,
2107 lightslategrey: 0x778899,
2108 lightsteelblue: 0xb0c4de,
2109 lightyellow: 0xffffe0,
2111 limegreen: 0x32cd32,
2115 mediumaquamarine: 0x66cdaa,
2116 mediumblue: 0x0000cd,
2117 mediumorchid: 0xba55d3,
2118 mediumpurple: 0x9370db,
2119 mediumseagreen: 0x3cb371,
2120 mediumslateblue: 0x7b68ee,
2121 mediumspringgreen: 0x00fa9a,
2122 mediumturquoise: 0x48d1cc,
2123 mediumvioletred: 0xc71585,
2124 midnightblue: 0x191970,
2125 mintcream: 0xf5fffa,
2126 mistyrose: 0xffe4e1,
2128 navajowhite: 0xffdead,
2132 olivedrab: 0x6b8e23,
2134 orangered: 0xff4500,
2136 palegoldenrod: 0xeee8aa,
2137 palegreen: 0x98fb98,
2138 paleturquoise: 0xafeeee,
2139 palevioletred: 0xdb7093,
2140 papayawhip: 0xffefd5,
2141 peachpuff: 0xffdab9,
2145 powderblue: 0xb0e0e6,
2147 rebeccapurple: 0x663399,
2149 rosybrown: 0xbc8f8f,
2150 royalblue: 0x4169e1,
2151 saddlebrown: 0x8b4513,
2153 sandybrown: 0xf4a460,
2159 slateblue: 0x6a5acd,
2160 slategray: 0x708090,
2161 slategrey: 0x708090,
2163 springgreen: 0x00ff7f,
2164 steelblue: 0x4682b4,
2169 turquoise: 0x40e0d0,
2173 whitesmoke: 0xf5f5f5,
2175 yellowgreen: 0x9acd32
2178 define(Color, color, {
2179 displayable: function() {
2180 return this.rgb().displayable();
2182 toString: function() {
2183 return this.rgb() + "";
2187 function color(format) {
2189 format = (format + "").trim().toLowerCase();
2190 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
2191 : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2192 : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2193 : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2194 : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2195 : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2196 : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2197 : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2198 : named.hasOwnProperty(format) ? rgbn(named[format])
2199 : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2204 return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2207 function rgba(r, g, b, a) {
2208 if (a <= 0) r = g = b = NaN;
2209 return new Rgb(r, g, b, a);
2212 function rgbConvert(o) {
2213 if (!(o instanceof Color)) o = color(o);
2214 if (!o) return new Rgb;
2216 return new Rgb(o.r, o.g, o.b, o.opacity);
2219 function rgb(r, g, b, opacity) {
2220 return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2223 function Rgb(r, g, b, opacity) {
2227 this.opacity = +opacity;
2230 define(Rgb, rgb, extend(Color, {
2231 brighter: function(k) {
2232 k = k == null ? brighter : Math.pow(brighter, k);
2233 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2235 darker: function(k) {
2236 k = k == null ? darker : Math.pow(darker, k);
2237 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2242 displayable: function() {
2243 return (0 <= this.r && this.r <= 255)
2244 && (0 <= this.g && this.g <= 255)
2245 && (0 <= this.b && this.b <= 255)
2246 && (0 <= this.opacity && this.opacity <= 1);
2248 toString: function() {
2249 var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2250 return (a === 1 ? "rgb(" : "rgba(")
2251 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2252 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2253 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2254 + (a === 1 ? ")" : ", " + a + ")");
2258 function hsla(h, s, l, a) {
2259 if (a <= 0) h = s = l = NaN;
2260 else if (l <= 0 || l >= 1) h = s = NaN;
2261 else if (s <= 0) h = NaN;
2262 return new Hsl(h, s, l, a);
2265 function hslConvert(o) {
2266 if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2267 if (!(o instanceof Color)) o = color(o);
2268 if (!o) return new Hsl;
2269 if (o instanceof Hsl) return o;
2274 min = Math.min(r, g, b),
2275 max = Math.max(r, g, b),
2278 l = (max + min) / 2;
2280 if (r === max) h = (g - b) / s + (g < b) * 6;
2281 else if (g === max) h = (b - r) / s + 2;
2282 else h = (r - g) / s + 4;
2283 s /= l < 0.5 ? max + min : 2 - max - min;
2286 s = l > 0 && l < 1 ? 0 : h;
2288 return new Hsl(h, s, l, o.opacity);
2291 function hsl(h, s, l, opacity) {
2292 return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2295 function Hsl(h, s, l, opacity) {
2299 this.opacity = +opacity;
2302 define(Hsl, hsl, extend(Color, {
2303 brighter: function(k) {
2304 k = k == null ? brighter : Math.pow(brighter, k);
2305 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2307 darker: function(k) {
2308 k = k == null ? darker : Math.pow(darker, k);
2309 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2312 var h = this.h % 360 + (this.h < 0) * 360,
2313 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2315 m2 = l + (l < 0.5 ? l : 1 - l) * s,
2318 hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2320 hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2324 displayable: function() {
2325 return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2326 && (0 <= this.l && this.l <= 1)
2327 && (0 <= this.opacity && this.opacity <= 1);
2331 /* From FvD 13.37, CSS Color Module Level 3 */
2332 function hsl2rgb(h, m1, m2) {
2333 return (h < 60 ? m1 + (m2 - m1) * h / 60
2335 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2339 var deg2rad = Math.PI / 180;
2340 var rad2deg = 180 / Math.PI;
2343 Xn = 0.950470, // D65 standard referent
2351 function labConvert(o) {
2352 if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2353 if (o instanceof Hcl) {
2354 var h = o.h * deg2rad;
2355 return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2357 if (!(o instanceof Rgb)) o = rgbConvert(o);
2358 var b = rgb2xyz(o.r),
2361 x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2362 y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2363 z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2364 return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2367 function lab(l, a, b, opacity) {
2368 return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2371 function Lab(l, a, b, opacity) {
2375 this.opacity = +opacity;
2378 define(Lab, lab, extend(Color, {
2379 brighter: function(k) {
2380 return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2382 darker: function(k) {
2383 return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2386 var y = (this.l + 16) / 116,
2387 x = isNaN(this.a) ? y : y + this.a / 500,
2388 z = isNaN(this.b) ? y : y - this.b / 200;
2389 y = Yn * lab2xyz(y);
2390 x = Xn * lab2xyz(x);
2391 z = Zn * lab2xyz(z);
2393 xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2394 xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2395 xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2401 function xyz2lab(t) {
2402 return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2405 function lab2xyz(t) {
2406 return t > t1 ? t * t * t : t2 * (t - t0);
2409 function xyz2rgb(x) {
2410 return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2413 function rgb2xyz(x) {
2414 return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2417 function hclConvert(o) {
2418 if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2419 if (!(o instanceof Lab)) o = labConvert(o);
2420 var h = Math.atan2(o.b, o.a) * rad2deg;
2421 return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2424 function hcl(h, c, l, opacity) {
2425 return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2428 function Hcl(h, c, l, opacity) {
2432 this.opacity = +opacity;
2435 define(Hcl, hcl, extend(Color, {
2436 brighter: function(k) {
2437 return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2439 darker: function(k) {
2440 return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2443 return labConvert(this).rgb();
2454 BC_DA = B * C - D * A;
2456 function cubehelixConvert(o) {
2457 if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2458 if (!(o instanceof Rgb)) o = rgbConvert(o);
2462 l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2464 k = (E * (g - l) - C * bl) / D,
2465 s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2466 h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2467 return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2470 function cubehelix(h, s, l, opacity) {
2471 return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2474 function Cubehelix(h, s, l, opacity) {
2478 this.opacity = +opacity;
2481 define(Cubehelix, cubehelix, extend(Color, {
2482 brighter: function(k) {
2483 k = k == null ? brighter : Math.pow(brighter, k);
2484 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2486 darker: function(k) {
2487 k = k == null ? darker : Math.pow(darker, k);
2488 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2491 var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2493 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2497 255 * (l + a * (A * cosh + B * sinh)),
2498 255 * (l + a * (C * cosh + D * sinh)),
2499 255 * (l + a * (E * cosh)),
2505 function basis(t1, v0, v1, v2, v3) {
2506 var t2 = t1 * t1, t3 = t2 * t1;
2507 return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2508 + (4 - 6 * t2 + 3 * t3) * v1
2509 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2513 function basis$1(values) {
2514 var n = values.length - 1;
2515 return function(t) {
2516 var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2519 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2520 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2521 return basis((t - i / n) * n, v0, v1, v2, v3);
2525 function basisClosed(values) {
2526 var n = values.length;
2527 return function(t) {
2528 var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2529 v0 = values[(i + n - 1) % n],
2531 v2 = values[(i + 1) % n],
2532 v3 = values[(i + 2) % n];
2533 return basis((t - i / n) * n, v0, v1, v2, v3);
2537 function constant$3(x) {
2543 function linear(a, d) {
2544 return function(t) {
2549 function exponential(a, b, y) {
2550 return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2551 return Math.pow(a + t * b, y);
2555 function hue(a, b) {
2557 return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2561 return (y = +y) === 1 ? nogamma : function(a, b) {
2562 return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2566 function nogamma(a, b) {
2568 return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2571 var d3_interpolateRgb = (function rgbGamma(y) {
2572 var color$$1 = gamma(y);
2574 function rgb$$1(start, end) {
2575 var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2576 g = color$$1(start.g, end.g),
2577 b = color$$1(start.b, end.b),
2578 opacity = nogamma(start.opacity, end.opacity);
2579 return function(t) {
2583 start.opacity = opacity(t);
2588 rgb$$1.gamma = rgbGamma;
2593 function rgbSpline(spline) {
2594 return function(colors) {
2595 var n = colors.length,
2600 for (i = 0; i < n; ++i) {
2601 color$$1 = rgb(colors[i]);
2602 r[i] = color$$1.r || 0;
2603 g[i] = color$$1.g || 0;
2604 b[i] = color$$1.b || 0;
2609 color$$1.opacity = 1;
2610 return function(t) {
2614 return color$$1 + "";
2619 var rgbBasis = rgbSpline(basis$1);
2620 var rgbBasisClosed = rgbSpline(basisClosed);
2622 function array$1(a, b) {
2623 var nb = b ? b.length : 0,
2624 na = a ? Math.min(nb, a.length) : 0,
2629 for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
2630 for (; i < nb; ++i) c[i] = b[i];
2632 return function(t) {
2633 for (i = 0; i < na; ++i) c[i] = x[i](t);
2638 function date(a, b) {
2640 return a = +a, b -= a, function(t) {
2641 return d.setTime(a + b * t), d;
2645 function d3_interpolateNumber(a, b) {
2646 return a = +a, b -= a, function(t) {
2651 function object(a, b) {
2656 if (a === null || typeof a !== "object") a = {};
2657 if (b === null || typeof b !== "object") b = {};
2661 i[k] = d3_interpolate(a[k], b[k]);
2667 return function(t) {
2668 for (k in i) c[k] = i[k](t);
2673 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674 reB = new RegExp(reA.source, "g");
2683 return function(t) {
2688 function interpolateString(a, b) {
2689 var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2690 am, // current match in a
2691 bm, // current match in b
2692 bs, // string preceding current number in b, if any
2693 i = -1, // index in s
2694 s = [], // string constants and placeholders
2695 q = []; // number interpolators
2697 // Coerce inputs to strings.
2698 a = a + "", b = b + "";
2700 // Interpolate pairs of numbers in a & b.
2701 while ((am = reA.exec(a))
2702 && (bm = reB.exec(b))) {
2703 if ((bs = bm.index) > bi) { // a string precedes the next number in b
2704 bs = b.slice(bi, bs);
2705 if (s[i]) s[i] += bs; // coalesce with previous string
2708 if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709 if (s[i]) s[i] += bm; // coalesce with previous string
2711 } else { // interpolate non-matching numbers
2713 q.push({i: i, x: d3_interpolateNumber(am, bm)});
2718 // Add remains of b.
2719 if (bi < b.length) {
2721 if (s[i]) s[i] += bs; // coalesce with previous string
2725 // Special optimization for only a single match.
2726 // Otherwise, interpolate each of the numbers and rejoin the string.
2727 return s.length < 2 ? (q[0]
2730 : (b = q.length, function(t) {
2731 for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2736 function d3_interpolate(a, b) {
2737 var t = typeof b, c;
2738 return b == null || t === "boolean" ? constant$3(b)
2739 : (t === "number" ? d3_interpolateNumber
2740 : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2741 : b instanceof color ? d3_interpolateRgb
2742 : b instanceof Date ? date
2743 : Array.isArray(b) ? array$1
2744 : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2745 : d3_interpolateNumber)(a, b);
2748 function interpolateRound(a, b) {
2749 return a = +a, b -= a, function(t) {
2750 return Math.round(a + b * t);
2754 var degrees = 180 / Math.PI;
2765 function decompose(a, b, c, d, e, f) {
2766 var scaleX, scaleY, skewX;
2767 if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2768 if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2769 if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2770 if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2774 rotate: Math.atan2(b, a) * degrees,
2775 skewX: Math.atan(skewX) * degrees,
2786 function parseCss(value) {
2787 if (value === "none") return identity$2;
2788 if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2789 cssNode.style.transform = value;
2790 value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2791 cssRoot.removeChild(cssNode);
2792 value = value.slice(7, -1).split(",");
2793 return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2796 function parseSvg(value) {
2797 if (value == null) return identity$2;
2798 if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2799 svgNode.setAttribute("transform", value);
2800 if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2801 value = value.matrix;
2802 return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2805 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2808 return s.length ? s.pop() + " " : "";
2811 function translate(xa, ya, xb, yb, s, q) {
2812 if (xa !== xb || ya !== yb) {
2813 var i = s.push("translate(", null, pxComma, null, pxParen);
2814 q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2815 } else if (xb || yb) {
2816 s.push("translate(" + xb + pxComma + yb + pxParen);
2820 function rotate(a, b, s, q) {
2822 if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2823 q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2825 s.push(pop(s) + "rotate(" + b + degParen);
2829 function skewX(a, b, s, q) {
2831 q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2833 s.push(pop(s) + "skewX(" + b + degParen);
2837 function scale(xa, ya, xb, yb, s, q) {
2838 if (xa !== xb || ya !== yb) {
2839 var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2840 q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2841 } else if (xb !== 1 || yb !== 1) {
2842 s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2846 return function(a, b) {
2847 var s = [], // string constants and placeholders
2848 q = []; // number interpolators
2849 a = parse(a), b = parse(b);
2850 translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2851 rotate(a.rotate, b.rotate, s, q);
2852 skewX(a.skewX, b.skewX, s, q);
2853 scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2855 return function(t) {
2856 var i = -1, n = q.length, o;
2857 while (++i < n) s[(o = q[i]).i] = o.x(t);
2863 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2866 var rho = Math.SQRT2,
2872 return ((x = Math.exp(x)) + 1 / x) / 2;
2876 return ((x = Math.exp(x)) - 1 / x) / 2;
2880 return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2883 // p0 = [ux0, uy0, w0]
2884 // p1 = [ux1, uy1, w1]
2885 function interpolateZoom(p0, p1) {
2886 var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2887 ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2890 d2 = dx * dx + dy * dy,
2894 // Special case for u0 ≅ u1.
2895 if (d2 < epsilon2) {
2896 S = Math.log(w1 / w0) / rho;
2901 w0 * Math.exp(rho * t * S)
2908 var d1 = Math.sqrt(d2),
2909 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2910 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2911 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2912 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2913 S = (r1 - r0) / rho;
2917 u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2921 w0 * coshr0 / cosh(rho * s + r0)
2926 i.duration = S * 1000;
2931 function hsl$1(hue$$1) {
2932 return function(start, end) {
2933 var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2934 s = nogamma(start.s, end.s),
2935 l = nogamma(start.l, end.l),
2936 opacity = nogamma(start.opacity, end.opacity);
2937 return function(t) {
2941 start.opacity = opacity(t);
2947 var hsl$2 = hsl$1(hue);
2948 var hslLong = hsl$1(nogamma);
2950 function lab$1(start, end) {
2951 var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2952 a = nogamma(start.a, end.a),
2953 b = nogamma(start.b, end.b),
2954 opacity = nogamma(start.opacity, end.opacity);
2955 return function(t) {
2959 start.opacity = opacity(t);
2964 function hcl$1(hue$$1) {
2965 return function(start, end) {
2966 var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2967 c = nogamma(start.c, end.c),
2968 l = nogamma(start.l, end.l),
2969 opacity = nogamma(start.opacity, end.opacity);
2970 return function(t) {
2974 start.opacity = opacity(t);
2980 var hcl$2 = hcl$1(hue);
2981 var hclLong = hcl$1(nogamma);
2983 function cubehelix$1(hue$$1) {
2984 return (function cubehelixGamma(y) {
2987 function cubehelix$$1(start, end) {
2988 var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2989 s = nogamma(start.s, end.s),
2990 l = nogamma(start.l, end.l),
2991 opacity = nogamma(start.opacity, end.opacity);
2992 return function(t) {
2995 start.l = l(Math.pow(t, y));
2996 start.opacity = opacity(t);
3001 cubehelix$$1.gamma = cubehelixGamma;
3003 return cubehelix$$1;
3007 var cubehelix$2 = cubehelix$1(hue);
3008 var cubehelixLong = cubehelix$1(nogamma);
3010 function d3_quantize(interpolator, n) {
3011 var samples = new Array(n);
3012 for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3016 var frame = 0, // is an animation frame pending?
3017 timeout = 0, // is a timeout pending?
3018 interval = 0, // are any timers active?
3019 pokeDelay = 1000, // how frequently we check for clock skew
3025 clock = typeof performance === "object" && performance.now ? performance : Date,
3026 setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3029 return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3032 function clearNow() {
3042 Timer.prototype = timer.prototype = {
3044 restart: function(callback, delay, time) {
3045 if (typeof callback !== "function") throw new TypeError("callback is not a function");
3046 time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3047 if (!this._next && taskTail !== this) {
3048 if (taskTail) taskTail._next = this;
3049 else taskHead = this;
3052 this._call = callback;
3059 this._time = Infinity;
3065 function timer(callback, delay, time) {
3067 t.restart(callback, delay, time);
3071 function timerFlush() {
3072 now(); // Get the current time, if not already set.
3073 ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3074 var t = taskHead, e;
3076 if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3083 clockNow = (clockLast = clock.now()) + clockSkew;
3084 frame = timeout = 0;
3095 var now = clock.now(), delay = now - clockLast;
3096 if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3100 var t0, t1 = taskHead, t2, time = Infinity;
3103 if (time > t1._time) time = t1._time;
3104 t0 = t1, t1 = t1._next;
3106 t2 = t1._next, t1._next = null;
3107 t1 = t0 ? t0._next = t2 : taskHead = t2;
3114 function sleep(time) {
3115 if (frame) return; // Soonest alarm already set, or will be.
3116 if (timeout) timeout = clearTimeout(timeout);
3117 var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3119 if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120 if (interval) interval = clearInterval(interval);
3122 if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123 frame = 1, setFrame(wake);
3127 function d3_timeout(callback, delay, time) {
3129 delay = delay == null ? 0 : +delay;
3130 t.restart(function(elapsed) {
3132 callback(elapsed + delay);
3137 function interval$1(callback, delay, time) {
3138 var t = new Timer, total = delay;
3139 if (delay == null) return t.restart(callback, delay, time), t;
3140 delay = +delay, time = time == null ? now() : +time;
3141 t.restart(function tick(elapsed) {
3143 t.restart(tick, total += delay, time);
3149 var emptyOn = dispatch("start", "end", "interrupt");
3150 var emptyTween = [];
3160 function schedule(node, name, id, index, group, timing) {
3161 var schedules = node.__transition;
3162 if (!schedules) node.__transition = {};
3163 else if (id in schedules) return;
3164 create$1(node, id, {
3166 index: index, // For context during callback.
3167 group: group, // For context during callback.
3171 delay: timing.delay,
3172 duration: timing.duration,
3179 function init(node, id) {
3180 var schedule = get$1(node, id);
3181 if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3185 function set$1(node, id) {
3186 var schedule = get$1(node, id);
3187 if (schedule.state > STARTING) throw new Error("too late; already started");
3191 function get$1(node, id) {
3192 var schedule = node.__transition;
3193 if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3197 function create$1(node, id, self) {
3198 var schedules = node.__transition,
3201 // Initialize the self timer when the transition is created.
3202 // Note the actual delay is not known until the first callback!
3203 schedules[id] = self;
3204 self.timer = timer(schedule, 0, self.time);
3206 function schedule(elapsed) {
3207 self.state = SCHEDULED;
3208 self.timer.restart(start, self.delay, self.time);
3210 // If the elapsed delay is less than our first sleep, start immediately.
3211 if (self.delay <= elapsed) start(elapsed - self.delay);
3214 function start(elapsed) {
3217 // If the state is not SCHEDULED, then we previously errored on start.
3218 if (self.state !== SCHEDULED) return stop();
3220 for (i in schedules) {
3222 if (o.name !== self.name) continue;
3224 // While this element already has a starting transition during this frame,
3225 // defer starting an interrupting transition until that transition has a
3226 // chance to tick (and possibly end); see d3/d3-transition#54!
3227 if (o.state === STARTED) return d3_timeout(start);
3229 // Interrupt the active transition, if any.
3230 // Dispatch the interrupt event.
3231 if (o.state === RUNNING) {
3234 o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235 delete schedules[i];
3238 // Cancel any pre-empted transitions. No interrupt event is dispatched
3239 // because the cancelled transitions never started. Note that this also
3240 // removes this transition from the pending list!
3244 delete schedules[i];
3248 // Defer the first tick to end of the current frame; see d3/d3#1576.
3249 // Note the transition may be canceled after start and before the first tick!
3250 // Note this must be scheduled before the start event; see d3/d3-transition#16!
3251 // Assuming this is successful, subsequent callbacks go straight to tick.
3252 d3_timeout(function() {
3253 if (self.state === STARTED) {
3254 self.state = RUNNING;
3255 self.timer.restart(tick, self.delay, self.time);
3260 // Dispatch the start event.
3261 // Note this must be done before the tween are initialized.
3262 self.state = STARTING;
3263 self.on.call("start", node, node.__data__, self.index, self.group);
3264 if (self.state !== STARTING) return; // interrupted
3265 self.state = STARTED;
3267 // Initialize the tween, deleting null tween.
3268 tween = new Array(n = self.tween.length);
3269 for (i = 0, j = -1; i < n; ++i) {
3270 if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3274 tween.length = j + 1;
3277 function tick(elapsed) {
3278 var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3283 tween[i].call(null, t);
3286 // Dispatch the end event.
3287 if (self.state === ENDING) {
3288 self.on.call("end", node, node.__data__, self.index, self.group);
3296 delete schedules[id];
3297 for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298 delete node.__transition;
3302 function interrupt(node, name) {
3303 var schedules = node.__transition,
3309 if (!schedules) return;
3311 name = name == null ? null : name + "";
3313 for (i in schedules) {
3314 if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3315 active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3316 schedule$$1.state = ENDED;
3317 schedule$$1.timer.stop();
3318 if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3319 delete schedules[i];
3322 if (empty) delete node.__transition;
3325 function selection_interrupt(name) {
3326 return this.each(function() {
3327 interrupt(this, name);
3331 function tweenRemove(id, name) {
3334 var schedule$$1 = set$1(this, id),
3335 tween = schedule$$1.tween;
3337 // If this node shared tween with the previous node,
3338 // just assign the updated shared tween and we’re done!
3339 // Otherwise, copy-on-write.
3340 if (tween !== tween0) {
3341 tween1 = tween0 = tween;
3342 for (var i = 0, n = tween1.length; i < n; ++i) {
3343 if (tween1[i].name === name) {
3344 tween1 = tween1.slice();
3345 tween1.splice(i, 1);
3351 schedule$$1.tween = tween1;
3355 function tweenFunction(id, name, value) {
3357 if (typeof value !== "function") throw new Error;
3359 var schedule$$1 = set$1(this, id),
3360 tween = schedule$$1.tween;
3362 // If this node shared tween with the previous node,
3363 // just assign the updated shared tween and we’re done!
3364 // Otherwise, copy-on-write.
3365 if (tween !== tween0) {
3366 tween1 = (tween0 = tween).slice();
3367 for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3368 if (tween1[i].name === name) {
3373 if (i === n) tween1.push(t);
3376 schedule$$1.tween = tween1;
3380 function transition_tween(name, value) {
3385 if (arguments.length < 2) {
3386 var tween = get$1(this.node(), id).tween;
3387 for (var i = 0, n = tween.length, t; i < n; ++i) {
3388 if ((t = tween[i]).name === name) {
3395 return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3398 function tweenValue(transition, name, value) {
3399 var id = transition._id;
3401 transition.each(function() {
3402 var schedule$$1 = set$1(this, id);
3403 (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3406 return function(node) {
3407 return get$1(node, id).value[name];
3411 function interpolate(a, b) {
3413 return (typeof b === "number" ? d3_interpolateNumber
3414 : b instanceof color ? d3_interpolateRgb
3415 : (c = color(b)) ? (b = c, d3_interpolateRgb)
3416 : interpolateString)(a, b);
3419 function attrRemove$1(name) {
3421 this.removeAttribute(name);
3425 function attrRemoveNS$1(fullname) {
3427 this.removeAttributeNS(fullname.space, fullname.local);
3431 function attrConstant$1(name, interpolate$$1, value1) {
3435 var value0 = this.getAttribute(name);
3436 return value0 === value1 ? null
3437 : value0 === value00 ? interpolate0
3438 : interpolate0 = interpolate$$1(value00 = value0, value1);
3442 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3446 var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447 return value0 === value1 ? null
3448 : value0 === value00 ? interpolate0
3449 : interpolate0 = interpolate$$1(value00 = value0, value1);
3453 function attrFunction$1(name, interpolate$$1, value) {
3458 var value0, value1 = value(this);
3459 if (value1 == null) return void this.removeAttribute(name);
3460 value0 = this.getAttribute(name);
3461 return value0 === value1 ? null
3462 : value0 === value00 && value1 === value10 ? interpolate0
3463 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3467 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3472 var value0, value1 = value(this);
3473 if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3474 value0 = this.getAttributeNS(fullname.space, fullname.local);
3475 return value0 === value1 ? null
3476 : value0 === value00 && value1 === value10 ? interpolate0
3477 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3481 function transition_attr(name, value) {
3482 var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
3483 return this.attrTween(name, typeof value === "function"
3484 ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3485 : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3486 : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3489 function attrTweenNS(fullname, value) {
3491 var node = this, i = value.apply(node, arguments);
3492 return i && function(t) {
3493 node.setAttributeNS(fullname.space, fullname.local, i(t));
3496 tween._value = value;
3500 function attrTween(name, value) {
3502 var node = this, i = value.apply(node, arguments);
3503 return i && function(t) {
3504 node.setAttribute(name, i(t));
3507 tween._value = value;
3511 function transition_attrTween(name, value) {
3512 var key = "attr." + name;
3513 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3514 if (value == null) return this.tween(key, null);
3515 if (typeof value !== "function") throw new Error;
3516 var fullname = namespace(name);
3517 return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3520 function delayFunction(id, value) {
3522 init(this, id).delay = +value.apply(this, arguments);
3526 function delayConstant(id, value) {
3527 return value = +value, function() {
3528 init(this, id).delay = value;
3532 function transition_delay(value) {
3535 return arguments.length
3536 ? this.each((typeof value === "function"
3538 : delayConstant)(id, value))
3539 : get$1(this.node(), id).delay;
3542 function durationFunction(id, value) {
3544 set$1(this, id).duration = +value.apply(this, arguments);
3548 function durationConstant(id, value) {
3549 return value = +value, function() {
3550 set$1(this, id).duration = value;
3554 function transition_duration(value) {
3557 return arguments.length
3558 ? this.each((typeof value === "function"
3560 : durationConstant)(id, value))
3561 : get$1(this.node(), id).duration;
3564 function easeConstant(id, value) {
3565 if (typeof value !== "function") throw new Error;
3567 set$1(this, id).ease = value;
3571 function transition_ease(value) {
3574 return arguments.length
3575 ? this.each(easeConstant(id, value))
3576 : get$1(this.node(), id).ease;
3579 function transition_filter(match) {
3580 if (typeof match !== "function") match = matcher$1(match);
3582 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3583 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3584 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3585 subgroup.push(node);
3590 return new Transition(subgroups, this._parents, this._name, this._id);
3593 function transition_merge(transition$$1) {
3594 if (transition$$1._id !== this._id) throw new Error;
3596 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) {
3597 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3598 if (node = group0[i] || group1[i]) {
3604 for (; j < m0; ++j) {
3605 merges[j] = groups0[j];
3608 return new Transition(merges, this._parents, this._name, this._id);
3611 function start(name) {
3612 return (name + "").trim().split(/^|\s+/).every(function(t) {
3613 var i = t.indexOf(".");
3614 if (i >= 0) t = t.slice(0, i);
3615 return !t || t === "start";
3619 function onFunction(id, name, listener) {
3620 var on0, on1, sit = start(name) ? init : set$1;
3622 var schedule$$1 = sit(this, id),
3623 on = schedule$$1.on;
3625 // If this node shared a dispatch with the previous node,
3626 // just assign the updated shared dispatch and we’re done!
3627 // Otherwise, copy-on-write.
3628 if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3630 schedule$$1.on = on1;
3634 function transition_on(name, listener) {
3637 return arguments.length < 2
3638 ? get$1(this.node(), id).on.on(name)
3639 : this.each(onFunction(id, name, listener));
3642 function removeFunction(id) {
3644 var parent = this.parentNode;
3645 for (var i in this.__transition) if (+i !== id) return;
3646 if (parent) parent.removeChild(this);
3650 function transition_remove() {
3651 return this.on("end.remove", removeFunction(this._id));
3654 function transition_select(select) {
3655 var name = this._name,
3658 if (typeof select !== "function") select = selector(select);
3660 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3661 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3662 if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
3663 if ("__data__" in node) subnode.__data__ = node.__data__;
3664 subgroup[i] = subnode;
3665 schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3670 return new Transition(subgroups, this._parents, name, id);
3673 function transition_selectAll(select) {
3674 var name = this._name,
3677 if (typeof select !== "function") select = selectorAll(select);
3679 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3680 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3681 if (node = group[i]) {
3682 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3683 if (child = children[k]) {
3684 schedule(child, name, id, k, children, inherit);
3687 subgroups.push(children);
3693 return new Transition(subgroups, parents, name, id);
3696 var Selection$1 = selection.prototype.constructor;
3698 function transition_selection() {
3699 return new Selection$1(this._groups, this._parents);
3702 function styleRemove$1(name, interpolate$$1) {
3707 var value0 = styleValue(this, name),
3708 value1 = (this.style.removeProperty(name), styleValue(this, name));
3709 return value0 === value1 ? null
3710 : value0 === value00 && value1 === value10 ? interpolate0
3711 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3715 function styleRemoveEnd(name) {
3717 this.style.removeProperty(name);
3721 function styleConstant$1(name, interpolate$$1, value1) {
3725 var value0 = styleValue(this, name);
3726 return value0 === value1 ? null
3727 : value0 === value00 ? interpolate0
3728 : interpolate0 = interpolate$$1(value00 = value0, value1);
3732 function styleFunction$1(name, interpolate$$1, value) {
3737 var value0 = styleValue(this, name),
3738 value1 = value(this);
3739 if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3740 return value0 === value1 ? null
3741 : value0 === value00 && value1 === value10 ? interpolate0
3742 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3746 function transition_style(name, value, priority) {
3747 var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
3748 return value == null ? this
3749 .styleTween(name, styleRemove$1(name, i))
3750 .on("end.style." + name, styleRemoveEnd(name))
3751 : this.styleTween(name, typeof value === "function"
3752 ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3753 : styleConstant$1(name, i, value + ""), priority);
3756 function styleTween(name, value, priority) {
3758 var node = this, i = value.apply(node, arguments);
3759 return i && function(t) {
3760 node.style.setProperty(name, i(t), priority);
3763 tween._value = value;
3767 function transition_styleTween(name, value, priority) {
3768 var key = "style." + (name += "");
3769 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3770 if (value == null) return this.tween(key, null);
3771 if (typeof value !== "function") throw new Error;
3772 return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3775 function textConstant$1(value) {
3777 this.textContent = value;
3781 function textFunction$1(value) {
3783 var value1 = value(this);
3784 this.textContent = value1 == null ? "" : value1;
3788 function transition_text(value) {
3789 return this.tween("text", typeof value === "function"
3790 ? textFunction$1(tweenValue(this, "text", value))
3791 : textConstant$1(value == null ? "" : value + ""));
3794 function transition_transition() {
3795 var name = this._name,
3799 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3800 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3801 if (node = group[i]) {
3802 var inherit = get$1(node, id0);
3803 schedule(node, name, id1, i, group, {
3804 time: inherit.time + inherit.delay + inherit.duration,
3806 duration: inherit.duration,
3813 return new Transition(groups, this._parents, name, id1);
3818 function Transition(groups, parents, name, id) {
3819 this._groups = groups;
3820 this._parents = parents;
3825 function transition(name) {
3826 return selection().transition(name);
3833 var selection_prototype = selection.prototype;
3835 Transition.prototype = transition.prototype = {
3836 constructor: Transition,
3837 select: transition_select,
3838 selectAll: transition_selectAll,
3839 filter: transition_filter,
3840 merge: transition_merge,
3841 selection: transition_selection,
3842 transition: transition_transition,
3843 call: selection_prototype.call,
3844 nodes: selection_prototype.nodes,
3845 node: selection_prototype.node,
3846 size: selection_prototype.size,
3847 empty: selection_prototype.empty,
3848 each: selection_prototype.each,
3850 attr: transition_attr,
3851 attrTween: transition_attrTween,
3852 style: transition_style,
3853 styleTween: transition_styleTween,
3854 text: transition_text,
3855 remove: transition_remove,
3856 tween: transition_tween,
3857 delay: transition_delay,
3858 duration: transition_duration,
3859 ease: transition_ease
3862 function linear$1(t) {
3866 function quadIn(t) {
3870 function quadOut(t) {
3874 function quadInOut(t) {
3875 return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3878 function cubicIn(t) {
3882 function cubicOut(t) {
3883 return --t * t * t + 1;
3886 function cubicInOut(t) {
3887 return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3892 var polyIn = (function custom(e) {
3895 function polyIn(t) {
3896 return Math.pow(t, e);
3899 polyIn.exponent = custom;
3904 var polyOut = (function custom(e) {
3907 function polyOut(t) {
3908 return 1 - Math.pow(1 - t, e);
3911 polyOut.exponent = custom;
3916 var polyInOut = (function custom(e) {
3919 function polyInOut(t) {
3920 return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3923 polyInOut.exponent = custom;
3932 return 1 - Math.cos(t * halfPi);
3935 function sinOut(t) {
3936 return Math.sin(t * halfPi);
3939 function sinInOut(t) {
3940 return (1 - Math.cos(pi * t)) / 2;
3944 return Math.pow(2, 10 * t - 10);
3947 function expOut(t) {
3948 return 1 - Math.pow(2, -10 * t);
3951 function expInOut(t) {
3952 return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3955 function circleIn(t) {
3956 return 1 - Math.sqrt(1 - t * t);
3959 function circleOut(t) {
3960 return Math.sqrt(1 - --t * t);
3963 function circleInOut(t) {
3964 return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3978 function bounceIn(t) {
3979 return 1 - bounceOut(1 - t);
3982 function bounceOut(t) {
3983 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;
3986 function bounceInOut(t) {
3987 return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3990 var overshoot = 1.70158;
3992 var backIn = (function custom(s) {
3995 function backIn(t) {
3996 return t * t * ((s + 1) * t - s);
3999 backIn.overshoot = custom;
4004 var backOut = (function custom(s) {
4007 function backOut(t) {
4008 return --t * t * ((s + 1) * t + s) + 1;
4011 backOut.overshoot = custom;
4016 var backInOut = (function custom(s) {
4019 function backInOut(t) {
4020 return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4023 backInOut.overshoot = custom;
4028 var tau = 2 * Math.PI,
4032 var elasticIn = (function custom(a, p) {
4033 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4035 function elasticIn(t) {
4036 return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4039 elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040 elasticIn.period = function(p) { return custom(a, p); };
4043 })(amplitude, period);
4045 var elasticOut = (function custom(a, p) {
4046 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4048 function elasticOut(t) {
4049 return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4052 elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053 elasticOut.period = function(p) { return custom(a, p); };
4056 })(amplitude, period);
4058 var elasticInOut = (function custom(a, p) {
4059 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4061 function elasticInOut(t) {
4062 return ((t = t * 2 - 1) < 0
4063 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4064 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4067 elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068 elasticInOut.period = function(p) { return custom(a, p); };
4070 return elasticInOut;
4071 })(amplitude, period);
4073 var defaultTiming = {
4074 time: null, // Set on use.
4080 function inherit(node, id) {
4082 while (!(timing = node.__transition) || !(timing = timing[id])) {
4083 if (!(node = node.parentNode)) {
4084 return defaultTiming.time = now(), defaultTiming;
4090 function selection_transition(name) {
4094 if (name instanceof Transition) {
4095 id = name._id, name = name._name;
4097 id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4100 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4101 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4102 if (node = group[i]) {
4103 schedule(node, name, id, i, group, timing || inherit(node, id));
4108 return new Transition(groups, this._parents, name, id);
4111 selection.prototype.interrupt = selection_interrupt;
4112 selection.prototype.transition = selection_transition;
4114 var root$1 = [null];
4116 function active(node, name) {
4117 var schedules = node.__transition,
4122 name = name == null ? null : name + "";
4123 for (i in schedules) {
4124 if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4125 return new Transition([[node]], root$1, name, +i);
4133 function constant$4(x) {
4139 function BrushEvent(target, type, selection) {
4140 this.target = target;
4142 this.selection = selection;
4145 function nopropagation$1() {
4146 event.stopImmediatePropagation();
4149 function noevent$1() {
4150 event.preventDefault();
4151 event.stopImmediatePropagation();
4154 var MODE_DRAG = {name: "drag"},
4155 MODE_SPACE = {name: "space"},
4156 MODE_HANDLE = {name: "handle"},
4157 MODE_CENTER = {name: "center"};
4161 handles: ["e", "w"].map(type),
4162 input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4163 output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4168 handles: ["n", "s"].map(type),
4169 input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4170 output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4175 handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176 input: function(xy) { return xy; },
4177 output: function(xy) { return xy; }
4181 overlay: "crosshair",
4241 // Ignore right-click, since that should open the context menu.
4242 function defaultFilter$1() {
4243 return !event.button;
4246 function defaultExtent() {
4247 var svg = this.ownerSVGElement || this;
4248 return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4251 // Like d3.local, but with the name “__brush” rather than auto-generated.
4252 function local$1(node) {
4253 while (!node.__brush) if (!(node = node.parentNode)) return;
4254 return node.__brush;
4257 function empty$1(extent) {
4258 return extent[0][0] === extent[1][0]
4259 || extent[0][1] === extent[1][1];
4262 function brushSelection(node) {
4263 var state = node.__brush;
4264 return state ? state.dim.output(state.selection) : null;
4279 function brush$1(dim) {
4280 var extent = defaultExtent,
4281 filter = defaultFilter$1,
4282 listeners = dispatch(brush, "start", "brush", "end"),
4286 function brush(group) {
4288 .property("__brush", initialize)
4289 .selectAll(".overlay")
4290 .data([type("overlay")]);
4292 overlay.enter().append("rect")
4293 .attr("class", "overlay")
4294 .attr("pointer-events", "all")
4295 .attr("cursor", cursors.overlay)
4298 var extent = local$1(this).extent;
4300 .attr("x", extent[0][0])
4301 .attr("y", extent[0][1])
4302 .attr("width", extent[1][0] - extent[0][0])
4303 .attr("height", extent[1][1] - extent[0][1]);
4306 group.selectAll(".selection")
4307 .data([type("selection")])
4308 .enter().append("rect")
4309 .attr("class", "selection")
4310 .attr("cursor", cursors.selection)
4311 .attr("fill", "#777")
4312 .attr("fill-opacity", 0.3)
4313 .attr("stroke", "#fff")
4314 .attr("shape-rendering", "crispEdges");
4316 var handle = group.selectAll(".handle")
4317 .data(dim.handles, function(d) { return d.type; });
4319 handle.exit().remove();
4321 handle.enter().append("rect")
4322 .attr("class", function(d) { return "handle handle--" + d.type; })
4323 .attr("cursor", function(d) { return cursors[d.type]; });
4327 .attr("fill", "none")
4328 .attr("pointer-events", "all")
4329 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4330 .on("mousedown.brush touchstart.brush", started);
4333 brush.move = function(group, selection$$1) {
4334 if (group.selection) {
4336 .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4337 .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4338 .tween("brush", function() {
4340 state = that.__brush,
4341 emit = emitter(that, arguments),
4342 selection0 = state.selection,
4343 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent),
4344 i = d3_interpolate(selection0, selection1);
4347 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4352 return selection0 && selection1 ? tween : tween(1);
4359 state = that.__brush,
4360 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent),
4361 emit = emitter(that, args).beforestart();
4364 state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4366 emit.start().brush().end();
4372 var group = d3_select(this),
4373 selection$$1 = local$1(this).selection;
4376 group.selectAll(".selection")
4377 .style("display", null)
4378 .attr("x", selection$$1[0][0])
4379 .attr("y", selection$$1[0][1])
4380 .attr("width", selection$$1[1][0] - selection$$1[0][0])
4381 .attr("height", selection$$1[1][1] - selection$$1[0][1]);
4383 group.selectAll(".handle")
4384 .style("display", null)
4385 .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; })
4386 .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; })
4387 .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; })
4388 .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; });
4392 group.selectAll(".selection,.handle")
4393 .style("display", "none")
4396 .attr("width", null)
4397 .attr("height", null);
4401 function emitter(that, args) {
4402 return that.__brush.emitter || new Emitter(that, args);
4405 function Emitter(that, args) {
4408 this.state = that.__brush;
4412 Emitter.prototype = {
4413 beforestart: function() {
4414 if (++this.active === 1) this.state.emitter = this, this.starting = true;
4418 if (this.starting) this.starting = false, this.emit("start");
4426 if (--this.active === 0) delete this.state.emitter, this.emit("end");
4429 emit: function(type) {
4430 customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4434 function started() {
4435 if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4436 else if (touchending) return;
4437 if (!filter.apply(this, arguments)) return;
4440 type = event.target.__data__.type,
4441 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4442 signX = dim === Y ? null : signsX[type],
4443 signY = dim === X ? null : signsY[type],
4444 state = local$1(that),
4445 extent = state.extent,
4446 selection$$1 = state.selection,
4447 W = extent[0][0], w0, w1,
4448 N = extent[0][1], n0, n1,
4449 E = extent[1][0], e0, e1,
4450 S = extent[1][1], s0, s1,
4454 shifting = signX && signY && event.shiftKey,
4457 point0 = d3_mouse(that),
4459 emit = emitter(that, arguments).beforestart();
4461 if (type === "overlay") {
4462 state.selection = selection$$1 = [
4463 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4467 w0 = selection$$1[0][0];
4468 n0 = selection$$1[0][1];
4469 e0 = selection$$1[1][0];
4470 s0 = selection$$1[1][1];
4478 var group = d3_select(that)
4479 .attr("pointer-events", "none");
4481 var overlay = group.selectAll(".overlay")
4482 .attr("cursor", cursors[type]);
4484 if (event.touches) {
4486 .on("touchmove.brush", moved, true)
4487 .on("touchend.brush touchcancel.brush", ended, true);
4489 var view = d3_select(event.view)
4490 .on("keydown.brush", keydowned, true)
4491 .on("keyup.brush", keyupped, true)
4492 .on("mousemove.brush", moved, true)
4493 .on("mouseup.brush", ended, true);
4495 dragDisable(event.view);
4504 var point1 = d3_mouse(that);
4505 if (shifting && !lockX && !lockY) {
4506 if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$$1[1])) lockY = true;
4518 dx = point$$1[0] - point0[0];
4519 dy = point$$1[1] - point0[1];
4524 if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4525 if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4529 if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4530 else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4531 if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4532 else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4536 if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4537 if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4544 t = w0, w0 = e0, e0 = t;
4545 t = w1, w1 = e1, e1 = t;
4546 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4551 t = n0, n0 = s0, s0 = t;
4552 t = n1, n1 = s1, s1 = t;
4553 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4556 if (state.selection) selection$$1 = state.selection; // May be set by brush.move!
4557 if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0];
4558 if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1];
4560 if (selection$$1[0][0] !== w1
4561 || selection$$1[0][1] !== n1
4562 || selection$$1[1][0] !== e1
4563 || selection$$1[1][1] !== s1) {
4564 state.selection = [[w1, n1], [e1, s1]];
4572 if (event.touches) {
4573 if (event.touches.length) return;
4574 if (touchending) clearTimeout(touchending);
4575 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4576 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4578 yesdrag(event.view, moving);
4579 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4581 group.attr("pointer-events", "all");
4582 overlay.attr("cursor", cursors.overlay);
4583 if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)!
4584 if (empty$1(selection$$1)) state.selection = null, redraw.call(that);
4588 function keydowned() {
4589 switch (event.keyCode) {
4591 shifting = signX && signY;
4595 if (mode === MODE_HANDLE) {
4596 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4597 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4603 case 32: { // SPACE; takes priority over ALT
4604 if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4605 if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4606 if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4608 overlay.attr("cursor", cursors.selection);
4618 function keyupped() {
4619 switch (event.keyCode) {
4622 lockX = lockY = shifting = false;
4628 if (mode === MODE_CENTER) {
4629 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4630 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4637 if (mode === MODE_SPACE) {
4639 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4643 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4647 overlay.attr("cursor", cursors[type]);
4658 function initialize() {
4659 var state = this.__brush || {selection: null};
4660 state.extent = extent.apply(this, arguments);
4665 brush.extent = function(_) {
4666 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4669 brush.filter = function(_) {
4670 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4673 brush.handleSize = function(_) {
4674 return arguments.length ? (handleSize = +_, brush) : handleSize;
4677 brush.on = function() {
4678 var value = listeners.on.apply(listeners, arguments);
4679 return value === listeners ? brush : value;
4688 var halfPi$1 = pi$1 / 2;
4689 var tau$1 = pi$1 * 2;
4690 var max$1 = Math.max;
4692 function compareValue(compare) {
4693 return function(a, b) {
4695 a.source.value + a.target.value,
4696 b.source.value + b.target.value
4704 sortSubgroups = null,
4707 function chord(matrix) {
4708 var n = matrix.length,
4710 groupIndex = d3_range(n),
4713 groups = chords.groups = new Array(n),
4714 subgroups = new Array(n * n),
4723 k = 0, i = -1; while (++i < n) {
4724 x = 0, j = -1; while (++j < n) {
4728 subgroupIndex.push(d3_range(n));
4733 if (sortGroups) groupIndex.sort(function(a, b) {
4734 return sortGroups(groupSums[a], groupSums[b]);
4738 if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739 d.sort(function(a, b) {
4740 return sortSubgroups(matrix[i][a], matrix[i][b]);
4744 // Convert the sum to scaling factor for [0, 2pi].
4745 // TODO Allow start and end angle to be specified?
4746 // TODO Allow padding to be specified as percentage?
4747 k = max$1(0, tau$1 - padAngle * n) / k;
4748 dx = k ? padAngle : tau$1 / n;
4750 // Compute the start and end angle for each group and subgroup.
4751 // Note: Opera has a bug reordering object literal properties!
4752 x = 0, i = -1; while (++i < n) {
4753 x0 = x, j = -1; while (++j < n) {
4754 var di = groupIndex[i],
4755 dj = subgroupIndex[di][j],
4759 subgroups[dj * n + di] = {
4771 value: groupSums[di]
4776 // Generate chords for each (non-empty) subgroup-subgroup link.
4777 i = -1; while (++i < n) {
4778 j = i - 1; while (++j < n) {
4779 var source = subgroups[j * n + i],
4780 target = subgroups[i * n + j];
4781 if (source.value || target.value) {
4782 chords.push(source.value < target.value
4783 ? {source: target, target: source}
4784 : {source: source, target: target});
4789 return sortChords ? chords.sort(sortChords) : chords;
4792 chord.padAngle = function(_) {
4793 return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4796 chord.sortGroups = function(_) {
4797 return arguments.length ? (sortGroups = _, chord) : sortGroups;
4800 chord.sortSubgroups = function(_) {
4801 return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4804 chord.sortChords = function(_) {
4805 return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4811 var slice$2 = Array.prototype.slice;
4813 function constant$5(x) {
4822 tauEpsilon = tau$2 - epsilon$1;
4825 this._x0 = this._y0 = // start of current subpath
4826 this._x1 = this._y1 = null; // end of current subpath
4834 Path.prototype = path.prototype = {
4836 moveTo: function(x, y) {
4837 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4839 closePath: function() {
4840 if (this._x1 !== null) {
4841 this._x1 = this._x0, this._y1 = this._y0;
4845 lineTo: function(x, y) {
4846 this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4848 quadraticCurveTo: function(x1, y1, x, y) {
4849 this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4851 bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852 this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4854 arcTo: function(x1, y1, x2, y2, r) {
4855 x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4862 l01_2 = x01 * x01 + y01 * y01;
4864 // Is the radius negative? Error.
4865 if (r < 0) throw new Error("negative radius: " + r);
4867 // Is this path empty? Move to (x1,y1).
4868 if (this._x1 === null) {
4869 this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4872 // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873 else if (!(l01_2 > epsilon$1)) {}
4875 // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4876 // Equivalently, is (x1,y1) coincident with (x2,y2)?
4877 // Or, is the radius zero? Line to (x1,y1).
4878 else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4879 this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4882 // Otherwise, draw an arc!
4886 l21_2 = x21 * x21 + y21 * y21,
4887 l20_2 = x20 * x20 + y20 * y20,
4888 l21 = Math.sqrt(l21_2),
4889 l01 = Math.sqrt(l01_2),
4890 l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4894 // If the start tangent is not coincident with (x0,y0), line to.
4895 if (Math.abs(t01 - 1) > epsilon$1) {
4896 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4899 this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4902 arc: function(x, y, r, a0, a1, ccw) {
4903 x = +x, y = +y, r = +r;
4904 var dx = r * Math.cos(a0),
4905 dy = r * Math.sin(a0),
4909 da = ccw ? a0 - a1 : a1 - a0;
4911 // Is the radius negative? Error.
4912 if (r < 0) throw new Error("negative radius: " + r);
4914 // Is this path empty? Move to (x0,y0).
4915 if (this._x1 === null) {
4916 this._ += "M" + x0 + "," + y0;
4919 // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4920 else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4921 this._ += "L" + x0 + "," + y0;
4924 // Is this arc empty? We’re done.
4927 // Does the angle go the wrong way? Flip the direction.
4928 if (da < 0) da = da % tau$2 + tau$2;
4930 // Is this a complete circle? Draw two arcs to complete the circle.
4931 if (da > tauEpsilon) {
4932 this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4935 // Is this arc non-empty? Draw an arc!
4936 else if (da > epsilon$1) {
4937 this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4940 rect: function(x, y, w, h) {
4941 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4943 toString: function() {
4948 function defaultSource(d) {
4952 function defaultTarget(d) {
4956 function defaultRadius(d) {
4960 function defaultStartAngle(d) {
4961 return d.startAngle;
4964 function defaultEndAngle(d) {
4969 var source = defaultSource,
4970 target = defaultTarget,
4971 radius = defaultRadius,
4972 startAngle = defaultStartAngle,
4973 endAngle = defaultEndAngle,
4978 argv = slice$2.call(arguments),
4979 s = source.apply(this, argv),
4980 t = target.apply(this, argv),
4981 sr = +radius.apply(this, (argv[0] = s, argv)),
4982 sa0 = startAngle.apply(this, argv) - halfPi$1,
4983 sa1 = endAngle.apply(this, argv) - halfPi$1,
4984 sx0 = sr * cos(sa0),
4985 sy0 = sr * sin(sa0),
4986 tr = +radius.apply(this, (argv[0] = t, argv)),
4987 ta0 = startAngle.apply(this, argv) - halfPi$1,
4988 ta1 = endAngle.apply(this, argv) - halfPi$1;
4990 if (!context) context = buffer = path();
4992 context.moveTo(sx0, sy0);
4993 context.arc(0, 0, sr, sa0, sa1);
4994 if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4995 context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4996 context.arc(0, 0, tr, ta0, ta1);
4998 context.quadraticCurveTo(0, 0, sx0, sy0);
4999 context.closePath();
5001 if (buffer) return context = null, buffer + "" || null;
5004 ribbon.radius = function(_) {
5005 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5008 ribbon.startAngle = function(_) {
5009 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5012 ribbon.endAngle = function(_) {
5013 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5016 ribbon.source = function(_) {
5017 return arguments.length ? (source = _, ribbon) : source;
5020 ribbon.target = function(_) {
5021 return arguments.length ? (target = _, ribbon) : target;
5024 ribbon.context = function(_) {
5025 return arguments.length ? (context = _ == null ? null : _, ribbon) : context;
5035 Map.prototype = map$1.prototype = {
5037 has: function(key) {
5038 return (prefix + key) in this;
5040 get: function(key) {
5041 return this[prefix + key];
5043 set: function(key, value) {
5044 this[prefix + key] = value;
5047 remove: function(key) {
5048 var property = prefix + key;
5049 return property in this && delete this[property];
5052 for (var property in this) if (property[0] === prefix) delete this[property];
5056 for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5059 values: function() {
5061 for (var property in this) if (property[0] === prefix) values.push(this[property]);
5064 entries: function() {
5066 for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5071 for (var property in this) if (property[0] === prefix) ++size;
5075 for (var property in this) if (property[0] === prefix) return false;
5079 for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5083 function map$1(object, f) {
5086 // Copy constructor.
5087 if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5089 // Index array by numeric index or specified key function.
5090 else if (Array.isArray(object)) {
5095 if (f == null) while (++i < n) map.set(i, object[i]);
5096 else while (++i < n) map.set(f(o = object[i], i, object), o);
5099 // Convert object to map.
5100 else if (object) for (var key in object) map.set(key, object[key]);
5112 function apply(array, depth, createResult, setResult) {
5113 if (depth >= keys.length) {
5114 if (sortValues != null) array.sort(sortValues);
5115 return rollup != null ? rollup(array) : array;
5120 key = keys[depth++],
5123 valuesByKey = map$1(),
5125 result = createResult();
5128 if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5131 valuesByKey.set(keyValue, [value]);
5135 valuesByKey.each(function(values, key) {
5136 setResult(result, key, apply(values, depth, createResult, setResult));
5142 function entries(map, depth) {
5143 if (++depth > keys.length) return map;
5144 var array, sortKey = sortKeys[depth - 1];
5145 if (rollup != null && depth >= keys.length) array = map.entries();
5146 else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5147 return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5151 object: function(array) { return apply(array, 0, createObject, setObject); },
5152 map: function(array) { return apply(array, 0, createMap, setMap); },
5153 entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5154 key: function(d) { keys.push(d); return nest; },
5155 sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5156 sortValues: function(order) { sortValues = order; return nest; },
5157 rollup: function(f) { rollup = f; return nest; }
5161 function createObject() {
5165 function setObject(object, key, value) {
5166 object[key] = value;
5169 function createMap() {
5173 function setMap(map, key, value) {
5174 map.set(key, value);
5179 var proto = map$1.prototype;
5181 Set.prototype = set$2.prototype = {
5184 add: function(value) {
5186 this[prefix + value] = value;
5189 remove: proto.remove,
5197 function set$2(object, f) {
5200 // Copy constructor.
5201 if (object instanceof Set) object.each(function(value) { set.add(value); });
5203 // Otherwise, assume it’s an array.
5205 var i = -1, n = object.length;
5206 if (f == null) while (++i < n) set.add(object[i]);
5207 else while (++i < n) set.add(f(object[i], i, object));
5213 function keys(map) {
5215 for (var key in map) keys.push(key);
5219 function values(map) {
5221 for (var key in map) values.push(map[key]);
5225 function entries(map) {
5227 for (var key in map) entries.push({key: key, value: map[key]});
5237 function objectConverter(columns) {
5238 return new Function("d", "return {" + columns.map(function(name, i) {
5239 return JSON.stringify(name) + ": d[" + i + "]";
5240 }).join(",") + "}");
5243 function customConverter(columns, f) {
5244 var object = objectConverter(columns);
5245 return function(row, i) {
5246 return f(object(row), i, columns);
5250 // Compute unique columns in order of discovery.
5251 function inferColumns(rows) {
5252 var columnSet = Object.create(null),
5255 rows.forEach(function(row) {
5256 for (var column in row) {
5257 if (!(column in columnSet)) {
5258 columns.push(columnSet[column] = column);
5266 function dsv(delimiter) {
5267 var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268 DELIMITER = delimiter.charCodeAt(0);
5270 function parse(text, f) {
5271 var convert, columns, rows = parseRows(text, function(row, i) {
5272 if (convert) return convert(row, i - 1);
5273 columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5275 rows.columns = columns || [];
5279 function parseRows(text, f) {
5280 var rows = [], // output rows
5282 I = 0, // current character index
5283 n = 0, // current line number
5285 eof = N <= 0, // current token followed by EOF?
5286 eol = false; // current token followed by EOL?
5288 // Strip the trailing newline.
5289 if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290 if (text.charCodeAt(N - 1) === RETURN) --N;
5293 if (eof) return EOF;
5294 if (eol) return eol = false, EOL;
5298 if (text.charCodeAt(j) === QUOTE) {
5299 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5300 if ((i = I) >= N) eof = true;
5301 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5302 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5303 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5306 // Find next delimiter or newline.
5308 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5309 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5310 else if (c !== DELIMITER) continue;
5311 return text.slice(j, i);
5314 // Return last token before EOF.
5315 return eof = true, text.slice(j, N);
5318 while ((t = token()) !== EOF) {
5320 while (t !== EOL && t !== EOF) row.push(t), t = token();
5321 if (f && (row = f(row, n++)) == null) continue;
5328 function format(rows, columns) {
5329 if (columns == null) columns = inferColumns(rows);
5330 return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5331 return columns.map(function(column) {
5332 return formatValue(row[column]);
5337 function formatRows(rows) {
5338 return rows.map(formatRow).join("\n");
5341 function formatRow(row) {
5342 return row.map(formatValue).join(delimiter);
5345 function formatValue(text) {
5346 return text == null ? ""
5347 : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5353 parseRows: parseRows,
5355 formatRows: formatRows
5361 var csvParse = csv.parse;
5362 var csvParseRows = csv.parseRows;
5363 var csvFormat = csv.format;
5364 var csvFormatRows = csv.formatRows;
5366 var tsv = dsv("\t");
5368 var tsvParse = tsv.parse;
5369 var tsvParseRows = tsv.parseRows;
5370 var tsvFormat = tsv.format;
5371 var tsvFormatRows = tsv.formatRows;
5373 function center$1(x, y) {
5376 if (x == null) x = 0;
5377 if (y == null) y = 0;
5386 for (i = 0; i < n; ++i) {
5387 node = nodes[i], sx += node.x, sy += node.y;
5390 for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5391 node = nodes[i], node.x -= sx, node.y -= sy;
5395 force.initialize = function(_) {
5399 force.x = function(_) {
5400 return arguments.length ? (x = +_, force) : x;
5403 force.y = function(_) {
5404 return arguments.length ? (y = +_, force) : y;
5410 function constant$6(x) {
5417 return (Math.random() - 0.5) * 1e-6;
5420 function tree_add(d) {
5421 var x = +this._x.call(null, d),
5422 y = +this._y.call(null, d);
5423 return add(this.cover(x, y), x, y, d);
5426 function add(tree, x, y, d) {
5427 if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5445 // If the tree is empty, initialize the root as a leaf.
5446 if (!node) return tree._root = leaf, tree;
5448 // Find the existing leaf for the new point, or add it.
5449 while (node.length) {
5450 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5451 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5452 if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5455 // Is the new point is exactly coincident with the existing point?
5456 xp = +tree._x.call(null, node.data);
5457 yp = +tree._y.call(null, node.data);
5458 if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5460 // Otherwise, split the leaf node until the old and new point are separated.
5462 parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5463 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5464 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5465 } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5466 return parent[j] = node, parent[i] = leaf, tree;
5469 function addAll(data) {
5470 var d, i, n = data.length,
5480 // Compute the points and their extent.
5481 for (i = 0; i < n; ++i) {
5482 if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5491 // If there were no (valid) points, inherit the existing extent.
5492 if (x1 < x0) x0 = this._x0, x1 = this._x1;
5493 if (y1 < y0) y0 = this._y0, y1 = this._y1;
5495 // Expand the tree to cover the new points.
5496 this.cover(x0, y0).cover(x1, y1);
5498 // Add the new points.
5499 for (i = 0; i < n; ++i) {
5500 add(this, xz[i], yz[i], data[i]);
5506 function tree_cover(x, y) {
5507 if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5514 // If the quadtree has no extent, initialize them.
5515 // Integer extent are necessary so that if we later double the extent,
5516 // the existing quadrant boundaries don’t change due to floating point error!
5518 x1 = (x0 = Math.floor(x)) + 1;
5519 y1 = (y0 = Math.floor(y)) + 1;
5522 // Otherwise, double repeatedly to cover.
5523 else if (x0 > x || x > x1 || y0 > y || y > y1) {
5529 switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5531 do parent = new Array(4), parent[i] = node, node = parent;
5532 while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5536 do parent = new Array(4), parent[i] = node, node = parent;
5537 while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5541 do parent = new Array(4), parent[i] = node, node = parent;
5542 while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5546 do parent = new Array(4), parent[i] = node, node = parent;
5547 while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5552 if (this._root && this._root.length) this._root = node;
5555 // If the quadtree covers the point already, just return.
5565 function tree_data() {
5567 this.visit(function(node) {
5568 if (!node.length) do data.push(node.data); while (node = node.next)
5573 function tree_extent(_) {
5574 return arguments.length
5575 ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5576 : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5579 function Quad(node, x0, y0, x1, y1) {
5587 function tree_find(x, y, radius) {
5602 if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603 if (radius == null) radius = Infinity;
5605 x0 = x - radius, y0 = y - radius;
5606 x3 = x + radius, y3 = y + radius;
5610 while (q = quads.pop()) {
5612 // Stop searching if this quadrant can’t contain a closer node.
5613 if (!(node = q.node)
5617 || (y2 = q.y1) < y0) continue;
5619 // Bisect the current quadrant.
5621 var xm = (x1 + x2) / 2,
5625 new Quad(node[3], xm, ym, x2, y2),
5626 new Quad(node[2], x1, ym, xm, y2),
5627 new Quad(node[1], xm, y1, x2, ym),
5628 new Quad(node[0], x1, y1, xm, ym)
5631 // Visit the closest quadrant first.
5632 if (i = (y >= ym) << 1 | (x >= xm)) {
5633 q = quads[quads.length - 1];
5634 quads[quads.length - 1] = quads[quads.length - 1 - i];
5635 quads[quads.length - 1 - i] = q;
5639 // Visit this point. (Visiting coincident points isn’t necessary!)
5641 var dx = x - +this._x.call(null, node.data),
5642 dy = y - +this._y.call(null, node.data),
5643 d2 = dx * dx + dy * dy;
5645 var d = Math.sqrt(radius = d2);
5646 x0 = x - d, y0 = y - d;
5647 x3 = x + d, y3 = y + d;
5656 function tree_remove(d) {
5657 if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5677 // If the tree is empty, initialize the root as a leaf.
5678 if (!node) return this;
5680 // Find the leaf node for the point.
5681 // While descending, also retain the deepest parent with a non-removed sibling.
5682 if (node.length) while (true) {
5683 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5684 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5685 if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5686 if (!node.length) break;
5687 if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5690 // Find the point to remove.
5691 while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5692 if (next = node.next) delete node.next;
5694 // If there are multiple coincident points, remove just the point.
5695 if (previous) return next ? previous.next = next : delete previous.next, this;
5697 // If this is the root point, remove it.
5698 if (!parent) return this._root = next, this;
5700 // Remove this leaf.
5701 next ? parent[i] = next : delete parent[i];
5703 // If the parent now contains exactly one leaf, collapse superfluous parents.
5704 if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5705 && node === (parent[3] || parent[2] || parent[1] || parent[0])
5707 if (retainer) retainer[j] = node;
5708 else this._root = node;
5714 function removeAll(data) {
5715 for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5719 function tree_root() {
5723 function tree_size() {
5725 this.visit(function(node) {
5726 if (!node.length) do ++size; while (node = node.next)
5731 function tree_visit(callback) {
5732 var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5733 if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5734 while (q = quads.pop()) {
5735 if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5736 var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5737 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5738 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5740 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5746 function tree_visitAfter(callback) {
5747 var quads = [], next = [], q;
5748 if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5749 while (q = quads.pop()) {
5752 var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5753 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5754 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5755 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5756 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5760 while (q = next.pop()) {
5761 callback(q.node, q.x0, q.y0, q.x1, q.y1);
5766 function defaultX(d) {
5770 function tree_x(_) {
5771 return arguments.length ? (this._x = _, this) : this._x;
5774 function defaultY(d) {
5778 function tree_y(_) {
5779 return arguments.length ? (this._y = _, this) : this._y;
5782 function quadtree(nodes, x, y) {
5783 var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5784 return nodes == null ? tree : tree.addAll(nodes);
5787 function Quadtree(x, y, x0, y0, x1, y1) {
5794 this._root = undefined;
5797 function leaf_copy(leaf) {
5798 var copy = {data: leaf.data}, next = copy;
5799 while (leaf = leaf.next) next = next.next = {data: leaf.data};
5803 var treeProto = quadtree.prototype = Quadtree.prototype;
5805 treeProto.copy = function() {
5806 var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5811 if (!node) return copy;
5813 if (!node.length) return copy._root = leaf_copy(node), copy;
5815 nodes = [{source: node, target: copy._root = new Array(4)}];
5816 while (node = nodes.pop()) {
5817 for (var i = 0; i < 4; ++i) {
5818 if (child = node.source[i]) {
5819 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5820 else node.target[i] = leaf_copy(child);
5828 treeProto.add = tree_add;
5829 treeProto.addAll = addAll;
5830 treeProto.cover = tree_cover;
5831 treeProto.data = tree_data;
5832 treeProto.extent = tree_extent;
5833 treeProto.find = tree_find;
5834 treeProto.remove = tree_remove;
5835 treeProto.removeAll = removeAll;
5836 treeProto.root = tree_root;
5837 treeProto.size = tree_size;
5838 treeProto.visit = tree_visit;
5839 treeProto.visitAfter = tree_visitAfter;
5840 treeProto.x = tree_x;
5841 treeProto.y = tree_y;
5851 function collide(radius) {
5857 if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5860 var i, n = nodes.length,
5868 for (var k = 0; k < iterations; ++k) {
5869 tree = quadtree(nodes, x, y).visitAfter(prepare);
5870 for (i = 0; i < n; ++i) {
5872 ri = radii[node.index], ri2 = ri * ri;
5873 xi = node.x + node.vx;
5874 yi = node.y + node.vy;
5879 function apply(quad, x0, y0, x1, y1) {
5880 var data = quad.data, rj = quad.r, r = ri + rj;
5882 if (data.index > node.index) {
5883 var x = xi - data.x - data.vx,
5884 y = yi - data.y - data.vy,
5887 if (x === 0) x = jiggle(), l += x * x;
5888 if (y === 0) y = jiggle(), l += y * y;
5889 l = (r - (l = Math.sqrt(l))) / l * strength;
5890 node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5891 node.vy += (y *= l) * r;
5892 data.vx -= x * (r = 1 - r);
5898 return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5902 function prepare(quad) {
5903 if (quad.data) return quad.r = radii[quad.data.index];
5904 for (var i = quad.r = 0; i < 4; ++i) {
5905 if (quad[i] && quad[i].r > quad.r) {
5911 function initialize() {
5913 var i, n = nodes.length, node;
5914 radii = new Array(n);
5915 for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5918 force.initialize = function(_) {
5923 force.iterations = function(_) {
5924 return arguments.length ? (iterations = +_, force) : iterations;
5927 force.strength = function(_) {
5928 return arguments.length ? (strength = +_, force) : strength;
5931 force.radius = function(_) {
5932 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5942 function find(nodeById, nodeId) {
5943 var node = nodeById.get(nodeId);
5944 if (!node) throw new Error("missing: " + nodeId);
5948 function link(links) {
5950 strength = defaultStrength,
5952 distance = constant$6(30),
5959 if (links == null) links = [];
5961 function defaultStrength(link) {
5962 return 1 / Math.min(count[link.source.index], count[link.target.index]);
5965 function force(alpha) {
5966 for (var k = 0, n = links.length; k < iterations; ++k) {
5967 for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5968 link = links[i], source = link.source, target = link.target;
5969 x = target.x + target.vx - source.x - source.vx || jiggle();
5970 y = target.y + target.vy - source.y - source.vy || jiggle();
5971 l = Math.sqrt(x * x + y * y);
5972 l = (l - distances[i]) / l * alpha * strengths[i];
5974 target.vx -= x * (b = bias[i]);
5976 source.vx += x * (b = 1 - b);
5982 function initialize() {
5988 nodeById = map$1(nodes, id),
5991 for (i = 0, count = new Array(n); i < m; ++i) {
5992 link = links[i], link.index = i;
5993 if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5994 if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5995 count[link.source.index] = (count[link.source.index] || 0) + 1;
5996 count[link.target.index] = (count[link.target.index] || 0) + 1;
5999 for (i = 0, bias = new Array(m); i < m; ++i) {
6000 link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
6003 strengths = new Array(m), initializeStrength();
6004 distances = new Array(m), initializeDistance();
6007 function initializeStrength() {
6010 for (var i = 0, n = links.length; i < n; ++i) {
6011 strengths[i] = +strength(links[i], i, links);
6015 function initializeDistance() {
6018 for (var i = 0, n = links.length; i < n; ++i) {
6019 distances[i] = +distance(links[i], i, links);
6023 force.initialize = function(_) {
6028 force.links = function(_) {
6029 return arguments.length ? (links = _, initialize(), force) : links;
6032 force.id = function(_) {
6033 return arguments.length ? (id = _, force) : id;
6036 force.iterations = function(_) {
6037 return arguments.length ? (iterations = +_, force) : iterations;
6040 force.strength = function(_) {
6041 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6044 force.distance = function(_) {
6045 return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6059 var initialRadius = 10,
6060 initialAngle = Math.PI * (3 - Math.sqrt(5));
6062 function simulation(nodes) {
6066 alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6068 velocityDecay = 0.6,
6070 stepper = timer(step),
6071 event = dispatch("tick", "end");
6073 if (nodes == null) nodes = [];
6077 event.call("tick", simulation);
6078 if (alpha < alphaMin) {
6080 event.call("end", simulation);
6085 var i, n = nodes.length, node;
6087 alpha += (alphaTarget - alpha) * alphaDecay;
6089 forces.each(function(force) {
6093 for (i = 0; i < n; ++i) {
6095 if (node.fx == null) node.x += node.vx *= velocityDecay;
6096 else node.x = node.fx, node.vx = 0;
6097 if (node.fy == null) node.y += node.vy *= velocityDecay;
6098 else node.y = node.fy, node.vy = 0;
6102 function initializeNodes() {
6103 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6104 node = nodes[i], node.index = i;
6105 if (isNaN(node.x) || isNaN(node.y)) {
6106 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6107 node.x = radius * Math.cos(angle);
6108 node.y = radius * Math.sin(angle);
6110 if (isNaN(node.vx) || isNaN(node.vy)) {
6111 node.vx = node.vy = 0;
6116 function initializeForce(force) {
6117 if (force.initialize) force.initialize(nodes);
6123 return simulation = {
6126 restart: function() {
6127 return stepper.restart(step), simulation;
6131 return stepper.stop(), simulation;
6134 nodes: function(_) {
6135 return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6138 alpha: function(_) {
6139 return arguments.length ? (alpha = +_, simulation) : alpha;
6142 alphaMin: function(_) {
6143 return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6146 alphaDecay: function(_) {
6147 return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6150 alphaTarget: function(_) {
6151 return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6154 velocityDecay: function(_) {
6155 return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6158 force: function(name, _) {
6159 return arguments.length > 1 ? (_ == null ? forces.remove(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);
6162 find: function(x, y, radius) {
6171 if (radius == null) radius = Infinity;
6172 else radius *= radius;
6174 for (i = 0; i < n; ++i) {
6178 d2 = dx * dx + dy * dy;
6179 if (d2 < radius) closest = node, radius = d2;
6185 on: function(name, _) {
6186 return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6191 function manyBody() {
6195 strength = constant$6(-30),
6198 distanceMax2 = Infinity,
6202 var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6203 for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6206 function initialize() {
6208 var i, n = nodes.length, node;
6209 strengths = new Array(n);
6210 for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6213 function accumulate(quad) {
6214 var strength = 0, q, c, weight = 0, x, y, i;
6216 // For internal nodes, accumulate forces from child quadrants.
6218 for (x = y = i = 0; i < 4; ++i) {
6219 if ((q = quad[i]) && (c = Math.abs(q.value))) {
6220 strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6223 quad.x = x / weight;
6224 quad.y = y / weight;
6227 // For leaf nodes, accumulate forces from coincident quadrants.
6232 do strength += strengths[q.data.index];
6236 quad.value = strength;
6239 function apply(quad, x1, _, x2) {
6240 if (!quad.value) return true;
6242 var x = quad.x - node.x,
6243 y = quad.y - node.y,
6247 // Apply the Barnes-Hut approximation if possible.
6248 // Limit forces for very close nodes; randomize direction if coincident.
6249 if (w * w / theta2 < l) {
6250 if (l < distanceMax2) {
6251 if (x === 0) x = jiggle(), l += x * x;
6252 if (y === 0) y = jiggle(), l += y * y;
6253 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6254 node.vx += x * quad.value * alpha / l;
6255 node.vy += y * quad.value * alpha / l;
6260 // Otherwise, process points directly.
6261 else if (quad.length || l >= distanceMax2) return;
6263 // Limit forces for very close nodes; randomize direction if coincident.
6264 if (quad.data !== node || quad.next) {
6265 if (x === 0) x = jiggle(), l += x * x;
6266 if (y === 0) y = jiggle(), l += y * y;
6267 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6270 do if (quad.data !== node) {
6271 w = strengths[quad.data.index] * alpha / l;
6274 } while (quad = quad.next);
6277 force.initialize = function(_) {
6282 force.strength = function(_) {
6283 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6286 force.distanceMin = function(_) {
6287 return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6290 force.distanceMax = function(_) {
6291 return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6294 force.theta = function(_) {
6295 return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6301 function radial(radius, x, y) {
6303 strength = constant$6(0.1),
6307 if (typeof radius !== "function") radius = constant$6(+radius);
6308 if (x == null) x = 0;
6309 if (y == null) y = 0;
6311 function force(alpha) {
6312 for (var i = 0, n = nodes.length; i < n; ++i) {
6313 var node = nodes[i],
6314 dx = node.x - x || 1e-6,
6315 dy = node.y - y || 1e-6,
6316 r = Math.sqrt(dx * dx + dy * dy),
6317 k = (radiuses[i] - r) * strengths[i] * alpha / r;
6323 function initialize() {
6325 var i, n = nodes.length;
6326 strengths = new Array(n);
6327 radiuses = new Array(n);
6328 for (i = 0; i < n; ++i) {
6329 radiuses[i] = +radius(nodes[i], i, nodes);
6330 strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6334 force.initialize = function(_) {
6335 nodes = _, initialize();
6338 force.strength = function(_) {
6339 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6342 force.radius = function(_) {
6343 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6346 force.x = function(_) {
6347 return arguments.length ? (x = +_, force) : x;
6350 force.y = function(_) {
6351 return arguments.length ? (y = +_, force) : y;
6358 var strength = constant$6(0.1),
6363 if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6365 function force(alpha) {
6366 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6367 node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6371 function initialize() {
6373 var i, n = nodes.length;
6374 strengths = new Array(n);
6376 for (i = 0; i < n; ++i) {
6377 strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6381 force.initialize = function(_) {
6386 force.strength = function(_) {
6387 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6390 force.x = function(_) {
6391 return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6398 var strength = constant$6(0.1),
6403 if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6405 function force(alpha) {
6406 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6407 node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6411 function initialize() {
6413 var i, n = nodes.length;
6414 strengths = new Array(n);
6416 for (i = 0; i < n; ++i) {
6417 strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6421 force.initialize = function(_) {
6426 force.strength = function(_) {
6427 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6430 force.y = function(_) {
6431 return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6437 // Computes the decimal coefficient and exponent of the specified number x with
6438 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6439 // For example, formatDecimal(1.23) returns ["123", 0].
6440 function formatDecimal(x, p) {
6441 if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6442 var i, coefficient = x.slice(0, i);
6444 // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6445 // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6447 coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6452 function exponent$1(x) {
6453 return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6456 function formatGroup(grouping, thousands) {
6457 return function(value, width) {
6458 var i = value.length,
6464 while (i > 0 && g > 0) {
6465 if (length + g + 1 > width) g = Math.max(1, width - length);
6466 t.push(value.substring(i -= g, i + g));
6467 if ((length += g + 1) > width) break;
6468 g = grouping[j = (j + 1) % grouping.length];
6471 return t.reverse().join(thousands);
6475 function formatNumerals(numerals) {
6476 return function(value) {
6477 return value.replace(/[0-9]/g, function(i) {
6478 return numerals[+i];
6483 function formatDefault(x, p) {
6484 x = x.toPrecision(p);
6486 out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6488 case ".": i0 = i1 = i; break;
6489 case "0": if (i0 === 0) i0 = i; i1 = i; break;
6490 case "e": break out;
6491 default: if (i0 > 0) i0 = 0; break;
6495 return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6500 function formatPrefixAuto(x, p) {
6501 var d = formatDecimal(x, p);
6502 if (!d) return x + "";
6503 var coefficient = d[0],
6505 i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6506 n = coefficient.length;
6507 return i === n ? coefficient
6508 : i > n ? coefficient + new Array(i - n + 1).join("0")
6509 : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6510 : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6513 function formatRounded(x, p) {
6514 var d = formatDecimal(x, p);
6515 if (!d) return x + "";
6516 var coefficient = d[0],
6518 return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6519 : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6520 : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6525 "%": function(x, p) { return (x * 100).toFixed(p); },
6526 "b": function(x) { return Math.round(x).toString(2); },
6527 "c": function(x) { return x + ""; },
6528 "d": function(x) { return Math.round(x).toString(10); },
6529 "e": function(x, p) { return x.toExponential(p); },
6530 "f": function(x, p) { return x.toFixed(p); },
6531 "g": function(x, p) { return x.toPrecision(p); },
6532 "o": function(x) { return Math.round(x).toString(8); },
6533 "p": function(x, p) { return formatRounded(x * 100, p); },
6535 "s": formatPrefixAuto,
6536 "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537 "x": function(x) { return Math.round(x).toString(16); }
6540 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6543 function formatSpecifier(specifier) {
6544 return new FormatSpecifier(specifier);
6547 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6549 function FormatSpecifier(specifier) {
6550 if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6553 fill = match[1] || " ",
6554 align = match[2] || ">",
6555 sign = match[3] || "-",
6556 symbol = match[4] || "",
6558 width = match[6] && +match[6],
6560 precision = match[8] && +match[8].slice(1),
6561 type = match[9] || "";
6563 // The "n" type is an alias for ",g".
6564 if (type === "n") comma = true, type = "g";
6566 // Map invalid types to the default format.
6567 else if (!formatTypes[type]) type = "";
6569 // If zero fill is specified, padding goes after sign and before digits.
6570 if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6575 this.symbol = symbol;
6579 this.precision = precision;
6583 FormatSpecifier.prototype.toString = function() {
6588 + (this.zero ? "0" : "")
6589 + (this.width == null ? "" : Math.max(1, this.width | 0))
6590 + (this.comma ? "," : "")
6591 + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6595 function identity$3(x) {
6599 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6601 function formatLocale(locale) {
6602 var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6603 currency = locale.currency,
6604 decimal = locale.decimal,
6605 numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6606 percent = locale.percent || "%";
6608 function newFormat(specifier) {
6609 specifier = formatSpecifier(specifier);
6611 var fill = specifier.fill,
6612 align = specifier.align,
6613 sign = specifier.sign,
6614 symbol = specifier.symbol,
6615 zero = specifier.zero,
6616 width = specifier.width,
6617 comma = specifier.comma,
6618 precision = specifier.precision,
6619 type = specifier.type;
6621 // Compute the prefix and suffix.
6622 // For SI-prefix, the suffix is lazily computed.
6623 var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6624 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6626 // What format function should we use?
6627 // Is this an integer type?
6628 // Can this type generate exponential notation?
6629 var formatType = formatTypes[type],
6630 maybeSuffix = !type || /[defgprs%]/.test(type);
6632 // Set the default precision if not specified,
6633 // or clamp the specified precision to the supported range.
6634 // For significant precision, it must be in [1, 21].
6635 // For fixed precision, it must be in [0, 20].
6636 precision = precision == null ? (type ? 6 : 12)
6637 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6638 : Math.max(0, Math.min(20, precision));
6640 function format(value) {
6641 var valuePrefix = prefix,
6642 valueSuffix = suffix,
6646 valueSuffix = formatType(value) + valueSuffix;
6651 // Perform the initial formatting.
6652 var valueNegative = value < 0;
6653 value = formatType(Math.abs(value), precision);
6655 // If a negative value rounds to zero during formatting, treat as positive.
6656 if (valueNegative && +value === 0) valueNegative = false;
6658 // Compute the prefix and suffix.
6659 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6660 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
6662 // Break the formatted value into the integer “value” part that can be
6663 // grouped, and fractional or exponential “suffix” part that is not.
6665 i = -1, n = value.length;
6667 if (c = value.charCodeAt(i), 48 > c || c > 57) {
6668 valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6669 value = value.slice(0, i);
6676 // If the fill character is not "0", grouping is applied before padding.
6677 if (comma && !zero) value = group(value, Infinity);
6679 // Compute the padding.
6680 var length = valuePrefix.length + value.length + valueSuffix.length,
6681 padding = length < width ? new Array(width - length + 1).join(fill) : "";
6683 // If the fill character is "0", grouping is applied after padding.
6684 if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6686 // Reconstruct the final output based on the desired alignment.
6688 case "<": value = valuePrefix + value + valueSuffix + padding; break;
6689 case "=": value = valuePrefix + padding + value + valueSuffix; break;
6690 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6691 default: value = padding + valuePrefix + value + valueSuffix; break;
6694 return numerals(value);
6697 format.toString = function() {
6698 return specifier + "";
6704 function formatPrefix(specifier, value) {
6705 var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6706 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6707 k = Math.pow(10, -e),
6708 prefix = prefixes[8 + e / 3];
6709 return function(value) {
6710 return f(k * value) + prefix;
6716 formatPrefix: formatPrefix
6731 function defaultLocale(definition) {
6732 locale = formatLocale(definition);
6733 format = locale.format;
6734 formatPrefix = locale.formatPrefix;
6738 function precisionFixed(step) {
6739 return Math.max(0, -exponent$1(Math.abs(step)));
6742 function precisionPrefix(step, value) {
6743 return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6746 function precisionRound(step, max) {
6747 step = Math.abs(step), max = Math.abs(max) - step;
6748 return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6751 // Adds floating point numbers with twice the normal precision.
6752 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6753 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6755 // Code adapted from GeographicLib by Charles F. F. Karney,
6756 // http://geographiclib.sourceforge.net/
6769 this.s = // rounded value
6770 this.t = 0; // exact error
6773 add$1(temp, y, this.t);
6774 add$1(this, temp.s, this.s);
6775 if (this.s) this.t += temp.t;
6776 else this.s = temp.t;
6778 valueOf: function() {
6783 var temp = new Adder;
6785 function add$1(adder, a, b) {
6786 var x = adder.s = a + b,
6789 adder.t = (a - av) + (b - bv);
6792 var epsilon$2 = 1e-6;
6793 var epsilon2$1 = 1e-12;
6795 var halfPi$2 = pi$3 / 2;
6796 var quarterPi = pi$3 / 4;
6797 var tau$3 = pi$3 * 2;
6799 var degrees$1 = 180 / pi$3;
6800 var radians = pi$3 / 180;
6803 var atan = Math.atan;
6804 var atan2 = Math.atan2;
6805 var cos$1 = Math.cos;
6806 var ceil = Math.ceil;
6810 var sin$1 = Math.sin;
6811 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6812 var sqrt = Math.sqrt;
6816 return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6820 return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6823 function haversin(x) {
6824 return (x = sin$1(x / 2)) * x;
6827 function noop$1() {}
6829 function streamGeometry(geometry, stream) {
6830 if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831 streamGeometryType[geometry.type](geometry, stream);
6835 var streamObjectType = {
6836 Feature: function(object, stream) {
6837 streamGeometry(object.geometry, stream);
6839 FeatureCollection: function(object, stream) {
6840 var features = object.features, i = -1, n = features.length;
6841 while (++i < n) streamGeometry(features[i].geometry, stream);
6845 var streamGeometryType = {
6846 Sphere: function(object, stream) {
6849 Point: function(object, stream) {
6850 object = object.coordinates;
6851 stream.point(object[0], object[1], object[2]);
6853 MultiPoint: function(object, stream) {
6854 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6855 while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6857 LineString: function(object, stream) {
6858 streamLine(object.coordinates, stream, 0);
6860 MultiLineString: function(object, stream) {
6861 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862 while (++i < n) streamLine(coordinates[i], stream, 0);
6864 Polygon: function(object, stream) {
6865 streamPolygon(object.coordinates, stream);
6867 MultiPolygon: function(object, stream) {
6868 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869 while (++i < n) streamPolygon(coordinates[i], stream);
6871 GeometryCollection: function(object, stream) {
6872 var geometries = object.geometries, i = -1, n = geometries.length;
6873 while (++i < n) streamGeometry(geometries[i], stream);
6877 function streamLine(coordinates, stream, closed) {
6878 var i = -1, n = coordinates.length - closed, coordinate;
6880 while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6884 function streamPolygon(coordinates, stream) {
6885 var i = -1, n = coordinates.length;
6886 stream.polygonStart();
6887 while (++i < n) streamLine(coordinates[i], stream, 1);
6888 stream.polygonEnd();
6891 function d3_geoStream(object, stream) {
6892 if (object && streamObjectType.hasOwnProperty(object.type)) {
6893 streamObjectType[object.type](object, stream);
6895 streamGeometry(object, stream);
6899 var areaRingSum = adder();
6901 var areaSum = adder(),
6912 polygonStart: function() {
6913 areaRingSum.reset();
6914 areaStream.lineStart = areaRingStart;
6915 areaStream.lineEnd = areaRingEnd;
6917 polygonEnd: function() {
6918 var areaRing = +areaRingSum;
6919 areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6920 this.lineStart = this.lineEnd = this.point = noop$1;
6922 sphere: function() {
6927 function areaRingStart() {
6928 areaStream.point = areaPointFirst;
6931 function areaRingEnd() {
6932 areaPoint(lambda00, phi00);
6935 function areaPointFirst(lambda, phi) {
6936 areaStream.point = areaPoint;
6937 lambda00 = lambda, phi00 = phi;
6938 lambda *= radians, phi *= radians;
6939 lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6942 function areaPoint(lambda, phi) {
6943 lambda *= radians, phi *= radians;
6944 phi = phi / 2 + quarterPi; // half the angular distance from south pole
6946 // Spherical excess E for a spherical triangle with vertices: south pole,
6947 // previous point, current point. Uses a formula derived from Cagnoli’s
6948 // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6949 var dLambda = lambda - lambda0,
6950 sdLambda = dLambda >= 0 ? 1 : -1,
6951 adLambda = sdLambda * dLambda,
6952 cosPhi = cos$1(phi),
6953 sinPhi = sin$1(phi),
6954 k = sinPhi0 * sinPhi,
6955 u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6956 v = k * sdLambda * sin$1(adLambda);
6957 areaRingSum.add(atan2(v, u));
6959 // Advance the previous points.
6960 lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6963 function d3_geoArea(object) {
6965 d3_geoStream(object, areaStream);
6969 function spherical(cartesian) {
6970 return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6973 function cartesian(spherical) {
6974 var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6975 return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6978 function cartesianDot(a, b) {
6979 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6982 function cartesianCross(a, b) {
6983 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]];
6987 function cartesianAddInPlace(a, b) {
6988 a[0] += b[0], a[1] += b[1], a[2] += b[2];
6991 function cartesianScale(vector, k) {
6992 return [vector[0] * k, vector[1] * k, vector[2] * k];
6996 function cartesianNormalizeInPlace(d) {
6997 var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6998 d[0] /= l, d[1] /= l, d[2] /= l;
7001 var lambda0$1, phi0, lambda1, phi1, // bounds
7002 lambda2, // previous lambda-coordinate
7003 lambda00$1, phi00$1, // first point
7004 p0, // previous 3D point
7009 var boundsStream = {
7011 lineStart: boundsLineStart,
7012 lineEnd: boundsLineEnd,
7013 polygonStart: function() {
7014 boundsStream.point = boundsRingPoint;
7015 boundsStream.lineStart = boundsRingStart;
7016 boundsStream.lineEnd = boundsRingEnd;
7018 areaStream.polygonStart();
7020 polygonEnd: function() {
7021 areaStream.polygonEnd();
7022 boundsStream.point = boundsPoint;
7023 boundsStream.lineStart = boundsLineStart;
7024 boundsStream.lineEnd = boundsLineEnd;
7025 if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7026 else if (deltaSum > epsilon$2) phi1 = 90;
7027 else if (deltaSum < -epsilon$2) phi0 = -90;
7028 range[0] = lambda0$1, range[1] = lambda1;
7032 function boundsPoint(lambda, phi) {
7033 ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7034 if (phi < phi0) phi0 = phi;
7035 if (phi > phi1) phi1 = phi;
7038 function linePoint(lambda, phi) {
7039 var p = cartesian([lambda * radians, phi * radians]);
7041 var normal = cartesianCross(p0, p),
7042 equatorial = [normal[1], -normal[0], 0],
7043 inflection = cartesianCross(equatorial, normal);
7044 cartesianNormalizeInPlace(inflection);
7045 inflection = spherical(inflection);
7046 var delta = lambda - lambda2,
7047 sign$$1 = delta > 0 ? 1 : -1,
7048 lambdai = inflection[0] * degrees$1 * sign$$1,
7050 antimeridian = abs(delta) > 180;
7051 if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7052 phii = inflection[1] * degrees$1;
7053 if (phii > phi1) phi1 = phii;
7054 } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7055 phii = -inflection[1] * degrees$1;
7056 if (phii < phi0) phi0 = phii;
7058 if (phi < phi0) phi0 = phi;
7059 if (phi > phi1) phi1 = phi;
7062 if (lambda < lambda2) {
7063 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7065 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7068 if (lambda1 >= lambda0$1) {
7069 if (lambda < lambda0$1) lambda0$1 = lambda;
7070 if (lambda > lambda1) lambda1 = lambda;
7072 if (lambda > lambda2) {
7073 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7075 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7080 ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7082 if (phi < phi0) phi0 = phi;
7083 if (phi > phi1) phi1 = phi;
7084 p0 = p, lambda2 = lambda;
7087 function boundsLineStart() {
7088 boundsStream.point = linePoint;
7091 function boundsLineEnd() {
7092 range[0] = lambda0$1, range[1] = lambda1;
7093 boundsStream.point = boundsPoint;
7097 function boundsRingPoint(lambda, phi) {
7099 var delta = lambda - lambda2;
7100 deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7102 lambda00$1 = lambda, phi00$1 = phi;
7104 areaStream.point(lambda, phi);
7105 linePoint(lambda, phi);
7108 function boundsRingStart() {
7109 areaStream.lineStart();
7112 function boundsRingEnd() {
7113 boundsRingPoint(lambda00$1, phi00$1);
7114 areaStream.lineEnd();
7115 if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7116 range[0] = lambda0$1, range[1] = lambda1;
7120 // Finds the left-right distance between two longitudes.
7121 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7122 // the distance between ±180° to be 360°.
7123 function angle(lambda0, lambda1) {
7124 return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7127 function rangeCompare(a, b) {
7131 function rangeContains(range, x) {
7132 return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7135 function d3_geoBounds(feature) {
7136 var i, n, a, b, merged, deltaMax, delta;
7138 phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7140 d3_geoStream(feature, boundsStream);
7142 // First, sort ranges by their minimum longitudes.
7143 if (n = ranges.length) {
7144 ranges.sort(rangeCompare);
7146 // Then, merge any ranges that overlap.
7147 for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7149 if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7150 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7151 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7157 // Finally, find the largest gap between the merged ranges.
7158 // The final bounding box will be the inverse of this gap.
7159 for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7161 if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7165 ranges = range = null;
7167 return lambda0$1 === Infinity || phi0 === Infinity
7168 ? [[NaN, NaN], [NaN, NaN]]
7169 : [[lambda0$1, phi0], [lambda1, phi1]];
7176 lambda00$2, phi00$2, // first point
7177 x0, y0, z0; // previous point
7179 var centroidStream = {
7181 point: centroidPoint,
7182 lineStart: centroidLineStart,
7183 lineEnd: centroidLineEnd,
7184 polygonStart: function() {
7185 centroidStream.lineStart = centroidRingStart;
7186 centroidStream.lineEnd = centroidRingEnd;
7188 polygonEnd: function() {
7189 centroidStream.lineStart = centroidLineStart;
7190 centroidStream.lineEnd = centroidLineEnd;
7194 // Arithmetic mean of Cartesian vectors.
7195 function centroidPoint(lambda, phi) {
7196 lambda *= radians, phi *= radians;
7197 var cosPhi = cos$1(phi);
7198 centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7201 function centroidPointCartesian(x, y, z) {
7203 X0 += (x - X0) / W0;
7204 Y0 += (y - Y0) / W0;
7205 Z0 += (z - Z0) / W0;
7208 function centroidLineStart() {
7209 centroidStream.point = centroidLinePointFirst;
7212 function centroidLinePointFirst(lambda, phi) {
7213 lambda *= radians, phi *= radians;
7214 var cosPhi = cos$1(phi);
7215 x0 = cosPhi * cos$1(lambda);
7216 y0 = cosPhi * sin$1(lambda);
7218 centroidStream.point = centroidLinePoint;
7219 centroidPointCartesian(x0, y0, z0);
7222 function centroidLinePoint(lambda, phi) {
7223 lambda *= radians, phi *= radians;
7224 var cosPhi = cos$1(phi),
7225 x = cosPhi * cos$1(lambda),
7226 y = cosPhi * sin$1(lambda),
7228 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);
7230 X1 += w * (x0 + (x0 = x));
7231 Y1 += w * (y0 + (y0 = y));
7232 Z1 += w * (z0 + (z0 = z));
7233 centroidPointCartesian(x0, y0, z0);
7236 function centroidLineEnd() {
7237 centroidStream.point = centroidPoint;
7240 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7241 // J. Applied Mechanics 42, 239 (1975).
7242 function centroidRingStart() {
7243 centroidStream.point = centroidRingPointFirst;
7246 function centroidRingEnd() {
7247 centroidRingPoint(lambda00$2, phi00$2);
7248 centroidStream.point = centroidPoint;
7251 function centroidRingPointFirst(lambda, phi) {
7252 lambda00$2 = lambda, phi00$2 = phi;
7253 lambda *= radians, phi *= radians;
7254 centroidStream.point = centroidRingPoint;
7255 var cosPhi = cos$1(phi);
7256 x0 = cosPhi * cos$1(lambda);
7257 y0 = cosPhi * sin$1(lambda);
7259 centroidPointCartesian(x0, y0, z0);
7262 function centroidRingPoint(lambda, phi) {
7263 lambda *= radians, phi *= radians;
7264 var cosPhi = cos$1(phi),
7265 x = cosPhi * cos$1(lambda),
7266 y = cosPhi * sin$1(lambda),
7268 cx = y0 * z - z0 * y,
7269 cy = z0 * x - x0 * z,
7270 cz = x0 * y - y0 * x,
7271 m = sqrt(cx * cx + cy * cy + cz * cz),
7272 w = asin(m), // line weight = angle
7273 v = m && -w / m; // area weight multiplier
7278 X1 += w * (x0 + (x0 = x));
7279 Y1 += w * (y0 + (y0 = y));
7280 Z1 += w * (z0 + (z0 = z));
7281 centroidPointCartesian(x0, y0, z0);
7284 function d3_geoCentroid(object) {
7289 d3_geoStream(object, centroidStream);
7294 m = x * x + y * y + z * z;
7296 // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7297 if (m < epsilon2$1) {
7298 x = X1, y = Y1, z = Z1;
7299 // If the feature has zero length, fall back to arithmetic mean of point vectors.
7300 if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7301 m = x * x + y * y + z * z;
7302 // If the feature still has an undefined ccentroid, then return.
7303 if (m < epsilon2$1) return [NaN, NaN];
7306 return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7309 function constant$7(x) {
7315 function compose(a, b) {
7317 function compose(x, y) {
7318 return x = a(x, y), b(x[0], x[1]);
7321 if (a.invert && b.invert) compose.invert = function(x, y) {
7322 return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7328 function rotationIdentity(lambda, phi) {
7329 return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7332 rotationIdentity.invert = rotationIdentity;
7334 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7335 return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7336 : rotationLambda(deltaLambda))
7337 : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7338 : rotationIdentity);
7341 function forwardRotationLambda(deltaLambda) {
7342 return function(lambda, phi) {
7343 return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7347 function rotationLambda(deltaLambda) {
7348 var rotation = forwardRotationLambda(deltaLambda);
7349 rotation.invert = forwardRotationLambda(-deltaLambda);
7353 function rotationPhiGamma(deltaPhi, deltaGamma) {
7354 var cosDeltaPhi = cos$1(deltaPhi),
7355 sinDeltaPhi = sin$1(deltaPhi),
7356 cosDeltaGamma = cos$1(deltaGamma),
7357 sinDeltaGamma = sin$1(deltaGamma);
7359 function rotation(lambda, phi) {
7360 var cosPhi = cos$1(phi),
7361 x = cos$1(lambda) * cosPhi,
7362 y = sin$1(lambda) * cosPhi,
7364 k = z * cosDeltaPhi + x * sinDeltaPhi;
7366 atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367 asin(k * cosDeltaGamma + y * sinDeltaGamma)
7371 rotation.invert = function(lambda, phi) {
7372 var cosPhi = cos$1(phi),
7373 x = cos$1(lambda) * cosPhi,
7374 y = sin$1(lambda) * cosPhi,
7376 k = z * cosDeltaGamma - y * sinDeltaGamma;
7378 atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379 asin(k * cosDeltaPhi - x * sinDeltaPhi)
7386 function rotation(rotate) {
7387 rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7389 function forward(coordinates) {
7390 coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7394 forward.invert = function(coordinates) {
7395 coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7396 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7402 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403 function circleStream(stream, radius, delta, direction, t0, t1) {
7405 var cosRadius = cos$1(radius),
7406 sinRadius = sin$1(radius),
7407 step = direction * delta;
7409 t0 = radius + direction * tau$3;
7410 t1 = radius - step / 2;
7412 t0 = circleRadius(cosRadius, t0);
7413 t1 = circleRadius(cosRadius, t1);
7414 if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7416 for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7417 point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7418 stream.point(point[0], point[1]);
7422 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7423 function circleRadius(cosRadius, point) {
7424 point = cartesian(point), point[0] -= cosRadius;
7425 cartesianNormalizeInPlace(point);
7426 var radius = acos(-point[1]);
7427 return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7431 var center = constant$7([0, 0]),
7432 radius = constant$7(90),
7433 precision = constant$7(6),
7436 stream = {point: point};
7438 function point(x, y) {
7439 ring.push(x = rotate(x, y));
7440 x[0] *= degrees$1, x[1] *= degrees$1;
7444 var c = center.apply(this, arguments),
7445 r = radius.apply(this, arguments) * radians,
7446 p = precision.apply(this, arguments) * radians;
7448 rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7449 circleStream(stream, r, p, 1);
7450 c = {type: "Polygon", coordinates: [ring]};
7451 ring = rotate = null;
7455 circle.center = function(_) {
7456 return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7459 circle.radius = function(_) {
7460 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7463 circle.precision = function(_) {
7464 return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7470 function clipBuffer() {
7474 point: function(x, y) {
7477 lineStart: function() {
7478 lines.push(line = []);
7481 rejoin: function() {
7482 if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7484 result: function() {
7493 function pointEqual(a, b) {
7494 return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7497 function Intersection(point, points, other, entry) {
7500 this.o = other; // another intersection
7501 this.e = entry; // is an entry?
7502 this.v = false; // visited
7503 this.n = this.p = null; // next & previous
7506 // A generalized polygon clipping algorithm: given a polygon that has been cut
7507 // into its visible line segments, and rejoins the segments by interpolating
7508 // along the clip edge.
7509 function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
7515 segments.forEach(function(segment) {
7516 if ((n = segment.length - 1) <= 0) return;
7517 var n, p0 = segment[0], p1 = segment[n], x;
7519 // If the first and last points of a segment are coincident, then treat as a
7520 // closed ring. TODO if all rings are closed, then the winding order of the
7521 // exterior ring should be checked.
7522 if (pointEqual(p0, p1)) {
7524 for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7529 subject.push(x = new Intersection(p0, segment, null, true));
7530 clip.push(x.o = new Intersection(p0, null, x, false));
7531 subject.push(x = new Intersection(p1, segment, null, false));
7532 clip.push(x.o = new Intersection(p1, null, x, true));
7535 if (!subject.length) return;
7537 clip.sort(compareIntersection);
7541 for (i = 0, n = clip.length; i < n; ++i) {
7542 clip[i].e = startInside = !startInside;
7545 var start = subject[0],
7550 // Find first unvisited intersection.
7551 var current = start,
7553 while (current.v) if ((current = current.n) === start) return;
7557 current.v = current.o.v = true;
7560 for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7562 interpolate(current.x, current.n.x, 1, stream);
7564 current = current.n;
7567 points = current.p.z;
7568 for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7570 interpolate(current.x, current.p.x, -1, stream);
7572 current = current.p;
7574 current = current.o;
7576 isSubject = !isSubject;
7577 } while (!current.v);
7582 function link$1(array) {
7583 if (!(n = array.length)) return;
7597 var sum$1 = adder();
7599 function polygonContains(polygon, point) {
7600 var lambda = point[0],
7602 normal = [sin$1(lambda), -cos$1(lambda), 0],
7608 for (var i = 0, n = polygon.length; i < n; ++i) {
7609 if (!(m = (ring = polygon[i]).length)) continue;
7612 point0 = ring[m - 1],
7613 lambda0 = point0[0],
7614 phi0 = point0[1] / 2 + quarterPi,
7615 sinPhi0 = sin$1(phi0),
7616 cosPhi0 = cos$1(phi0);
7618 for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7619 var point1 = ring[j],
7620 lambda1 = point1[0],
7621 phi1 = point1[1] / 2 + quarterPi,
7622 sinPhi1 = sin$1(phi1),
7623 cosPhi1 = cos$1(phi1),
7624 delta = lambda1 - lambda0,
7625 sign$$1 = delta >= 0 ? 1 : -1,
7626 absDelta = sign$$1 * delta,
7627 antimeridian = absDelta > pi$3,
7628 k = sinPhi0 * sinPhi1;
7630 sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631 angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7633 // Are the longitudes either side of the point’s meridian (lambda),
7634 // and are the latitudes smaller than the parallel (phi)?
7635 if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7636 var arc = cartesianCross(cartesian(point0), cartesian(point1));
7637 cartesianNormalizeInPlace(arc);
7638 var intersection = cartesianCross(normal, arc);
7639 cartesianNormalizeInPlace(intersection);
7640 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7641 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7642 winding += antimeridian ^ delta >= 0 ? 1 : -1;
7648 // First, determine whether the South pole is inside or outside:
7651 // * the polygon winds around it in a clockwise direction.
7652 // * the polygon does not (cumulatively) wind around it, but has a negative
7653 // (counter-clockwise) area.
7655 // Second, count the (signed) number of times a segment crosses a lambda
7656 // from the point to the South pole. If it is zero, then the point is the
7657 // same side as the South pole.
7659 return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7662 function clip(pointVisible, clipLine, interpolate, start) {
7663 return function(sink) {
7664 var line = clipLine(sink),
7665 ringBuffer = clipBuffer(),
7666 ringSink = clipLine(ringBuffer),
7667 polygonStarted = false,
7674 lineStart: lineStart,
7676 polygonStart: function() {
7677 clip.point = pointRing;
7678 clip.lineStart = ringStart;
7679 clip.lineEnd = ringEnd;
7683 polygonEnd: function() {
7685 clip.lineStart = lineStart;
7686 clip.lineEnd = lineEnd;
7687 segments = merge(segments);
7688 var startInside = polygonContains(polygon, start);
7689 if (segments.length) {
7690 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7691 clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7692 } else if (startInside) {
7693 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7695 interpolate(null, null, 1, sink);
7698 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699 segments = polygon = null;
7701 sphere: function() {
7702 sink.polygonStart();
7704 interpolate(null, null, 1, sink);
7710 function point(lambda, phi) {
7711 if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7714 function pointLine(lambda, phi) {
7715 line.point(lambda, phi);
7718 function lineStart() {
7719 clip.point = pointLine;
7723 function lineEnd() {
7728 function pointRing(lambda, phi) {
7729 ring.push([lambda, phi]);
7730 ringSink.point(lambda, phi);
7733 function ringStart() {
7734 ringSink.lineStart();
7738 function ringEnd() {
7739 pointRing(ring[0][0], ring[0][1]);
7742 var clean = ringSink.clean(),
7743 ringSegments = ringBuffer.result(),
7744 i, n = ringSegments.length, m,
7754 // No intersections.
7756 segment = ringSegments[0];
7757 if ((m = segment.length - 1) > 0) {
7758 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7760 for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7766 // Rejoin connected segments.
7767 // TODO reuse ringBuffer.rejoin()?
7768 if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7770 segments.push(ringSegments.filter(validSegment));
7777 function validSegment(segment) {
7778 return segment.length > 1;
7781 // Intersections are sorted along the clip edge. For both antimeridian cutting
7782 // and circle clipping, the same comparison is used.
7783 function compareIntersection(a, b) {
7784 return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7785 - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7788 var clipAntimeridian = clip(
7789 function() { return true; },
7790 clipAntimeridianLine,
7791 clipAntimeridianInterpolate,
7795 // Takes a line and cuts into visible segments. Return values: 0 - there were
7796 // intersections or the line was empty; 1 - no intersections; 2 - there were
7797 // intersections, and the first and last segments should be rejoined.
7798 function clipAntimeridianLine(stream) {
7802 clean; // no intersections
7805 lineStart: function() {
7809 point: function(lambda1, phi1) {
7810 var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7811 delta = abs(lambda1 - lambda0);
7812 if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7813 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7814 stream.point(sign0, phi0);
7817 stream.point(sign1, phi0);
7818 stream.point(lambda1, phi0);
7820 } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7821 if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7822 if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7823 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7824 stream.point(sign0, phi0);
7827 stream.point(sign1, phi0);
7830 stream.point(lambda0 = lambda1, phi0 = phi1);
7833 lineEnd: function() {
7835 lambda0 = phi0 = NaN;
7838 return 2 - clean; // if intersections, rejoin first and last segments
7843 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7846 sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7847 return abs(sinLambda0Lambda1) > epsilon$2
7848 ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7849 - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7850 / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7851 : (phi0 + phi1) / 2;
7854 function clipAntimeridianInterpolate(from, to, direction, stream) {
7857 phi = direction * halfPi$2;
7858 stream.point(-pi$3, phi);
7859 stream.point(0, phi);
7860 stream.point(pi$3, phi);
7861 stream.point(pi$3, 0);
7862 stream.point(pi$3, -phi);
7863 stream.point(0, -phi);
7864 stream.point(-pi$3, -phi);
7865 stream.point(-pi$3, 0);
7866 stream.point(-pi$3, phi);
7867 } else if (abs(from[0] - to[0]) > epsilon$2) {
7868 var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7869 phi = direction * lambda / 2;
7870 stream.point(-lambda, phi);
7871 stream.point(0, phi);
7872 stream.point(lambda, phi);
7874 stream.point(to[0], to[1]);
7878 function clipCircle(radius) {
7879 var cr = cos$1(radius),
7880 delta = 6 * radians,
7881 smallRadius = cr > 0,
7882 notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7884 function interpolate(from, to, direction, stream) {
7885 circleStream(stream, radius, delta, direction, from, to);
7888 function visible(lambda, phi) {
7889 return cos$1(lambda) * cos$1(phi) > cr;
7892 // Takes a line and cuts into visible segments. Return values used for polygon
7893 // clipping: 0 - there were intersections or the line was empty; 1 - no
7894 // intersections 2 - there were intersections, and the first and last segments
7895 // should be rejoined.
7896 function clipLine(stream) {
7897 var point0, // previous point
7898 c0, // code for previous point
7899 v0, // visibility of previous point
7900 v00, // visibility of first point
7901 clean; // no intersections
7903 lineStart: function() {
7907 point: function(lambda, phi) {
7908 var point1 = [lambda, phi],
7910 v = visible(lambda, phi),
7912 ? v ? 0 : code(lambda, phi)
7913 : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7914 if (!point0 && (v00 = v0 = v)) stream.lineStart();
7915 // Handle degeneracies.
7916 // TODO ignore if not clipping polygons.
7918 point2 = intersect(point0, point1);
7919 if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7920 point1[0] += epsilon$2;
7921 point1[1] += epsilon$2;
7922 v = visible(point1[0], point1[1]);
7930 point2 = intersect(point1, point0);
7931 stream.point(point2[0], point2[1]);
7934 point2 = intersect(point0, point1);
7935 stream.point(point2[0], point2[1]);
7939 } else if (notHemisphere && point0 && smallRadius ^ v) {
7941 // If the codes for two points are different, or are both zero,
7942 // and there this segment intersects with the small circle.
7943 if (!(c & c0) && (t = intersect(point1, point0, true))) {
7947 stream.point(t[0][0], t[0][1]);
7948 stream.point(t[1][0], t[1][1]);
7951 stream.point(t[1][0], t[1][1]);
7954 stream.point(t[0][0], t[0][1]);
7958 if (v && (!point0 || !pointEqual(point0, point1))) {
7959 stream.point(point1[0], point1[1]);
7961 point0 = point1, v0 = v, c0 = c;
7963 lineEnd: function() {
7964 if (v0) stream.lineEnd();
7967 // Rejoin first and last segments if there were intersections and the first
7968 // and last points were visible.
7970 return clean | ((v00 && v0) << 1);
7975 // Intersects the great circle between a and b with the clip circle.
7976 function intersect(a, b, two) {
7977 var pa = cartesian(a),
7980 // We have two planes, n1.p = d1 and n2.p = d2.
7981 // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7982 var n1 = [1, 0, 0], // normal
7983 n2 = cartesianCross(pa, pb),
7984 n2n2 = cartesianDot(n2, n2),
7985 n1n2 = n2[0], // cartesianDot(n1, n2),
7986 determinant = n2n2 - n1n2 * n1n2;
7988 // Two polar points.
7989 if (!determinant) return !two && a;
7991 var c1 = cr * n2n2 / determinant,
7992 c2 = -cr * n1n2 / determinant,
7993 n1xn2 = cartesianCross(n1, n2),
7994 A = cartesianScale(n1, c1),
7995 B = cartesianScale(n2, c2);
7996 cartesianAddInPlace(A, B);
7998 // Solve |p(t)|^2 = 1.
8000 w = cartesianDot(A, u),
8001 uu = cartesianDot(u, u),
8002 t2 = w * w - uu * (cartesianDot(A, A) - 1);
8007 q = cartesianScale(u, (-w - t) / uu);
8008 cartesianAddInPlace(q, A);
8013 // Two intersection points.
8020 if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8022 var delta = lambda1 - lambda0,
8023 polar = abs(delta - pi$3) < epsilon$2,
8024 meridian = polar || delta < epsilon$2;
8026 if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8028 // Check that the first point is between a and b.
8031 ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8032 : phi0 <= q[1] && q[1] <= phi1
8033 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8034 var q1 = cartesianScale(u, (-w + t) / uu);
8035 cartesianAddInPlace(q1, A);
8036 return [q, spherical(q1)];
8040 // Generates a 4-bit vector representing the location of a point relative to
8041 // the small circle's bounding box.
8042 function code(lambda, phi) {
8043 var r = smallRadius ? radius : pi$3 - radius,
8045 if (lambda < -r) code |= 1; // left
8046 else if (lambda > r) code |= 2; // right
8047 if (phi < -r) code |= 4; // below
8048 else if (phi > r) code |= 8; // above
8052 return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8055 function clipLine(a, b, x0, y0, x1, y1) {
8067 if (!dx && r > 0) return;
8072 } else if (dx > 0) {
8078 if (!dx && r < 0) return;
8083 } else if (dx > 0) {
8089 if (!dy && r > 0) return;
8094 } else if (dy > 0) {
8100 if (!dy && r < 0) return;
8105 } else if (dy > 0) {
8110 if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8111 if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8115 var clipMax = 1e9, clipMin = -clipMax;
8117 // TODO Use d3-polygon’s polygonContains here for the ring check?
8118 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8120 function clipRectangle(x0, y0, x1, y1) {
8122 function visible(x, y) {
8123 return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8126 function interpolate(from, to, direction, stream) {
8129 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8130 || comparePoint(from, to) < 0 ^ direction > 0) {
8131 do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8132 while ((a = (a + direction + 4) % 4) !== a1);
8134 stream.point(to[0], to[1]);
8138 function corner(p, direction) {
8139 return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8140 : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8141 : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8142 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8145 function compareIntersection(a, b) {
8146 return comparePoint(a.x, b.x);
8149 function comparePoint(a, b) {
8150 var ca = corner(a, 1),
8152 return ca !== cb ? ca - cb
8153 : ca === 0 ? b[1] - a[1]
8154 : ca === 1 ? a[0] - b[0]
8155 : ca === 2 ? a[1] - b[1]
8159 return function(stream) {
8160 var activeStream = stream,
8161 bufferStream = clipBuffer(),
8165 x__, y__, v__, // first point
8166 x_, y_, v_, // previous point
8172 lineStart: lineStart,
8174 polygonStart: polygonStart,
8175 polygonEnd: polygonEnd
8178 function point(x, y) {
8179 if (visible(x, y)) activeStream.point(x, y);
8182 function polygonInside() {
8185 for (var i = 0, n = polygon.length; i < n; ++i) {
8186 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8187 a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8188 if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8189 else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8196 // Buffer geometry within a polygon and then clip it en masse.
8197 function polygonStart() {
8198 activeStream = bufferStream, segments = [], polygon = [], clean = true;
8201 function polygonEnd() {
8202 var startInside = polygonInside(),
8203 cleanInside = clean && startInside,
8204 visible = (segments = merge(segments)).length;
8205 if (cleanInside || visible) {
8206 stream.polygonStart();
8209 interpolate(null, null, 1, stream);
8213 clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8215 stream.polygonEnd();
8217 activeStream = stream, segments = polygon = ring = null;
8220 function lineStart() {
8221 clipStream.point = linePoint;
8222 if (polygon) polygon.push(ring = []);
8228 // TODO rather than special-case polygons, simply handle them separately.
8229 // Ideally, coincident intersection points should be jittered to avoid
8231 function lineEnd() {
8233 linePoint(x__, y__);
8234 if (v__ && v_) bufferStream.rejoin();
8235 segments.push(bufferStream.result());
8237 clipStream.point = point;
8238 if (v_) activeStream.lineEnd();
8241 function linePoint(x, y) {
8242 var v = visible(x, y);
8243 if (polygon) ring.push([x, y]);
8245 x__ = x, y__ = y, v__ = v;
8248 activeStream.lineStart();
8249 activeStream.point(x, y);
8252 if (v && v_) activeStream.point(x, y);
8254 var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8255 b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8256 if (clipLine(a, b, x0, y0, x1, y1)) {
8258 activeStream.lineStart();
8259 activeStream.point(a[0], a[1]);
8261 activeStream.point(b[0], b[1]);
8262 if (!v) activeStream.lineEnd();
8265 activeStream.lineStart();
8266 activeStream.point(x, y);
8271 x_ = x, y_ = y, v_ = v;
8278 function extent$1() {
8288 stream: function(stream) {
8289 return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8291 extent: function(_) {
8292 return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8297 var lengthSum = adder(),
8302 var lengthStream = {
8305 lineStart: lengthLineStart,
8307 polygonStart: noop$1,
8311 function lengthLineStart() {
8312 lengthStream.point = lengthPointFirst;
8313 lengthStream.lineEnd = lengthLineEnd;
8316 function lengthLineEnd() {
8317 lengthStream.point = lengthStream.lineEnd = noop$1;
8320 function lengthPointFirst(lambda, phi) {
8321 lambda *= radians, phi *= radians;
8322 lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8323 lengthStream.point = lengthPoint;
8326 function lengthPoint(lambda, phi) {
8327 lambda *= radians, phi *= radians;
8328 var sinPhi = sin$1(phi),
8329 cosPhi = cos$1(phi),
8330 delta = abs(lambda - lambda0$2),
8331 cosDelta = cos$1(delta),
8332 sinDelta = sin$1(delta),
8333 x = cosPhi * sinDelta,
8334 y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8335 z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8336 lengthSum.add(atan2(sqrt(x * x + y * y), z));
8337 lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8340 function d3_geoLength(object) {
8342 d3_geoStream(object, lengthStream);
8346 var coordinates = [null, null],
8347 object$1 = {type: "LineString", coordinates: coordinates};
8349 function distance(a, b) {
8352 return d3_geoLength(object$1);
8355 var containsObjectType = {
8356 Feature: function(object, point) {
8357 return containsGeometry(object.geometry, point);
8359 FeatureCollection: function(object, point) {
8360 var features = object.features, i = -1, n = features.length;
8361 while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8366 var containsGeometryType = {
8367 Sphere: function() {
8370 Point: function(object, point) {
8371 return containsPoint(object.coordinates, point);
8373 MultiPoint: function(object, point) {
8374 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8375 while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8378 LineString: function(object, point) {
8379 return containsLine(object.coordinates, point);
8381 MultiLineString: function(object, point) {
8382 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8383 while (++i < n) if (containsLine(coordinates[i], point)) return true;
8386 Polygon: function(object, point) {
8387 return containsPolygon(object.coordinates, point);
8389 MultiPolygon: function(object, point) {
8390 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8391 while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8394 GeometryCollection: function(object, point) {
8395 var geometries = object.geometries, i = -1, n = geometries.length;
8396 while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8401 function containsGeometry(geometry, point) {
8402 return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403 ? containsGeometryType[geometry.type](geometry, point)
8407 function containsPoint(coordinates, point) {
8408 return distance(coordinates, point) === 0;
8411 function containsLine(coordinates, point) {
8412 var ab = distance(coordinates[0], coordinates[1]),
8413 ao = distance(coordinates[0], point),
8414 ob = distance(point, coordinates[1]);
8415 return ao + ob <= ab + epsilon$2;
8418 function containsPolygon(coordinates, point) {
8419 return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8422 function ringRadians(ring) {
8423 return ring = ring.map(pointRadians), ring.pop(), ring;
8426 function pointRadians(point) {
8427 return [point[0] * radians, point[1] * radians];
8430 function contains(object, point) {
8431 return (object && containsObjectType.hasOwnProperty(object.type)
8432 ? containsObjectType[object.type]
8433 : containsGeometry)(object, point);
8436 function graticuleX(y0, y1, dy) {
8437 var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
8438 return function(x) { return y.map(function(y) { return [x, y]; }); };
8441 function graticuleY(x0, x1, dx) {
8442 var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
8443 return function(y) { return x.map(function(x) { return [x, y]; }); };
8446 function graticule() {
8449 dx = 10, dy = dx, DX = 90, DY = 360,
8453 function graticule() {
8454 return {type: "MultiLineString", coordinates: lines()};
8458 return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8464 graticule.lines = function() {
8465 return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8468 graticule.outline = function() {
8474 X(X1).reverse().slice(1),
8475 Y(Y0).reverse().slice(1))
8480 graticule.extent = function(_) {
8481 if (!arguments.length) return graticule.extentMinor();
8482 return graticule.extentMajor(_).extentMinor(_);
8485 graticule.extentMajor = function(_) {
8486 if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8487 X0 = +_[0][0], X1 = +_[1][0];
8488 Y0 = +_[0][1], Y1 = +_[1][1];
8489 if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8490 if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8491 return graticule.precision(precision);
8494 graticule.extentMinor = function(_) {
8495 if (!arguments.length) return [[x0, y0], [x1, y1]];
8496 x0 = +_[0][0], x1 = +_[1][0];
8497 y0 = +_[0][1], y1 = +_[1][1];
8498 if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8499 if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8500 return graticule.precision(precision);
8503 graticule.step = function(_) {
8504 if (!arguments.length) return graticule.stepMinor();
8505 return graticule.stepMajor(_).stepMinor(_);
8508 graticule.stepMajor = function(_) {
8509 if (!arguments.length) return [DX, DY];
8510 DX = +_[0], DY = +_[1];
8514 graticule.stepMinor = function(_) {
8515 if (!arguments.length) return [dx, dy];
8516 dx = +_[0], dy = +_[1];
8520 graticule.precision = function(_) {
8521 if (!arguments.length) return precision;
8523 x = graticuleX(y0, y1, 90);
8524 y = graticuleY(x0, x1, precision);
8525 X = graticuleX(Y0, Y1, 90);
8526 Y = graticuleY(X0, X1, precision);
8531 .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532 .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8535 function graticule10() {
8536 return graticule()();
8539 function interpolate$1(a, b) {
8540 var x0 = a[0] * radians,
8541 y0 = a[1] * radians,
8542 x1 = b[0] * radians,
8543 y1 = b[1] * radians,
8548 kx0 = cy0 * cos$1(x0),
8549 ky0 = cy0 * sin$1(x0),
8550 kx1 = cy1 * cos$1(x1),
8551 ky1 = cy1 * sin$1(x1),
8552 d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8555 var interpolate = d ? function(t) {
8556 var B = sin$1(t *= d) / k,
8557 A = sin$1(d - t) / k,
8558 x = A * kx0 + B * kx1,
8559 y = A * ky0 + B * ky1,
8560 z = A * sy0 + B * sy1;
8562 atan2(y, x) * degrees$1,
8563 atan2(z, sqrt(x * x + y * y)) * degrees$1
8566 return [x0 * degrees$1, y0 * degrees$1];
8569 interpolate.distance = d;
8574 function identity$4(x) {
8578 var areaSum$1 = adder(),
8579 areaRingSum$1 = adder(),
8585 var areaStream$1 = {
8589 polygonStart: function() {
8590 areaStream$1.lineStart = areaRingStart$1;
8591 areaStream$1.lineEnd = areaRingEnd$1;
8593 polygonEnd: function() {
8594 areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8595 areaSum$1.add(abs(areaRingSum$1));
8596 areaRingSum$1.reset();
8598 result: function() {
8599 var area = areaSum$1 / 2;
8605 function areaRingStart$1() {
8606 areaStream$1.point = areaPointFirst$1;
8609 function areaPointFirst$1(x, y) {
8610 areaStream$1.point = areaPoint$1;
8611 x00 = x0$1 = x, y00 = y0$1 = y;
8614 function areaPoint$1(x, y) {
8615 areaRingSum$1.add(y0$1 * x - x0$1 * y);
8619 function areaRingEnd$1() {
8620 areaPoint$1(x00, y00);
8623 var x0$2 = Infinity,
8628 var boundsStream$1 = {
8629 point: boundsPoint$1,
8632 polygonStart: noop$1,
8634 result: function() {
8635 var bounds = [[x0$2, y0$2], [x1, y1]];
8636 x1 = y1 = -(y0$2 = x0$2 = Infinity);
8641 function boundsPoint$1(x, y) {
8642 if (x < x0$2) x0$2 = x;
8644 if (y < y0$2) y0$2 = y;
8648 // TODO Enforce positive area for exterior, negative area for interior?
8664 var centroidStream$1 = {
8665 point: centroidPoint$1,
8666 lineStart: centroidLineStart$1,
8667 lineEnd: centroidLineEnd$1,
8668 polygonStart: function() {
8669 centroidStream$1.lineStart = centroidRingStart$1;
8670 centroidStream$1.lineEnd = centroidRingEnd$1;
8672 polygonEnd: function() {
8673 centroidStream$1.point = centroidPoint$1;
8674 centroidStream$1.lineStart = centroidLineStart$1;
8675 centroidStream$1.lineEnd = centroidLineEnd$1;
8677 result: function() {
8678 var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8679 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8680 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8682 X0$1 = Y0$1 = Z0$1 =
8683 X1$1 = Y1$1 = Z1$1 =
8684 X2$1 = Y2$1 = Z2$1 = 0;
8689 function centroidPoint$1(x, y) {
8695 function centroidLineStart$1() {
8696 centroidStream$1.point = centroidPointFirstLine;
8699 function centroidPointFirstLine(x, y) {
8700 centroidStream$1.point = centroidPointLine;
8701 centroidPoint$1(x0$3 = x, y0$3 = y);
8704 function centroidPointLine(x, y) {
8705 var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8706 X1$1 += z * (x0$3 + x) / 2;
8707 Y1$1 += z * (y0$3 + y) / 2;
8709 centroidPoint$1(x0$3 = x, y0$3 = y);
8712 function centroidLineEnd$1() {
8713 centroidStream$1.point = centroidPoint$1;
8716 function centroidRingStart$1() {
8717 centroidStream$1.point = centroidPointFirstRing;
8720 function centroidRingEnd$1() {
8721 centroidPointRing(x00$1, y00$1);
8724 function centroidPointFirstRing(x, y) {
8725 centroidStream$1.point = centroidPointRing;
8726 centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8729 function centroidPointRing(x, y) {
8732 z = sqrt(dx * dx + dy * dy);
8734 X1$1 += z * (x0$3 + x) / 2;
8735 Y1$1 += z * (y0$3 + y) / 2;
8738 z = y0$3 * x - x0$3 * y;
8739 X2$1 += z * (x0$3 + x);
8740 Y2$1 += z * (y0$3 + y);
8742 centroidPoint$1(x0$3 = x, y0$3 = y);
8745 function PathContext(context) {
8746 this._context = context;
8749 PathContext.prototype = {
8751 pointRadius: function(_) {
8752 return this._radius = _, this;
8754 polygonStart: function() {
8757 polygonEnd: function() {
8760 lineStart: function() {
8763 lineEnd: function() {
8764 if (this._line === 0) this._context.closePath();
8767 point: function(x, y) {
8768 switch (this._point) {
8770 this._context.moveTo(x, y);
8775 this._context.lineTo(x, y);
8779 this._context.moveTo(x + this._radius, y);
8780 this._context.arc(x, y, this._radius, 0, tau$3);
8788 var lengthSum$1 = adder(),
8795 var lengthStream$1 = {
8797 lineStart: function() {
8798 lengthStream$1.point = lengthPointFirst$1;
8800 lineEnd: function() {
8801 if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802 lengthStream$1.point = noop$1;
8804 polygonStart: function() {
8807 polygonEnd: function() {
8810 result: function() {
8811 var length = +lengthSum$1;
8812 lengthSum$1.reset();
8817 function lengthPointFirst$1(x, y) {
8818 lengthStream$1.point = lengthPoint$1;
8819 x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8822 function lengthPoint$1(x, y) {
8823 x0$4 -= x, y0$4 -= y;
8824 lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8828 function PathString() {
8832 PathString.prototype = {
8834 _circle: circle$1(4.5),
8835 pointRadius: function(_) {
8836 if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8839 polygonStart: function() {
8842 polygonEnd: function() {
8845 lineStart: function() {
8848 lineEnd: function() {
8849 if (this._line === 0) this._string.push("Z");
8852 point: function(x, y) {
8853 switch (this._point) {
8855 this._string.push("M", x, ",", y);
8860 this._string.push("L", x, ",", y);
8864 if (this._circle == null) this._circle = circle$1(this._radius);
8865 this._string.push("M", x, ",", y, this._circle);
8870 result: function() {
8871 if (this._string.length) {
8872 var result = this._string.join("");
8881 function circle$1(radius) {
8882 return "m0," + radius
8883 + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8884 + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8888 function d3_geoPath(projection, context) {
8889 var pointRadius = 4.5,
8893 function path(object) {
8895 if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896 d3_geoStream(object, projectionStream(contextStream));
8898 return contextStream.result();
8901 path.area = function(object) {
8902 d3_geoStream(object, projectionStream(areaStream$1));
8903 return areaStream$1.result();
8906 path.measure = function(object) {
8907 d3_geoStream(object, projectionStream(lengthStream$1));
8908 return lengthStream$1.result();
8911 path.bounds = function(object) {
8912 d3_geoStream(object, projectionStream(boundsStream$1));
8913 return boundsStream$1.result();
8916 path.centroid = function(object) {
8917 d3_geoStream(object, projectionStream(centroidStream$1));
8918 return centroidStream$1.result();
8921 path.projection = function(_) {
8922 return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8925 path.context = function(_) {
8926 if (!arguments.length) return context;
8927 contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8928 if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8932 path.pointRadius = function(_) {
8933 if (!arguments.length) return pointRadius;
8934 pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8938 return path.projection(projection).context(context);
8941 function d3_geoTransform(methods) {
8943 stream: transformer(methods)
8947 function transformer(methods) {
8948 return function(stream) {
8949 var s = new TransformStream;
8950 for (var key in methods) s[key] = methods[key];
8956 function TransformStream() {}
8958 TransformStream.prototype = {
8959 constructor: TransformStream,
8960 point: function(x, y) { this.stream.point(x, y); },
8961 sphere: function() { this.stream.sphere(); },
8962 lineStart: function() { this.stream.lineStart(); },
8963 lineEnd: function() { this.stream.lineEnd(); },
8964 polygonStart: function() { this.stream.polygonStart(); },
8965 polygonEnd: function() { this.stream.polygonEnd(); }
8968 function fit(projection, fitBounds, object) {
8969 var clip = projection.clipExtent && projection.clipExtent();
8970 projection.scale(150).translate([0, 0]);
8971 if (clip != null) projection.clipExtent(null);
8972 d3_geoStream(object, projection.stream(boundsStream$1));
8973 fitBounds(boundsStream$1.result());
8974 if (clip != null) projection.clipExtent(clip);
8978 function fitExtent(projection, extent, object) {
8979 return fit(projection, function(b) {
8980 var w = extent[1][0] - extent[0][0],
8981 h = extent[1][1] - extent[0][1],
8982 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8983 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8984 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985 projection.scale(150 * k).translate([x, y]);
8989 function fitSize(projection, size, object) {
8990 return fitExtent(projection, [[0, 0], size], object);
8993 function fitWidth(projection, width, object) {
8994 return fit(projection, function(b) {
8996 k = w / (b[1][0] - b[0][0]),
8997 x = (w - k * (b[1][0] + b[0][0])) / 2,
8999 projection.scale(150 * k).translate([x, y]);
9003 function fitHeight(projection, height, object) {
9004 return fit(projection, function(b) {
9006 k = h / (b[1][1] - b[0][1]),
9008 y = (h - k * (b[1][1] + b[0][1])) / 2;
9009 projection.scale(150 * k).translate([x, y]);
9013 var maxDepth = 16, // maximum depth of subdivision
9014 cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9016 function resample(project, delta2) {
9017 return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9020 function resampleNone(project) {
9021 return transformer({
9022 point: function(x, y) {
9024 this.stream.point(x[0], x[1]);
9029 function resample$1(project, delta2) {
9031 function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9034 d2 = dx * dx + dy * dy;
9035 if (d2 > 4 * delta2 && depth--) {
9039 m = sqrt(a * a + b * b + c * c),
9040 phi2 = asin(c /= m),
9041 lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9042 p = project(lambda2, phi2),
9047 dz = dy * dx2 - dx * dy2;
9048 if (dz * dz / d2 > delta2 // perpendicular projected distance
9049 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9050 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9051 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9052 stream.point(x2, y2);
9053 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9057 return function(stream) {
9058 var lambda00, x00, y00, a00, b00, c00, // first point
9059 lambda0, x0, y0, a0, b0, c0; // previous point
9061 var resampleStream = {
9063 lineStart: lineStart,
9065 polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066 polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9069 function point(x, y) {
9071 stream.point(x[0], x[1]);
9074 function lineStart() {
9076 resampleStream.point = linePoint;
9080 function linePoint(lambda, phi) {
9081 var c = cartesian([lambda, phi]), p = project(lambda, phi);
9082 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);
9083 stream.point(x0, y0);
9086 function lineEnd() {
9087 resampleStream.point = point;
9091 function ringStart() {
9093 resampleStream.point = ringPoint;
9094 resampleStream.lineEnd = ringEnd;
9097 function ringPoint(lambda, phi) {
9098 linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099 resampleStream.point = linePoint;
9102 function ringEnd() {
9103 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104 resampleStream.lineEnd = lineEnd;
9108 return resampleStream;
9112 var transformRadians = transformer({
9113 point: function(x, y) {
9114 this.stream.point(x * radians, y * radians);
9118 function transformRotate(rotate) {
9119 return transformer({
9120 point: function(x, y) {
9121 var r = rotate(x, y);
9122 return this.stream.point(r[0], r[1]);
9127 function projection(project) {
9128 return projectionMutator(function() { return project; })();
9131 function projectionMutator(projectAt) {
9134 x = 480, y = 250, // translate
9135 dx, dy, lambda = 0, phi = 0, // center
9136 deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9137 theta = null, preclip = clipAntimeridian, // clip angle
9138 x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9139 delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9143 function projection(point) {
9144 point = projectRotate(point[0] * radians, point[1] * radians);
9145 return [point[0] * k + dx, dy - point[1] * k];
9148 function invert(point) {
9149 point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9150 return point && [point[0] * degrees$1, point[1] * degrees$1];
9153 function projectTransform(x, y) {
9154 return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9157 projection.stream = function(stream) {
9158 return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9161 projection.preclip = function(_) {
9162 return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9165 projection.postclip = function(_) {
9166 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9169 projection.clipAngle = function(_) {
9170 return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9173 projection.clipExtent = function(_) {
9174 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]];
9177 projection.scale = function(_) {
9178 return arguments.length ? (k = +_, recenter()) : k;
9181 projection.translate = function(_) {
9182 return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9185 projection.center = function(_) {
9186 return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9189 projection.rotate = function(_) {
9190 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];
9193 projection.precision = function(_) {
9194 return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9197 projection.fitExtent = function(extent, object) {
9198 return fitExtent(projection, extent, object);
9201 projection.fitSize = function(size, object) {
9202 return fitSize(projection, size, object);
9205 projection.fitWidth = function(width, object) {
9206 return fitWidth(projection, width, object);
9209 projection.fitHeight = function(height, object) {
9210 return fitHeight(projection, height, object);
9213 function recenter() {
9214 projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9215 var center = project(lambda, phi);
9216 dx = x - center[0] * k;
9217 dy = y + center[1] * k;
9222 cache = cacheStream = null;
9227 project = projectAt.apply(this, arguments);
9228 projection.invert = project.invert && invert;
9233 function conicProjection(projectAt) {
9236 m = projectionMutator(projectAt),
9239 p.parallels = function(_) {
9240 return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9246 function cylindricalEqualAreaRaw(phi0) {
9247 var cosPhi0 = cos$1(phi0);
9249 function forward(lambda, phi) {
9250 return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9253 forward.invert = function(x, y) {
9254 return [x / cosPhi0, asin(y * cosPhi0)];
9260 function conicEqualAreaRaw(y0, y1) {
9261 var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9263 // Are the parallels symmetrical around the Equator?
9264 if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9266 var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9268 function project(x, y) {
9269 var r = sqrt(c - 2 * n * sin$1(y)) / n;
9270 return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9273 project.invert = function(x, y) {
9275 return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9281 function conicEqualArea() {
9282 return conicProjection(conicEqualAreaRaw)
9284 .center([0, 33.6442]);
9288 return conicEqualArea()
9289 .parallels([29.5, 45.5])
9291 .translate([480, 250])
9293 .center([-0.6, 38.7]);
9296 // The projections must have mutually exclusive clip regions on the sphere,
9297 // as this will avoid emitting interleaving lines and polygons.
9298 function multiplex(streams) {
9299 var n = streams.length;
9301 point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9302 sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9303 lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9304 lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9305 polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9306 polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9310 // A composite projection for the United States, configured by default for
9311 // 960×500. The projection also works quite well at 960×600 if you change the
9312 // scale to 1285 and adjust the translate accordingly. The set of standard
9313 // parallels for each region comes from USGS, which is published here:
9314 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9315 function albersUsa() {
9318 lower48 = albers(), lower48Point,
9319 alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9320 hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9321 point, pointStream = {point: function(x, y) { point = [x, y]; }};
9323 function albersUsa(coordinates) {
9324 var x = coordinates[0], y = coordinates[1];
9325 return point = null, (lower48Point.point(x, y), point)
9326 || (alaskaPoint.point(x, y), point)
9327 || (hawaiiPoint.point(x, y), point);
9330 albersUsa.invert = function(coordinates) {
9331 var k = lower48.scale(),
9332 t = lower48.translate(),
9333 x = (coordinates[0] - t[0]) / k,
9334 y = (coordinates[1] - t[1]) / k;
9335 return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9336 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9337 : lower48).invert(coordinates);
9340 albersUsa.stream = function(stream) {
9341 return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9344 albersUsa.precision = function(_) {
9345 if (!arguments.length) return lower48.precision();
9346 lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9350 albersUsa.scale = function(_) {
9351 if (!arguments.length) return lower48.scale();
9352 lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9353 return albersUsa.translate(lower48.translate());
9356 albersUsa.translate = function(_) {
9357 if (!arguments.length) return lower48.translate();
9358 var k = lower48.scale(), x = +_[0], y = +_[1];
9360 lower48Point = lower48
9362 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9363 .stream(pointStream);
9365 alaskaPoint = alaska
9366 .translate([x - 0.307 * k, y + 0.201 * k])
9367 .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]])
9368 .stream(pointStream);
9370 hawaiiPoint = hawaii
9371 .translate([x - 0.205 * k, y + 0.212 * k])
9372 .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]])
9373 .stream(pointStream);
9378 albersUsa.fitExtent = function(extent, object) {
9379 return fitExtent(albersUsa, extent, object);
9382 albersUsa.fitSize = function(size, object) {
9383 return fitSize(albersUsa, size, object);
9386 albersUsa.fitWidth = function(width, object) {
9387 return fitWidth(albersUsa, width, object);
9390 albersUsa.fitHeight = function(height, object) {
9391 return fitHeight(albersUsa, height, object);
9395 cache = cacheStream = null;
9399 return albersUsa.scale(1070);
9402 function azimuthalRaw(scale) {
9403 return function(x, y) {
9414 function azimuthalInvert(angle) {
9415 return function(x, y) {
9416 var z = sqrt(x * x + y * y),
9421 atan2(x * sc, z * cc),
9422 asin(z && y * sc / z)
9427 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9428 return sqrt(2 / (1 + cxcy));
9431 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9432 return 2 * asin(z / 2);
9435 function azimuthalEqualArea() {
9436 return projection(azimuthalEqualAreaRaw)
9438 .clipAngle(180 - 1e-3);
9441 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9442 return (c = acos(c)) && c / sin$1(c);
9445 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9449 function azimuthalEquidistant() {
9450 return projection(azimuthalEquidistantRaw)
9452 .clipAngle(180 - 1e-3);
9455 function mercatorRaw(lambda, phi) {
9456 return [lambda, log(tan((halfPi$2 + phi) / 2))];
9459 mercatorRaw.invert = function(x, y) {
9460 return [x, 2 * atan(exp(y)) - halfPi$2];
9463 function mercator() {
9464 return mercatorProjection(mercatorRaw)
9465 .scale(961 / tau$3);
9468 function mercatorProjection(project) {
9469 var m = projection(project),
9472 translate = m.translate,
9473 clipExtent = m.clipExtent,
9474 x0 = null, y0, x1, y1; // clip extent
9476 m.scale = function(_) {
9477 return arguments.length ? (scale(_), reclip()) : scale();
9480 m.translate = function(_) {
9481 return arguments.length ? (translate(_), reclip()) : translate();
9484 m.center = function(_) {
9485 return arguments.length ? (center(_), reclip()) : center();
9488 m.clipExtent = function(_) {
9489 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]];
9493 var k = pi$3 * scale(),
9494 t = m(rotation(m.rotate()).invert([0, 0]));
9495 return clipExtent(x0 == null
9496 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9497 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9498 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9505 return tan((halfPi$2 + y) / 2);
9508 function conicConformalRaw(y0, y1) {
9509 var cy0 = cos$1(y0),
9510 n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9511 f = cy0 * pow(tany(y0), n) / n;
9513 if (!n) return mercatorRaw;
9515 function project(x, y) {
9516 if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9517 else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9518 var r = f / pow(tany(y), n);
9519 return [r * sin$1(n * x), f - r * cos$1(n * x)];
9522 project.invert = function(x, y) {
9523 var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9524 return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9530 function conicConformal() {
9531 return conicProjection(conicConformalRaw)
9533 .parallels([30, 30]);
9536 function equirectangularRaw(lambda, phi) {
9537 return [lambda, phi];
9540 equirectangularRaw.invert = equirectangularRaw;
9542 function equirectangular() {
9543 return projection(equirectangularRaw)
9547 function conicEquidistantRaw(y0, y1) {
9548 var cy0 = cos$1(y0),
9549 n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9552 if (abs(n) < epsilon$2) return equirectangularRaw;
9554 function project(x, y) {
9555 var gy = g - y, nx = n * x;
9556 return [gy * sin$1(nx), g - gy * cos$1(nx)];
9559 project.invert = function(x, y) {
9561 return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9567 function conicEquidistant() {
9568 return conicProjection(conicEquidistantRaw)
9570 .center([0, 13.9389]);
9573 function gnomonicRaw(x, y) {
9574 var cy = cos$1(y), k = cos$1(x) * cy;
9575 return [cy * sin$1(x) / k, sin$1(y) / k];
9578 gnomonicRaw.invert = azimuthalInvert(atan);
9580 function gnomonic() {
9581 return projection(gnomonicRaw)
9586 function scaleTranslate(kx, ky, tx, ty) {
9587 return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9588 point: function(x, y) {
9589 this.stream.point(x * kx + tx, y * ky + ty);
9594 function d3_geoIdentity() {
9595 var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9596 x0 = null, y0, x1, y1, // clip extent
9597 postclip = identity$4,
9603 cache = cacheStream = null;
9607 return projection = {
9608 stream: function(stream) {
9609 return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611 postclip: function(_) {
9612 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614 clipExtent: function(_) {
9615 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]];
9617 scale: function(_) {
9618 return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620 translate: function(_) {
9621 return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623 reflectX: function(_) {
9624 return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626 reflectY: function(_) {
9627 return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629 fitExtent: function(extent, object) {
9630 return fitExtent(projection, extent, object);
9632 fitSize: function(size, object) {
9633 return fitSize(projection, size, object);
9635 fitWidth: function(width, object) {
9636 return fitWidth(projection, width, object);
9638 fitHeight: function(height, object) {
9639 return fitHeight(projection, height, object);
9644 function naturalEarth1Raw(lambda, phi) {
9645 var phi2 = phi * phi, phi4 = phi2 * phi2;
9647 lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9648 phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9652 naturalEarth1Raw.invert = function(x, y) {
9653 var phi = y, i = 25, delta;
9655 var phi2 = phi * phi, phi4 = phi2 * phi2;
9656 phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9657 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9658 } while (abs(delta) > epsilon$2 && --i > 0);
9660 x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9665 function naturalEarth1() {
9666 return projection(naturalEarth1Raw)
9670 function orthographicRaw(x, y) {
9671 return [cos$1(y) * sin$1(x), sin$1(y)];
9674 orthographicRaw.invert = azimuthalInvert(asin);
9676 function orthographic() {
9677 return projection(orthographicRaw)
9679 .clipAngle(90 + epsilon$2);
9682 function stereographicRaw(x, y) {
9683 var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9684 return [cy * sin$1(x) / k, sin$1(y) / k];
9687 stereographicRaw.invert = azimuthalInvert(function(z) {
9691 function stereographic() {
9692 return projection(stereographicRaw)
9697 function transverseMercatorRaw(lambda, phi) {
9698 return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9701 transverseMercatorRaw.invert = function(x, y) {
9702 return [-y, 2 * atan(exp(x)) - halfPi$2];
9705 function transverseMercator() {
9706 var m = mercatorProjection(transverseMercatorRaw),
9710 m.center = function(_) {
9711 return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9714 m.rotate = function(_) {
9715 return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9718 return rotate([0, 0, 90])
9722 function defaultSeparation(a, b) {
9723 return a.parent === b.parent ? 1 : 2;
9726 function meanX(children) {
9727 return children.reduce(meanXReduce, 0) / children.length;
9730 function meanXReduce(x, c) {
9734 function maxY(children) {
9735 return 1 + children.reduce(maxYReduce, 0);
9738 function maxYReduce(y, c) {
9739 return Math.max(y, c.y);
9742 function leafLeft(node) {
9744 while (children = node.children) node = children[0];
9748 function leafRight(node) {
9750 while (children = node.children) node = children[children.length - 1];
9754 function cluster() {
9755 var separation = defaultSeparation,
9760 function cluster(root) {
9764 // First walk, computing the initial x & y values.
9765 root.eachAfter(function(node) {
9766 var children = node.children;
9768 node.x = meanX(children);
9769 node.y = maxY(children);
9771 node.x = previousNode ? x += separation(node, previousNode) : 0;
9773 previousNode = node;
9777 var left = leafLeft(root),
9778 right = leafRight(root),
9779 x0 = left.x - separation(left, right) / 2,
9780 x1 = right.x + separation(right, left) / 2;
9782 // Second walk, normalizing x & y to the desired size.
9783 return root.eachAfter(nodeSize ? function(node) {
9784 node.x = (node.x - root.x) * dx;
9785 node.y = (root.y - node.y) * dy;
9786 } : function(node) {
9787 node.x = (node.x - x0) / (x1 - x0) * dx;
9788 node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9792 cluster.separation = function(x) {
9793 return arguments.length ? (separation = x, cluster) : separation;
9796 cluster.size = function(x) {
9797 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9800 cluster.nodeSize = function(x) {
9801 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9807 function count(node) {
9809 children = node.children,
9810 i = children && children.length;
9812 else while (--i >= 0) sum += children[i].value;
9816 function node_count() {
9817 return this.eachAfter(count);
9820 function node_each(callback) {
9821 var node = this, current, next = [node], children, i, n;
9823 current = next.reverse(), next = [];
9824 while (node = current.pop()) {
9825 callback(node), children = node.children;
9826 if (children) for (i = 0, n = children.length; i < n; ++i) {
9827 next.push(children[i]);
9830 } while (next.length);
9834 function node_eachBefore(callback) {
9835 var node = this, nodes = [node], children, i;
9836 while (node = nodes.pop()) {
9837 callback(node), children = node.children;
9838 if (children) for (i = children.length - 1; i >= 0; --i) {
9839 nodes.push(children[i]);
9845 function node_eachAfter(callback) {
9846 var node = this, nodes = [node], next = [], children, i, n;
9847 while (node = nodes.pop()) {
9848 next.push(node), children = node.children;
9849 if (children) for (i = 0, n = children.length; i < n; ++i) {
9850 nodes.push(children[i]);
9853 while (node = next.pop()) {
9859 function node_sum(value) {
9860 return this.eachAfter(function(node) {
9861 var sum = +value(node.data) || 0,
9862 children = node.children,
9863 i = children && children.length;
9864 while (--i >= 0) sum += children[i].value;
9869 function node_sort(compare) {
9870 return this.eachBefore(function(node) {
9871 if (node.children) {
9872 node.children.sort(compare);
9877 function node_path(end) {
9879 ancestor = leastCommonAncestor(start, end),
9881 while (start !== ancestor) {
9882 start = start.parent;
9885 var k = nodes.length;
9886 while (end !== ancestor) {
9887 nodes.splice(k, 0, end);
9893 function leastCommonAncestor(a, b) {
9894 if (a === b) return a;
9895 var aNodes = a.ancestors(),
9896 bNodes = b.ancestors(),
9908 function node_ancestors() {
9909 var node = this, nodes = [node];
9910 while (node = node.parent) {
9916 function node_descendants() {
9918 this.each(function(node) {
9924 function node_leaves() {
9926 this.eachBefore(function(node) {
9927 if (!node.children) {
9934 function node_links() {
9935 var root = this, links = [];
9936 root.each(function(node) {
9937 if (node !== root) { // Don’t include the root’s parent, if any.
9938 links.push({source: node.parent, target: node});
9944 function hierarchy(data, children) {
9945 var root = new Node(data),
9946 valued = +data.value && (root.value = data.value),
9954 if (children == null) children = defaultChildren;
9956 while (node = nodes.pop()) {
9957 if (valued) node.value = +node.data.value;
9958 if ((childs = children(node.data)) && (n = childs.length)) {
9959 node.children = new Array(n);
9960 for (i = n - 1; i >= 0; --i) {
9961 nodes.push(child = node.children[i] = new Node(childs[i]));
9962 child.parent = node;
9963 child.depth = node.depth + 1;
9968 return root.eachBefore(computeHeight);
9971 function node_copy() {
9972 return hierarchy(this).eachBefore(copyData);
9975 function defaultChildren(d) {
9979 function copyData(node) {
9980 node.data = node.data.data;
9983 function computeHeight(node) {
9985 do node.height = height;
9986 while ((node = node.parent) && (node.height < ++height));
9989 function Node(data) {
9996 Node.prototype = hierarchy.prototype = {
10000 eachAfter: node_eachAfter,
10001 eachBefore: node_eachBefore,
10005 ancestors: node_ancestors,
10006 descendants: node_descendants,
10007 leaves: node_leaves,
10012 var slice$3 = Array.prototype.slice;
10014 function shuffle$1(array) {
10015 var m = array.length,
10020 i = Math.random() * m-- | 0;
10022 array[m] = array[i];
10029 function enclose(circles) {
10030 var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10034 if (e && enclosesWeak(e, p)) ++i;
10035 else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10041 function extendBasis(B, p) {
10044 if (enclosesWeakAll(p, B)) return [p];
10046 // If we get here then B must have at least one element.
10047 for (i = 0; i < B.length; ++i) {
10048 if (enclosesNot(p, B[i])
10049 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10054 // If we get here then B must have at least two elements.
10055 for (i = 0; i < B.length - 1; ++i) {
10056 for (j = i + 1; j < B.length; ++j) {
10057 if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10058 && enclosesNot(encloseBasis2(B[i], p), B[j])
10059 && enclosesNot(encloseBasis2(B[j], p), B[i])
10060 && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10061 return [B[i], B[j], p];
10066 // If we get here then something is very wrong.
10070 function enclosesNot(a, b) {
10071 var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10072 return dr < 0 || dr * dr < dx * dx + dy * dy;
10075 function enclosesWeak(a, b) {
10076 var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10077 return dr > 0 && dr * dr > dx * dx + dy * dy;
10080 function enclosesWeakAll(a, B) {
10081 for (var i = 0; i < B.length; ++i) {
10082 if (!enclosesWeak(a, B[i])) {
10089 function encloseBasis(B) {
10090 switch (B.length) {
10091 case 1: return encloseBasis1(B[0]);
10092 case 2: return encloseBasis2(B[0], B[1]);
10093 case 3: return encloseBasis3(B[0], B[1], B[2]);
10097 function encloseBasis1(a) {
10105 function encloseBasis2(a, b) {
10106 var x1 = a.x, y1 = a.y, r1 = a.r,
10107 x2 = b.x, y2 = b.y, r2 = b.r,
10108 x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10109 l = Math.sqrt(x21 * x21 + y21 * y21);
10111 x: (x1 + x2 + x21 / l * r21) / 2,
10112 y: (y1 + y2 + y21 / l * r21) / 2,
10113 r: (l + r1 + r2) / 2
10117 function encloseBasis3(a, b, c) {
10118 var x1 = a.x, y1 = a.y, r1 = a.r,
10119 x2 = b.x, y2 = b.y, r2 = b.r,
10120 x3 = c.x, y3 = c.y, r3 = c.r,
10127 d1 = x1 * x1 + y1 * y1 - r1 * r1,
10128 d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10129 d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10130 ab = a3 * b2 - a2 * b3,
10131 xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10132 xb = (b3 * c2 - b2 * c3) / ab,
10133 ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10134 yb = (a2 * c3 - a3 * c2) / ab,
10135 A = xb * xb + yb * yb - 1,
10136 B = 2 * (r1 + xa * xb + ya * yb),
10137 C = xa * xa + ya * ya - r1 * r1,
10138 r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10140 x: x1 + xa + xb * r,
10141 y: y1 + ya + yb * r,
10146 function place(a, b, c) {
10153 dc = dx * dx + dy * dy;
10155 var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10156 y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10157 c.x = ax + x * dx + y * dy;
10158 c.y = ay + x * dy - y * dx;
10165 function intersects(a, b) {
10166 var dx = b.x - a.x,
10169 return dr * dr - 1e-6 > dx * dx + dy * dy;
10172 function score(node) {
10176 dx = (a.x * b.r + b.x * a.r) / ab,
10177 dy = (a.y * b.r + b.y * a.r) / ab;
10178 return dx * dx + dy * dy;
10181 function Node$1(circle) {
10184 this.previous = null;
10187 function packEnclose(circles) {
10188 if (!(n = circles.length)) return 0;
10190 var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192 // Place the first circle.
10193 a = circles[0], a.x = 0, a.y = 0;
10194 if (!(n > 1)) return a.r;
10196 // Place the second circle.
10197 b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10198 if (!(n > 2)) return a.r + b.r;
10200 // Place the third circle.
10201 place(b, a, c = circles[2]);
10203 // Initialize the front-chain using the first three circles a, b and c.
10204 a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10205 a.next = c.previous = b;
10206 b.next = a.previous = c;
10207 c.next = b.previous = a;
10209 // Attempt to place each remaining circle…
10210 pack: for (i = 3; i < n; ++i) {
10211 place(a._, b._, c = circles[i]), c = new Node$1(c);
10213 // Find the closest intersecting circle on the front-chain, if any.
10214 // “Closeness” is determined by linear distance along the front-chain.
10215 // “Ahead” or “behind” is likewise determined by linear distance.
10216 j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10219 if (intersects(j._, c._)) {
10220 b = j, a.next = b, b.previous = a, --i;
10223 sj += j._.r, j = j.next;
10225 if (intersects(k._, c._)) {
10226 a = k, a.next = b, b.previous = a, --i;
10229 sk += k._.r, k = k.previous;
10231 } while (j !== k.next);
10233 // Success! Insert the new circle c between a and b.
10234 c.previous = a, c.next = b, a.next = b.previous = b = c;
10236 // Compute the new closest circle pair to the centroid.
10238 while ((c = c.next) !== b) {
10239 if ((ca = score(c)) < aa) {
10246 // Compute the enclosing circle of the front chain.
10247 a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10249 // Translate the circles to put the enclosing circle around the origin.
10250 for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10255 function siblings(circles) {
10256 packEnclose(circles);
10260 function optional(f) {
10261 return f == null ? null : required(f);
10264 function required(f) {
10265 if (typeof f !== "function") throw new Error;
10269 function constantZero() {
10273 function constant$8(x) {
10274 return function() {
10279 function defaultRadius$1(d) {
10280 return Math.sqrt(d.value);
10283 function index$1() {
10287 padding = constantZero;
10289 function pack(root) {
10290 root.x = dx / 2, root.y = dy / 2;
10292 root.eachBefore(radiusLeaf(radius))
10293 .eachAfter(packChildren(padding, 0.5))
10294 .eachBefore(translateChild(1));
10296 root.eachBefore(radiusLeaf(defaultRadius$1))
10297 .eachAfter(packChildren(constantZero, 1))
10298 .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10299 .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10304 pack.radius = function(x) {
10305 return arguments.length ? (radius = optional(x), pack) : radius;
10308 pack.size = function(x) {
10309 return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10312 pack.padding = function(x) {
10313 return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10319 function radiusLeaf(radius) {
10320 return function(node) {
10321 if (!node.children) {
10322 node.r = Math.max(0, +radius(node) || 0);
10327 function packChildren(padding, k) {
10328 return function(node) {
10329 if (children = node.children) {
10332 n = children.length,
10333 r = padding(node) * k || 0,
10336 if (r) for (i = 0; i < n; ++i) children[i].r += r;
10337 e = packEnclose(children);
10338 if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10344 function translateChild(k) {
10345 return function(node) {
10346 var parent = node.parent;
10349 node.x = parent.x + k * node.x;
10350 node.y = parent.y + k * node.y;
10355 function roundNode(node) {
10356 node.x0 = Math.round(node.x0);
10357 node.y0 = Math.round(node.y0);
10358 node.x1 = Math.round(node.x1);
10359 node.y1 = Math.round(node.y1);
10362 function treemapDice(parent, x0, y0, x1, y1) {
10363 var nodes = parent.children,
10367 k = parent.value && (x1 - x0) / parent.value;
10370 node = nodes[i], node.y0 = y0, node.y1 = y1;
10371 node.x0 = x0, node.x1 = x0 += node.value * k;
10375 function partition() {
10381 function partition(root) {
10382 var n = root.height + 1;
10387 root.eachBefore(positionNode(dy, n));
10388 if (round) root.eachBefore(roundNode);
10392 function positionNode(dy, n) {
10393 return function(node) {
10394 if (node.children) {
10395 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10399 x1 = node.x1 - padding,
10400 y1 = node.y1 - padding;
10401 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10402 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10410 partition.round = function(x) {
10411 return arguments.length ? (round = !!x, partition) : round;
10414 partition.size = function(x) {
10415 return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10418 partition.padding = function(x) {
10419 return arguments.length ? (padding = +x, partition) : padding;
10425 var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10426 preroot = {depth: -1},
10429 function defaultId(d) {
10433 function defaultParentId(d) {
10437 function stratify() {
10438 var id = defaultId,
10439 parentId = defaultParentId;
10441 function stratify(data) {
10448 nodes = new Array(n),
10453 for (i = 0; i < n; ++i) {
10454 d = data[i], node = nodes[i] = new Node(d);
10455 if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10456 nodeKey = keyPrefix$1 + (node.id = nodeId);
10457 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10461 for (i = 0; i < n; ++i) {
10462 node = nodes[i], nodeId = parentId(data[i], i, data);
10463 if (nodeId == null || !(nodeId += "")) {
10464 if (root) throw new Error("multiple roots");
10467 parent = nodeByKey[keyPrefix$1 + nodeId];
10468 if (!parent) throw new Error("missing: " + nodeId);
10469 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10470 if (parent.children) parent.children.push(node);
10471 else parent.children = [node];
10472 node.parent = parent;
10476 if (!root) throw new Error("no root");
10477 root.parent = preroot;
10478 root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10479 root.parent = null;
10480 if (n > 0) throw new Error("cycle");
10485 stratify.id = function(x) {
10486 return arguments.length ? (id = required(x), stratify) : id;
10489 stratify.parentId = function(x) {
10490 return arguments.length ? (parentId = required(x), stratify) : parentId;
10496 function defaultSeparation$1(a, b) {
10497 return a.parent === b.parent ? 1 : 2;
10500 // function radialSeparation(a, b) {
10501 // return (a.parent === b.parent ? 1 : 2) / a.depth;
10504 // This function is used to traverse the left contour of a subtree (or
10505 // subforest). It returns the successor of v on this contour. This successor is
10506 // either given by the leftmost child of v or by the thread of v. The function
10507 // returns null if and only if v is on the highest level of its subtree.
10508 function nextLeft(v) {
10509 var children = v.children;
10510 return children ? children[0] : v.t;
10513 // This function works analogously to nextLeft.
10514 function nextRight(v) {
10515 var children = v.children;
10516 return children ? children[children.length - 1] : v.t;
10519 // Shifts the current subtree rooted at w+. This is done by increasing
10520 // prelim(w+) and mod(w+) by shift.
10521 function moveSubtree(wm, wp, shift) {
10522 var change = shift / (wp.i - wm.i);
10530 // All other shifts, applied to the smaller subtrees between w- and w+, are
10531 // performed by this function. To prepare the shifts, we have to adjust
10532 // change(w+), shift(w+), and change(w-).
10533 function executeShifts(v) {
10536 children = v.children,
10537 i = children.length,
10543 shift += w.s + (change += w.c);
10547 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10548 // returns the specified (default) ancestor.
10549 function nextAncestor(vim, v, ancestor) {
10550 return vim.a.parent === v.parent ? vim.a : ancestor;
10553 function TreeNode(node, i) {
10555 this.parent = null;
10556 this.children = null;
10557 this.A = null; // default ancestor
10558 this.a = this; // ancestor
10559 this.z = 0; // prelim
10561 this.c = 0; // change
10562 this.s = 0; // shift
10563 this.t = null; // thread
10564 this.i = i; // number
10567 TreeNode.prototype = Object.create(Node.prototype);
10569 function treeRoot(root) {
10570 var tree = new TreeNode(root, 0),
10578 while (node = nodes.pop()) {
10579 if (children = node._.children) {
10580 node.children = new Array(n = children.length);
10581 for (i = n - 1; i >= 0; --i) {
10582 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10583 child.parent = node;
10588 (tree.parent = new TreeNode(null, 0)).children = [tree];
10592 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594 var separation = defaultSeparation$1,
10599 function tree(root) {
10600 var t = treeRoot(root);
10602 // Compute the layout using Buchheim et al.’s algorithm.
10603 t.eachAfter(firstWalk), t.parent.m = -t.z;
10604 t.eachBefore(secondWalk);
10606 // If a fixed node size is specified, scale x and y.
10607 if (nodeSize) root.eachBefore(sizeNode);
10609 // If a fixed tree size is specified, scale x and y based on the extent.
10610 // Compute the left-most, right-most, and depth-most nodes for extents.
10615 root.eachBefore(function(node) {
10616 if (node.x < left.x) left = node;
10617 if (node.x > right.x) right = node;
10618 if (node.depth > bottom.depth) bottom = node;
10620 var s = left === right ? 1 : separation(left, right) / 2,
10622 kx = dx / (right.x + s + tx),
10623 ky = dy / (bottom.depth || 1);
10624 root.eachBefore(function(node) {
10625 node.x = (node.x + tx) * kx;
10626 node.y = node.depth * ky;
10633 // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10634 // applied recursively to the children of v, as well as the function
10635 // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10636 // node v is placed to the midpoint of its outermost children.
10637 function firstWalk(v) {
10638 var children = v.children,
10639 siblings = v.parent.children,
10640 w = v.i ? siblings[v.i - 1] : null;
10643 var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645 v.z = w.z + separation(v._, w._);
10646 v.m = v.z - midpoint;
10651 v.z = w.z + separation(v._, w._);
10653 v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10656 // Computes all real x-coordinates by summing up the modifiers recursively.
10657 function secondWalk(v) {
10658 v._.x = v.z + v.parent.m;
10662 // The core of the algorithm. Here, a new subtree is combined with the
10663 // previous subtrees. Threads are used to traverse the inside and outside
10664 // contours of the left and right subtree up to the highest common level. The
10665 // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10666 // superscript o means outside and i means inside, the subscript - means left
10667 // subtree and + means right subtree. For summing up the modifiers along the
10668 // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10669 // nodes of the inside contours conflict, we compute the left one of the
10670 // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10671 // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10672 // Finally, we add a new thread (if necessary).
10673 function apportion(v, w, ancestor) {
10678 vom = vip.parent.children[0],
10684 while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10685 vom = nextLeft(vom);
10686 vop = nextRight(vop);
10688 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690 moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10699 if (vim && !nextRight(vop)) {
10701 vop.m += sim - sop;
10703 if (vip && !nextLeft(vom)) {
10705 vom.m += sip - som;
10712 function sizeNode(node) {
10714 node.y = node.depth * dy;
10717 tree.separation = function(x) {
10718 return arguments.length ? (separation = x, tree) : separation;
10721 tree.size = function(x) {
10722 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10725 tree.nodeSize = function(x) {
10726 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10732 function treemapSlice(parent, x0, y0, x1, y1) {
10733 var nodes = parent.children,
10737 k = parent.value && (y1 - y0) / parent.value;
10740 node = nodes[i], node.x0 = x0, node.x1 = x1;
10741 node.y0 = y0, node.y1 = y0 += node.value * k;
10745 var phi = (1 + Math.sqrt(5)) / 2;
10747 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749 nodes = parent.children,
10756 value = parent.value,
10766 dx = x1 - x0, dy = y1 - y0;
10768 // Find the next non-empty node.
10769 do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10770 minValue = maxValue = sumValue;
10771 alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10772 beta = sumValue * sumValue * alpha;
10773 minRatio = Math.max(maxValue / beta, beta / minValue);
10775 // Keep adding nodes while the aspect ratio maintains or improves.
10776 for (; i1 < n; ++i1) {
10777 sumValue += nodeValue = nodes[i1].value;
10778 if (nodeValue < minValue) minValue = nodeValue;
10779 if (nodeValue > maxValue) maxValue = nodeValue;
10780 beta = sumValue * sumValue * alpha;
10781 newRatio = Math.max(maxValue / beta, beta / minValue);
10782 if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10783 minRatio = newRatio;
10786 // Position and record the row orientation.
10787 rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10788 if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10789 else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10790 value -= sumValue, i0 = i1;
10796 var squarify = (function custom(ratio) {
10798 function squarify(parent, x0, y0, x1, y1) {
10799 squarifyRatio(ratio, parent, x0, y0, x1, y1);
10802 squarify.ratio = function(x) {
10803 return custom((x = +x) > 1 ? x : 1);
10809 function index$2() {
10810 var tile = squarify,
10814 paddingStack = [0],
10815 paddingInner = constantZero,
10816 paddingTop = constantZero,
10817 paddingRight = constantZero,
10818 paddingBottom = constantZero,
10819 paddingLeft = constantZero;
10821 function treemap(root) {
10826 root.eachBefore(positionNode);
10827 paddingStack = [0];
10828 if (round) root.eachBefore(roundNode);
10832 function positionNode(node) {
10833 var p = paddingStack[node.depth],
10838 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10839 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10844 if (node.children) {
10845 p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10846 x0 += paddingLeft(node) - p;
10847 y0 += paddingTop(node) - p;
10848 x1 -= paddingRight(node) - p;
10849 y1 -= paddingBottom(node) - p;
10850 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10851 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10852 tile(node, x0, y0, x1, y1);
10856 treemap.round = function(x) {
10857 return arguments.length ? (round = !!x, treemap) : round;
10860 treemap.size = function(x) {
10861 return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10864 treemap.tile = function(x) {
10865 return arguments.length ? (tile = required(x), treemap) : tile;
10868 treemap.padding = function(x) {
10869 return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10872 treemap.paddingInner = function(x) {
10873 return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10876 treemap.paddingOuter = function(x) {
10877 return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10880 treemap.paddingTop = function(x) {
10881 return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10884 treemap.paddingRight = function(x) {
10885 return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10888 treemap.paddingBottom = function(x) {
10889 return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10892 treemap.paddingLeft = function(x) {
10893 return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10899 function binary(parent, x0, y0, x1, y1) {
10900 var nodes = parent.children,
10901 i, n = nodes.length,
10902 sum, sums = new Array(n + 1);
10904 for (sums[0] = sum = i = 0; i < n; ++i) {
10905 sums[i + 1] = sum += nodes[i].value;
10908 partition(0, n, parent.value, x0, y0, x1, y1);
10910 function partition(i, j, value, x0, y0, x1, y1) {
10912 var node = nodes[i];
10913 node.x0 = x0, node.y0 = y0;
10914 node.x1 = x1, node.y1 = y1;
10918 var valueOffset = sums[i],
10919 valueTarget = (value / 2) + valueOffset,
10924 var mid = k + hi >>> 1;
10925 if (sums[mid] < valueTarget) k = mid + 1;
10929 if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931 var valueLeft = sums[k] - valueOffset,
10932 valueRight = value - valueLeft;
10934 if ((x1 - x0) > (y1 - y0)) {
10935 var xk = (x0 * valueRight + x1 * valueLeft) / value;
10936 partition(i, k, valueLeft, x0, y0, xk, y1);
10937 partition(k, j, valueRight, xk, y0, x1, y1);
10939 var yk = (y0 * valueRight + y1 * valueLeft) / value;
10940 partition(i, k, valueLeft, x0, y0, x1, yk);
10941 partition(k, j, valueRight, x0, yk, x1, y1);
10946 function sliceDice(parent, x0, y0, x1, y1) {
10947 (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10950 var resquarify = (function custom(ratio) {
10952 function resquarify(parent, x0, y0, x1, y1) {
10953 if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10961 value = parent.value;
10964 row = rows[j], nodes = row.children;
10965 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10966 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10967 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10968 value -= row.value;
10971 parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10972 rows.ratio = ratio;
10976 resquarify.ratio = function(x) {
10977 return custom((x = +x) > 1 ? x : 1);
10983 function d3_polygonArea(polygon) {
10985 n = polygon.length,
10987 b = polygon[n - 1],
10993 area += a[1] * b[0] - a[0] * b[1];
10999 function d3_polygonCentroid(polygon) {
11001 n = polygon.length,
11005 b = polygon[n - 1],
11012 k += c = a[0] * b[1] - b[0] * a[1];
11013 x += (a[0] + b[0]) * c;
11014 y += (a[1] + b[1]) * c;
11017 return k *= 3, [x / k, y / k];
11020 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11021 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11022 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11023 // negative if clockwise, and zero if the points are collinear.
11024 function cross$1(a, b, c) {
11025 return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11028 function lexicographicOrder(a, b) {
11029 return a[0] - b[0] || a[1] - b[1];
11032 // Computes the upper convex hull per the monotone chain algorithm.
11033 // Assumes points.length >= 3, is sorted by x, unique in y.
11034 // Returns an array of indices into points in left-to-right order.
11035 function computeUpperHullIndexes(points) {
11036 var n = points.length,
11040 for (var i = 2; i < n; ++i) {
11041 while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11042 indexes[size++] = i;
11045 return indexes.slice(0, size); // remove popped points
11048 function d3_polygonHull(points) {
11049 if ((n = points.length) < 3) return null;
11053 sortedPoints = new Array(n),
11054 flippedPoints = new Array(n);
11056 for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11057 sortedPoints.sort(lexicographicOrder);
11058 for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11060 var upperIndexes = computeUpperHullIndexes(sortedPoints),
11061 lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063 // Construct the hull polygon, removing possible duplicate endpoints.
11064 var skipLeft = lowerIndexes[0] === upperIndexes[0],
11065 skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11068 // Add upper hull in right-to-l order.
11069 // Then add lower hull in left-to-right order.
11070 for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11071 for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11076 function contains$1(polygon, point) {
11077 var n = polygon.length,
11078 p = polygon[n - 1],
11079 x = point[0], y = point[1],
11080 x0 = p[0], y0 = p[1],
11084 for (var i = 0; i < n; ++i) {
11085 p = polygon[i], x1 = p[0], y1 = p[1];
11086 if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11093 function length$1(polygon) {
11095 n = polygon.length,
11096 b = polygon[n - 1],
11111 perimeter += Math.sqrt(xa * xa + ya * ya);
11117 var slice$4 = [].slice;
11121 function Queue(size) {
11124 this._error = null;
11130 this._start = 0; // inside a synchronous task callback?
11133 Queue.prototype = queue.prototype = {
11134 constructor: Queue,
11135 defer: function(callback) {
11136 if (typeof callback !== "function") throw new Error("invalid callback");
11137 if (this._call) throw new Error("defer after await");
11138 if (this._error != null) return this;
11139 var t = slice$4.call(arguments, 1);
11141 ++this._waiting, this._tasks.push(t);
11145 abort: function() {
11146 if (this._error == null) abort(this, new Error("abort"));
11149 await: function(callback) {
11150 if (typeof callback !== "function") throw new Error("invalid callback");
11151 if (this._call) throw new Error("multiple await");
11152 this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11156 awaitAll: function(callback) {
11157 if (typeof callback !== "function") throw new Error("invalid callback");
11158 if (this._call) throw new Error("multiple await");
11159 this._call = callback;
11165 function poke$1(q) {
11167 try { start$1(q); } // let the current task complete
11169 if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11170 else if (!q._data) throw e; // await callback errored synchronously
11175 function start$1(q) {
11176 while (q._start = q._waiting && q._active < q._size) {
11177 var i = q._ended + q._active,
11182 --q._waiting, ++q._active;
11183 t = c.apply(null, t);
11184 if (!q._tasks[i]) continue; // task finished synchronously
11185 q._tasks[i] = t || noabort;
11189 function end(q, i) {
11190 return function(e, r) {
11191 if (!q._tasks[i]) return; // ignore multiple callbacks
11192 --q._active, ++q._ended;
11193 q._tasks[i] = null;
11194 if (q._error != null) return; // ignore secondary errors
11199 if (q._waiting) poke$1(q);
11200 else maybeNotify(q);
11205 function abort(q, e) {
11206 var i = q._tasks.length, t;
11207 q._error = e; // ignore active callbacks
11208 q._data = undefined; // allow gc
11209 q._waiting = NaN; // prevent starting
11212 if (t = q._tasks[i]) {
11213 q._tasks[i] = null;
11216 catch (e) { /* ignore */ }
11221 q._active = NaN; // allow notification
11225 function maybeNotify(q) {
11226 if (!q._active && q._call) {
11228 q._data = undefined; // allow gc
11229 q._call(q._error, d);
11233 function queue(concurrency) {
11234 if (concurrency == null) concurrency = Infinity;
11235 else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11236 return new Queue(concurrency);
11239 function defaultSource$1() {
11240 return Math.random();
11243 var uniform = (function sourceRandomUniform(source) {
11244 function randomUniform(min, max) {
11245 min = min == null ? 0 : +min;
11246 max = max == null ? 1 : +max;
11247 if (arguments.length === 1) max = min, min = 0;
11249 return function() {
11250 return source() * max + min;
11254 randomUniform.source = sourceRandomUniform;
11256 return randomUniform;
11257 })(defaultSource$1);
11259 var normal = (function sourceRandomNormal(source) {
11260 function randomNormal(mu, sigma) {
11262 mu = mu == null ? 0 : +mu;
11263 sigma = sigma == null ? 1 : +sigma;
11264 return function() {
11267 // If available, use the second previously-generated uniform random.
11268 if (x != null) y = x, x = null;
11270 // Otherwise, generate a new x and y.
11272 x = source() * 2 - 1;
11273 y = source() * 2 - 1;
11275 } while (!r || r > 1);
11277 return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11281 randomNormal.source = sourceRandomNormal;
11283 return randomNormal;
11284 })(defaultSource$1);
11286 var logNormal = (function sourceRandomLogNormal(source) {
11287 function randomLogNormal() {
11288 var randomNormal = normal.source(source).apply(this, arguments);
11289 return function() {
11290 return Math.exp(randomNormal());
11294 randomLogNormal.source = sourceRandomLogNormal;
11296 return randomLogNormal;
11297 })(defaultSource$1);
11299 var irwinHall = (function sourceRandomIrwinHall(source) {
11300 function randomIrwinHall(n) {
11301 return function() {
11302 for (var sum = 0, i = 0; i < n; ++i) sum += source();
11307 randomIrwinHall.source = sourceRandomIrwinHall;
11309 return randomIrwinHall;
11310 })(defaultSource$1);
11312 var bates = (function sourceRandomBates(source) {
11313 function randomBates(n) {
11314 var randomIrwinHall = irwinHall.source(source)(n);
11315 return function() {
11316 return randomIrwinHall() / n;
11320 randomBates.source = sourceRandomBates;
11322 return randomBates;
11323 })(defaultSource$1);
11325 var exponential$1 = (function sourceRandomExponential(source) {
11326 function randomExponential(lambda) {
11327 return function() {
11328 return -Math.log(1 - source()) / lambda;
11332 randomExponential.source = sourceRandomExponential;
11334 return randomExponential;
11335 })(defaultSource$1);
11337 function d3_request(url, callback) {
11339 event = dispatch("beforesend", "progress", "load", "error"),
11342 xhr = new XMLHttpRequest,
11349 // If IE does not support CORS, use XDomainRequest.
11350 if (typeof XDomainRequest !== "undefined"
11351 && !("withCredentials" in xhr)
11352 && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11355 ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11356 : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358 function respond(o) {
11359 var status = xhr.status, result;
11360 if (!status && hasResponse(xhr)
11361 || status >= 200 && status < 300
11362 || status === 304) {
11365 result = response.call(request, xhr);
11367 event.call("error", request, e);
11373 event.call("load", request, result);
11375 event.call("error", request, o);
11379 xhr.onprogress = function(e) {
11380 event.call("progress", request, e);
11384 header: function(name, value) {
11385 name = (name + "").toLowerCase();
11386 if (arguments.length < 2) return headers.get(name);
11387 if (value == null) headers.remove(name);
11388 else headers.set(name, value + "");
11392 // If mimeType is non-null and no Accept header is set, a default is used.
11393 mimeType: function(value) {
11394 if (!arguments.length) return mimeType;
11395 mimeType = value == null ? null : value + "";
11399 // Specifies what type the response value should take;
11400 // for instance, arraybuffer, blob, document, or text.
11401 responseType: function(value) {
11402 if (!arguments.length) return responseType;
11403 responseType = value;
11407 timeout: function(value) {
11408 if (!arguments.length) return timeout;
11413 user: function(value) {
11414 return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11417 password: function(value) {
11418 return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11421 // Specify how to convert the response content to a specific type;
11422 // changes the callback value on "load" events.
11423 response: function(value) {
11428 // Alias for send("GET", …).
11429 get: function(data, callback) {
11430 return request.send("GET", data, callback);
11433 // Alias for send("POST", …).
11434 post: function(data, callback) {
11435 return request.send("POST", data, callback);
11438 // If callback is non-null, it will be used for error and load events.
11439 send: function(method, data, callback) {
11440 xhr.open(method, url, true, user, password);
11441 if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11442 if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11443 if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11444 if (responseType != null) xhr.responseType = responseType;
11445 if (timeout > 0) xhr.timeout = timeout;
11446 if (callback == null && typeof data === "function") callback = data, data = null;
11447 if (callback != null && callback.length === 1) callback = fixCallback(callback);
11448 if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11449 event.call("beforesend", request, xhr);
11450 xhr.send(data == null ? null : data);
11454 abort: function() {
11460 var value = event.on.apply(event, arguments);
11461 return value === event ? request : value;
11465 if (callback != null) {
11466 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11467 return request.get(callback);
11473 function fixCallback(callback) {
11474 return function(error, xhr) {
11475 callback(error == null ? xhr : null);
11479 function hasResponse(xhr) {
11480 var type = xhr.responseType;
11481 return type && type !== "text"
11482 ? xhr.response // null on error
11483 : xhr.responseText; // "" on error
11486 function type$1(defaultMimeType, response) {
11487 return function(url, callback) {
11488 var r = d3_request(url).mimeType(defaultMimeType).response(response);
11489 if (callback != null) {
11490 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11491 return r.get(callback);
11497 var html = type$1("text/html", function(xhr) {
11498 return document.createRange().createContextualFragment(xhr.responseText);
11501 var d3_json = type$1("application/json", function(xhr) {
11502 return JSON.parse(xhr.responseText);
11505 var d3_text = type$1("text/plain", function(xhr) {
11506 return xhr.responseText;
11509 var d3_xml = type$1("application/xml", function(xhr) {
11510 var xml = xhr.responseXML;
11511 if (!xml) throw new Error("parse error");
11515 function dsv$1(defaultMimeType, parse) {
11516 return function(url, row, callback) {
11517 if (arguments.length < 3) callback = row, row = null;
11518 var r = d3_request(url).mimeType(defaultMimeType);
11519 r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11521 return callback ? r.get(callback) : r;
11525 function responseOf(parse, row) {
11526 return function(request) {
11527 return parse(request.responseText, row);
11531 var csv$1 = dsv$1("text/csv", csvParse);
11533 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535 var array$2 = Array.prototype;
11537 var map$2 = array$2.map;
11538 var slice$5 = array$2.slice;
11540 var implicit = {name: "implicit"};
11542 function ordinal(range) {
11543 var index = map$1(),
11545 unknown = implicit;
11547 range = range == null ? [] : slice$5.call(range);
11549 function scale(d) {
11550 var key = d + "", i = index.get(key);
11552 if (unknown !== implicit) return unknown;
11553 index.set(key, i = domain.push(d));
11555 return range[(i - 1) % range.length];
11558 scale.domain = function(_) {
11559 if (!arguments.length) return domain.slice();
11560 domain = [], index = map$1();
11561 var i = -1, n = _.length, d, key;
11562 while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11566 scale.range = function(_) {
11567 return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11570 scale.unknown = function(_) {
11571 return arguments.length ? (unknown = _, scale) : unknown;
11574 scale.copy = function() {
11585 var scale = ordinal().unknown(undefined),
11586 domain = scale.domain,
11587 ordinalRange = scale.range,
11596 delete scale.unknown;
11598 function rescale() {
11599 var n = domain().length,
11600 reverse = range$$1[1] < range$$1[0],
11601 start = range$$1[reverse - 0],
11602 stop = range$$1[1 - reverse];
11603 step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11604 if (round) step = Math.floor(step);
11605 start += (stop - start - step * (n - paddingInner)) * align;
11606 bandwidth = step * (1 - paddingInner);
11607 if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11608 var values = d3_range(n).map(function(i) { return start + step * i; });
11609 return ordinalRange(reverse ? values.reverse() : values);
11612 scale.domain = function(_) {
11613 return arguments.length ? (domain(_), rescale()) : domain();
11616 scale.range = function(_) {
11617 return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11620 scale.rangeRound = function(_) {
11621 return range$$1 = [+_[0], +_[1]], round = true, rescale();
11624 scale.bandwidth = function() {
11628 scale.step = function() {
11632 scale.round = function(_) {
11633 return arguments.length ? (round = !!_, rescale()) : round;
11636 scale.padding = function(_) {
11637 return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11640 scale.paddingInner = function(_) {
11641 return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11644 scale.paddingOuter = function(_) {
11645 return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11648 scale.align = function(_) {
11649 return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11652 scale.copy = function() {
11657 .paddingInner(paddingInner)
11658 .paddingOuter(paddingOuter)
11665 function pointish(scale) {
11666 var copy = scale.copy;
11668 scale.padding = scale.paddingOuter;
11669 delete scale.paddingInner;
11670 delete scale.paddingOuter;
11672 scale.copy = function() {
11673 return pointish(copy());
11679 function point$1() {
11680 return pointish(band().paddingInner(1));
11683 function constant$9(x) {
11684 return function() {
11689 function number$2(x) {
11695 function deinterpolateLinear(a, b) {
11696 return (b -= (a = +a))
11697 ? function(x) { return (x - a) / b; }
11701 function deinterpolateClamp(deinterpolate) {
11702 return function(a, b) {
11703 var d = deinterpolate(a = +a, b = +b);
11704 return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11708 function reinterpolateClamp(reinterpolate) {
11709 return function(a, b) {
11710 var r = reinterpolate(a = +a, b = +b);
11711 return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11715 function bimap(domain, range, deinterpolate, reinterpolate) {
11716 var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11717 if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11718 else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11719 return function(x) { return r0(d0(x)); };
11722 function polymap(domain, range, deinterpolate, reinterpolate) {
11723 var j = Math.min(domain.length, range.length) - 1,
11728 // Reverse descending domains.
11729 if (domain[j] < domain[0]) {
11730 domain = domain.slice().reverse();
11731 range = range.slice().reverse();
11735 d[i] = deinterpolate(domain[i], domain[i + 1]);
11736 r[i] = reinterpolate(range[i], range[i + 1]);
11739 return function(x) {
11740 var i = bisectRight(domain, x, 1, j) - 1;
11741 return r[i](d[i](x));
11745 function copy(source, target) {
11747 .domain(source.domain())
11748 .range(source.range())
11749 .interpolate(source.interpolate())
11750 .clamp(source.clamp());
11753 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11754 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11755 function continuous(deinterpolate, reinterpolate) {
11758 interpolate$$1 = d3_interpolate,
11764 function rescale() {
11765 piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11766 output = input = null;
11770 function scale(x) {
11771 return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11774 scale.invert = function(y) {
11775 return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11778 scale.domain = function(_) {
11779 return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11782 scale.range = function(_) {
11783 return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11786 scale.rangeRound = function(_) {
11787 return range = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11790 scale.clamp = function(_) {
11791 return arguments.length ? (clamp = !!_, rescale()) : clamp;
11794 scale.interpolate = function(_) {
11795 return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11801 function tickFormat(domain, count, specifier) {
11802 var start = domain[0],
11803 stop = domain[domain.length - 1],
11804 step = tickStep(start, stop, count == null ? 10 : count),
11806 specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11807 switch (specifier.type) {
11809 var value = Math.max(Math.abs(start), Math.abs(stop));
11810 if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11811 return formatPrefix(specifier, value);
11818 if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11823 if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11827 return format(specifier);
11830 function linearish(scale) {
11831 var domain = scale.domain;
11833 scale.ticks = function(count) {
11835 return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11838 scale.tickFormat = function(count, specifier) {
11839 return tickFormat(domain(), count, specifier);
11842 scale.nice = function(count) {
11843 if (count == null) count = 10;
11852 if (stop < start) {
11853 step = start, start = stop, stop = step;
11854 step = i0, i0 = i1, i1 = step;
11857 step = tickIncrement(start, stop, count);
11860 start = Math.floor(start / step) * step;
11861 stop = Math.ceil(stop / step) * step;
11862 step = tickIncrement(start, stop, count);
11863 } else if (step < 0) {
11864 start = Math.ceil(start * step) / step;
11865 stop = Math.floor(stop * step) / step;
11866 step = tickIncrement(start, stop, count);
11870 d[i0] = Math.floor(start / step) * step;
11871 d[i1] = Math.ceil(stop / step) * step;
11873 } else if (step < 0) {
11874 d[i0] = Math.ceil(start * step) / step;
11875 d[i1] = Math.floor(stop * step) / step;
11885 function linear$2() {
11886 var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11888 scale.copy = function() {
11889 return copy(scale, linear$2());
11892 return linearish(scale);
11895 function identity$5() {
11896 var domain = [0, 1];
11898 function scale(x) {
11902 scale.invert = scale;
11904 scale.domain = scale.range = function(_) {
11905 return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11908 scale.copy = function() {
11909 return identity$5().domain(domain);
11912 return linearish(scale);
11915 function nice(domain, interval) {
11916 domain = domain.slice();
11919 i1 = domain.length - 1,
11925 t = i0, i0 = i1, i1 = t;
11926 t = x0, x0 = x1, x1 = t;
11929 domain[i0] = interval.floor(x0);
11930 domain[i1] = interval.ceil(x1);
11934 function deinterpolate(a, b) {
11935 return (b = Math.log(b / a))
11936 ? function(x) { return Math.log(x / a) / b; }
11940 function reinterpolate(a, b) {
11942 ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11943 : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11946 function pow10(x) {
11947 return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11950 function powp(base) {
11951 return base === 10 ? pow10
11952 : base === Math.E ? Math.exp
11953 : function(x) { return Math.pow(base, x); };
11956 function logp(base) {
11957 return base === Math.E ? Math.log
11958 : base === 10 && Math.log10
11959 || base === 2 && Math.log2
11960 || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11963 function reflect(f) {
11964 return function(x) {
11970 var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11971 domain = scale.domain,
11976 function rescale() {
11977 logs = logp(base), pows = powp(base);
11978 if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11982 scale.base = function(_) {
11983 return arguments.length ? (base = +_, rescale()) : base;
11986 scale.domain = function(_) {
11987 return arguments.length ? (domain(_), rescale()) : domain();
11990 scale.ticks = function(count) {
11993 v = d[d.length - 1],
11996 if (r = v < u) i = u, u = v, v = i;
12003 n = count == null ? 10 : +count,
12006 if (!(base % 1) && j - i < n) {
12007 i = Math.round(i) - 1, j = Math.round(j) + 1;
12008 if (u > 0) for (; i < j; ++i) {
12009 for (k = 1, p = pows(i); k < base; ++k) {
12011 if (t < u) continue;
12015 } else for (; i < j; ++i) {
12016 for (k = base - 1, p = pows(i); k >= 1; --k) {
12018 if (t < u) continue;
12024 z = ticks(i, j, Math.min(j - i, n)).map(pows);
12027 return r ? z.reverse() : z;
12030 scale.tickFormat = function(count, specifier) {
12031 if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12032 if (typeof specifier !== "function") specifier = format(specifier);
12033 if (count === Infinity) return specifier;
12034 if (count == null) count = 10;
12035 var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12036 return function(d) {
12037 var i = d / pows(Math.round(logs(d)));
12038 if (i * base < base - 0.5) i *= base;
12039 return i <= k ? specifier(d) : "";
12043 scale.nice = function() {
12044 return domain(nice(domain(), {
12045 floor: function(x) { return pows(Math.floor(logs(x))); },
12046 ceil: function(x) { return pows(Math.ceil(logs(x))); }
12050 scale.copy = function() {
12051 return copy(scale, log$1().base(base));
12057 function raise$1(x, exponent) {
12058 return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12063 scale = continuous(deinterpolate, reinterpolate),
12064 domain = scale.domain;
12066 function deinterpolate(a, b) {
12067 return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12068 ? function(x) { return (raise$1(x, exponent) - a) / b; }
12072 function reinterpolate(a, b) {
12073 b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12074 return function(t) { return raise$1(a + b * t, 1 / exponent); };
12077 scale.exponent = function(_) {
12078 return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12081 scale.copy = function() {
12082 return copy(scale, pow$1().exponent(exponent));
12085 return linearish(scale);
12088 function sqrt$1() {
12089 return pow$1().exponent(0.5);
12092 function quantile$$1() {
12097 function rescale() {
12098 var i = 0, n = Math.max(1, range.length);
12099 thresholds = new Array(n - 1);
12100 while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12104 function scale(x) {
12105 if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12108 scale.invertExtent = function(y) {
12109 var i = range.indexOf(y);
12110 return i < 0 ? [NaN, NaN] : [
12111 i > 0 ? thresholds[i - 1] : domain[0],
12112 i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12116 scale.domain = function(_) {
12117 if (!arguments.length) return domain.slice();
12119 for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12120 domain.sort(d3_ascending);
12124 scale.range = function(_) {
12125 return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12128 scale.quantiles = function() {
12129 return thresholds.slice();
12132 scale.copy = function() {
12133 return quantile$$1()
12141 function quantize() {
12148 function scale(x) {
12149 if (x <= x) return range[bisectRight(domain, x, 0, n)];
12152 function rescale() {
12154 domain = new Array(n);
12155 while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12159 scale.domain = function(_) {
12160 return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12163 scale.range = function(_) {
12164 return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12167 scale.invertExtent = function(y) {
12168 var i = range.indexOf(y);
12169 return i < 0 ? [NaN, NaN]
12170 : i < 1 ? [x0, domain[0]]
12171 : i >= n ? [domain[n - 1], x1]
12172 : [domain[i - 1], domain[i]];
12175 scale.copy = function() {
12181 return linearish(scale);
12184 function threshold$1() {
12185 var domain = [0.5],
12189 function scale(x) {
12190 if (x <= x) return range[bisectRight(domain, x, 0, n)];
12193 scale.domain = function(_) {
12194 return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12197 scale.range = function(_) {
12198 return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12201 scale.invertExtent = function(y) {
12202 var i = range.indexOf(y);
12203 return [domain[i - 1], domain[i]];
12206 scale.copy = function() {
12207 return threshold$1()
12215 var t0$1 = new Date,
12218 function newInterval(floori, offseti, count, field) {
12220 function interval(date) {
12221 return floori(date = new Date(+date)), date;
12224 interval.floor = interval;
12226 interval.ceil = function(date) {
12227 return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12230 interval.round = function(date) {
12231 var d0 = interval(date),
12232 d1 = interval.ceil(date);
12233 return date - d0 < d1 - date ? d0 : d1;
12236 interval.offset = function(date, step) {
12237 return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12240 interval.range = function(start, stop, step) {
12241 var range = [], previous;
12242 start = interval.ceil(start);
12243 step = step == null ? 1 : Math.floor(step);
12244 if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12245 do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12246 while (previous < start && start < stop);
12250 interval.filter = function(test) {
12251 return newInterval(function(date) {
12252 if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12253 }, function(date, step) {
12254 if (date >= date) {
12255 if (step < 0) while (++step <= 0) {
12256 while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12257 } else while (--step >= 0) {
12258 while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12265 interval.count = function(start, end) {
12266 t0$1.setTime(+start), t1$1.setTime(+end);
12267 floori(t0$1), floori(t1$1);
12268 return Math.floor(count(t0$1, t1$1));
12271 interval.every = function(step) {
12272 step = Math.floor(step);
12273 return !isFinite(step) || !(step > 0) ? null
12274 : !(step > 1) ? interval
12275 : interval.filter(field
12276 ? function(d) { return field(d) % step === 0; }
12277 : function(d) { return interval.count(0, d) % step === 0; });
12284 var millisecond = newInterval(function() {
12286 }, function(date, step) {
12287 date.setTime(+date + step);
12288 }, function(start, end) {
12289 return end - start;
12292 // An optimized implementation for this simple case.
12293 millisecond.every = function(k) {
12295 if (!isFinite(k) || !(k > 0)) return null;
12296 if (!(k > 1)) return millisecond;
12297 return newInterval(function(date) {
12298 date.setTime(Math.floor(date / k) * k);
12299 }, function(date, step) {
12300 date.setTime(+date + step * k);
12301 }, function(start, end) {
12302 return (end - start) / k;
12305 var milliseconds = millisecond.range;
12307 var durationSecond = 1e3;
12308 var durationMinute = 6e4;
12309 var durationHour = 36e5;
12310 var durationDay = 864e5;
12311 var durationWeek = 6048e5;
12313 var second = newInterval(function(date) {
12314 date.setTime(Math.floor(date / durationSecond) * durationSecond);
12315 }, function(date, step) {
12316 date.setTime(+date + step * durationSecond);
12317 }, function(start, end) {
12318 return (end - start) / durationSecond;
12319 }, function(date) {
12320 return date.getUTCSeconds();
12322 var seconds = second.range;
12324 var minute = newInterval(function(date) {
12325 date.setTime(Math.floor(date / durationMinute) * durationMinute);
12326 }, function(date, step) {
12327 date.setTime(+date + step * durationMinute);
12328 }, function(start, end) {
12329 return (end - start) / durationMinute;
12330 }, function(date) {
12331 return date.getMinutes();
12333 var minutes = minute.range;
12335 var hour = newInterval(function(date) {
12336 var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12337 if (offset < 0) offset += durationHour;
12338 date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12339 }, function(date, step) {
12340 date.setTime(+date + step * durationHour);
12341 }, function(start, end) {
12342 return (end - start) / durationHour;
12343 }, function(date) {
12344 return date.getHours();
12346 var hours = hour.range;
12348 var day = newInterval(function(date) {
12349 date.setHours(0, 0, 0, 0);
12350 }, function(date, step) {
12351 date.setDate(date.getDate() + step);
12352 }, function(start, end) {
12353 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12354 }, function(date) {
12355 return date.getDate() - 1;
12357 var days = day.range;
12359 function weekday(i) {
12360 return newInterval(function(date) {
12361 date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12362 date.setHours(0, 0, 0, 0);
12363 }, function(date, step) {
12364 date.setDate(date.getDate() + step * 7);
12365 }, function(start, end) {
12366 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12370 var sunday = weekday(0);
12371 var monday = weekday(1);
12372 var tuesday = weekday(2);
12373 var wednesday = weekday(3);
12374 var thursday = weekday(4);
12375 var friday = weekday(5);
12376 var saturday = weekday(6);
12378 var sundays = sunday.range;
12379 var mondays = monday.range;
12380 var tuesdays = tuesday.range;
12381 var wednesdays = wednesday.range;
12382 var thursdays = thursday.range;
12383 var fridays = friday.range;
12384 var saturdays = saturday.range;
12386 var month = newInterval(function(date) {
12388 date.setHours(0, 0, 0, 0);
12389 }, function(date, step) {
12390 date.setMonth(date.getMonth() + step);
12391 }, function(start, end) {
12392 return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12393 }, function(date) {
12394 return date.getMonth();
12396 var months = month.range;
12398 var year = newInterval(function(date) {
12399 date.setMonth(0, 1);
12400 date.setHours(0, 0, 0, 0);
12401 }, function(date, step) {
12402 date.setFullYear(date.getFullYear() + step);
12403 }, function(start, end) {
12404 return end.getFullYear() - start.getFullYear();
12405 }, function(date) {
12406 return date.getFullYear();
12409 // An optimized implementation for this simple case.
12410 year.every = function(k) {
12411 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12412 date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12413 date.setMonth(0, 1);
12414 date.setHours(0, 0, 0, 0);
12415 }, function(date, step) {
12416 date.setFullYear(date.getFullYear() + step * k);
12419 var years = year.range;
12421 var utcMinute = newInterval(function(date) {
12422 date.setUTCSeconds(0, 0);
12423 }, function(date, step) {
12424 date.setTime(+date + step * durationMinute);
12425 }, function(start, end) {
12426 return (end - start) / durationMinute;
12427 }, function(date) {
12428 return date.getUTCMinutes();
12430 var utcMinutes = utcMinute.range;
12432 var utcHour = newInterval(function(date) {
12433 date.setUTCMinutes(0, 0, 0);
12434 }, function(date, step) {
12435 date.setTime(+date + step * durationHour);
12436 }, function(start, end) {
12437 return (end - start) / durationHour;
12438 }, function(date) {
12439 return date.getUTCHours();
12441 var utcHours = utcHour.range;
12443 var utcDay = newInterval(function(date) {
12444 date.setUTCHours(0, 0, 0, 0);
12445 }, function(date, step) {
12446 date.setUTCDate(date.getUTCDate() + step);
12447 }, function(start, end) {
12448 return (end - start) / durationDay;
12449 }, function(date) {
12450 return date.getUTCDate() - 1;
12452 var utcDays = utcDay.range;
12454 function utcWeekday(i) {
12455 return newInterval(function(date) {
12456 date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12457 date.setUTCHours(0, 0, 0, 0);
12458 }, function(date, step) {
12459 date.setUTCDate(date.getUTCDate() + step * 7);
12460 }, function(start, end) {
12461 return (end - start) / durationWeek;
12465 var utcSunday = utcWeekday(0);
12466 var utcMonday = utcWeekday(1);
12467 var utcTuesday = utcWeekday(2);
12468 var utcWednesday = utcWeekday(3);
12469 var utcThursday = utcWeekday(4);
12470 var utcFriday = utcWeekday(5);
12471 var utcSaturday = utcWeekday(6);
12473 var utcSundays = utcSunday.range;
12474 var utcMondays = utcMonday.range;
12475 var utcTuesdays = utcTuesday.range;
12476 var utcWednesdays = utcWednesday.range;
12477 var utcThursdays = utcThursday.range;
12478 var utcFridays = utcFriday.range;
12479 var utcSaturdays = utcSaturday.range;
12481 var utcMonth = newInterval(function(date) {
12482 date.setUTCDate(1);
12483 date.setUTCHours(0, 0, 0, 0);
12484 }, function(date, step) {
12485 date.setUTCMonth(date.getUTCMonth() + step);
12486 }, function(start, end) {
12487 return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12488 }, function(date) {
12489 return date.getUTCMonth();
12491 var utcMonths = utcMonth.range;
12493 var utcYear = newInterval(function(date) {
12494 date.setUTCMonth(0, 1);
12495 date.setUTCHours(0, 0, 0, 0);
12496 }, function(date, step) {
12497 date.setUTCFullYear(date.getUTCFullYear() + step);
12498 }, function(start, end) {
12499 return end.getUTCFullYear() - start.getUTCFullYear();
12500 }, function(date) {
12501 return date.getUTCFullYear();
12504 // An optimized implementation for this simple case.
12505 utcYear.every = function(k) {
12506 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12507 date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12508 date.setUTCMonth(0, 1);
12509 date.setUTCHours(0, 0, 0, 0);
12510 }, function(date, step) {
12511 date.setUTCFullYear(date.getUTCFullYear() + step * k);
12514 var utcYears = utcYear.range;
12516 function localDate(d) {
12517 if (0 <= d.y && d.y < 100) {
12518 var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12519 date.setFullYear(d.y);
12522 return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12525 function utcDate(d) {
12526 if (0 <= d.y && d.y < 100) {
12527 var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12528 date.setUTCFullYear(d.y);
12531 return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12534 function newYear(y) {
12535 return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12538 function formatLocale$1(locale) {
12539 var locale_dateTime = locale.dateTime,
12540 locale_date = locale.date,
12541 locale_time = locale.time,
12542 locale_periods = locale.periods,
12543 locale_weekdays = locale.days,
12544 locale_shortWeekdays = locale.shortDays,
12545 locale_months = locale.months,
12546 locale_shortMonths = locale.shortMonths;
12548 var periodRe = formatRe(locale_periods),
12549 periodLookup = formatLookup(locale_periods),
12550 weekdayRe = formatRe(locale_weekdays),
12551 weekdayLookup = formatLookup(locale_weekdays),
12552 shortWeekdayRe = formatRe(locale_shortWeekdays),
12553 shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12554 monthRe = formatRe(locale_months),
12555 monthLookup = formatLookup(locale_months),
12556 shortMonthRe = formatRe(locale_shortMonths),
12557 shortMonthLookup = formatLookup(locale_shortMonths);
12560 "a": formatShortWeekday,
12561 "A": formatWeekday,
12562 "b": formatShortMonth,
12565 "d": formatDayOfMonth,
12566 "e": formatDayOfMonth,
12567 "f": formatMicroseconds,
12570 "j": formatDayOfYear,
12571 "L": formatMilliseconds,
12572 "m": formatMonthNumber,
12573 "M": formatMinutes,
12575 "Q": formatUnixTimestamp,
12576 "s": formatUnixTimestampSeconds,
12577 "S": formatSeconds,
12578 "u": formatWeekdayNumberMonday,
12579 "U": formatWeekNumberSunday,
12580 "V": formatWeekNumberISO,
12581 "w": formatWeekdayNumberSunday,
12582 "W": formatWeekNumberMonday,
12586 "Y": formatFullYear,
12588 "%": formatLiteralPercent
12592 "a": formatUTCShortWeekday,
12593 "A": formatUTCWeekday,
12594 "b": formatUTCShortMonth,
12595 "B": formatUTCMonth,
12597 "d": formatUTCDayOfMonth,
12598 "e": formatUTCDayOfMonth,
12599 "f": formatUTCMicroseconds,
12600 "H": formatUTCHour24,
12601 "I": formatUTCHour12,
12602 "j": formatUTCDayOfYear,
12603 "L": formatUTCMilliseconds,
12604 "m": formatUTCMonthNumber,
12605 "M": formatUTCMinutes,
12606 "p": formatUTCPeriod,
12607 "Q": formatUnixTimestamp,
12608 "s": formatUnixTimestampSeconds,
12609 "S": formatUTCSeconds,
12610 "u": formatUTCWeekdayNumberMonday,
12611 "U": formatUTCWeekNumberSunday,
12612 "V": formatUTCWeekNumberISO,
12613 "w": formatUTCWeekdayNumberSunday,
12614 "W": formatUTCWeekNumberMonday,
12617 "y": formatUTCYear,
12618 "Y": formatUTCFullYear,
12619 "Z": formatUTCZone,
12620 "%": formatLiteralPercent
12624 "a": parseShortWeekday,
12626 "b": parseShortMonth,
12628 "c": parseLocaleDateTime,
12629 "d": parseDayOfMonth,
12630 "e": parseDayOfMonth,
12631 "f": parseMicroseconds,
12634 "j": parseDayOfYear,
12635 "L": parseMilliseconds,
12636 "m": parseMonthNumber,
12639 "Q": parseUnixTimestamp,
12640 "s": parseUnixTimestampSeconds,
12642 "u": parseWeekdayNumberMonday,
12643 "U": parseWeekNumberSunday,
12644 "V": parseWeekNumberISO,
12645 "w": parseWeekdayNumberSunday,
12646 "W": parseWeekNumberMonday,
12647 "x": parseLocaleDate,
12648 "X": parseLocaleTime,
12650 "Y": parseFullYear,
12652 "%": parseLiteralPercent
12655 // These recursive directive definitions must be deferred.
12656 formats.x = newFormat(locale_date, formats);
12657 formats.X = newFormat(locale_time, formats);
12658 formats.c = newFormat(locale_dateTime, formats);
12659 utcFormats.x = newFormat(locale_date, utcFormats);
12660 utcFormats.X = newFormat(locale_time, utcFormats);
12661 utcFormats.c = newFormat(locale_dateTime, utcFormats);
12663 function newFormat(specifier, formats) {
12664 return function(date) {
12668 n = specifier.length,
12673 if (!(date instanceof Date)) date = new Date(+date);
12676 if (specifier.charCodeAt(i) === 37) {
12677 string.push(specifier.slice(j, i));
12678 if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12679 else pad = c === "e" ? " " : "0";
12680 if (format = formats[c]) c = format(date, pad);
12686 string.push(specifier.slice(j, i));
12687 return string.join("");
12691 function newParse(specifier, newDate) {
12692 return function(string) {
12693 var d = newYear(1900),
12694 i = parseSpecifier(d, specifier, string += "", 0),
12696 if (i != string.length) return null;
12698 // If a UNIX timestamp is specified, return it.
12699 if ("Q" in d) return new Date(d.Q);
12701 // The am-pm flag is 0 for AM, and 1 for PM.
12702 if ("p" in d) d.H = d.H % 12 + d.p * 12;
12704 // Convert day-of-week and week-of-year to day-of-year.
12706 if (d.V < 1 || d.V > 53) return null;
12707 if (!("w" in d)) d.w = 1;
12709 week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12710 week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12711 week = utcDay.offset(week, (d.V - 1) * 7);
12712 d.y = week.getUTCFullYear();
12713 d.m = week.getUTCMonth();
12714 d.d = week.getUTCDate() + (d.w + 6) % 7;
12716 week = newDate(newYear(d.y)), day$$1 = week.getDay();
12717 week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12718 week = day.offset(week, (d.V - 1) * 7);
12719 d.y = week.getFullYear();
12720 d.m = week.getMonth();
12721 d.d = week.getDate() + (d.w + 6) % 7;
12723 } else if ("W" in d || "U" in d) {
12724 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12725 day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12727 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;
12730 // If a time zone is specified, all fields are interpreted as UTC and then
12731 // offset according to the specified time zone.
12733 d.H += d.Z / 100 | 0;
12738 // Otherwise, all fields are in local time.
12743 function parseSpecifier(d, specifier, string, j) {
12745 n = specifier.length,
12751 if (j >= m) return -1;
12752 c = specifier.charCodeAt(i++);
12754 c = specifier.charAt(i++);
12755 parse = parses[c in pads ? specifier.charAt(i++) : c];
12756 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12757 } else if (c != string.charCodeAt(j++)) {
12765 function parsePeriod(d, string, i) {
12766 var n = periodRe.exec(string.slice(i));
12767 return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12770 function parseShortWeekday(d, string, i) {
12771 var n = shortWeekdayRe.exec(string.slice(i));
12772 return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12775 function parseWeekday(d, string, i) {
12776 var n = weekdayRe.exec(string.slice(i));
12777 return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12780 function parseShortMonth(d, string, i) {
12781 var n = shortMonthRe.exec(string.slice(i));
12782 return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12785 function parseMonth(d, string, i) {
12786 var n = monthRe.exec(string.slice(i));
12787 return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12790 function parseLocaleDateTime(d, string, i) {
12791 return parseSpecifier(d, locale_dateTime, string, i);
12794 function parseLocaleDate(d, string, i) {
12795 return parseSpecifier(d, locale_date, string, i);
12798 function parseLocaleTime(d, string, i) {
12799 return parseSpecifier(d, locale_time, string, i);
12802 function formatShortWeekday(d) {
12803 return locale_shortWeekdays[d.getDay()];
12806 function formatWeekday(d) {
12807 return locale_weekdays[d.getDay()];
12810 function formatShortMonth(d) {
12811 return locale_shortMonths[d.getMonth()];
12814 function formatMonth(d) {
12815 return locale_months[d.getMonth()];
12818 function formatPeriod(d) {
12819 return locale_periods[+(d.getHours() >= 12)];
12822 function formatUTCShortWeekday(d) {
12823 return locale_shortWeekdays[d.getUTCDay()];
12826 function formatUTCWeekday(d) {
12827 return locale_weekdays[d.getUTCDay()];
12830 function formatUTCShortMonth(d) {
12831 return locale_shortMonths[d.getUTCMonth()];
12834 function formatUTCMonth(d) {
12835 return locale_months[d.getUTCMonth()];
12838 function formatUTCPeriod(d) {
12839 return locale_periods[+(d.getUTCHours() >= 12)];
12843 format: function(specifier) {
12844 var f = newFormat(specifier += "", formats);
12845 f.toString = function() { return specifier; };
12848 parse: function(specifier) {
12849 var p = newParse(specifier += "", localDate);
12850 p.toString = function() { return specifier; };
12853 utcFormat: function(specifier) {
12854 var f = newFormat(specifier += "", utcFormats);
12855 f.toString = function() { return specifier; };
12858 utcParse: function(specifier) {
12859 var p = newParse(specifier, utcDate);
12860 p.toString = function() { return specifier; };
12866 var pads = {"-": "", "_": " ", "0": "0"},
12867 numberRe = /^\s*\d+/, // note: ignores next directive
12869 requoteRe = /[\\^$*+?|[\]().{}]/g;
12871 function pad(value, fill, width) {
12872 var sign = value < 0 ? "-" : "",
12873 string = (sign ? -value : value) + "",
12874 length = string.length;
12875 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12878 function requote(s) {
12879 return s.replace(requoteRe, "\\$&");
12882 function formatRe(names) {
12883 return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12886 function formatLookup(names) {
12887 var map = {}, i = -1, n = names.length;
12888 while (++i < n) map[names[i].toLowerCase()] = i;
12892 function parseWeekdayNumberSunday(d, string, i) {
12893 var n = numberRe.exec(string.slice(i, i + 1));
12894 return n ? (d.w = +n[0], i + n[0].length) : -1;
12897 function parseWeekdayNumberMonday(d, string, i) {
12898 var n = numberRe.exec(string.slice(i, i + 1));
12899 return n ? (d.u = +n[0], i + n[0].length) : -1;
12902 function parseWeekNumberSunday(d, string, i) {
12903 var n = numberRe.exec(string.slice(i, i + 2));
12904 return n ? (d.U = +n[0], i + n[0].length) : -1;
12907 function parseWeekNumberISO(d, string, i) {
12908 var n = numberRe.exec(string.slice(i, i + 2));
12909 return n ? (d.V = +n[0], i + n[0].length) : -1;
12912 function parseWeekNumberMonday(d, string, i) {
12913 var n = numberRe.exec(string.slice(i, i + 2));
12914 return n ? (d.W = +n[0], i + n[0].length) : -1;
12917 function parseFullYear(d, string, i) {
12918 var n = numberRe.exec(string.slice(i, i + 4));
12919 return n ? (d.y = +n[0], i + n[0].length) : -1;
12922 function parseYear(d, string, i) {
12923 var n = numberRe.exec(string.slice(i, i + 2));
12924 return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12927 function parseZone(d, string, i) {
12928 var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12929 return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12932 function parseMonthNumber(d, string, i) {
12933 var n = numberRe.exec(string.slice(i, i + 2));
12934 return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12937 function parseDayOfMonth(d, string, i) {
12938 var n = numberRe.exec(string.slice(i, i + 2));
12939 return n ? (d.d = +n[0], i + n[0].length) : -1;
12942 function parseDayOfYear(d, string, i) {
12943 var n = numberRe.exec(string.slice(i, i + 3));
12944 return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12947 function parseHour24(d, string, i) {
12948 var n = numberRe.exec(string.slice(i, i + 2));
12949 return n ? (d.H = +n[0], i + n[0].length) : -1;
12952 function parseMinutes(d, string, i) {
12953 var n = numberRe.exec(string.slice(i, i + 2));
12954 return n ? (d.M = +n[0], i + n[0].length) : -1;
12957 function parseSeconds(d, string, i) {
12958 var n = numberRe.exec(string.slice(i, i + 2));
12959 return n ? (d.S = +n[0], i + n[0].length) : -1;
12962 function parseMilliseconds(d, string, i) {
12963 var n = numberRe.exec(string.slice(i, i + 3));
12964 return n ? (d.L = +n[0], i + n[0].length) : -1;
12967 function parseMicroseconds(d, string, i) {
12968 var n = numberRe.exec(string.slice(i, i + 6));
12969 return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12972 function parseLiteralPercent(d, string, i) {
12973 var n = percentRe.exec(string.slice(i, i + 1));
12974 return n ? i + n[0].length : -1;
12977 function parseUnixTimestamp(d, string, i) {
12978 var n = numberRe.exec(string.slice(i));
12979 return n ? (d.Q = +n[0], i + n[0].length) : -1;
12982 function parseUnixTimestampSeconds(d, string, i) {
12983 var n = numberRe.exec(string.slice(i));
12984 return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12987 function formatDayOfMonth(d, p) {
12988 return pad(d.getDate(), p, 2);
12991 function formatHour24(d, p) {
12992 return pad(d.getHours(), p, 2);
12995 function formatHour12(d, p) {
12996 return pad(d.getHours() % 12 || 12, p, 2);
12999 function formatDayOfYear(d, p) {
13000 return pad(1 + day.count(year(d), d), p, 3);
13003 function formatMilliseconds(d, p) {
13004 return pad(d.getMilliseconds(), p, 3);
13007 function formatMicroseconds(d, p) {
13008 return formatMilliseconds(d, p) + "000";
13011 function formatMonthNumber(d, p) {
13012 return pad(d.getMonth() + 1, p, 2);
13015 function formatMinutes(d, p) {
13016 return pad(d.getMinutes(), p, 2);
13019 function formatSeconds(d, p) {
13020 return pad(d.getSeconds(), p, 2);
13023 function formatWeekdayNumberMonday(d) {
13024 var day$$1 = d.getDay();
13025 return day$$1 === 0 ? 7 : day$$1;
13028 function formatWeekNumberSunday(d, p) {
13029 return pad(sunday.count(year(d), d), p, 2);
13032 function formatWeekNumberISO(d, p) {
13033 var day$$1 = d.getDay();
13034 d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13035 return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13038 function formatWeekdayNumberSunday(d) {
13042 function formatWeekNumberMonday(d, p) {
13043 return pad(monday.count(year(d), d), p, 2);
13046 function formatYear(d, p) {
13047 return pad(d.getFullYear() % 100, p, 2);
13050 function formatFullYear(d, p) {
13051 return pad(d.getFullYear() % 10000, p, 4);
13054 function formatZone(d) {
13055 var z = d.getTimezoneOffset();
13056 return (z > 0 ? "-" : (z *= -1, "+"))
13057 + pad(z / 60 | 0, "0", 2)
13058 + pad(z % 60, "0", 2);
13061 function formatUTCDayOfMonth(d, p) {
13062 return pad(d.getUTCDate(), p, 2);
13065 function formatUTCHour24(d, p) {
13066 return pad(d.getUTCHours(), p, 2);
13069 function formatUTCHour12(d, p) {
13070 return pad(d.getUTCHours() % 12 || 12, p, 2);
13073 function formatUTCDayOfYear(d, p) {
13074 return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13077 function formatUTCMilliseconds(d, p) {
13078 return pad(d.getUTCMilliseconds(), p, 3);
13081 function formatUTCMicroseconds(d, p) {
13082 return formatUTCMilliseconds(d, p) + "000";
13085 function formatUTCMonthNumber(d, p) {
13086 return pad(d.getUTCMonth() + 1, p, 2);
13089 function formatUTCMinutes(d, p) {
13090 return pad(d.getUTCMinutes(), p, 2);
13093 function formatUTCSeconds(d, p) {
13094 return pad(d.getUTCSeconds(), p, 2);
13097 function formatUTCWeekdayNumberMonday(d) {
13098 var dow = d.getUTCDay();
13099 return dow === 0 ? 7 : dow;
13102 function formatUTCWeekNumberSunday(d, p) {
13103 return pad(utcSunday.count(utcYear(d), d), p, 2);
13106 function formatUTCWeekNumberISO(d, p) {
13107 var day$$1 = d.getUTCDay();
13108 d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13109 return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13112 function formatUTCWeekdayNumberSunday(d) {
13113 return d.getUTCDay();
13116 function formatUTCWeekNumberMonday(d, p) {
13117 return pad(utcMonday.count(utcYear(d), d), p, 2);
13120 function formatUTCYear(d, p) {
13121 return pad(d.getUTCFullYear() % 100, p, 2);
13124 function formatUTCFullYear(d, p) {
13125 return pad(d.getUTCFullYear() % 10000, p, 4);
13128 function formatUTCZone() {
13132 function formatLiteralPercent() {
13136 function formatUnixTimestamp(d) {
13140 function formatUnixTimestampSeconds(d) {
13141 return Math.floor(+d / 1000);
13151 dateTime: "%x, %X",
13152 date: "%-m/%-d/%Y",
13153 time: "%-I:%M:%S %p",
13154 periods: ["AM", "PM"],
13155 days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13156 shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13157 months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13158 shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13161 function defaultLocale$1(definition) {
13162 locale$1 = formatLocale$1(definition);
13163 timeFormat = locale$1.format;
13164 timeParse = locale$1.parse;
13165 utcFormat = locale$1.utcFormat;
13166 utcParse = locale$1.utcParse;
13170 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172 function formatIsoNative(date) {
13173 return date.toISOString();
13176 var formatIso = Date.prototype.toISOString
13178 : utcFormat(isoSpecifier);
13180 function parseIsoNative(string) {
13181 var date = new Date(string);
13182 return isNaN(date) ? null : date;
13185 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187 : utcParse(isoSpecifier);
13189 var durationSecond$1 = 1000,
13190 durationMinute$1 = durationSecond$1 * 60,
13191 durationHour$1 = durationMinute$1 * 60,
13192 durationDay$1 = durationHour$1 * 24,
13193 durationWeek$1 = durationDay$1 * 7,
13194 durationMonth = durationDay$1 * 30,
13195 durationYear = durationDay$1 * 365;
13197 function date$1(t) {
13198 return new Date(t);
13201 function number$3(t) {
13202 return t instanceof Date ? +t : +new Date(+t);
13205 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13206 var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13207 invert = scale.invert,
13208 domain = scale.domain;
13210 var formatMillisecond = format(".%L"),
13211 formatSecond = format(":%S"),
13212 formatMinute = format("%I:%M"),
13213 formatHour = format("%I %p"),
13214 formatDay = format("%a %d"),
13215 formatWeek = format("%b %d"),
13216 formatMonth = format("%B"),
13217 formatYear = format("%Y");
13219 var tickIntervals = [
13220 [second$$1, 1, durationSecond$1],
13221 [second$$1, 5, 5 * durationSecond$1],
13222 [second$$1, 15, 15 * durationSecond$1],
13223 [second$$1, 30, 30 * durationSecond$1],
13224 [minute$$1, 1, durationMinute$1],
13225 [minute$$1, 5, 5 * durationMinute$1],
13226 [minute$$1, 15, 15 * durationMinute$1],
13227 [minute$$1, 30, 30 * durationMinute$1],
13228 [ hour$$1, 1, durationHour$1 ],
13229 [ hour$$1, 3, 3 * durationHour$1 ],
13230 [ hour$$1, 6, 6 * durationHour$1 ],
13231 [ hour$$1, 12, 12 * durationHour$1 ],
13232 [ day$$1, 1, durationDay$1 ],
13233 [ day$$1, 2, 2 * durationDay$1 ],
13234 [ week, 1, durationWeek$1 ],
13235 [ month$$1, 1, durationMonth ],
13236 [ month$$1, 3, 3 * durationMonth ],
13237 [ year$$1, 1, durationYear ]
13240 function tickFormat(date$$1) {
13241 return (second$$1(date$$1) < date$$1 ? formatMillisecond
13242 : minute$$1(date$$1) < date$$1 ? formatSecond
13243 : hour$$1(date$$1) < date$$1 ? formatMinute
13244 : day$$1(date$$1) < date$$1 ? formatHour
13245 : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13246 : year$$1(date$$1) < date$$1 ? formatMonth
13247 : formatYear)(date$$1);
13250 function tickInterval(interval, start, stop, step) {
13251 if (interval == null) interval = 10;
13253 // If a desired tick count is specified, pick a reasonable tick interval
13254 // based on the extent of the domain and a rough estimate of tick size.
13255 // Otherwise, assume interval is already a time interval and use it.
13256 if (typeof interval === "number") {
13257 var target = Math.abs(stop - start) / interval,
13258 i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13259 if (i === tickIntervals.length) {
13260 step = tickStep(start / durationYear, stop / durationYear, interval);
13261 interval = year$$1;
13263 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13267 step = Math.max(tickStep(start, stop, interval), 1);
13268 interval = millisecond$$1;
13272 return step == null ? interval : interval.every(step);
13275 scale.invert = function(y) {
13276 return new Date(invert(y));
13279 scale.domain = function(_) {
13280 return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13283 scale.ticks = function(interval, step) {
13286 t1 = d[d.length - 1],
13289 if (r) t = t0, t0 = t1, t1 = t;
13290 t = tickInterval(interval, t0, t1, step);
13291 t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13292 return r ? t.reverse() : t;
13295 scale.tickFormat = function(count, specifier) {
13296 return specifier == null ? tickFormat : format(specifier);
13299 scale.nice = function(interval, step) {
13301 return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13302 ? domain(nice(d, interval))
13306 scale.copy = function() {
13307 return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13314 return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13317 function utcTime() {
13318 return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13321 function colors(s) {
13322 return s.match(/.{6}/g).map(function(x) {
13327 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341 var rainbow = cubehelix();
13343 function rainbow$1(t) {
13344 if (t < 0 || t > 1) t -= Math.floor(t);
13345 var ts = Math.abs(t - 0.5);
13346 rainbow.h = 360 * t - 100;
13347 rainbow.s = 1.5 - 1.5 * ts;
13348 rainbow.l = 0.8 - 0.9 * ts;
13349 return rainbow + "";
13352 function ramp(range) {
13353 var n = range.length;
13354 return function(t) {
13355 return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13359 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367 function sequential(interpolator) {
13372 function scale(x) {
13373 var t = (x - x0) / (x1 - x0);
13374 return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13377 scale.domain = function(_) {
13378 return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13381 scale.clamp = function(_) {
13382 return arguments.length ? (clamp = !!_, scale) : clamp;
13385 scale.interpolator = function(_) {
13386 return arguments.length ? (interpolator = _, scale) : interpolator;
13389 scale.copy = function() {
13390 return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13393 return linearish(scale);
13396 function constant$10(x) {
13397 return function constant() {
13402 var abs$1 = Math.abs;
13403 var atan2$1 = Math.atan2;
13404 var cos$2 = Math.cos;
13405 var max$2 = Math.max;
13406 var min$1 = Math.min;
13407 var sin$2 = Math.sin;
13408 var sqrt$2 = Math.sqrt;
13410 var epsilon$3 = 1e-12;
13411 var pi$4 = Math.PI;
13412 var halfPi$3 = pi$4 / 2;
13413 var tau$4 = 2 * pi$4;
13415 function acos$1(x) {
13416 return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13419 function asin$1(x) {
13420 return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13423 function arcInnerRadius(d) {
13424 return d.innerRadius;
13427 function arcOuterRadius(d) {
13428 return d.outerRadius;
13431 function arcStartAngle(d) {
13432 return d.startAngle;
13435 function arcEndAngle(d) {
13439 function arcPadAngle(d) {
13440 return d && d.padAngle; // Note: optional!
13443 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13444 var x10 = x1 - x0, y10 = y1 - y0,
13445 x32 = x3 - x2, y32 = y3 - y2,
13446 t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13447 return [x0 + t * x10, y0 + t * y10];
13450 // Compute perpendicular offset line of length rc.
13451 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13452 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13455 lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13462 x00 = (x11 + x10) / 2,
13463 y00 = (y11 + y10) / 2,
13466 d2 = dx * dx + dy * dy,
13468 D = x11 * y10 - x10 * y11,
13469 d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13470 cx0 = (D * dy - dx * d) / d2,
13471 cy0 = (-D * dx - dy * d) / d2,
13472 cx1 = (D * dy + dx * d) / d2,
13473 cy1 = (-D * dx + dy * d) / d2,
13479 // Pick the closer of the two intersection points.
13480 // TODO Is there a faster way to determine which intersection to use?
13481 if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13488 x11: cx0 * (r1 / r - 1),
13489 y11: cy0 * (r1 / r - 1)
13494 var innerRadius = arcInnerRadius,
13495 outerRadius = arcOuterRadius,
13496 cornerRadius = constant$10(0),
13498 startAngle = arcStartAngle,
13499 endAngle = arcEndAngle,
13500 padAngle = arcPadAngle,
13506 r0 = +innerRadius.apply(this, arguments),
13507 r1 = +outerRadius.apply(this, arguments),
13508 a0 = startAngle.apply(this, arguments) - halfPi$3,
13509 a1 = endAngle.apply(this, arguments) - halfPi$3,
13510 da = abs$1(a1 - a0),
13513 if (!context) context = buffer = path();
13515 // Ensure that the outer radius is always larger than the inner radius.
13516 if (r1 < r0) r = r1, r1 = r0, r0 = r;
13519 if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521 // Or is it a circle or annulus?
13522 else if (da > tau$4 - epsilon$3) {
13523 context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13524 context.arc(0, 0, r1, a0, a1, !cw);
13525 if (r0 > epsilon$3) {
13526 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13527 context.arc(0, 0, r0, a1, a0, cw);
13531 // Or is it a circular or annular sector?
13539 ap = padAngle.apply(this, arguments) / 2,
13540 rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13541 rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13547 // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13548 if (rp > epsilon$3) {
13549 var p0 = asin$1(rp / r0 * sin$2(ap)),
13550 p1 = asin$1(rp / r1 * sin$2(ap));
13551 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13552 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13553 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13554 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13557 var x01 = r1 * cos$2(a01),
13558 y01 = r1 * sin$2(a01),
13559 x10 = r0 * cos$2(a10),
13560 y10 = r0 * sin$2(a10);
13562 // Apply rounded corners?
13563 if (rc > epsilon$3) {
13564 var x11 = r1 * cos$2(a11),
13565 y11 = r1 * sin$2(a11),
13566 x00 = r0 * cos$2(a00),
13567 y00 = r0 * sin$2(a00);
13569 // Restrict the corner radius according to the sector angle.
13571 var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13576 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13577 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13578 rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13579 rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13583 // Is the sector collapsed to a line?
13584 if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586 // Does the sector’s outer ring have rounded corners?
13587 else if (rc1 > epsilon$3) {
13588 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13589 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13591 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593 // Have the corners merged?
13594 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13596 // Otherwise, draw the two corners and the ring.
13598 context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13599 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);
13600 context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13604 // Or is the outer ring just a circular arc?
13605 else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607 // Is there no inner ring, and it’s a circular sector?
13608 // Or perhaps it’s an annular sector collapsed due to padding?
13609 if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13611 // Does the sector’s inner ring (or point) have rounded corners?
13612 else if (rc0 > epsilon$3) {
13613 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13614 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13616 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618 // Have the corners merged?
13619 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13621 // Otherwise, draw the two corners and the ring.
13623 context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13624 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);
13625 context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13629 // Or is the inner ring just a circular arc?
13630 else context.arc(0, 0, r0, a10, a00, cw);
13633 context.closePath();
13635 if (buffer) return context = null, buffer + "" || null;
13638 arc.centroid = function() {
13639 var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13640 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13641 return [cos$2(a) * r, sin$2(a) * r];
13644 arc.innerRadius = function(_) {
13645 return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13648 arc.outerRadius = function(_) {
13649 return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13652 arc.cornerRadius = function(_) {
13653 return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13656 arc.padRadius = function(_) {
13657 return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13660 arc.startAngle = function(_) {
13661 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13664 arc.endAngle = function(_) {
13665 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13668 arc.padAngle = function(_) {
13669 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13672 arc.context = function(_) {
13673 return arguments.length ? (context = _ == null ? null : _, arc) : context;
13679 function Linear(context) {
13680 this._context = context;
13683 Linear.prototype = {
13684 areaStart: function() {
13687 areaEnd: function() {
13690 lineStart: function() {
13693 lineEnd: function() {
13694 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13695 this._line = 1 - this._line;
13697 point: function(x, y) {
13699 switch (this._point) {
13700 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13701 case 1: this._point = 2; // proceed
13702 default: this._context.lineTo(x, y); break;
13707 function curveLinear(context) {
13708 return new Linear(context);
13722 defined = constant$10(true),
13724 curve = curveLinear,
13727 function line(data) {
13734 if (context == null) output = curve(buffer = path());
13736 for (i = 0; i <= n; ++i) {
13737 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13738 if (defined0 = !defined0) output.lineStart();
13739 else output.lineEnd();
13741 if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13744 if (buffer) return output = null, buffer + "" || null;
13747 line.x = function(_) {
13748 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : x$$1;
13751 line.y = function(_) {
13752 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : y$$1;
13755 line.defined = function(_) {
13756 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13759 line.curve = function(_) {
13760 return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13763 line.context = function(_) {
13764 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13773 y0 = constant$10(0),
13775 defined = constant$10(true),
13777 curve = curveLinear,
13780 function area(data) {
13788 x0z = new Array(n),
13789 y0z = new Array(n);
13791 if (context == null) output = curve(buffer = path());
13793 for (i = 0; i <= n; ++i) {
13794 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13795 if (defined0 = !defined0) {
13797 output.areaStart();
13798 output.lineStart();
13801 output.lineStart();
13802 for (k = i - 1; k >= j; --k) {
13803 output.point(x0z[k], y0z[k]);
13810 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13811 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13815 if (buffer) return output = null, buffer + "" || null;
13818 function arealine() {
13819 return line().defined(defined).curve(curve).context(context);
13822 area.x = function(_) {
13823 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13826 area.x0 = function(_) {
13827 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13830 area.x1 = function(_) {
13831 return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13834 area.y = function(_) {
13835 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13838 area.y0 = function(_) {
13839 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13842 area.y1 = function(_) {
13843 return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13847 area.lineY0 = function() {
13848 return arealine().x(x0).y(y0);
13851 area.lineY1 = function() {
13852 return arealine().x(x0).y(y1);
13855 area.lineX1 = function() {
13856 return arealine().x(x1).y(y0);
13859 area.defined = function(_) {
13860 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13863 area.curve = function(_) {
13864 return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13867 area.context = function(_) {
13868 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13874 function descending(a, b) {
13875 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13878 function identity$6(d) {
13883 var value = identity$6,
13884 sortValues = descending,
13886 startAngle = constant$10(0),
13887 endAngle = constant$10(tau$4),
13888 padAngle = constant$10(0);
13890 function pie(data) {
13896 index = new Array(n),
13897 arcs = new Array(n),
13898 a0 = +startAngle.apply(this, arguments),
13899 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13901 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13902 pa = p * (da < 0 ? -1 : 1),
13905 for (i = 0; i < n; ++i) {
13906 if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13911 // Optionally sort the arcs by previously-computed values or by data.
13912 if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13913 else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13915 // Compute the arcs! They are stored in the original data's order.
13916 for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13917 j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13930 pie.value = function(_) {
13931 return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13934 pie.sortValues = function(_) {
13935 return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13938 pie.sort = function(_) {
13939 return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13942 pie.startAngle = function(_) {
13943 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13946 pie.endAngle = function(_) {
13947 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13950 pie.padAngle = function(_) {
13951 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13957 var curveRadialLinear = curveRadial(curveLinear);
13959 function Radial(curve) {
13960 this._curve = curve;
13963 Radial.prototype = {
13964 areaStart: function() {
13965 this._curve.areaStart();
13967 areaEnd: function() {
13968 this._curve.areaEnd();
13970 lineStart: function() {
13971 this._curve.lineStart();
13973 lineEnd: function() {
13974 this._curve.lineEnd();
13976 point: function(a, r) {
13977 this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13981 function curveRadial(curve) {
13983 function radial(context) {
13984 return new Radial(curve(context));
13987 radial._curve = curve;
13992 function lineRadial(l) {
13995 l.angle = l.x, delete l.x;
13996 l.radius = l.y, delete l.y;
13998 l.curve = function(_) {
13999 return arguments.length ? c(curveRadial(_)) : c()._curve;
14005 function lineRadial$1() {
14006 return lineRadial(line().curve(curveRadialLinear));
14009 function areaRadial() {
14010 var a = area().curve(curveRadialLinear),
14017 a.angle = a.x, delete a.x;
14018 a.startAngle = a.x0, delete a.x0;
14019 a.endAngle = a.x1, delete a.x1;
14020 a.radius = a.y, delete a.y;
14021 a.innerRadius = a.y0, delete a.y0;
14022 a.outerRadius = a.y1, delete a.y1;
14023 a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14024 a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14025 a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14026 a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14028 a.curve = function(_) {
14029 return arguments.length ? c(curveRadial(_)) : c()._curve;
14035 function pointRadial(x, y) {
14036 return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14039 var slice$6 = Array.prototype.slice;
14041 function linkSource(d) {
14045 function linkTarget(d) {
14049 function link$2(curve) {
14050 var source = linkSource,
14051 target = linkTarget,
14057 var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14058 if (!context) context = buffer = path();
14059 curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));
14060 if (buffer) return context = null, buffer + "" || null;
14063 link.source = function(_) {
14064 return arguments.length ? (source = _, link) : source;
14067 link.target = function(_) {
14068 return arguments.length ? (target = _, link) : target;
14071 link.x = function(_) {
14072 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : x$$1;
14075 link.y = function(_) {
14076 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), link) : y$$1;
14079 link.context = function(_) {
14080 return arguments.length ? (context = _ == null ? null : _, link) : context;
14086 function curveHorizontal(context, x0, y0, x1, y1) {
14087 context.moveTo(x0, y0);
14088 context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14091 function curveVertical(context, x0, y0, x1, y1) {
14092 context.moveTo(x0, y0);
14093 context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14096 function curveRadial$1(context, x0, y0, x1, y1) {
14097 var p0 = pointRadial(x0, y0),
14098 p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14099 p2 = pointRadial(x1, y0),
14100 p3 = pointRadial(x1, y1);
14101 context.moveTo(p0[0], p0[1]);
14102 context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14105 function linkHorizontal() {
14106 return link$2(curveHorizontal);
14109 function linkVertical() {
14110 return link$2(curveVertical);
14113 function linkRadial() {
14114 var l = link$2(curveRadial$1);
14115 l.angle = l.x, delete l.x;
14116 l.radius = l.y, delete l.y;
14121 draw: function(context, size) {
14122 var r = Math.sqrt(size / pi$4);
14123 context.moveTo(r, 0);
14124 context.arc(0, 0, r, 0, tau$4);
14129 draw: function(context, size) {
14130 var r = Math.sqrt(size / 5) / 2;
14131 context.moveTo(-3 * r, -r);
14132 context.lineTo(-r, -r);
14133 context.lineTo(-r, -3 * r);
14134 context.lineTo(r, -3 * r);
14135 context.lineTo(r, -r);
14136 context.lineTo(3 * r, -r);
14137 context.lineTo(3 * r, r);
14138 context.lineTo(r, r);
14139 context.lineTo(r, 3 * r);
14140 context.lineTo(-r, 3 * r);
14141 context.lineTo(-r, r);
14142 context.lineTo(-3 * r, r);
14143 context.closePath();
14147 var tan30 = Math.sqrt(1 / 3),
14148 tan30_2 = tan30 * 2;
14151 draw: function(context, size) {
14152 var y = Math.sqrt(size / tan30_2),
14154 context.moveTo(0, -y);
14155 context.lineTo(x, 0);
14156 context.lineTo(0, y);
14157 context.lineTo(-x, 0);
14158 context.closePath();
14162 var ka = 0.89081309152928522810,
14163 kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14164 kx = Math.sin(tau$4 / 10) * kr,
14165 ky = -Math.cos(tau$4 / 10) * kr;
14168 draw: function(context, size) {
14169 var r = Math.sqrt(size * ka),
14172 context.moveTo(0, -r);
14173 context.lineTo(x, y);
14174 for (var i = 1; i < 5; ++i) {
14175 var a = tau$4 * i / 5,
14178 context.lineTo(s * r, -c * r);
14179 context.lineTo(c * x - s * y, s * x + c * y);
14181 context.closePath();
14186 draw: function(context, size) {
14187 var w = Math.sqrt(size),
14189 context.rect(x, x, w, w);
14193 var sqrt3 = Math.sqrt(3);
14196 draw: function(context, size) {
14197 var y = -Math.sqrt(size / (sqrt3 * 3));
14198 context.moveTo(0, y * 2);
14199 context.lineTo(-sqrt3 * y, -y);
14200 context.lineTo(sqrt3 * y, -y);
14201 context.closePath();
14206 s = Math.sqrt(3) / 2,
14207 k = 1 / Math.sqrt(12),
14208 a = (k / 2 + 1) * 3;
14211 draw: function(context, size) {
14212 var r = Math.sqrt(size / a),
14219 context.moveTo(x0, y0);
14220 context.lineTo(x1, y1);
14221 context.lineTo(x2, y2);
14222 context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14223 context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14224 context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14225 context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14226 context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14227 context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14228 context.closePath();
14242 function symbol() {
14243 var type = constant$10(circle$2),
14244 size = constant$10(64),
14247 function symbol() {
14249 if (!context) context = buffer = path();
14250 type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14251 if (buffer) return context = null, buffer + "" || null;
14254 symbol.type = function(_) {
14255 return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14258 symbol.size = function(_) {
14259 return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14262 symbol.context = function(_) {
14263 return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14269 function noop$2() {}
14271 function point$2(that, x, y) {
14272 that._context.bezierCurveTo(
14273 (2 * that._x0 + that._x1) / 3,
14274 (2 * that._y0 + that._y1) / 3,
14275 (that._x0 + 2 * that._x1) / 3,
14276 (that._y0 + 2 * that._y1) / 3,
14277 (that._x0 + 4 * that._x1 + x) / 6,
14278 (that._y0 + 4 * that._y1 + y) / 6
14282 function Basis(context) {
14283 this._context = context;
14286 Basis.prototype = {
14287 areaStart: function() {
14290 areaEnd: function() {
14293 lineStart: function() {
14294 this._x0 = this._x1 =
14295 this._y0 = this._y1 = NaN;
14298 lineEnd: function() {
14299 switch (this._point) {
14300 case 3: point$2(this, this._x1, this._y1); // proceed
14301 case 2: this._context.lineTo(this._x1, this._y1); break;
14303 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14304 this._line = 1 - this._line;
14306 point: function(x, y) {
14308 switch (this._point) {
14309 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14310 case 1: this._point = 2; break;
14311 case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14312 default: point$2(this, x, y); break;
14314 this._x0 = this._x1, this._x1 = x;
14315 this._y0 = this._y1, this._y1 = y;
14319 function basis$2(context) {
14320 return new Basis(context);
14323 function BasisClosed(context) {
14324 this._context = context;
14327 BasisClosed.prototype = {
14330 lineStart: function() {
14331 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14332 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14335 lineEnd: function() {
14336 switch (this._point) {
14338 this._context.moveTo(this._x2, this._y2);
14339 this._context.closePath();
14343 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14344 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14345 this._context.closePath();
14349 this.point(this._x2, this._y2);
14350 this.point(this._x3, this._y3);
14351 this.point(this._x4, this._y4);
14356 point: function(x, y) {
14358 switch (this._point) {
14359 case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14360 case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14361 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;
14362 default: point$2(this, x, y); break;
14364 this._x0 = this._x1, this._x1 = x;
14365 this._y0 = this._y1, this._y1 = y;
14369 function basisClosed$1(context) {
14370 return new BasisClosed(context);
14373 function BasisOpen(context) {
14374 this._context = context;
14377 BasisOpen.prototype = {
14378 areaStart: function() {
14381 areaEnd: function() {
14384 lineStart: function() {
14385 this._x0 = this._x1 =
14386 this._y0 = this._y1 = NaN;
14389 lineEnd: function() {
14390 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14391 this._line = 1 - this._line;
14393 point: function(x, y) {
14395 switch (this._point) {
14396 case 0: this._point = 1; break;
14397 case 1: this._point = 2; break;
14398 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;
14399 case 3: this._point = 4; // proceed
14400 default: point$2(this, x, y); break;
14402 this._x0 = this._x1, this._x1 = x;
14403 this._y0 = this._y1, this._y1 = y;
14407 function basisOpen(context) {
14408 return new BasisOpen(context);
14411 function Bundle(context, beta) {
14412 this._basis = new Basis(context);
14416 Bundle.prototype = {
14417 lineStart: function() {
14420 this._basis.lineStart();
14422 lineEnd: function() {
14438 this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14439 this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14444 this._x = this._y = null;
14445 this._basis.lineEnd();
14447 point: function(x, y) {
14453 var bundle = (function custom(beta) {
14455 function bundle(context) {
14456 return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14459 bundle.beta = function(beta) {
14460 return custom(+beta);
14466 function point$3(that, x, y) {
14467 that._context.bezierCurveTo(
14468 that._x1 + that._k * (that._x2 - that._x0),
14469 that._y1 + that._k * (that._y2 - that._y0),
14470 that._x2 + that._k * (that._x1 - x),
14471 that._y2 + that._k * (that._y1 - y),
14477 function Cardinal(context, tension) {
14478 this._context = context;
14479 this._k = (1 - tension) / 6;
14482 Cardinal.prototype = {
14483 areaStart: function() {
14486 areaEnd: function() {
14489 lineStart: function() {
14490 this._x0 = this._x1 = this._x2 =
14491 this._y0 = this._y1 = this._y2 = NaN;
14494 lineEnd: function() {
14495 switch (this._point) {
14496 case 2: this._context.lineTo(this._x2, this._y2); break;
14497 case 3: point$3(this, this._x1, this._y1); break;
14499 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14500 this._line = 1 - this._line;
14502 point: function(x, y) {
14504 switch (this._point) {
14505 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14506 case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14507 case 2: this._point = 3; // proceed
14508 default: point$3(this, x, y); break;
14510 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14511 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14515 var cardinal = (function custom(tension) {
14517 function cardinal(context) {
14518 return new Cardinal(context, tension);
14521 cardinal.tension = function(tension) {
14522 return custom(+tension);
14528 function CardinalClosed(context, tension) {
14529 this._context = context;
14530 this._k = (1 - tension) / 6;
14533 CardinalClosed.prototype = {
14536 lineStart: function() {
14537 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14538 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14541 lineEnd: function() {
14542 switch (this._point) {
14544 this._context.moveTo(this._x3, this._y3);
14545 this._context.closePath();
14549 this._context.lineTo(this._x3, this._y3);
14550 this._context.closePath();
14554 this.point(this._x3, this._y3);
14555 this.point(this._x4, this._y4);
14556 this.point(this._x5, this._y5);
14561 point: function(x, y) {
14563 switch (this._point) {
14564 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14565 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14566 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14567 default: point$3(this, x, y); break;
14569 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14570 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14574 var cardinalClosed = (function custom(tension) {
14576 function cardinal$$1(context) {
14577 return new CardinalClosed(context, tension);
14580 cardinal$$1.tension = function(tension) {
14581 return custom(+tension);
14584 return cardinal$$1;
14587 function CardinalOpen(context, tension) {
14588 this._context = context;
14589 this._k = (1 - tension) / 6;
14592 CardinalOpen.prototype = {
14593 areaStart: function() {
14596 areaEnd: function() {
14599 lineStart: function() {
14600 this._x0 = this._x1 = this._x2 =
14601 this._y0 = this._y1 = this._y2 = NaN;
14604 lineEnd: function() {
14605 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14606 this._line = 1 - this._line;
14608 point: function(x, y) {
14610 switch (this._point) {
14611 case 0: this._point = 1; break;
14612 case 1: this._point = 2; break;
14613 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14614 case 3: this._point = 4; // proceed
14615 default: point$3(this, x, y); break;
14617 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14618 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14622 var cardinalOpen = (function custom(tension) {
14624 function cardinal$$1(context) {
14625 return new CardinalOpen(context, tension);
14628 cardinal$$1.tension = function(tension) {
14629 return custom(+tension);
14632 return cardinal$$1;
14635 function point$4(that, x, y) {
14641 if (that._l01_a > epsilon$3) {
14642 var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14643 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14644 x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14645 y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14648 if (that._l23_a > epsilon$3) {
14649 var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14650 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14651 x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14652 y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14655 that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14658 function CatmullRom(context, alpha) {
14659 this._context = context;
14660 this._alpha = alpha;
14663 CatmullRom.prototype = {
14664 areaStart: function() {
14667 areaEnd: function() {
14670 lineStart: function() {
14671 this._x0 = this._x1 = this._x2 =
14672 this._y0 = this._y1 = this._y2 = NaN;
14673 this._l01_a = this._l12_a = this._l23_a =
14674 this._l01_2a = this._l12_2a = this._l23_2a =
14677 lineEnd: function() {
14678 switch (this._point) {
14679 case 2: this._context.lineTo(this._x2, this._y2); break;
14680 case 3: this.point(this._x2, this._y2); break;
14682 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14683 this._line = 1 - this._line;
14685 point: function(x, y) {
14689 var x23 = this._x2 - x,
14690 y23 = this._y2 - y;
14691 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14694 switch (this._point) {
14695 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14696 case 1: this._point = 2; break;
14697 case 2: this._point = 3; // proceed
14698 default: point$4(this, x, y); break;
14701 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14702 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14703 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14704 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14708 var catmullRom = (function custom(alpha) {
14710 function catmullRom(context) {
14711 return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14714 catmullRom.alpha = function(alpha) {
14715 return custom(+alpha);
14721 function CatmullRomClosed(context, alpha) {
14722 this._context = context;
14723 this._alpha = alpha;
14726 CatmullRomClosed.prototype = {
14729 lineStart: function() {
14730 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14731 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14732 this._l01_a = this._l12_a = this._l23_a =
14733 this._l01_2a = this._l12_2a = this._l23_2a =
14736 lineEnd: function() {
14737 switch (this._point) {
14739 this._context.moveTo(this._x3, this._y3);
14740 this._context.closePath();
14744 this._context.lineTo(this._x3, this._y3);
14745 this._context.closePath();
14749 this.point(this._x3, this._y3);
14750 this.point(this._x4, this._y4);
14751 this.point(this._x5, this._y5);
14756 point: function(x, y) {
14760 var x23 = this._x2 - x,
14761 y23 = this._y2 - y;
14762 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14765 switch (this._point) {
14766 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14767 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14768 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14769 default: point$4(this, x, y); break;
14772 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14773 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14774 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14775 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14779 var catmullRomClosed = (function custom(alpha) {
14781 function catmullRom$$1(context) {
14782 return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14785 catmullRom$$1.alpha = function(alpha) {
14786 return custom(+alpha);
14789 return catmullRom$$1;
14792 function CatmullRomOpen(context, alpha) {
14793 this._context = context;
14794 this._alpha = alpha;
14797 CatmullRomOpen.prototype = {
14798 areaStart: function() {
14801 areaEnd: function() {
14804 lineStart: function() {
14805 this._x0 = this._x1 = this._x2 =
14806 this._y0 = this._y1 = this._y2 = NaN;
14807 this._l01_a = this._l12_a = this._l23_a =
14808 this._l01_2a = this._l12_2a = this._l23_2a =
14811 lineEnd: function() {
14812 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14813 this._line = 1 - this._line;
14815 point: function(x, y) {
14819 var x23 = this._x2 - x,
14820 y23 = this._y2 - y;
14821 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14824 switch (this._point) {
14825 case 0: this._point = 1; break;
14826 case 1: this._point = 2; break;
14827 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14828 case 3: this._point = 4; // proceed
14829 default: point$4(this, x, y); break;
14832 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14833 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14834 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14835 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14839 var catmullRomOpen = (function custom(alpha) {
14841 function catmullRom$$1(context) {
14842 return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14845 catmullRom$$1.alpha = function(alpha) {
14846 return custom(+alpha);
14849 return catmullRom$$1;
14852 function LinearClosed(context) {
14853 this._context = context;
14856 LinearClosed.prototype = {
14859 lineStart: function() {
14862 lineEnd: function() {
14863 if (this._point) this._context.closePath();
14865 point: function(x, y) {
14867 if (this._point) this._context.lineTo(x, y);
14868 else this._point = 1, this._context.moveTo(x, y);
14872 function linearClosed(context) {
14873 return new LinearClosed(context);
14876 function sign$1(x) {
14877 return x < 0 ? -1 : 1;
14880 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14881 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14882 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14883 // NOV(II), P. 443, 1990.
14884 function slope3(that, x2, y2) {
14885 var h0 = that._x1 - that._x0,
14886 h1 = x2 - that._x1,
14887 s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14888 s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14889 p = (s0 * h1 + s1 * h0) / (h0 + h1);
14890 return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14893 // Calculate a one-sided slope.
14894 function slope2(that, t) {
14895 var h = that._x1 - that._x0;
14896 return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14899 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14900 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14901 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14902 function point$5(that, t0, t1) {
14907 dx = (x1 - x0) / 3;
14908 that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14911 function MonotoneX(context) {
14912 this._context = context;
14915 MonotoneX.prototype = {
14916 areaStart: function() {
14919 areaEnd: function() {
14922 lineStart: function() {
14923 this._x0 = this._x1 =
14924 this._y0 = this._y1 =
14928 lineEnd: function() {
14929 switch (this._point) {
14930 case 2: this._context.lineTo(this._x1, this._y1); break;
14931 case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14933 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14934 this._line = 1 - this._line;
14936 point: function(x, y) {
14940 if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14941 switch (this._point) {
14942 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14943 case 1: this._point = 2; break;
14944 case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14945 default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14948 this._x0 = this._x1, this._x1 = x;
14949 this._y0 = this._y1, this._y1 = y;
14954 function MonotoneY(context) {
14955 this._context = new ReflectContext(context);
14958 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14959 MonotoneX.prototype.point.call(this, y, x);
14962 function ReflectContext(context) {
14963 this._context = context;
14966 ReflectContext.prototype = {
14967 moveTo: function(x, y) { this._context.moveTo(y, x); },
14968 closePath: function() { this._context.closePath(); },
14969 lineTo: function(x, y) { this._context.lineTo(y, x); },
14970 bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14973 function monotoneX(context) {
14974 return new MonotoneX(context);
14977 function monotoneY(context) {
14978 return new MonotoneY(context);
14981 function Natural(context) {
14982 this._context = context;
14985 Natural.prototype = {
14986 areaStart: function() {
14989 areaEnd: function() {
14992 lineStart: function() {
14996 lineEnd: function() {
15002 this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004 this._context.lineTo(x[1], y[1]);
15006 var px = controlPoints(x),
15007 py = controlPoints(y);
15008 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15009 this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15014 if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15015 this._line = 1 - this._line;
15016 this._x = this._y = null;
15018 point: function(x, y) {
15024 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15025 function controlPoints(x) {
15032 a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15033 for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15034 a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15035 for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15036 a[n - 1] = r[n - 1] / b[n - 1];
15037 for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15038 b[n - 1] = (x[n] + a[n - 1]) / 2;
15039 for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15043 function natural(context) {
15044 return new Natural(context);
15047 function Step(context, t) {
15048 this._context = context;
15053 areaStart: function() {
15056 areaEnd: function() {
15059 lineStart: function() {
15060 this._x = this._y = NaN;
15063 lineEnd: function() {
15064 if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15065 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15066 if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15068 point: function(x, y) {
15070 switch (this._point) {
15071 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15072 case 1: this._point = 2; // proceed
15074 if (this._t <= 0) {
15075 this._context.lineTo(this._x, y);
15076 this._context.lineTo(x, y);
15078 var x1 = this._x * (1 - this._t) + x * this._t;
15079 this._context.lineTo(x1, this._y);
15080 this._context.lineTo(x1, y);
15085 this._x = x, this._y = y;
15089 function step(context) {
15090 return new Step(context, 0.5);
15093 function stepBefore(context) {
15094 return new Step(context, 0);
15097 function stepAfter(context) {
15098 return new Step(context, 1);
15101 function none$1(series, order) {
15102 if (!((n = series.length) > 1)) return;
15103 for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15104 s0 = s1, s1 = series[order[i]];
15105 for (j = 0; j < m; ++j) {
15106 s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15111 function none$2(series) {
15112 var n = series.length, o = new Array(n);
15113 while (--n >= 0) o[n] = n;
15117 function stackValue(d, key) {
15122 var keys = constant$10([]),
15125 value = stackValue;
15127 function stack(data) {
15128 var kz = keys.apply(this, arguments),
15135 for (i = 0; i < n; ++i) {
15136 for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15137 si[j] = sij = [0, +value(data[j], ki, j, data)];
15138 sij.data = data[j];
15143 for (i = 0, oz = order(sz); i < n; ++i) {
15144 sz[oz[i]].index = i;
15151 stack.keys = function(_) {
15152 return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15155 stack.value = function(_) {
15156 return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15159 stack.order = function(_) {
15160 return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15163 stack.offset = function(_) {
15164 return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15170 function expand(series, order) {
15171 if (!((n = series.length) > 0)) return;
15172 for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15173 for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15174 if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15176 none$1(series, order);
15179 function diverging(series, order) {
15180 if (!((n = series.length) > 1)) return;
15181 for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15182 for (yp = yn = 0, i = 0; i < n; ++i) {
15183 if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15184 d[0] = yp, d[1] = yp += dy;
15185 } else if (dy < 0) {
15186 d[1] = yn, d[0] = yn += dy;
15194 function silhouette(series, order) {
15195 if (!((n = series.length) > 0)) return;
15196 for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15197 for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15198 s0[j][1] += s0[j][0] = -y / 2;
15200 none$1(series, order);
15203 function wiggle(series, order) {
15204 if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15205 for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15206 for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15207 var si = series[order[i]],
15208 sij0 = si[j][1] || 0,
15209 sij1 = si[j - 1][1] || 0,
15210 s3 = (sij0 - sij1) / 2;
15211 for (var k = 0; k < i; ++k) {
15212 var sk = series[order[k]],
15213 skj0 = sk[j][1] || 0,
15214 skj1 = sk[j - 1][1] || 0;
15217 s1 += sij0, s2 += s3 * sij0;
15219 s0[j - 1][1] += s0[j - 1][0] = y;
15220 if (s1) y -= s2 / s1;
15222 s0[j - 1][1] += s0[j - 1][0] = y;
15223 none$1(series, order);
15226 function ascending$1(series) {
15227 var sums = series.map(sum$2);
15228 return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15231 function sum$2(series) {
15232 var s = 0, i = -1, n = series.length, v;
15233 while (++i < n) if (v = +series[i][1]) s += v;
15237 function descending$1(series) {
15238 return ascending$1(series).reverse();
15241 function insideOut(series) {
15242 var n = series.length,
15245 sums = series.map(sum$2),
15246 order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15252 for (i = 0; i < n; ++i) {
15254 if (top < bottom) {
15263 return bottoms.reverse().concat(tops);
15266 function reverse(series) {
15267 return none$2(series).reverse();
15270 function constant$11(x) {
15271 return function() {
15284 function RedBlackTree() {
15285 this._ = null; // root node
15288 function RedBlackNode(node) {
15289 node.U = // parent node
15290 node.C = // color - true for red, false for black
15291 node.L = // left node
15292 node.R = // right node
15293 node.P = // previous node
15294 node.N = null; // next node
15297 RedBlackTree.prototype = {
15298 constructor: RedBlackTree,
15300 insert: function(after, node) {
15301 var parent, grandpa, uncle;
15306 if (after.N) after.N.P = node;
15310 while (after.L) after = after.L;
15316 } else if (this._) {
15317 after = RedBlackFirst(this._);
15320 after.P = after.L = node;
15323 node.P = node.N = null;
15327 node.L = node.R = null;
15332 while (parent && parent.C) {
15333 grandpa = parent.U;
15334 if (parent === grandpa.L) {
15336 if (uncle && uncle.C) {
15337 parent.C = uncle.C = false;
15341 if (after === parent.R) {
15342 RedBlackRotateLeft(this, parent);
15348 RedBlackRotateRight(this, grandpa);
15352 if (uncle && uncle.C) {
15353 parent.C = uncle.C = false;
15357 if (after === parent.L) {
15358 RedBlackRotateRight(this, parent);
15364 RedBlackRotateLeft(this, grandpa);
15372 remove: function(node) {
15373 if (node.N) node.N.P = node.P;
15374 if (node.P) node.P.N = node.N;
15375 node.N = node.P = null;
15377 var parent = node.U,
15384 if (!left) next = right;
15385 else if (!right) next = left;
15386 else next = RedBlackFirst(right);
15389 if (parent.L === node) parent.L = next;
15390 else parent.R = next;
15395 if (left && right) {
15400 if (next !== right) {
15417 if (node) node.U = parent;
15419 if (node && node.C) { node.C = false; return; }
15422 if (node === this._) break;
15423 if (node === parent.L) {
15424 sibling = parent.R;
15428 RedBlackRotateLeft(this, parent);
15429 sibling = parent.R;
15431 if ((sibling.L && sibling.L.C)
15432 || (sibling.R && sibling.R.C)) {
15433 if (!sibling.R || !sibling.R.C) {
15434 sibling.L.C = false;
15436 RedBlackRotateRight(this, sibling);
15437 sibling = parent.R;
15439 sibling.C = parent.C;
15440 parent.C = sibling.R.C = false;
15441 RedBlackRotateLeft(this, parent);
15446 sibling = parent.L;
15450 RedBlackRotateRight(this, parent);
15451 sibling = parent.L;
15453 if ((sibling.L && sibling.L.C)
15454 || (sibling.R && sibling.R.C)) {
15455 if (!sibling.L || !sibling.L.C) {
15456 sibling.R.C = false;
15458 RedBlackRotateLeft(this, sibling);
15459 sibling = parent.L;
15461 sibling.C = parent.C;
15462 parent.C = sibling.L.C = false;
15463 RedBlackRotateRight(this, parent);
15473 if (node) node.C = false;
15477 function RedBlackRotateLeft(tree, node) {
15483 if (parent.L === p) parent.L = q;
15492 if (p.R) p.R.U = p;
15496 function RedBlackRotateRight(tree, node) {
15502 if (parent.L === p) parent.L = q;
15511 if (p.L) p.L.U = p;
15515 function RedBlackFirst(node) {
15516 while (node.L) node = node.L;
15520 function createEdge(left, right, v0, v1) {
15521 var edge = [null, null],
15522 index = edges.push(edge) - 1;
15524 edge.right = right;
15525 if (v0) setEdgeEnd(edge, left, right, v0);
15526 if (v1) setEdgeEnd(edge, right, left, v1);
15527 cells[left.index].halfedges.push(index);
15528 cells[right.index].halfedges.push(index);
15532 function createBorderEdge(left, v0, v1) {
15533 var edge = [v0, v1];
15538 function setEdgeEnd(edge, left, right, vertex) {
15539 if (!edge[0] && !edge[1]) {
15542 edge.right = right;
15543 } else if (edge.left === right) {
15550 // Liang–Barsky line clipping.
15551 function clipEdge(edge, x0, y0, x1, y1) {
15565 if (!dx && r > 0) return;
15568 if (r < t0) return;
15569 if (r < t1) t1 = r;
15570 } else if (dx > 0) {
15571 if (r > t1) return;
15572 if (r > t0) t0 = r;
15576 if (!dx && r < 0) return;
15579 if (r > t1) return;
15580 if (r > t0) t0 = r;
15581 } else if (dx > 0) {
15582 if (r < t0) return;
15583 if (r < t1) t1 = r;
15587 if (!dy && r > 0) return;
15590 if (r < t0) return;
15591 if (r < t1) t1 = r;
15592 } else if (dy > 0) {
15593 if (r > t1) return;
15594 if (r > t0) t0 = r;
15598 if (!dy && r < 0) return;
15601 if (r > t1) return;
15602 if (r > t0) t0 = r;
15603 } else if (dy > 0) {
15604 if (r < t0) return;
15605 if (r < t1) t1 = r;
15608 if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610 if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15611 if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15615 function connectEdge(edge, x0, y0, x1, y1) {
15617 if (v1) return true;
15621 right = edge.right,
15626 fx = (lx + rx) / 2,
15627 fy = (ly + ry) / 2,
15632 if (fx < x0 || fx >= x1) return;
15634 if (!v0) v0 = [fx, y0];
15635 else if (v0[1] >= y1) return;
15638 if (!v0) v0 = [fx, y1];
15639 else if (v0[1] < y0) return;
15643 fm = (lx - rx) / (ry - ly);
15645 if (fm < -1 || fm > 1) {
15647 if (!v0) v0 = [(y0 - fb) / fm, y0];
15648 else if (v0[1] >= y1) return;
15649 v1 = [(y1 - fb) / fm, y1];
15651 if (!v0) v0 = [(y1 - fb) / fm, y1];
15652 else if (v0[1] < y0) return;
15653 v1 = [(y0 - fb) / fm, y0];
15657 if (!v0) v0 = [x0, fm * x0 + fb];
15658 else if (v0[0] >= x1) return;
15659 v1 = [x1, fm * x1 + fb];
15661 if (!v0) v0 = [x1, fm * x1 + fb];
15662 else if (v0[0] < x0) return;
15663 v1 = [x0, fm * x0 + fb];
15673 function clipEdges(x0, y0, x1, y1) {
15674 var i = edges.length,
15678 if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15679 || !clipEdge(edge, x0, y0, x1, y1)
15680 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15681 || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15687 function createCell(site) {
15688 return cells[site.index] = {
15694 function cellHalfedgeAngle(cell, edge) {
15695 var site = cell.site,
15698 if (site === vb) vb = va, va = site;
15699 if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15700 if (site === va) va = edge[1], vb = edge[0];
15701 else va = edge[0], vb = edge[1];
15702 return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15705 function cellHalfedgeStart(cell, edge) {
15706 return edge[+(edge.left !== cell.site)];
15709 function cellHalfedgeEnd(cell, edge) {
15710 return edge[+(edge.left === cell.site)];
15713 function sortCellHalfedges() {
15714 for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15715 if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15716 var index = new Array(m),
15717 array = new Array(m);
15718 for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15719 index.sort(function(i, j) { return array[j] - array[i]; });
15720 for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15721 for (j = 0; j < m; ++j) halfedges[j] = array[j];
15726 function clipCells(x0, y0, x1, y1) {
15727 var nCells = cells.length,
15742 for (iCell = 0; iCell < nCells; ++iCell) {
15743 if (cell = cells[iCell]) {
15745 halfedges = cell.halfedges;
15746 iHalfedge = halfedges.length;
15748 // Remove any dangling clipped edges.
15749 while (iHalfedge--) {
15750 if (!edges[halfedges[iHalfedge]]) {
15751 halfedges.splice(iHalfedge, 1);
15755 // Insert any border edges as necessary.
15756 iHalfedge = 0, nHalfedges = halfedges.length;
15757 while (iHalfedge < nHalfedges) {
15758 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15759 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15760 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15761 halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15762 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15763 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15764 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15765 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15771 if (nHalfedges) cover = false;
15775 // If there weren’t any edges, have the closest site cover the extent.
15776 // It doesn’t matter which corner of the extent we measure!
15778 var dx, dy, d2, dc = Infinity;
15780 for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15781 if (cell = cells[iCell]) {
15785 d2 = dx * dx + dy * dy;
15786 if (d2 < dc) dc = d2, cover = cell;
15791 var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15792 cover.halfedges.push(
15793 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15794 edges.push(createBorderEdge(site, v01, v11)) - 1,
15795 edges.push(createBorderEdge(site, v11, v10)) - 1,
15796 edges.push(createBorderEdge(site, v10, v00)) - 1
15801 // Lastly delete any cells with no edges; these were entirely clipped.
15802 for (iCell = 0; iCell < nCells; ++iCell) {
15803 if (cell = cells[iCell]) {
15804 if (!cell.halfedges.length) {
15805 delete cells[iCell];
15811 var circlePool = [];
15815 function Circle() {
15816 RedBlackNode(this);
15824 function attachCircle(arc) {
15828 if (!lArc || !rArc) return;
15830 var lSite = lArc.site,
15834 if (lSite === rSite) return;
15838 ax = lSite[0] - bx,
15839 ay = lSite[1] - by,
15840 cx = rSite[0] - bx,
15841 cy = rSite[1] - by;
15843 var d = 2 * (ax * cy - ay * cx);
15844 if (d >= -epsilon2$2) return;
15846 var ha = ax * ax + ay * ay,
15847 hc = cx * cx + cy * cy,
15848 x = (cy * ha - ay * hc) / d,
15849 y = (ax * hc - cx * ha) / d;
15851 var circle = circlePool.pop() || new Circle;
15853 circle.site = cSite;
15855 circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857 arc.circle = circle;
15863 if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15864 if (node.L) node = node.L;
15865 else { before = node.P; break; }
15867 if (node.R) node = node.R;
15868 else { before = node; break; }
15872 circles.insert(before, circle);
15873 if (!before) firstCircle = circle;
15876 function detachCircle(arc) {
15877 var circle = arc.circle;
15879 if (!circle.P) firstCircle = circle.N;
15880 circles.remove(circle);
15881 circlePool.push(circle);
15882 RedBlackNode(circle);
15887 var beachPool = [];
15890 RedBlackNode(this);
15893 this.circle = null;
15896 function createBeach(site) {
15897 var beach = beachPool.pop() || new Beach;
15902 function detachBeach(beach) {
15903 detachCircle(beach);
15904 beaches.remove(beach);
15905 beachPool.push(beach);
15906 RedBlackNode(beach);
15909 function removeBeach(beach) {
15910 var circle = beach.circle,
15914 previous = beach.P,
15916 disappearing = [beach];
15918 detachBeach(beach);
15920 var lArc = previous;
15922 && Math.abs(x - lArc.circle.x) < epsilon$4
15923 && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925 disappearing.unshift(lArc);
15930 disappearing.unshift(lArc);
15931 detachCircle(lArc);
15935 && Math.abs(x - rArc.circle.x) < epsilon$4
15936 && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938 disappearing.push(rArc);
15943 disappearing.push(rArc);
15944 detachCircle(rArc);
15946 var nArcs = disappearing.length,
15948 for (iArc = 1; iArc < nArcs; ++iArc) {
15949 rArc = disappearing[iArc];
15950 lArc = disappearing[iArc - 1];
15951 setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15954 lArc = disappearing[0];
15955 rArc = disappearing[nArcs - 1];
15956 rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958 attachCircle(lArc);
15959 attachCircle(rArc);
15962 function addBeach(site) {
15964 directrix = site[1],
15972 dxl = leftBreakPoint(node, directrix) - x;
15973 if (dxl > epsilon$4) node = node.L; else {
15974 dxr = x - rightBreakPoint(node, directrix);
15975 if (dxr > epsilon$4) {
15982 if (dxl > -epsilon$4) {
15985 } else if (dxr > -epsilon$4) {
15989 lArc = rArc = node;
15997 var newArc = createBeach(site);
15998 beaches.insert(lArc, newArc);
16000 if (!lArc && !rArc) return;
16002 if (lArc === rArc) {
16003 detachCircle(lArc);
16004 rArc = createBeach(lArc.site);
16005 beaches.insert(newArc, rArc);
16006 newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16007 attachCircle(lArc);
16008 attachCircle(rArc);
16012 if (!rArc) { // && lArc
16013 newArc.edge = createEdge(lArc.site, newArc.site);
16017 // else lArc !== rArc
16018 detachCircle(lArc);
16019 detachCircle(rArc);
16021 var lSite = lArc.site,
16027 cx = rSite[0] - ax,
16028 cy = rSite[1] - ay,
16029 d = 2 * (bx * cy - by * cx),
16030 hb = bx * bx + by * by,
16031 hc = cx * cx + cy * cy,
16032 vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16034 setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16035 newArc.edge = createEdge(lSite, site, null, vertex);
16036 rArc.edge = createEdge(site, rSite, null, vertex);
16037 attachCircle(lArc);
16038 attachCircle(rArc);
16041 function leftBreakPoint(arc, directrix) {
16042 var site = arc.site,
16045 pby2 = rfocy - directrix;
16047 if (!pby2) return rfocx;
16050 if (!lArc) return -Infinity;
16053 var lfocx = site[0],
16055 plby2 = lfocy - directrix;
16057 if (!plby2) return lfocx;
16059 var hl = lfocx - rfocx,
16060 aby2 = 1 / pby2 - 1 / plby2,
16063 if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065 return (rfocx + lfocx) / 2;
16068 function rightBreakPoint(arc, directrix) {
16070 if (rArc) return leftBreakPoint(rArc, directrix);
16071 var site = arc.site;
16072 return site[1] === directrix ? site[0] : Infinity;
16075 var epsilon$4 = 1e-6;
16076 var epsilon2$2 = 1e-12;
16082 function triangleArea(a, b, c) {
16083 return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16086 function lexicographic(a, b) {
16091 function Diagram(sites, extent) {
16092 var site = sites.sort(lexicographic).pop(),
16098 cells = new Array(sites.length);
16099 beaches = new RedBlackTree;
16100 circles = new RedBlackTree;
16103 circle = firstCircle;
16104 if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16105 if (site[0] !== x || site[1] !== y) {
16107 x = site[0], y = site[1];
16109 site = sites.pop();
16110 } else if (circle) {
16111 removeBeach(circle.arc);
16117 sortCellHalfedges();
16120 var x0 = +extent[0][0],
16121 y0 = +extent[0][1],
16122 x1 = +extent[1][0],
16123 y1 = +extent[1][1];
16124 clipEdges(x0, y0, x1, y1);
16125 clipCells(x0, y0, x1, y1);
16128 this.edges = edges;
16129 this.cells = cells;
16137 Diagram.prototype = {
16138 constructor: Diagram,
16140 polygons: function() {
16141 var edges = this.edges;
16143 return this.cells.map(function(cell) {
16144 var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16145 polygon.data = cell.site.data;
16150 triangles: function() {
16151 var triangles = [],
16152 edges = this.edges;
16154 this.cells.forEach(function(cell, i) {
16155 if (!(m = (halfedges = cell.halfedges).length)) return;
16156 var site = cell.site,
16161 e1 = edges[halfedges[m - 1]],
16162 s1 = e1.left === site ? e1.right : e1.left;
16166 e1 = edges[halfedges[j]];
16167 s1 = e1.left === site ? e1.right : e1.left;
16168 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16169 triangles.push([site.data, s0.data, s1.data]);
16177 links: function() {
16178 return this.edges.filter(function(edge) {
16180 }).map(function(edge) {
16182 source: edge.left.data,
16183 target: edge.right.data
16188 find: function(x, y, radius) {
16189 var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191 // Use the previously-found cell, or start with an arbitrary one.
16192 while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16193 var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16195 // Traverse the half-edges to find a closer cell, if any.
16197 cell = that.cells[i0 = i1], i1 = null;
16198 cell.halfedges.forEach(function(e) {
16199 var edge = that.edges[e], v = edge.left;
16200 if ((v === cell.site || !v) && !(v = edge.right)) return;
16201 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16202 if (v2 < d2) d2 = v2, i1 = v.index;
16204 } while (i1 !== null);
16208 return radius == null || d2 <= radius * radius ? cell.site : null;
16212 function voronoi() {
16217 function voronoi(data) {
16218 return new Diagram(data.map(function(d, i) {
16219 var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16226 voronoi.polygons = function(data) {
16227 return voronoi(data).polygons();
16230 voronoi.links = function(data) {
16231 return voronoi(data).links();
16234 voronoi.triangles = function(data) {
16235 return voronoi(data).triangles();
16238 voronoi.x = function(_) {
16239 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x$$1;
16242 voronoi.y = function(_) {
16243 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y$$1;
16246 voronoi.extent = function(_) {
16247 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]]];
16250 voronoi.size = function(_) {
16251 return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16257 function constant$12(x) {
16258 return function() {
16263 function ZoomEvent(target, type, transform) {
16264 this.target = target;
16266 this.transform = transform;
16269 function Transform(k, x, y) {
16275 Transform.prototype = {
16276 constructor: Transform,
16277 scale: function(k) {
16278 return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280 translate: function(x, y) {
16281 return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16283 apply: function(point) {
16284 return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286 applyX: function(x) {
16287 return x * this.k + this.x;
16289 applyY: function(y) {
16290 return y * this.k + this.y;
16292 invert: function(location) {
16293 return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295 invertX: function(x) {
16296 return (x - this.x) / this.k;
16298 invertY: function(y) {
16299 return (y - this.y) / this.k;
16301 rescaleX: function(x) {
16302 return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304 rescaleY: function(y) {
16305 return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307 toString: function() {
16308 return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16312 var identity$7 = new Transform(1, 0, 0);
16314 transform.prototype = Transform.prototype;
16316 function transform(node) {
16317 return node.__zoom || identity$7;
16320 function nopropagation$2() {
16321 event.stopImmediatePropagation();
16324 function noevent$2() {
16325 event.preventDefault();
16326 event.stopImmediatePropagation();
16329 // Ignore right-click, since that should open the context menu.
16330 function defaultFilter$2() {
16331 return !event.button;
16334 function defaultExtent$1() {
16335 var e = this, w, h;
16336 if (e instanceof SVGElement) {
16337 e = e.ownerSVGElement || e;
16338 w = e.width.baseVal.value;
16339 h = e.height.baseVal.value;
16342 h = e.clientHeight;
16344 return [[0, 0], [w, h]];
16347 function defaultTransform() {
16348 return this.__zoom || identity$7;
16351 function defaultWheelDelta() {
16352 return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16355 function defaultTouchable$1() {
16356 return "ontouchstart" in this;
16359 function defaultConstrain(transform$$1, extent, translateExtent) {
16360 var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16361 dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16362 dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16363 dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16364 return transform$$1.translate(
16365 dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16366 dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16370 function d3_zoom() {
16371 var filter = defaultFilter$2,
16372 extent = defaultExtent$1,
16373 constrain = defaultConstrain,
16374 wheelDelta = defaultWheelDelta,
16375 touchable = defaultTouchable$1,
16376 scaleExtent = [0, Infinity],
16377 translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16379 interpolate = interpolateZoom,
16381 listeners = dispatch("start", "zoom", "end"),
16386 clickDistance2 = 0;
16388 function zoom(selection$$1) {
16390 .property("__zoom", defaultTransform)
16391 .on("wheel.zoom", wheeled)
16392 .on("mousedown.zoom", mousedowned)
16393 .on("dblclick.zoom", dblclicked)
16395 .on("touchstart.zoom", touchstarted)
16396 .on("touchmove.zoom", touchmoved)
16397 .on("touchend.zoom touchcancel.zoom", touchended)
16398 .style("touch-action", "none")
16399 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16402 zoom.transform = function(collection, transform$$1) {
16403 var selection$$1 = collection.selection ? collection.selection() : collection;
16404 selection$$1.property("__zoom", defaultTransform);
16405 if (collection !== selection$$1) {
16406 schedule(collection, transform$$1);
16408 selection$$1.interrupt().each(function() {
16409 gesture(this, arguments)
16411 .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16417 zoom.scaleBy = function(selection$$1, k) {
16418 zoom.scaleTo(selection$$1, function() {
16419 var k0 = this.__zoom.k,
16420 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16425 zoom.scaleTo = function(selection$$1, k) {
16426 zoom.transform(selection$$1, function() {
16427 var e = extent.apply(this, arguments),
16430 p1 = t0.invert(p0),
16431 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16432 return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16436 zoom.translateBy = function(selection$$1, x, y) {
16437 zoom.transform(selection$$1, function() {
16438 return constrain(this.__zoom.translate(
16439 typeof x === "function" ? x.apply(this, arguments) : x,
16440 typeof y === "function" ? y.apply(this, arguments) : y
16441 ), extent.apply(this, arguments), translateExtent);
16445 zoom.translateTo = function(selection$$1, x, y) {
16446 zoom.transform(selection$$1, function() {
16447 var e = extent.apply(this, arguments),
16450 return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16451 typeof x === "function" ? -x.apply(this, arguments) : -x,
16452 typeof y === "function" ? -y.apply(this, arguments) : -y
16453 ), e, translateExtent);
16457 function scale(transform$$1, k) {
16458 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16459 return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16462 function translate(transform$$1, p0, p1) {
16463 var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16464 return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16467 function centroid(extent) {
16468 return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16471 function schedule(transition$$1, transform$$1, center) {
16473 .on("start.zoom", function() { gesture(this, arguments).start(); })
16474 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16475 .tween("zoom", function() {
16478 g = gesture(that, args),
16479 e = extent.apply(that, args),
16480 p = center || centroid(e),
16481 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16483 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16484 i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16485 return function(t) {
16486 if (t === 1) t = b; // Avoid rounding error on end.
16487 else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16493 function gesture(that, args) {
16494 for (var i = 0, n = gestures.length, g; i < n; ++i) {
16495 if ((g = gestures[i]).that === that) {
16499 return new Gesture(that, args);
16502 function Gesture(that, args) {
16507 this.extent = extent.apply(that, args);
16510 Gesture.prototype = {
16511 start: function() {
16512 if (++this.active === 1) {
16513 this.index = gestures.push(this) - 1;
16514 this.emit("start");
16518 zoom: function(key, transform$$1) {
16519 if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16520 if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16521 if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16522 this.that.__zoom = transform$$1;
16527 if (--this.active === 0) {
16528 gestures.splice(this.index, 1);
16534 emit: function(type) {
16535 customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16539 function wheeled() {
16540 if (!filter.apply(this, arguments)) return;
16541 var g = gesture(this, arguments),
16543 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16544 p = d3_mouse(this);
16546 // If the mouse is in the same location as before, reuse it.
16547 // If there were recent wheel events, reset the wheel idle timeout.
16549 if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16550 g.mouse[1] = t.invert(g.mouse[0] = p);
16552 clearTimeout(g.wheel);
16555 // If this wheel event won’t trigger a transform change, ignore it.
16556 else if (t.k === k) return;
16558 // Otherwise, capture the mouse point and location at the start.
16560 g.mouse = [p, t.invert(p)];
16566 g.wheel = setTimeout(wheelidled, wheelDelay);
16567 g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569 function wheelidled() {
16575 function mousedowned() {
16576 if (touchending || !filter.apply(this, arguments)) return;
16577 var g = gesture(this, arguments),
16578 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16579 p = d3_mouse(this),
16580 x0 = event.clientX,
16581 y0 = event.clientY;
16583 dragDisable(event.view);
16585 g.mouse = [p, this.__zoom.invert(p)];
16589 function mousemoved() {
16592 var dx = event.clientX - x0, dy = event.clientY - y0;
16593 g.moved = dx * dx + dy * dy > clickDistance2;
16595 g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16598 function mouseupped() {
16599 v.on("mousemove.zoom mouseup.zoom", null);
16600 yesdrag(event.view, g.moved);
16606 function dblclicked() {
16607 if (!filter.apply(this, arguments)) return;
16608 var t0 = this.__zoom,
16609 p0 = d3_mouse(this),
16610 p1 = t0.invert(p0),
16611 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16612 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16615 if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16616 else d3_select(this).call(zoom.transform, t1);
16619 function touchstarted() {
16620 if (!filter.apply(this, arguments)) return;
16621 var g = gesture(this, arguments),
16622 touches = event.changedTouches,
16624 n = touches.length, i, t, p;
16627 for (i = 0; i < n; ++i) {
16628 t = touches[i], p = touch(this, touches, t.identifier);
16629 p = [p, this.__zoom.invert(p), t.identifier];
16630 if (!g.touch0) g.touch0 = p, started = true;
16631 else if (!g.touch1) g.touch1 = p;
16634 // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16635 if (touchstarting) {
16636 touchstarting = clearTimeout(touchstarting);
16639 p = d3_select(this).on("dblclick.zoom");
16640 if (p) p.apply(this, arguments);
16646 touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16652 function touchmoved() {
16653 var g = gesture(this, arguments),
16654 touches = event.changedTouches,
16655 n = touches.length, i, t, p, l;
16658 if (touchstarting) touchstarting = clearTimeout(touchstarting);
16659 for (i = 0; i < n; ++i) {
16660 t = touches[i], p = touch(this, touches, t.identifier);
16661 if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16662 else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16666 var p0 = g.touch0[0], l0 = g.touch0[1],
16667 p1 = g.touch1[0], l1 = g.touch1[1],
16668 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16669 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16670 t = scale(t, Math.sqrt(dp / dl));
16671 p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16672 l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16674 else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676 g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16679 function touchended() {
16680 var g = gesture(this, arguments),
16681 touches = event.changedTouches,
16682 n = touches.length, i, t;
16685 if (touchending) clearTimeout(touchending);
16686 touchending = setTimeout(function() { touchending = null; }, touchDelay);
16687 for (i = 0; i < n; ++i) {
16689 if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16690 else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16692 if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16693 if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16697 zoom.wheelDelta = function(_) {
16698 return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16701 zoom.filter = function(_) {
16702 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16705 zoom.touchable = function(_) {
16706 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16709 zoom.extent = function(_) {
16710 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16713 zoom.scaleExtent = function(_) {
16714 return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16717 zoom.translateExtent = function(_) {
16718 return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
16721 zoom.constrain = function(_) {
16722 return arguments.length ? (constrain = _, zoom) : constrain;
16725 zoom.duration = function(_) {
16726 return arguments.length ? (duration = +_, zoom) : duration;
16729 zoom.interpolate = function(_) {
16730 return arguments.length ? (interpolate = _, zoom) : interpolate;
16733 zoom.on = function() {
16734 var value = listeners.on.apply(listeners, arguments);
16735 return value === listeners ? zoom : value;
16738 zoom.clickDistance = function(_) {
16739 return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16747 var index$3 = Object.freeze({
16749 bisect: bisectRight,
16750 bisectRight: bisectRight,
16751 bisectLeft: bisectLeft,
16752 ascending: d3_ascending,
16753 bisector: d3_bisector,
16755 descending: d3_descending,
16756 deviation: deviation,
16758 histogram: histogram,
16759 thresholdFreedmanDiaconis: freedmanDiaconis,
16760 thresholdScott: scott,
16761 thresholdSturges: sturges,
16769 quantile: threshold,
16775 tickIncrement: tickIncrement,
16776 tickStep: tickStep,
16777 transpose: transpose,
16778 variance: variance,
16781 axisRight: axisRight,
16782 axisBottom: axisBottom,
16783 axisLeft: axisLeft,
16787 brushSelection: brushSelection,
16801 cubehelix: cubehelix,
16802 dispatch: dispatch,
16804 dragDisable: dragDisable,
16805 dragEnable: yesdrag,
16807 csvParse: csvParse,
16808 csvParseRows: csvParseRows,
16809 csvFormat: csvFormat,
16810 csvFormatRows: csvFormatRows,
16811 tsvParse: tsvParse,
16812 tsvParseRows: tsvParseRows,
16813 tsvFormat: tsvFormat,
16814 tsvFormatRows: tsvFormatRows,
16815 easeLinear: linear$1,
16816 easeQuad: quadInOut,
16817 easeQuadIn: quadIn,
16818 easeQuadOut: quadOut,
16819 easeQuadInOut: quadInOut,
16820 easeCubic: cubicInOut,
16821 easeCubicIn: cubicIn,
16822 easeCubicOut: cubicOut,
16823 easeCubicInOut: cubicInOut,
16824 easePoly: polyInOut,
16825 easePolyIn: polyIn,
16826 easePolyOut: polyOut,
16827 easePolyInOut: polyInOut,
16830 easeSinOut: sinOut,
16831 easeSinInOut: sinInOut,
16834 easeExpOut: expOut,
16835 easeExpInOut: expInOut,
16836 easeCircle: circleInOut,
16837 easeCircleIn: circleIn,
16838 easeCircleOut: circleOut,
16839 easeCircleInOut: circleInOut,
16840 easeBounce: bounceOut,
16841 easeBounceIn: bounceIn,
16842 easeBounceOut: bounceOut,
16843 easeBounceInOut: bounceInOut,
16844 easeBack: backInOut,
16845 easeBackIn: backIn,
16846 easeBackOut: backOut,
16847 easeBackInOut: backInOut,
16848 easeElastic: elasticOut,
16849 easeElasticIn: elasticIn,
16850 easeElasticOut: elasticOut,
16851 easeElasticInOut: elasticInOut,
16852 forceCenter: center$1,
16853 forceCollide: collide,
16855 forceManyBody: manyBody,
16856 forceRadial: radial,
16857 forceSimulation: simulation,
16860 formatDefaultLocale: defaultLocale,
16861 get format () { return format; },
16862 get formatPrefix () { return formatPrefix; },
16863 formatLocale: formatLocale,
16864 formatSpecifier: formatSpecifier,
16865 precisionFixed: precisionFixed,
16866 precisionPrefix: precisionPrefix,
16867 precisionRound: precisionRound,
16868 geoArea: d3_geoArea,
16869 geoBounds: d3_geoBounds,
16870 geoCentroid: d3_geoCentroid,
16872 geoClipAntimeridian: clipAntimeridian,
16873 geoClipCircle: clipCircle,
16874 geoClipExtent: extent$1,
16875 geoClipRectangle: clipRectangle,
16876 geoContains: contains,
16877 geoDistance: distance,
16878 geoGraticule: graticule,
16879 geoGraticule10: graticule10,
16880 geoInterpolate: interpolate$1,
16881 geoLength: d3_geoLength,
16882 geoPath: d3_geoPath,
16884 geoAlbersUsa: albersUsa,
16885 geoAzimuthalEqualArea: azimuthalEqualArea,
16886 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16887 geoAzimuthalEquidistant: azimuthalEquidistant,
16888 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16889 geoConicConformal: conicConformal,
16890 geoConicConformalRaw: conicConformalRaw,
16891 geoConicEqualArea: conicEqualArea,
16892 geoConicEqualAreaRaw: conicEqualAreaRaw,
16893 geoConicEquidistant: conicEquidistant,
16894 geoConicEquidistantRaw: conicEquidistantRaw,
16895 geoEquirectangular: equirectangular,
16896 geoEquirectangularRaw: equirectangularRaw,
16897 geoGnomonic: gnomonic,
16898 geoGnomonicRaw: gnomonicRaw,
16899 geoIdentity: d3_geoIdentity,
16900 geoProjection: projection,
16901 geoProjectionMutator: projectionMutator,
16902 geoMercator: mercator,
16903 geoMercatorRaw: mercatorRaw,
16904 geoNaturalEarth1: naturalEarth1,
16905 geoNaturalEarth1Raw: naturalEarth1Raw,
16906 geoOrthographic: orthographic,
16907 geoOrthographicRaw: orthographicRaw,
16908 geoStereographic: stereographic,
16909 geoStereographicRaw: stereographicRaw,
16910 geoTransverseMercator: transverseMercator,
16911 geoTransverseMercatorRaw: transverseMercatorRaw,
16912 geoRotation: rotation,
16913 geoStream: d3_geoStream,
16914 geoTransform: d3_geoTransform,
16916 hierarchy: hierarchy,
16918 packSiblings: siblings,
16919 packEnclose: enclose,
16920 partition: partition,
16921 stratify: stratify,
16924 treemapBinary: binary,
16925 treemapDice: treemapDice,
16926 treemapSlice: treemapSlice,
16927 treemapSliceDice: sliceDice,
16928 treemapSquarify: squarify,
16929 treemapResquarify: resquarify,
16930 interpolate: d3_interpolate,
16931 interpolateArray: array$1,
16932 interpolateBasis: basis$1,
16933 interpolateBasisClosed: basisClosed,
16934 interpolateDate: date,
16935 interpolateNumber: d3_interpolateNumber,
16936 interpolateObject: object,
16937 interpolateRound: interpolateRound,
16938 interpolateString: interpolateString,
16939 interpolateTransformCss: interpolateTransformCss,
16940 interpolateTransformSvg: interpolateTransformSvg,
16941 interpolateZoom: interpolateZoom,
16942 interpolateRgb: d3_interpolateRgb,
16943 interpolateRgbBasis: rgbBasis,
16944 interpolateRgbBasisClosed: rgbBasisClosed,
16945 interpolateHsl: hsl$2,
16946 interpolateHslLong: hslLong,
16947 interpolateLab: lab$1,
16948 interpolateHcl: hcl$2,
16949 interpolateHclLong: hclLong,
16950 interpolateCubehelix: cubehelix$2,
16951 interpolateCubehelixLong: cubehelixLong,
16952 quantize: d3_quantize,
16954 polygonArea: d3_polygonArea,
16955 polygonCentroid: d3_polygonCentroid,
16956 polygonHull: d3_polygonHull,
16957 polygonContains: contains$1,
16958 polygonLength: length$1,
16959 quadtree: quadtree,
16961 randomUniform: uniform,
16962 randomNormal: normal,
16963 randomLogNormal: logNormal,
16964 randomBates: bates,
16965 randomIrwinHall: irwinHall,
16966 randomExponential: exponential$1,
16967 request: d3_request,
16975 scalePoint: point$1,
16976 scaleIdentity: identity$5,
16977 scaleLinear: linear$2,
16979 scaleOrdinal: ordinal,
16980 scaleImplicit: implicit,
16983 scaleQuantile: quantile$$1,
16984 scaleQuantize: quantize,
16985 scaleThreshold: threshold$1,
16988 schemeCategory10: category10,
16989 schemeCategory20b: category20b,
16990 schemeCategory20c: category20c,
16991 schemeCategory20: category20,
16992 interpolateCubehelixDefault: cubehelix$3,
16993 interpolateRainbow: rainbow$1,
16994 interpolateWarm: warm,
16995 interpolateCool: cool,
16996 interpolateViridis: viridis,
16997 interpolateMagma: magma,
16998 interpolateInferno: inferno,
16999 interpolatePlasma: plasma,
17000 scaleSequential: sequential,
17004 matcher: matcher$1,
17006 namespace: namespace,
17007 namespaces: namespaces,
17008 clientPoint: point,
17010 selectAll: d3_selectAll,
17011 selection: selection,
17012 selector: selector,
17013 selectorAll: selectorAll,
17016 touches: d3_touches,
17017 window: defaultView,
17018 get event () { return event; },
17019 customEvent: customEvent,
17024 areaRadial: areaRadial,
17025 radialArea: areaRadial,
17026 lineRadial: lineRadial$1,
17027 radialLine: lineRadial$1,
17028 pointRadial: pointRadial,
17029 linkHorizontal: linkHorizontal,
17030 linkVertical: linkVertical,
17031 linkRadial: linkRadial,
17034 symbolCircle: circle$2,
17035 symbolCross: cross$2,
17036 symbolDiamond: diamond,
17037 symbolSquare: square,
17039 symbolTriangle: triangle,
17041 curveBasisClosed: basisClosed$1,
17042 curveBasisOpen: basisOpen,
17043 curveBasis: basis$2,
17044 curveBundle: bundle,
17045 curveCardinalClosed: cardinalClosed,
17046 curveCardinalOpen: cardinalOpen,
17047 curveCardinal: cardinal,
17048 curveCatmullRomClosed: catmullRomClosed,
17049 curveCatmullRomOpen: catmullRomOpen,
17050 curveCatmullRom: catmullRom,
17051 curveLinearClosed: linearClosed,
17052 curveLinear: curveLinear,
17053 curveMonotoneX: monotoneX,
17054 curveMonotoneY: monotoneY,
17055 curveNatural: natural,
17057 curveStepAfter: stepAfter,
17058 curveStepBefore: stepBefore,
17060 stackOffsetExpand: expand,
17061 stackOffsetDiverging: diverging,
17062 stackOffsetNone: none$1,
17063 stackOffsetSilhouette: silhouette,
17064 stackOffsetWiggle: wiggle,
17065 stackOrderAscending: ascending$1,
17066 stackOrderDescending: descending$1,
17067 stackOrderInsideOut: insideOut,
17068 stackOrderNone: none$2,
17069 stackOrderReverse: reverse,
17070 timeInterval: newInterval,
17071 timeMillisecond: millisecond,
17072 timeMilliseconds: milliseconds,
17073 utcMillisecond: millisecond,
17074 utcMilliseconds: milliseconds,
17075 timeSecond: second,
17076 timeSeconds: seconds,
17078 utcSeconds: seconds,
17079 timeMinute: minute,
17080 timeMinutes: minutes,
17086 timeWeeks: sundays,
17087 timeSunday: sunday,
17088 timeSundays: sundays,
17089 timeMonday: monday,
17090 timeMondays: mondays,
17091 timeTuesday: tuesday,
17092 timeTuesdays: tuesdays,
17093 timeWednesday: wednesday,
17094 timeWednesdays: wednesdays,
17095 timeThursday: thursday,
17096 timeThursdays: thursdays,
17097 timeFriday: friday,
17098 timeFridays: fridays,
17099 timeSaturday: saturday,
17100 timeSaturdays: saturdays,
17102 timeMonths: months,
17105 utcMinute: utcMinute,
17106 utcMinutes: utcMinutes,
17108 utcHours: utcHours,
17111 utcWeek: utcSunday,
17112 utcWeeks: utcSundays,
17113 utcSunday: utcSunday,
17114 utcSundays: utcSundays,
17115 utcMonday: utcMonday,
17116 utcMondays: utcMondays,
17117 utcTuesday: utcTuesday,
17118 utcTuesdays: utcTuesdays,
17119 utcWednesday: utcWednesday,
17120 utcWednesdays: utcWednesdays,
17121 utcThursday: utcThursday,
17122 utcThursdays: utcThursdays,
17123 utcFriday: utcFriday,
17124 utcFridays: utcFridays,
17125 utcSaturday: utcSaturday,
17126 utcSaturdays: utcSaturdays,
17127 utcMonth: utcMonth,
17128 utcMonths: utcMonths,
17130 utcYears: utcYears,
17131 timeFormatDefaultLocale: defaultLocale$1,
17132 get timeFormat () { return timeFormat; },
17133 get timeParse () { return timeParse; },
17134 get utcFormat () { return utcFormat; },
17135 get utcParse () { return utcParse; },
17136 timeFormatLocale: formatLocale$1,
17137 isoFormat: formatIso,
17138 isoParse: parseIso,
17141 timerFlush: timerFlush,
17142 timeout: d3_timeout,
17143 interval: interval$1,
17144 transition: transition,
17146 interrupt: interrupt,
17149 zoomTransform: transform,
17150 zoomIdentity: identity$7
17153 function actionAddEntity(way) {
17154 return function(graph) {
17155 return graph.replace(way);
17160 * Removes all key-value entries from the list cache.
17164 * @memberOf ListCache
17166 function listCacheClear() {
17167 this.__data__ = [];
17173 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17174 * comparison between two values to determine if they are equivalent.
17180 * @param {*} value The value to compare.
17181 * @param {*} other The other value to compare.
17182 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17185 * var object = { 'a': 1 };
17186 * var other = { 'a': 1 };
17188 * _.eq(object, object);
17191 * _.eq(object, other);
17197 * _.eq('a', Object('a'));
17203 function eq(value, other) {
17204 return value === other || (value !== value && other !== other);
17208 * Gets the index at which the `key` is found in `array` of key-value pairs.
17211 * @param {Array} array The array to inspect.
17212 * @param {*} key The key to search for.
17213 * @returns {number} Returns the index of the matched value, else `-1`.
17215 function assocIndexOf(array, key) {
17216 var length = array.length;
17218 if (eq(array[length][0], key)) {
17225 /** Used for built-in method references. */
17226 var arrayProto = Array.prototype;
17228 /** Built-in value references. */
17229 var splice = arrayProto.splice;
17232 * Removes `key` and its value from the list cache.
17236 * @memberOf ListCache
17237 * @param {string} key The key of the value to remove.
17238 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17240 function listCacheDelete(key) {
17241 var data = this.__data__,
17242 index = assocIndexOf(data, key);
17247 var lastIndex = data.length - 1;
17248 if (index == lastIndex) {
17251 splice.call(data, index, 1);
17258 * Gets the list cache value for `key`.
17262 * @memberOf ListCache
17263 * @param {string} key The key of the value to get.
17264 * @returns {*} Returns the entry value.
17266 function listCacheGet(key) {
17267 var data = this.__data__,
17268 index = assocIndexOf(data, key);
17270 return index < 0 ? undefined : data[index][1];
17274 * Checks if a list cache value for `key` exists.
17278 * @memberOf ListCache
17279 * @param {string} key The key of the entry to check.
17280 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17282 function listCacheHas(key) {
17283 return assocIndexOf(this.__data__, key) > -1;
17287 * Sets the list cache `key` to `value`.
17291 * @memberOf ListCache
17292 * @param {string} key The key of the value to set.
17293 * @param {*} value The value to set.
17294 * @returns {Object} Returns the list cache instance.
17296 function listCacheSet(key, value) {
17297 var data = this.__data__,
17298 index = assocIndexOf(data, key);
17302 data.push([key, value]);
17304 data[index][1] = value;
17310 * Creates an list cache object.
17314 * @param {Array} [entries] The key-value pairs to cache.
17316 function ListCache(entries) {
17318 length = entries == null ? 0 : entries.length;
17321 while (++index < length) {
17322 var entry = entries[index];
17323 this.set(entry[0], entry[1]);
17327 // Add methods to `ListCache`.
17328 ListCache.prototype.clear = listCacheClear;
17329 ListCache.prototype['delete'] = listCacheDelete;
17330 ListCache.prototype.get = listCacheGet;
17331 ListCache.prototype.has = listCacheHas;
17332 ListCache.prototype.set = listCacheSet;
17335 * Removes all key-value entries from the stack.
17341 function stackClear() {
17342 this.__data__ = new ListCache;
17347 * Removes `key` and its value from the stack.
17352 * @param {string} key The key of the value to remove.
17353 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355 function stackDelete(key) {
17356 var data = this.__data__,
17357 result = data['delete'](key);
17359 this.size = data.size;
17364 * Gets the stack value for `key`.
17369 * @param {string} key The key of the value to get.
17370 * @returns {*} Returns the entry value.
17372 function stackGet(key) {
17373 return this.__data__.get(key);
17377 * Checks if a stack value for `key` exists.
17382 * @param {string} key The key of the entry to check.
17383 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385 function stackHas(key) {
17386 return this.__data__.has(key);
17389 /** Detect free variable `global` from Node.js. */
17390 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392 /** Detect free variable `self`. */
17393 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395 /** Used as a reference to the global object. */
17396 var root$2 = freeGlobal || freeSelf || Function('return this')();
17398 /** Built-in value references. */
17399 var Symbol = root$2.Symbol;
17401 /** Used for built-in method references. */
17402 var objectProto = Object.prototype;
17404 /** Used to check objects for own properties. */
17405 var hasOwnProperty = objectProto.hasOwnProperty;
17408 * Used to resolve the
17409 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17412 var nativeObjectToString = objectProto.toString;
17414 /** Built-in value references. */
17415 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17418 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17421 * @param {*} value The value to query.
17422 * @returns {string} Returns the raw `toStringTag`.
17424 function getRawTag(value) {
17425 var isOwn = hasOwnProperty.call(value, symToStringTag),
17426 tag = value[symToStringTag];
17429 value[symToStringTag] = undefined;
17430 var unmasked = true;
17433 var result = nativeObjectToString.call(value);
17436 value[symToStringTag] = tag;
17438 delete value[symToStringTag];
17444 /** Used for built-in method references. */
17445 var objectProto$1 = Object.prototype;
17448 * Used to resolve the
17449 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17452 var nativeObjectToString$1 = objectProto$1.toString;
17455 * Converts `value` to a string using `Object.prototype.toString`.
17458 * @param {*} value The value to convert.
17459 * @returns {string} Returns the converted string.
17461 function objectToString(value) {
17462 return nativeObjectToString$1.call(value);
17465 /** `Object#toString` result references. */
17466 var nullTag = '[object Null]',
17467 undefinedTag = '[object Undefined]';
17469 /** Built-in value references. */
17470 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17473 * The base implementation of `getTag` without fallbacks for buggy environments.
17476 * @param {*} value The value to query.
17477 * @returns {string} Returns the `toStringTag`.
17479 function baseGetTag(value) {
17480 if (value == null) {
17481 return value === undefined ? undefinedTag : nullTag;
17483 return (symToStringTag$1 && symToStringTag$1 in Object(value))
17485 : objectToString(value);
17489 * Checks if `value` is the
17490 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17491 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17497 * @param {*} value The value to check.
17498 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17504 * _.isObject([1, 2, 3]);
17507 * _.isObject(_.noop);
17510 * _.isObject(null);
17513 function isObject(value) {
17514 var type = typeof value;
17515 return value != null && (type == 'object' || type == 'function');
17518 /** `Object#toString` result references. */
17519 var asyncTag = '[object AsyncFunction]',
17520 funcTag = '[object Function]',
17521 genTag = '[object GeneratorFunction]',
17522 proxyTag = '[object Proxy]';
17525 * Checks if `value` is classified as a `Function` object.
17531 * @param {*} value The value to check.
17532 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17538 * _.isFunction(/abc/);
17541 function isFunction(value) {
17542 if (!isObject(value)) {
17545 // The use of `Object#toString` avoids issues with the `typeof` operator
17546 // in Safari 9 which returns 'object' for typed arrays and other constructors.
17547 var tag = baseGetTag(value);
17548 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17551 /** Used to detect overreaching core-js shims. */
17552 var coreJsData = root$2['__core-js_shared__'];
17554 /** Used to detect methods masquerading as native. */
17555 var maskSrcKey = (function() {
17556 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17557 return uid ? ('Symbol(src)_1.' + uid) : '';
17561 * Checks if `func` has its source masked.
17564 * @param {Function} func The function to check.
17565 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17567 function isMasked(func) {
17568 return !!maskSrcKey && (maskSrcKey in func);
17571 /** Used for built-in method references. */
17572 var funcProto = Function.prototype;
17574 /** Used to resolve the decompiled source of functions. */
17575 var funcToString = funcProto.toString;
17578 * Converts `func` to its source code.
17581 * @param {Function} func The function to convert.
17582 * @returns {string} Returns the source code.
17584 function toSource(func) {
17585 if (func != null) {
17587 return funcToString.call(func);
17590 return (func + '');
17597 * Used to match `RegExp`
17598 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17600 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17602 /** Used to detect host constructors (Safari). */
17603 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17605 /** Used for built-in method references. */
17606 var funcProto$1 = Function.prototype,
17607 objectProto$2 = Object.prototype;
17609 /** Used to resolve the decompiled source of functions. */
17610 var funcToString$1 = funcProto$1.toString;
17612 /** Used to check objects for own properties. */
17613 var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17615 /** Used to detect if a method is native. */
17616 var reIsNative = RegExp('^' +
17617 funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17618 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17622 * The base implementation of `_.isNative` without bad shim checks.
17625 * @param {*} value The value to check.
17626 * @returns {boolean} Returns `true` if `value` is a native function,
17629 function baseIsNative(value) {
17630 if (!isObject(value) || isMasked(value)) {
17633 var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634 return pattern.test(toSource(value));
17638 * Gets the value at `key` of `object`.
17641 * @param {Object} [object] The object to query.
17642 * @param {string} key The key of the property to get.
17643 * @returns {*} Returns the property value.
17645 function getValue(object, key) {
17646 return object == null ? undefined : object[key];
17650 * Gets the native function at `key` of `object`.
17653 * @param {Object} object The object to query.
17654 * @param {string} key The key of the method to get.
17655 * @returns {*} Returns the function if it's native, else `undefined`.
17657 function getNative(object, key) {
17658 var value = getValue(object, key);
17659 return baseIsNative(value) ? value : undefined;
17662 /* Built-in method references that are verified to be native. */
17663 var Map$1 = getNative(root$2, 'Map');
17665 /* Built-in method references that are verified to be native. */
17666 var nativeCreate = getNative(Object, 'create');
17669 * Removes all key-value entries from the hash.
17675 function hashClear() {
17676 this.__data__ = nativeCreate ? nativeCreate(null) : {};
17681 * Removes `key` and its value from the hash.
17686 * @param {Object} hash The hash to modify.
17687 * @param {string} key The key of the value to remove.
17688 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17690 function hashDelete(key) {
17691 var result = this.has(key) && delete this.__data__[key];
17692 this.size -= result ? 1 : 0;
17696 /** Used to stand-in for `undefined` hash values. */
17697 var HASH_UNDEFINED = '__lodash_hash_undefined__';
17699 /** Used for built-in method references. */
17700 var objectProto$3 = Object.prototype;
17702 /** Used to check objects for own properties. */
17703 var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17706 * Gets the hash value for `key`.
17711 * @param {string} key The key of the value to get.
17712 * @returns {*} Returns the entry value.
17714 function hashGet(key) {
17715 var data = this.__data__;
17716 if (nativeCreate) {
17717 var result = data[key];
17718 return result === HASH_UNDEFINED ? undefined : result;
17720 return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17723 /** Used for built-in method references. */
17724 var objectProto$4 = Object.prototype;
17726 /** Used to check objects for own properties. */
17727 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17730 * Checks if a hash value for `key` exists.
17735 * @param {string} key The key of the entry to check.
17736 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17738 function hashHas(key) {
17739 var data = this.__data__;
17740 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17743 /** Used to stand-in for `undefined` hash values. */
17744 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17747 * Sets the hash `key` to `value`.
17752 * @param {string} key The key of the value to set.
17753 * @param {*} value The value to set.
17754 * @returns {Object} Returns the hash instance.
17756 function hashSet(key, value) {
17757 var data = this.__data__;
17758 this.size += this.has(key) ? 0 : 1;
17759 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17764 * Creates a hash object.
17768 * @param {Array} [entries] The key-value pairs to cache.
17770 function Hash(entries) {
17772 length = entries == null ? 0 : entries.length;
17775 while (++index < length) {
17776 var entry = entries[index];
17777 this.set(entry[0], entry[1]);
17781 // Add methods to `Hash`.
17782 Hash.prototype.clear = hashClear;
17783 Hash.prototype['delete'] = hashDelete;
17784 Hash.prototype.get = hashGet;
17785 Hash.prototype.has = hashHas;
17786 Hash.prototype.set = hashSet;
17789 * Removes all key-value entries from the map.
17793 * @memberOf MapCache
17795 function mapCacheClear() {
17799 'map': new (Map$1 || ListCache),
17805 * Checks if `value` is suitable for use as unique object key.
17808 * @param {*} value The value to check.
17809 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17811 function isKeyable(value) {
17812 var type = typeof value;
17813 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17814 ? (value !== '__proto__')
17815 : (value === null);
17819 * Gets the data for `map`.
17822 * @param {Object} map The map to query.
17823 * @param {string} key The reference key.
17824 * @returns {*} Returns the map data.
17826 function getMapData(map, key) {
17827 var data = map.__data__;
17828 return isKeyable(key)
17829 ? data[typeof key == 'string' ? 'string' : 'hash']
17834 * Removes `key` and its value from the map.
17838 * @memberOf MapCache
17839 * @param {string} key The key of the value to remove.
17840 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17842 function mapCacheDelete(key) {
17843 var result = getMapData(this, key)['delete'](key);
17844 this.size -= result ? 1 : 0;
17849 * Gets the map value for `key`.
17853 * @memberOf MapCache
17854 * @param {string} key The key of the value to get.
17855 * @returns {*} Returns the entry value.
17857 function mapCacheGet(key) {
17858 return getMapData(this, key).get(key);
17862 * Checks if a map value for `key` exists.
17866 * @memberOf MapCache
17867 * @param {string} key The key of the entry to check.
17868 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17870 function mapCacheHas(key) {
17871 return getMapData(this, key).has(key);
17875 * Sets the map `key` to `value`.
17879 * @memberOf MapCache
17880 * @param {string} key The key of the value to set.
17881 * @param {*} value The value to set.
17882 * @returns {Object} Returns the map cache instance.
17884 function mapCacheSet(key, value) {
17885 var data = getMapData(this, key),
17888 data.set(key, value);
17889 this.size += data.size == size ? 0 : 1;
17894 * Creates a map cache object to store key-value pairs.
17898 * @param {Array} [entries] The key-value pairs to cache.
17900 function MapCache(entries) {
17902 length = entries == null ? 0 : entries.length;
17905 while (++index < length) {
17906 var entry = entries[index];
17907 this.set(entry[0], entry[1]);
17911 // Add methods to `MapCache`.
17912 MapCache.prototype.clear = mapCacheClear;
17913 MapCache.prototype['delete'] = mapCacheDelete;
17914 MapCache.prototype.get = mapCacheGet;
17915 MapCache.prototype.has = mapCacheHas;
17916 MapCache.prototype.set = mapCacheSet;
17918 /** Used as the size to enable large array optimizations. */
17919 var LARGE_ARRAY_SIZE = 200;
17922 * Sets the stack `key` to `value`.
17927 * @param {string} key The key of the value to set.
17928 * @param {*} value The value to set.
17929 * @returns {Object} Returns the stack cache instance.
17931 function stackSet(key, value) {
17932 var data = this.__data__;
17933 if (data instanceof ListCache) {
17934 var pairs = data.__data__;
17935 if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17936 pairs.push([key, value]);
17937 this.size = ++data.size;
17940 data = this.__data__ = new MapCache(pairs);
17942 data.set(key, value);
17943 this.size = data.size;
17948 * Creates a stack cache object to store key-value pairs.
17952 * @param {Array} [entries] The key-value pairs to cache.
17954 function Stack(entries) {
17955 var data = this.__data__ = new ListCache(entries);
17956 this.size = data.size;
17959 // Add methods to `Stack`.
17960 Stack.prototype.clear = stackClear;
17961 Stack.prototype['delete'] = stackDelete;
17962 Stack.prototype.get = stackGet;
17963 Stack.prototype.has = stackHas;
17964 Stack.prototype.set = stackSet;
17967 * A specialized version of `_.forEach` for arrays without support for
17968 * iteratee shorthands.
17971 * @param {Array} [array] The array to iterate over.
17972 * @param {Function} iteratee The function invoked per iteration.
17973 * @returns {Array} Returns `array`.
17975 function arrayEach(array, iteratee) {
17977 length = array == null ? 0 : array.length;
17979 while (++index < length) {
17980 if (iteratee(array[index], index, array) === false) {
17987 var defineProperty = (function() {
17989 var func = getNative(Object, 'defineProperty');
17996 * The base implementation of `assignValue` and `assignMergeValue` without
18000 * @param {Object} object The object to modify.
18001 * @param {string} key The key of the property to assign.
18002 * @param {*} value The value to assign.
18004 function baseAssignValue(object, key, value) {
18005 if (key == '__proto__' && defineProperty) {
18006 defineProperty(object, key, {
18007 'configurable': true,
18008 'enumerable': true,
18013 object[key] = value;
18017 /** Used for built-in method references. */
18018 var objectProto$5 = Object.prototype;
18020 /** Used to check objects for own properties. */
18021 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18024 * Assigns `value` to `key` of `object` if the existing value is not equivalent
18025 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18026 * for equality comparisons.
18029 * @param {Object} object The object to modify.
18030 * @param {string} key The key of the property to assign.
18031 * @param {*} value The value to assign.
18033 function assignValue(object, key, value) {
18034 var objValue = object[key];
18035 if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18036 (value === undefined && !(key in object))) {
18037 baseAssignValue(object, key, value);
18042 * Copies properties of `source` to `object`.
18045 * @param {Object} source The object to copy properties from.
18046 * @param {Array} props The property identifiers to copy.
18047 * @param {Object} [object={}] The object to copy properties to.
18048 * @param {Function} [customizer] The function to customize copied values.
18049 * @returns {Object} Returns `object`.
18051 function copyObject(source, props, object, customizer) {
18052 var isNew = !object;
18053 object || (object = {});
18056 length = props.length;
18058 while (++index < length) {
18059 var key = props[index];
18061 var newValue = customizer
18062 ? customizer(object[key], source[key], key, object, source)
18065 if (newValue === undefined) {
18066 newValue = source[key];
18069 baseAssignValue(object, key, newValue);
18071 assignValue(object, key, newValue);
18078 * The base implementation of `_.times` without support for iteratee shorthands
18079 * or max array length checks.
18082 * @param {number} n The number of times to invoke `iteratee`.
18083 * @param {Function} iteratee The function invoked per iteration.
18084 * @returns {Array} Returns the array of results.
18086 function baseTimes(n, iteratee) {
18090 while (++index < n) {
18091 result[index] = iteratee(index);
18097 * Checks if `value` is object-like. A value is object-like if it's not `null`
18098 * and has a `typeof` result of "object".
18104 * @param {*} value The value to check.
18105 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18108 * _.isObjectLike({});
18111 * _.isObjectLike([1, 2, 3]);
18114 * _.isObjectLike(_.noop);
18117 * _.isObjectLike(null);
18120 function isObjectLike(value) {
18121 return value != null && typeof value == 'object';
18124 /** `Object#toString` result references. */
18125 var argsTag = '[object Arguments]';
18128 * The base implementation of `_.isArguments`.
18131 * @param {*} value The value to check.
18132 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18134 function baseIsArguments(value) {
18135 return isObjectLike(value) && baseGetTag(value) == argsTag;
18138 /** Used for built-in method references. */
18139 var objectProto$6 = Object.prototype;
18141 /** Used to check objects for own properties. */
18142 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18144 /** Built-in value references. */
18145 var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18148 * Checks if `value` is likely an `arguments` object.
18154 * @param {*} value The value to check.
18155 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18159 * _.isArguments(function() { return arguments; }());
18162 * _.isArguments([1, 2, 3]);
18165 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166 return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167 !propertyIsEnumerable.call(value, 'callee');
18171 * Checks if `value` is classified as an `Array` object.
18177 * @param {*} value The value to check.
18178 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18181 * _.isArray([1, 2, 3]);
18184 * _.isArray(document.body.children);
18187 * _.isArray('abc');
18190 * _.isArray(_.noop);
18193 var isArray = Array.isArray;
18196 * This method returns `false`.
18202 * @returns {boolean} Returns `false`.
18205 * _.times(2, _.stubFalse);
18206 * // => [false, false]
18208 function stubFalse() {
18212 /** Detect free variable `exports`. */
18213 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18215 /** Detect free variable `module`. */
18216 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18218 /** Detect the popular CommonJS extension `module.exports`. */
18219 var moduleExports = freeModule && freeModule.exports === freeExports;
18221 /** Built-in value references. */
18222 var Buffer = moduleExports ? root$2.Buffer : undefined;
18224 /* Built-in method references for those with the same name as other `lodash` methods. */
18225 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18228 * Checks if `value` is a buffer.
18234 * @param {*} value The value to check.
18235 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18238 * _.isBuffer(new Buffer(2));
18241 * _.isBuffer(new Uint8Array(2));
18244 var isBuffer = nativeIsBuffer || stubFalse;
18246 /** Used as references for various `Number` constants. */
18247 var MAX_SAFE_INTEGER = 9007199254740991;
18249 /** Used to detect unsigned integer values. */
18250 var reIsUint = /^(?:0|[1-9]\d*)$/;
18253 * Checks if `value` is a valid array-like index.
18256 * @param {*} value The value to check.
18257 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18258 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18260 function isIndex(value, length) {
18261 var type = typeof value;
18262 length = length == null ? MAX_SAFE_INTEGER : length;
18265 (type == 'number' ||
18266 (type != 'symbol' && reIsUint.test(value))) &&
18267 (value > -1 && value % 1 == 0 && value < length);
18270 /** Used as references for various `Number` constants. */
18271 var MAX_SAFE_INTEGER$1 = 9007199254740991;
18274 * Checks if `value` is a valid array-like length.
18276 * **Note:** This method is loosely based on
18277 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18283 * @param {*} value The value to check.
18284 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18290 * _.isLength(Number.MIN_VALUE);
18293 * _.isLength(Infinity);
18299 function isLength(value) {
18300 return typeof value == 'number' &&
18301 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18304 /** `Object#toString` result references. */
18305 var argsTag$1 = '[object Arguments]',
18306 arrayTag = '[object Array]',
18307 boolTag = '[object Boolean]',
18308 dateTag = '[object Date]',
18309 errorTag = '[object Error]',
18310 funcTag$1 = '[object Function]',
18311 mapTag = '[object Map]',
18312 numberTag = '[object Number]',
18313 objectTag = '[object Object]',
18314 regexpTag = '[object RegExp]',
18315 setTag = '[object Set]',
18316 stringTag = '[object String]',
18317 weakMapTag = '[object WeakMap]';
18319 var arrayBufferTag = '[object ArrayBuffer]',
18320 dataViewTag = '[object DataView]',
18321 float32Tag = '[object Float32Array]',
18322 float64Tag = '[object Float64Array]',
18323 int8Tag = '[object Int8Array]',
18324 int16Tag = '[object Int16Array]',
18325 int32Tag = '[object Int32Array]',
18326 uint8Tag = '[object Uint8Array]',
18327 uint8ClampedTag = '[object Uint8ClampedArray]',
18328 uint16Tag = '[object Uint16Array]',
18329 uint32Tag = '[object Uint32Array]';
18331 /** Used to identify `toStringTag` values of typed arrays. */
18332 var typedArrayTags = {};
18333 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18334 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18335 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18336 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18337 typedArrayTags[uint32Tag] = true;
18338 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18339 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18340 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18341 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18342 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18343 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18344 typedArrayTags[setTag] = typedArrayTags[stringTag] =
18345 typedArrayTags[weakMapTag] = false;
18348 * The base implementation of `_.isTypedArray` without Node.js optimizations.
18351 * @param {*} value The value to check.
18352 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18354 function baseIsTypedArray(value) {
18355 return isObjectLike(value) &&
18356 isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18360 * The base implementation of `_.unary` without support for storing metadata.
18363 * @param {Function} func The function to cap arguments for.
18364 * @returns {Function} Returns the new capped function.
18366 function baseUnary(func) {
18367 return function(value) {
18368 return func(value);
18372 /** Detect free variable `exports`. */
18373 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18375 /** Detect free variable `module`. */
18376 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18378 /** Detect the popular CommonJS extension `module.exports`. */
18379 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18381 /** Detect free variable `process` from Node.js. */
18382 var freeProcess = moduleExports$1 && freeGlobal.process;
18384 /** Used to access faster Node.js helpers. */
18385 var nodeUtil = (function() {
18387 return freeProcess && freeProcess.binding && freeProcess.binding('util');
18391 /* Node.js helper references. */
18392 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18395 * Checks if `value` is classified as a typed array.
18401 * @param {*} value The value to check.
18402 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18405 * _.isTypedArray(new Uint8Array);
18408 * _.isTypedArray([]);
18411 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18413 /** Used for built-in method references. */
18414 var objectProto$7 = Object.prototype;
18416 /** Used to check objects for own properties. */
18417 var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18420 * Creates an array of the enumerable property names of the array-like `value`.
18423 * @param {*} value The value to query.
18424 * @param {boolean} inherited Specify returning inherited property names.
18425 * @returns {Array} Returns the array of property names.
18427 function arrayLikeKeys(value, inherited) {
18428 var isArr = isArray(value),
18429 isArg = !isArr && isArguments(value),
18430 isBuff = !isArr && !isArg && isBuffer(value),
18431 isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18432 skipIndexes = isArr || isArg || isBuff || isType,
18433 result = skipIndexes ? baseTimes(value.length, String) : [],
18434 length = result.length;
18436 for (var key in value) {
18437 if ((inherited || hasOwnProperty$6.call(value, key)) &&
18439 // Safari 9 has enumerable `arguments.length` in strict mode.
18441 // Node.js 0.10 has enumerable non-index properties on buffers.
18442 (isBuff && (key == 'offset' || key == 'parent')) ||
18443 // PhantomJS 2 has enumerable non-index properties on typed arrays.
18444 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18445 // Skip index properties.
18446 isIndex(key, length)
18454 /** Used for built-in method references. */
18455 var objectProto$8 = Object.prototype;
18458 * Checks if `value` is likely a prototype object.
18461 * @param {*} value The value to check.
18462 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18464 function isPrototype(value) {
18465 var Ctor = value && value.constructor,
18466 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18468 return value === proto;
18472 * Creates a unary function that invokes `func` with its argument transformed.
18475 * @param {Function} func The function to wrap.
18476 * @param {Function} transform The argument transform.
18477 * @returns {Function} Returns the new function.
18479 function overArg(func, transform) {
18480 return function(arg) {
18481 return func(transform(arg));
18485 /* Built-in method references for those with the same name as other `lodash` methods. */
18486 var nativeKeys = overArg(Object.keys, Object);
18488 /** Used for built-in method references. */
18489 var objectProto$9 = Object.prototype;
18491 /** Used to check objects for own properties. */
18492 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18495 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18498 * @param {Object} object The object to query.
18499 * @returns {Array} Returns the array of property names.
18501 function baseKeys(object) {
18502 if (!isPrototype(object)) {
18503 return nativeKeys(object);
18506 for (var key in Object(object)) {
18507 if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18515 * Checks if `value` is array-like. A value is considered array-like if it's
18516 * not a function and has a `value.length` that's an integer greater than or
18517 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18523 * @param {*} value The value to check.
18524 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18527 * _.isArrayLike([1, 2, 3]);
18530 * _.isArrayLike(document.body.children);
18533 * _.isArrayLike('abc');
18536 * _.isArrayLike(_.noop);
18539 function isArrayLike(value) {
18540 return value != null && isLength(value.length) && !isFunction(value);
18544 * Creates an array of the own enumerable property names of `object`.
18546 * **Note:** Non-object values are coerced to objects. See the
18547 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18548 * for more details.
18554 * @param {Object} object The object to query.
18555 * @returns {Array} Returns the array of property names.
18563 * Foo.prototype.c = 3;
18566 * // => ['a', 'b'] (iteration order is not guaranteed)
18571 function keys$1(object) {
18572 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18576 * The base implementation of `_.assign` without support for multiple sources
18577 * or `customizer` functions.
18580 * @param {Object} object The destination object.
18581 * @param {Object} source The source object.
18582 * @returns {Object} Returns `object`.
18584 function baseAssign(object, source) {
18585 return object && copyObject(source, keys$1(source), object);
18589 * This function is like
18590 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18591 * except that it includes inherited enumerable properties.
18594 * @param {Object} object The object to query.
18595 * @returns {Array} Returns the array of property names.
18597 function nativeKeysIn(object) {
18599 if (object != null) {
18600 for (var key in Object(object)) {
18607 /** Used for built-in method references. */
18608 var objectProto$10 = Object.prototype;
18610 /** Used to check objects for own properties. */
18611 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18614 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18617 * @param {Object} object The object to query.
18618 * @returns {Array} Returns the array of property names.
18620 function baseKeysIn(object) {
18621 if (!isObject(object)) {
18622 return nativeKeysIn(object);
18624 var isProto = isPrototype(object),
18627 for (var key in object) {
18628 if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18636 * Creates an array of the own and inherited enumerable property names of `object`.
18638 * **Note:** Non-object values are coerced to objects.
18644 * @param {Object} object The object to query.
18645 * @returns {Array} Returns the array of property names.
18653 * Foo.prototype.c = 3;
18655 * _.keysIn(new Foo);
18656 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18658 function keysIn$1(object) {
18659 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18663 * The base implementation of `_.assignIn` without support for multiple sources
18664 * or `customizer` functions.
18667 * @param {Object} object The destination object.
18668 * @param {Object} source The source object.
18669 * @returns {Object} Returns `object`.
18671 function baseAssignIn(object, source) {
18672 return object && copyObject(source, keysIn$1(source), object);
18675 /** Detect free variable `exports`. */
18676 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18678 /** Detect free variable `module`. */
18679 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18681 /** Detect the popular CommonJS extension `module.exports`. */
18682 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18684 /** Built-in value references. */
18685 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18686 allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18689 * Creates a clone of `buffer`.
18692 * @param {Buffer} buffer The buffer to clone.
18693 * @param {boolean} [isDeep] Specify a deep clone.
18694 * @returns {Buffer} Returns the cloned buffer.
18696 function cloneBuffer(buffer, isDeep) {
18698 return buffer.slice();
18700 var length = buffer.length,
18701 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18703 buffer.copy(result);
18708 * Copies the values of `source` to `array`.
18711 * @param {Array} source The array to copy values from.
18712 * @param {Array} [array=[]] The array to copy values to.
18713 * @returns {Array} Returns `array`.
18715 function copyArray(source, array) {
18717 length = source.length;
18719 array || (array = Array(length));
18720 while (++index < length) {
18721 array[index] = source[index];
18727 * A specialized version of `_.filter` for arrays without support for
18728 * iteratee shorthands.
18731 * @param {Array} [array] The array to iterate over.
18732 * @param {Function} predicate The function invoked per iteration.
18733 * @returns {Array} Returns the new filtered array.
18735 function arrayFilter(array, predicate) {
18737 length = array == null ? 0 : array.length,
18741 while (++index < length) {
18742 var value = array[index];
18743 if (predicate(value, index, array)) {
18744 result[resIndex++] = value;
18751 * This method returns a new empty array.
18757 * @returns {Array} Returns the new empty array.
18760 * var arrays = _.times(2, _.stubArray);
18762 * console.log(arrays);
18765 * console.log(arrays[0] === arrays[1]);
18768 function stubArray() {
18772 /** Used for built-in method references. */
18773 var objectProto$11 = Object.prototype;
18775 /** Built-in value references. */
18776 var propertyIsEnumerable$1 = objectProto$11.propertyIsEnumerable;
18778 /* Built-in method references for those with the same name as other `lodash` methods. */
18779 var nativeGetSymbols = Object.getOwnPropertySymbols;
18782 * Creates an array of the own enumerable symbols of `object`.
18785 * @param {Object} object The object to query.
18786 * @returns {Array} Returns the array of symbols.
18788 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18789 if (object == null) {
18792 object = Object(object);
18793 return arrayFilter(nativeGetSymbols(object), function(symbol) {
18794 return propertyIsEnumerable$1.call(object, symbol);
18799 * Copies own symbols of `source` to `object`.
18802 * @param {Object} source The object to copy symbols from.
18803 * @param {Object} [object={}] The object to copy symbols to.
18804 * @returns {Object} Returns `object`.
18806 function copySymbols(source, object) {
18807 return copyObject(source, getSymbols(source), object);
18811 * Appends the elements of `values` to `array`.
18814 * @param {Array} array The array to modify.
18815 * @param {Array} values The values to append.
18816 * @returns {Array} Returns `array`.
18818 function arrayPush(array, values) {
18820 length = values.length,
18821 offset = array.length;
18823 while (++index < length) {
18824 array[offset + index] = values[index];
18829 /** Built-in value references. */
18830 var getPrototype = overArg(Object.getPrototypeOf, Object);
18832 /* Built-in method references for those with the same name as other `lodash` methods. */
18833 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18836 * Creates an array of the own and inherited enumerable symbols of `object`.
18839 * @param {Object} object The object to query.
18840 * @returns {Array} Returns the array of symbols.
18842 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18845 arrayPush(result, getSymbols(object));
18846 object = getPrototype(object);
18852 * Copies own and inherited symbols of `source` to `object`.
18855 * @param {Object} source The object to copy symbols from.
18856 * @param {Object} [object={}] The object to copy symbols to.
18857 * @returns {Object} Returns `object`.
18859 function copySymbolsIn(source, object) {
18860 return copyObject(source, getSymbolsIn(source), object);
18864 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18865 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18866 * symbols of `object`.
18869 * @param {Object} object The object to query.
18870 * @param {Function} keysFunc The function to get the keys of `object`.
18871 * @param {Function} symbolsFunc The function to get the symbols of `object`.
18872 * @returns {Array} Returns the array of property names and symbols.
18874 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18875 var result = keysFunc(object);
18876 return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18880 * Creates an array of own enumerable property names and symbols of `object`.
18883 * @param {Object} object The object to query.
18884 * @returns {Array} Returns the array of property names and symbols.
18886 function getAllKeys(object) {
18887 return baseGetAllKeys(object, keys$1, getSymbols);
18891 * Creates an array of own and inherited enumerable property names and
18892 * symbols of `object`.
18895 * @param {Object} object The object to query.
18896 * @returns {Array} Returns the array of property names and symbols.
18898 function getAllKeysIn(object) {
18899 return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18902 /* Built-in method references that are verified to be native. */
18903 var DataView = getNative(root$2, 'DataView');
18905 /* Built-in method references that are verified to be native. */
18906 var Promise = getNative(root$2, 'Promise');
18908 /* Built-in method references that are verified to be native. */
18909 var Set$1 = getNative(root$2, 'Set');
18911 /* Built-in method references that are verified to be native. */
18912 var WeakMap = getNative(root$2, 'WeakMap');
18914 /** `Object#toString` result references. */
18915 var mapTag$1 = '[object Map]',
18916 objectTag$1 = '[object Object]',
18917 promiseTag = '[object Promise]',
18918 setTag$1 = '[object Set]',
18919 weakMapTag$1 = '[object WeakMap]';
18921 var dataViewTag$1 = '[object DataView]';
18923 /** Used to detect maps, sets, and weakmaps. */
18924 var dataViewCtorString = toSource(DataView),
18925 mapCtorString = toSource(Map$1),
18926 promiseCtorString = toSource(Promise),
18927 setCtorString = toSource(Set$1),
18928 weakMapCtorString = toSource(WeakMap);
18931 * Gets the `toStringTag` of `value`.
18934 * @param {*} value The value to query.
18935 * @returns {string} Returns the `toStringTag`.
18937 var getTag = baseGetTag;
18939 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18940 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18941 (Map$1 && getTag(new Map$1) != mapTag$1) ||
18942 (Promise && getTag(Promise.resolve()) != promiseTag) ||
18943 (Set$1 && getTag(new Set$1) != setTag$1) ||
18944 (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18945 getTag = function(value) {
18946 var result = baseGetTag(value),
18947 Ctor = result == objectTag$1 ? value.constructor : undefined,
18948 ctorString = Ctor ? toSource(Ctor) : '';
18951 switch (ctorString) {
18952 case dataViewCtorString: return dataViewTag$1;
18953 case mapCtorString: return mapTag$1;
18954 case promiseCtorString: return promiseTag;
18955 case setCtorString: return setTag$1;
18956 case weakMapCtorString: return weakMapTag$1;
18963 var getTag$1 = getTag;
18965 /** Used for built-in method references. */
18966 var objectProto$12 = Object.prototype;
18968 /** Used to check objects for own properties. */
18969 var hasOwnProperty$9 = objectProto$12.hasOwnProperty;
18972 * Initializes an array clone.
18975 * @param {Array} array The array to clone.
18976 * @returns {Array} Returns the initialized clone.
18978 function initCloneArray(array) {
18979 var length = array.length,
18980 result = new array.constructor(length);
18982 // Add properties assigned by `RegExp#exec`.
18983 if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18984 result.index = array.index;
18985 result.input = array.input;
18990 /** Built-in value references. */
18991 var Uint8Array = root$2.Uint8Array;
18994 * Creates a clone of `arrayBuffer`.
18997 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
18998 * @returns {ArrayBuffer} Returns the cloned array buffer.
19000 function cloneArrayBuffer(arrayBuffer) {
19001 var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19002 new Uint8Array(result).set(new Uint8Array(arrayBuffer));
19007 * Creates a clone of `dataView`.
19010 * @param {Object} dataView The data view to clone.
19011 * @param {boolean} [isDeep] Specify a deep clone.
19012 * @returns {Object} Returns the cloned data view.
19014 function cloneDataView(dataView, isDeep) {
19015 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19016 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19019 /** Used to match `RegExp` flags from their coerced string values. */
19020 var reFlags = /\w*$/;
19023 * Creates a clone of `regexp`.
19026 * @param {Object} regexp The regexp to clone.
19027 * @returns {Object} Returns the cloned regexp.
19029 function cloneRegExp(regexp) {
19030 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19031 result.lastIndex = regexp.lastIndex;
19035 /** Used to convert symbols to primitives and strings. */
19036 var symbolProto = Symbol ? Symbol.prototype : undefined,
19037 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19040 * Creates a clone of the `symbol` object.
19043 * @param {Object} symbol The symbol object to clone.
19044 * @returns {Object} Returns the cloned symbol object.
19046 function cloneSymbol(symbol) {
19047 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19051 * Creates a clone of `typedArray`.
19054 * @param {Object} typedArray The typed array to clone.
19055 * @param {boolean} [isDeep] Specify a deep clone.
19056 * @returns {Object} Returns the cloned typed array.
19058 function cloneTypedArray(typedArray, isDeep) {
19059 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19060 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19063 /** `Object#toString` result references. */
19064 var boolTag$1 = '[object Boolean]',
19065 dateTag$1 = '[object Date]',
19066 mapTag$2 = '[object Map]',
19067 numberTag$1 = '[object Number]',
19068 regexpTag$1 = '[object RegExp]',
19069 setTag$2 = '[object Set]',
19070 stringTag$1 = '[object String]',
19071 symbolTag = '[object Symbol]';
19073 var arrayBufferTag$1 = '[object ArrayBuffer]',
19074 dataViewTag$2 = '[object DataView]',
19075 float32Tag$1 = '[object Float32Array]',
19076 float64Tag$1 = '[object Float64Array]',
19077 int8Tag$1 = '[object Int8Array]',
19078 int16Tag$1 = '[object Int16Array]',
19079 int32Tag$1 = '[object Int32Array]',
19080 uint8Tag$1 = '[object Uint8Array]',
19081 uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19082 uint16Tag$1 = '[object Uint16Array]',
19083 uint32Tag$1 = '[object Uint32Array]';
19086 * Initializes an object clone based on its `toStringTag`.
19088 * **Note:** This function only supports cloning values with tags of
19089 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19092 * @param {Object} object The object to clone.
19093 * @param {string} tag The `toStringTag` of the object to clone.
19094 * @param {boolean} [isDeep] Specify a deep clone.
19095 * @returns {Object} Returns the initialized clone.
19097 function initCloneByTag(object, tag, isDeep) {
19098 var Ctor = object.constructor;
19100 case arrayBufferTag$1:
19101 return cloneArrayBuffer(object);
19105 return new Ctor(+object);
19107 case dataViewTag$2:
19108 return cloneDataView(object, isDeep);
19110 case float32Tag$1: case float64Tag$1:
19111 case int8Tag$1: case int16Tag$1: case int32Tag$1:
19112 case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19113 return cloneTypedArray(object, isDeep);
19120 return new Ctor(object);
19123 return cloneRegExp(object);
19129 return cloneSymbol(object);
19133 /** Built-in value references. */
19134 var objectCreate = Object.create;
19137 * The base implementation of `_.create` without support for assigning
19138 * properties to the created object.
19141 * @param {Object} proto The object to inherit from.
19142 * @returns {Object} Returns the new object.
19144 var baseCreate = (function() {
19145 function object() {}
19146 return function(proto) {
19147 if (!isObject(proto)) {
19150 if (objectCreate) {
19151 return objectCreate(proto);
19153 object.prototype = proto;
19154 var result = new object;
19155 object.prototype = undefined;
19161 * Initializes an object clone.
19164 * @param {Object} object The object to clone.
19165 * @returns {Object} Returns the initialized clone.
19167 function initCloneObject(object) {
19168 return (typeof object.constructor == 'function' && !isPrototype(object))
19169 ? baseCreate(getPrototype(object))
19173 /** `Object#toString` result references. */
19174 var mapTag$3 = '[object Map]';
19177 * The base implementation of `_.isMap` without Node.js optimizations.
19180 * @param {*} value The value to check.
19181 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19183 function baseIsMap(value) {
19184 return isObjectLike(value) && getTag$1(value) == mapTag$3;
19187 /* Node.js helper references. */
19188 var nodeIsMap = nodeUtil && nodeUtil.isMap;
19191 * Checks if `value` is classified as a `Map` object.
19197 * @param {*} value The value to check.
19198 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19201 * _.isMap(new Map);
19204 * _.isMap(new WeakMap);
19207 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19209 /** `Object#toString` result references. */
19210 var setTag$3 = '[object Set]';
19213 * The base implementation of `_.isSet` without Node.js optimizations.
19216 * @param {*} value The value to check.
19217 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19219 function baseIsSet(value) {
19220 return isObjectLike(value) && getTag$1(value) == setTag$3;
19223 /* Node.js helper references. */
19224 var nodeIsSet = nodeUtil && nodeUtil.isSet;
19227 * Checks if `value` is classified as a `Set` object.
19233 * @param {*} value The value to check.
19234 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19237 * _.isSet(new Set);
19240 * _.isSet(new WeakSet);
19243 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19245 /** Used to compose bitmasks for cloning. */
19246 var CLONE_DEEP_FLAG = 1,
19247 CLONE_FLAT_FLAG = 2,
19248 CLONE_SYMBOLS_FLAG = 4;
19250 /** `Object#toString` result references. */
19251 var argsTag$2 = '[object Arguments]',
19252 arrayTag$1 = '[object Array]',
19253 boolTag$2 = '[object Boolean]',
19254 dateTag$2 = '[object Date]',
19255 errorTag$1 = '[object Error]',
19256 funcTag$2 = '[object Function]',
19257 genTag$1 = '[object GeneratorFunction]',
19258 mapTag$4 = '[object Map]',
19259 numberTag$2 = '[object Number]',
19260 objectTag$2 = '[object Object]',
19261 regexpTag$2 = '[object RegExp]',
19262 setTag$4 = '[object Set]',
19263 stringTag$2 = '[object String]',
19264 symbolTag$1 = '[object Symbol]',
19265 weakMapTag$2 = '[object WeakMap]';
19267 var arrayBufferTag$2 = '[object ArrayBuffer]',
19268 dataViewTag$3 = '[object DataView]',
19269 float32Tag$2 = '[object Float32Array]',
19270 float64Tag$2 = '[object Float64Array]',
19271 int8Tag$2 = '[object Int8Array]',
19272 int16Tag$2 = '[object Int16Array]',
19273 int32Tag$2 = '[object Int32Array]',
19274 uint8Tag$2 = '[object Uint8Array]',
19275 uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19276 uint16Tag$2 = '[object Uint16Array]',
19277 uint32Tag$2 = '[object Uint32Array]';
19279 /** Used to identify `toStringTag` values supported by `_.clone`. */
19280 var cloneableTags = {};
19281 cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19282 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19283 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19284 cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19285 cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19286 cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19287 cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19288 cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19289 cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19290 cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19291 cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19292 cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19293 cloneableTags[weakMapTag$2] = false;
19296 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19297 * traversed objects.
19300 * @param {*} value The value to clone.
19301 * @param {boolean} bitmask The bitmask flags.
19303 * 2 - Flatten inherited properties
19304 * 4 - Clone symbols
19305 * @param {Function} [customizer] The function to customize cloning.
19306 * @param {string} [key] The key of `value`.
19307 * @param {Object} [object] The parent object of `value`.
19308 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19309 * @returns {*} Returns the cloned value.
19311 function baseClone(value, bitmask, customizer, key, object, stack) {
19313 isDeep = bitmask & CLONE_DEEP_FLAG,
19314 isFlat = bitmask & CLONE_FLAT_FLAG,
19315 isFull = bitmask & CLONE_SYMBOLS_FLAG;
19318 result = object ? customizer(value, key, object, stack) : customizer(value);
19320 if (result !== undefined) {
19323 if (!isObject(value)) {
19326 var isArr = isArray(value);
19328 result = initCloneArray(value);
19330 return copyArray(value, result);
19333 var tag = getTag$1(value),
19334 isFunc = tag == funcTag$2 || tag == genTag$1;
19336 if (isBuffer(value)) {
19337 return cloneBuffer(value, isDeep);
19339 if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19340 result = (isFlat || isFunc) ? {} : initCloneObject(value);
19343 ? copySymbolsIn(value, baseAssignIn(result, value))
19344 : copySymbols(value, baseAssign(result, value));
19347 if (!cloneableTags[tag]) {
19348 return object ? value : {};
19350 result = initCloneByTag(value, tag, isDeep);
19353 // Check for circular references and return its corresponding clone.
19354 stack || (stack = new Stack);
19355 var stacked = stack.get(value);
19359 stack.set(value, result);
19361 if (isSet(value)) {
19362 value.forEach(function(subValue) {
19363 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19369 if (isMap(value)) {
19370 value.forEach(function(subValue, key) {
19371 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19377 var keysFunc = isFull
19378 ? (isFlat ? getAllKeysIn : getAllKeys)
19379 : (isFlat ? keysIn : keys$1);
19381 var props = isArr ? undefined : keysFunc(value);
19382 arrayEach(props || value, function(subValue, key) {
19385 subValue = value[key];
19387 // Recursively populate clone (susceptible to call stack limits).
19388 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19393 /** Used to compose bitmasks for cloning. */
19394 var CLONE_SYMBOLS_FLAG$1 = 4;
19397 * Creates a shallow clone of `value`.
19399 * **Note:** This method is loosely based on the
19400 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19401 * and supports cloning arrays, array buffers, booleans, date objects, maps,
19402 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19403 * arrays. The own enumerable properties of `arguments` objects are cloned
19404 * as plain objects. An empty object is returned for uncloneable values such
19405 * as error objects, functions, DOM nodes, and WeakMaps.
19411 * @param {*} value The value to clone.
19412 * @returns {*} Returns the cloned value.
19416 * var objects = [{ 'a': 1 }, { 'b': 2 }];
19418 * var shallow = _.clone(objects);
19419 * console.log(shallow[0] === objects[0]);
19422 function clone(value) {
19423 return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19427 * A specialized version of `baseAggregator` for arrays.
19430 * @param {Array} [array] The array to iterate over.
19431 * @param {Function} setter The function to set `accumulator` values.
19432 * @param {Function} iteratee The iteratee to transform keys.
19433 * @param {Object} accumulator The initial aggregated object.
19434 * @returns {Function} Returns `accumulator`.
19436 function arrayAggregator(array, setter, iteratee, accumulator) {
19438 length = array == null ? 0 : array.length;
19440 while (++index < length) {
19441 var value = array[index];
19442 setter(accumulator, value, iteratee(value), array);
19444 return accumulator;
19448 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19451 * @param {boolean} [fromRight] Specify iterating from right to left.
19452 * @returns {Function} Returns the new base function.
19454 function createBaseFor(fromRight) {
19455 return function(object, iteratee, keysFunc) {
19457 iterable = Object(object),
19458 props = keysFunc(object),
19459 length = props.length;
19462 var key = props[fromRight ? length : ++index];
19463 if (iteratee(iterable[key], key, iterable) === false) {
19472 * The base implementation of `baseForOwn` which iterates over `object`
19473 * properties returned by `keysFunc` and invokes `iteratee` for each property.
19474 * Iteratee functions may exit iteration early by explicitly returning `false`.
19477 * @param {Object} object The object to iterate over.
19478 * @param {Function} iteratee The function invoked per iteration.
19479 * @param {Function} keysFunc The function to get the keys of `object`.
19480 * @returns {Object} Returns `object`.
19482 var baseFor = createBaseFor();
19485 * The base implementation of `_.forOwn` without support for iteratee shorthands.
19488 * @param {Object} object The object to iterate over.
19489 * @param {Function} iteratee The function invoked per iteration.
19490 * @returns {Object} Returns `object`.
19492 function baseForOwn(object, iteratee) {
19493 return object && baseFor(object, iteratee, keys$1);
19497 * Creates a `baseEach` or `baseEachRight` function.
19500 * @param {Function} eachFunc The function to iterate over a collection.
19501 * @param {boolean} [fromRight] Specify iterating from right to left.
19502 * @returns {Function} Returns the new base function.
19504 function createBaseEach(eachFunc, fromRight) {
19505 return function(collection, iteratee) {
19506 if (collection == null) {
19509 if (!isArrayLike(collection)) {
19510 return eachFunc(collection, iteratee);
19512 var length = collection.length,
19513 index = fromRight ? length : -1,
19514 iterable = Object(collection);
19516 while ((fromRight ? index-- : ++index < length)) {
19517 if (iteratee(iterable[index], index, iterable) === false) {
19526 * The base implementation of `_.forEach` without support for iteratee shorthands.
19529 * @param {Array|Object} collection The collection to iterate over.
19530 * @param {Function} iteratee The function invoked per iteration.
19531 * @returns {Array|Object} Returns `collection`.
19533 var baseEach = createBaseEach(baseForOwn);
19536 * Aggregates elements of `collection` on `accumulator` with keys transformed
19537 * by `iteratee` and values set by `setter`.
19540 * @param {Array|Object} collection The collection to iterate over.
19541 * @param {Function} setter The function to set `accumulator` values.
19542 * @param {Function} iteratee The iteratee to transform keys.
19543 * @param {Object} accumulator The initial aggregated object.
19544 * @returns {Function} Returns `accumulator`.
19546 function baseAggregator(collection, setter, iteratee, accumulator) {
19547 baseEach(collection, function(value, key, collection) {
19548 setter(accumulator, value, iteratee(value), collection);
19550 return accumulator;
19553 /** Used to stand-in for `undefined` hash values. */
19554 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19557 * Adds `value` to the array cache.
19561 * @memberOf SetCache
19563 * @param {*} value The value to cache.
19564 * @returns {Object} Returns the cache instance.
19566 function setCacheAdd(value) {
19567 this.__data__.set(value, HASH_UNDEFINED$2);
19572 * Checks if `value` is in the array cache.
19576 * @memberOf SetCache
19577 * @param {*} value The value to search for.
19578 * @returns {number} Returns `true` if `value` is found, else `false`.
19580 function setCacheHas(value) {
19581 return this.__data__.has(value);
19586 * Creates an array cache object to store unique values.
19590 * @param {Array} [values] The values to cache.
19592 function SetCache(values) {
19594 length = values == null ? 0 : values.length;
19596 this.__data__ = new MapCache;
19597 while (++index < length) {
19598 this.add(values[index]);
19602 // Add methods to `SetCache`.
19603 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19604 SetCache.prototype.has = setCacheHas;
19607 * A specialized version of `_.some` for arrays without support for iteratee
19611 * @param {Array} [array] The array to iterate over.
19612 * @param {Function} predicate The function invoked per iteration.
19613 * @returns {boolean} Returns `true` if any element passes the predicate check,
19616 function arraySome(array, predicate) {
19618 length = array == null ? 0 : array.length;
19620 while (++index < length) {
19621 if (predicate(array[index], index, array)) {
19629 * Checks if a `cache` value for `key` exists.
19632 * @param {Object} cache The cache to query.
19633 * @param {string} key The key of the entry to check.
19634 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19636 function cacheHas(cache, key) {
19637 return cache.has(key);
19640 /** Used to compose bitmasks for value comparisons. */
19641 var COMPARE_PARTIAL_FLAG = 1,
19642 COMPARE_UNORDERED_FLAG = 2;
19645 * A specialized version of `baseIsEqualDeep` for arrays with support for
19646 * partial deep comparisons.
19649 * @param {Array} array The array to compare.
19650 * @param {Array} other The other array to compare.
19651 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19652 * @param {Function} customizer The function to customize comparisons.
19653 * @param {Function} equalFunc The function to determine equivalents of values.
19654 * @param {Object} stack Tracks traversed `array` and `other` objects.
19655 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19657 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19658 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19659 arrLength = array.length,
19660 othLength = other.length;
19662 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19665 // Assume cyclic values are equal.
19666 var stacked = stack.get(array);
19667 if (stacked && stack.get(other)) {
19668 return stacked == other;
19672 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19674 stack.set(array, other);
19675 stack.set(other, array);
19677 // Ignore non-index properties.
19678 while (++index < arrLength) {
19679 var arrValue = array[index],
19680 othValue = other[index];
19683 var compared = isPartial
19684 ? customizer(othValue, arrValue, index, other, array, stack)
19685 : customizer(arrValue, othValue, index, array, other, stack);
19687 if (compared !== undefined) {
19694 // Recursively compare arrays (susceptible to call stack limits).
19696 if (!arraySome(other, function(othValue, othIndex) {
19697 if (!cacheHas(seen, othIndex) &&
19698 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19699 return seen.push(othIndex);
19706 arrValue === othValue ||
19707 equalFunc(arrValue, othValue, bitmask, customizer, stack)
19713 stack['delete'](array);
19714 stack['delete'](other);
19719 * Converts `map` to its key-value pairs.
19722 * @param {Object} map The map to convert.
19723 * @returns {Array} Returns the key-value pairs.
19725 function mapToArray(map) {
19727 result = Array(map.size);
19729 map.forEach(function(value, key) {
19730 result[++index] = [key, value];
19736 * Converts `set` to an array of its values.
19739 * @param {Object} set The set to convert.
19740 * @returns {Array} Returns the values.
19742 function setToArray(set) {
19744 result = Array(set.size);
19746 set.forEach(function(value) {
19747 result[++index] = value;
19752 /** Used to compose bitmasks for value comparisons. */
19753 var COMPARE_PARTIAL_FLAG$1 = 1,
19754 COMPARE_UNORDERED_FLAG$1 = 2;
19756 /** `Object#toString` result references. */
19757 var boolTag$3 = '[object Boolean]',
19758 dateTag$3 = '[object Date]',
19759 errorTag$2 = '[object Error]',
19760 mapTag$5 = '[object Map]',
19761 numberTag$3 = '[object Number]',
19762 regexpTag$3 = '[object RegExp]',
19763 setTag$5 = '[object Set]',
19764 stringTag$3 = '[object String]',
19765 symbolTag$2 = '[object Symbol]';
19767 var arrayBufferTag$3 = '[object ArrayBuffer]',
19768 dataViewTag$4 = '[object DataView]';
19770 /** Used to convert symbols to primitives and strings. */
19771 var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19772 symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19775 * A specialized version of `baseIsEqualDeep` for comparing objects of
19776 * the same `toStringTag`.
19778 * **Note:** This function only supports comparing values with tags of
19779 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19782 * @param {Object} object The object to compare.
19783 * @param {Object} other The other object to compare.
19784 * @param {string} tag The `toStringTag` of the objects to compare.
19785 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19786 * @param {Function} customizer The function to customize comparisons.
19787 * @param {Function} equalFunc The function to determine equivalents of values.
19788 * @param {Object} stack Tracks traversed `object` and `other` objects.
19789 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19791 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19793 case dataViewTag$4:
19794 if ((object.byteLength != other.byteLength) ||
19795 (object.byteOffset != other.byteOffset)) {
19798 object = object.buffer;
19799 other = other.buffer;
19801 case arrayBufferTag$3:
19802 if ((object.byteLength != other.byteLength) ||
19803 !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19811 // Coerce booleans to `1` or `0` and dates to milliseconds.
19812 // Invalid dates are coerced to `NaN`.
19813 return eq(+object, +other);
19816 return object.name == other.name && object.message == other.message;
19820 // Coerce regexes to strings and treat strings, primitives and objects,
19821 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19822 // for more details.
19823 return object == (other + '');
19826 var convert = mapToArray;
19829 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19830 convert || (convert = setToArray);
19832 if (object.size != other.size && !isPartial) {
19835 // Assume cyclic values are equal.
19836 var stacked = stack.get(object);
19838 return stacked == other;
19840 bitmask |= COMPARE_UNORDERED_FLAG$1;
19842 // Recursively compare objects (susceptible to call stack limits).
19843 stack.set(object, other);
19844 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19845 stack['delete'](object);
19849 if (symbolValueOf$1) {
19850 return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19856 /** Used to compose bitmasks for value comparisons. */
19857 var COMPARE_PARTIAL_FLAG$2 = 1;
19859 /** Used for built-in method references. */
19860 var objectProto$13 = Object.prototype;
19862 /** Used to check objects for own properties. */
19863 var hasOwnProperty$10 = objectProto$13.hasOwnProperty;
19866 * A specialized version of `baseIsEqualDeep` for objects with support for
19867 * partial deep comparisons.
19870 * @param {Object} object The object to compare.
19871 * @param {Object} other The other object to compare.
19872 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19873 * @param {Function} customizer The function to customize comparisons.
19874 * @param {Function} equalFunc The function to determine equivalents of values.
19875 * @param {Object} stack Tracks traversed `object` and `other` objects.
19876 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19878 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19879 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19880 objProps = getAllKeys(object),
19881 objLength = objProps.length,
19882 othProps = getAllKeys(other),
19883 othLength = othProps.length;
19885 if (objLength != othLength && !isPartial) {
19888 var index = objLength;
19890 var key = objProps[index];
19891 if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19895 // Assume cyclic values are equal.
19896 var stacked = stack.get(object);
19897 if (stacked && stack.get(other)) {
19898 return stacked == other;
19901 stack.set(object, other);
19902 stack.set(other, object);
19904 var skipCtor = isPartial;
19905 while (++index < objLength) {
19906 key = objProps[index];
19907 var objValue = object[key],
19908 othValue = other[key];
19911 var compared = isPartial
19912 ? customizer(othValue, objValue, key, other, object, stack)
19913 : customizer(objValue, othValue, key, object, other, stack);
19915 // Recursively compare objects (susceptible to call stack limits).
19916 if (!(compared === undefined
19917 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19923 skipCtor || (skipCtor = key == 'constructor');
19925 if (result && !skipCtor) {
19926 var objCtor = object.constructor,
19927 othCtor = other.constructor;
19929 // Non `Object` object instances with different constructors are not equal.
19930 if (objCtor != othCtor &&
19931 ('constructor' in object && 'constructor' in other) &&
19932 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19933 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19937 stack['delete'](object);
19938 stack['delete'](other);
19942 /** Used to compose bitmasks for value comparisons. */
19943 var COMPARE_PARTIAL_FLAG$3 = 1;
19945 /** `Object#toString` result references. */
19946 var argsTag$3 = '[object Arguments]',
19947 arrayTag$2 = '[object Array]',
19948 objectTag$3 = '[object Object]';
19950 /** Used for built-in method references. */
19951 var objectProto$14 = Object.prototype;
19953 /** Used to check objects for own properties. */
19954 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
19957 * A specialized version of `baseIsEqual` for arrays and objects which performs
19958 * deep comparisons and tracks traversed objects enabling objects with circular
19959 * references to be compared.
19962 * @param {Object} object The object to compare.
19963 * @param {Object} other The other object to compare.
19964 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19965 * @param {Function} customizer The function to customize comparisons.
19966 * @param {Function} equalFunc The function to determine equivalents of values.
19967 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19968 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19970 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19971 var objIsArr = isArray(object),
19972 othIsArr = isArray(other),
19973 objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19974 othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19976 objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19977 othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19979 var objIsObj = objTag == objectTag$3,
19980 othIsObj = othTag == objectTag$3,
19981 isSameTag = objTag == othTag;
19983 if (isSameTag && isBuffer(object)) {
19984 if (!isBuffer(other)) {
19990 if (isSameTag && !objIsObj) {
19991 stack || (stack = new Stack);
19992 return (objIsArr || isTypedArray(object))
19993 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19994 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19996 if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
19997 var objIsWrapped = objIsObj && hasOwnProperty$11.call(object, '__wrapped__'),
19998 othIsWrapped = othIsObj && hasOwnProperty$11.call(other, '__wrapped__');
20000 if (objIsWrapped || othIsWrapped) {
20001 var objUnwrapped = objIsWrapped ? object.value() : object,
20002 othUnwrapped = othIsWrapped ? other.value() : other;
20004 stack || (stack = new Stack);
20005 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20011 stack || (stack = new Stack);
20012 return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20016 * The base implementation of `_.isEqual` which supports partial comparisons
20017 * and tracks traversed objects.
20020 * @param {*} value The value to compare.
20021 * @param {*} other The other value to compare.
20022 * @param {boolean} bitmask The bitmask flags.
20023 * 1 - Unordered comparison
20024 * 2 - Partial comparison
20025 * @param {Function} [customizer] The function to customize comparisons.
20026 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20027 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20029 function baseIsEqual(value, other, bitmask, customizer, stack) {
20030 if (value === other) {
20033 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20034 return value !== value && other !== other;
20036 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20039 /** Used to compose bitmasks for value comparisons. */
20040 var COMPARE_PARTIAL_FLAG$4 = 1,
20041 COMPARE_UNORDERED_FLAG$2 = 2;
20044 * The base implementation of `_.isMatch` without support for iteratee shorthands.
20047 * @param {Object} object The object to inspect.
20048 * @param {Object} source The object of property values to match.
20049 * @param {Array} matchData The property names, values, and compare flags to match.
20050 * @param {Function} [customizer] The function to customize comparisons.
20051 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20053 function baseIsMatch(object, source, matchData, customizer) {
20054 var index = matchData.length,
20056 noCustomizer = !customizer;
20058 if (object == null) {
20061 object = Object(object);
20063 var data = matchData[index];
20064 if ((noCustomizer && data[2])
20065 ? data[1] !== object[data[0]]
20066 : !(data[0] in object)
20071 while (++index < length) {
20072 data = matchData[index];
20074 objValue = object[key],
20075 srcValue = data[1];
20077 if (noCustomizer && data[2]) {
20078 if (objValue === undefined && !(key in object)) {
20082 var stack = new Stack;
20084 var result = customizer(objValue, srcValue, key, object, source, stack);
20086 if (!(result === undefined
20087 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20098 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20101 * @param {*} value The value to check.
20102 * @returns {boolean} Returns `true` if `value` if suitable for strict
20103 * equality comparisons, else `false`.
20105 function isStrictComparable(value) {
20106 return value === value && !isObject(value);
20110 * Gets the property names, values, and compare flags of `object`.
20113 * @param {Object} object The object to query.
20114 * @returns {Array} Returns the match data of `object`.
20116 function getMatchData(object) {
20117 var result = keys$1(object),
20118 length = result.length;
20121 var key = result[length],
20122 value = object[key];
20124 result[length] = [key, value, isStrictComparable(value)];
20130 * A specialized version of `matchesProperty` for source values suitable
20131 * for strict equality comparisons, i.e. `===`.
20134 * @param {string} key The key of the property to get.
20135 * @param {*} srcValue The value to match.
20136 * @returns {Function} Returns the new spec function.
20138 function matchesStrictComparable(key, srcValue) {
20139 return function(object) {
20140 if (object == null) {
20143 return object[key] === srcValue &&
20144 (srcValue !== undefined || (key in Object(object)));
20149 * The base implementation of `_.matches` which doesn't clone `source`.
20152 * @param {Object} source The object of property values to match.
20153 * @returns {Function} Returns the new spec function.
20155 function baseMatches(source) {
20156 var matchData = getMatchData(source);
20157 if (matchData.length == 1 && matchData[0][2]) {
20158 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20160 return function(object) {
20161 return object === source || baseIsMatch(object, source, matchData);
20165 /** `Object#toString` result references. */
20166 var symbolTag$3 = '[object Symbol]';
20169 * Checks if `value` is classified as a `Symbol` primitive or object.
20175 * @param {*} value The value to check.
20176 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20179 * _.isSymbol(Symbol.iterator);
20182 * _.isSymbol('abc');
20185 function isSymbol(value) {
20186 return typeof value == 'symbol' ||
20187 (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20190 /** Used to match property names within property paths. */
20191 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20192 reIsPlainProp = /^\w*$/;
20195 * Checks if `value` is a property name and not a property path.
20198 * @param {*} value The value to check.
20199 * @param {Object} [object] The object to query keys on.
20200 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20202 function isKey(value, object) {
20203 if (isArray(value)) {
20206 var type = typeof value;
20207 if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20208 value == null || isSymbol(value)) {
20211 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20212 (object != null && value in Object(object));
20215 /** Error message constants. */
20216 var FUNC_ERROR_TEXT = 'Expected a function';
20219 * Creates a function that memoizes the result of `func`. If `resolver` is
20220 * provided, it determines the cache key for storing the result based on the
20221 * arguments provided to the memoized function. By default, the first argument
20222 * provided to the memoized function is used as the map cache key. The `func`
20223 * is invoked with the `this` binding of the memoized function.
20225 * **Note:** The cache is exposed as the `cache` property on the memoized
20226 * function. Its creation may be customized by replacing the `_.memoize.Cache`
20227 * constructor with one whose instances implement the
20228 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20229 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20234 * @category Function
20235 * @param {Function} func The function to have its output memoized.
20236 * @param {Function} [resolver] The function to resolve the cache key.
20237 * @returns {Function} Returns the new memoized function.
20240 * var object = { 'a': 1, 'b': 2 };
20241 * var other = { 'c': 3, 'd': 4 };
20243 * var values = _.memoize(_.values);
20254 * // Modify the result cache.
20255 * values.cache.set(object, ['a', 'b']);
20259 * // Replace `_.memoize.Cache`.
20260 * _.memoize.Cache = WeakMap;
20262 function memoize(func, resolver) {
20263 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20264 throw new TypeError(FUNC_ERROR_TEXT);
20266 var memoized = function() {
20267 var args = arguments,
20268 key = resolver ? resolver.apply(this, args) : args[0],
20269 cache = memoized.cache;
20271 if (cache.has(key)) {
20272 return cache.get(key);
20274 var result = func.apply(this, args);
20275 memoized.cache = cache.set(key, result) || cache;
20278 memoized.cache = new (memoize.Cache || MapCache);
20282 // Expose `MapCache`.
20283 memoize.Cache = MapCache;
20285 /** Used as the maximum memoize cache size. */
20286 var MAX_MEMOIZE_SIZE = 500;
20289 * A specialized version of `_.memoize` which clears the memoized function's
20290 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20293 * @param {Function} func The function to have its output memoized.
20294 * @returns {Function} Returns the new memoized function.
20296 function memoizeCapped(func) {
20297 var result = memoize(func, function(key) {
20298 if (cache.size === MAX_MEMOIZE_SIZE) {
20304 var cache = result.cache;
20308 /** Used to match property names within property paths. */
20309 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20311 /** Used to match backslashes in property paths. */
20312 var reEscapeChar = /\\(\\)?/g;
20315 * Converts `string` to a property path array.
20318 * @param {string} string The string to convert.
20319 * @returns {Array} Returns the property path array.
20321 var stringToPath = memoizeCapped(function(string) {
20323 if (string.charCodeAt(0) === 46 /* . */) {
20326 string.replace(rePropName, function(match, number, quote, subString) {
20327 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20333 * A specialized version of `_.map` for arrays without support for iteratee
20337 * @param {Array} [array] The array to iterate over.
20338 * @param {Function} iteratee The function invoked per iteration.
20339 * @returns {Array} Returns the new mapped array.
20341 function arrayMap(array, iteratee) {
20343 length = array == null ? 0 : array.length,
20344 result = Array(length);
20346 while (++index < length) {
20347 result[index] = iteratee(array[index], index, array);
20352 /** Used as references for various `Number` constants. */
20353 var INFINITY = 1 / 0;
20355 /** Used to convert symbols to primitives and strings. */
20356 var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20357 symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20360 * The base implementation of `_.toString` which doesn't convert nullish
20361 * values to empty strings.
20364 * @param {*} value The value to process.
20365 * @returns {string} Returns the string.
20367 function baseToString(value) {
20368 // Exit early for strings to avoid a performance hit in some environments.
20369 if (typeof value == 'string') {
20372 if (isArray(value)) {
20373 // Recursively convert values (susceptible to call stack limits).
20374 return arrayMap(value, baseToString) + '';
20376 if (isSymbol(value)) {
20377 return symbolToString ? symbolToString.call(value) : '';
20379 var result = (value + '');
20380 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20384 * Converts `value` to a string. An empty string is returned for `null`
20385 * and `undefined` values. The sign of `-0` is preserved.
20391 * @param {*} value The value to convert.
20392 * @returns {string} Returns the converted string.
20395 * _.toString(null);
20401 * _.toString([1, 2, 3]);
20404 function toString(value) {
20405 return value == null ? '' : baseToString(value);
20409 * Casts `value` to a path array if it's not one.
20412 * @param {*} value The value to inspect.
20413 * @param {Object} [object] The object to query keys on.
20414 * @returns {Array} Returns the cast property path array.
20416 function castPath(value, object) {
20417 if (isArray(value)) {
20420 return isKey(value, object) ? [value] : stringToPath(toString(value));
20423 /** Used as references for various `Number` constants. */
20424 var INFINITY$1 = 1 / 0;
20427 * Converts `value` to a string key if it's not a string or symbol.
20430 * @param {*} value The value to inspect.
20431 * @returns {string|symbol} Returns the key.
20433 function toKey(value) {
20434 if (typeof value == 'string' || isSymbol(value)) {
20437 var result = (value + '');
20438 return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20442 * The base implementation of `_.get` without support for default values.
20445 * @param {Object} object The object to query.
20446 * @param {Array|string} path The path of the property to get.
20447 * @returns {*} Returns the resolved value.
20449 function baseGet(object, path) {
20450 path = castPath(path, object);
20453 length = path.length;
20455 while (object != null && index < length) {
20456 object = object[toKey(path[index++])];
20458 return (index && index == length) ? object : undefined;
20462 * Gets the value at `path` of `object`. If the resolved value is
20463 * `undefined`, the `defaultValue` is returned in its place.
20469 * @param {Object} object The object to query.
20470 * @param {Array|string} path The path of the property to get.
20471 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20472 * @returns {*} Returns the resolved value.
20475 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20477 * _.get(object, 'a[0].b.c');
20480 * _.get(object, ['a', '0', 'b', 'c']);
20483 * _.get(object, 'a.b.c', 'default');
20486 function get$2(object, path, defaultValue) {
20487 var result = object == null ? undefined : baseGet(object, path);
20488 return result === undefined ? defaultValue : result;
20492 * The base implementation of `_.hasIn` without support for deep paths.
20495 * @param {Object} [object] The object to query.
20496 * @param {Array|string} key The key to check.
20497 * @returns {boolean} Returns `true` if `key` exists, else `false`.
20499 function baseHasIn(object, key) {
20500 return object != null && key in Object(object);
20504 * Checks if `path` exists on `object`.
20507 * @param {Object} object The object to query.
20508 * @param {Array|string} path The path to check.
20509 * @param {Function} hasFunc The function to check properties.
20510 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20512 function hasPath(object, path, hasFunc) {
20513 path = castPath(path, object);
20516 length = path.length,
20519 while (++index < length) {
20520 var key = toKey(path[index]);
20521 if (!(result = object != null && hasFunc(object, key))) {
20524 object = object[key];
20526 if (result || ++index != length) {
20529 length = object == null ? 0 : object.length;
20530 return !!length && isLength(length) && isIndex(key, length) &&
20531 (isArray(object) || isArguments(object));
20535 * Checks if `path` is a direct or inherited property of `object`.
20541 * @param {Object} object The object to query.
20542 * @param {Array|string} path The path to check.
20543 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20546 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20548 * _.hasIn(object, 'a');
20551 * _.hasIn(object, 'a.b');
20554 * _.hasIn(object, ['a', 'b']);
20557 * _.hasIn(object, 'b');
20560 function hasIn(object, path) {
20561 return object != null && hasPath(object, path, baseHasIn);
20564 /** Used to compose bitmasks for value comparisons. */
20565 var COMPARE_PARTIAL_FLAG$5 = 1,
20566 COMPARE_UNORDERED_FLAG$3 = 2;
20569 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20572 * @param {string} path The path of the property to get.
20573 * @param {*} srcValue The value to match.
20574 * @returns {Function} Returns the new spec function.
20576 function baseMatchesProperty(path, srcValue) {
20577 if (isKey(path) && isStrictComparable(srcValue)) {
20578 return matchesStrictComparable(toKey(path), srcValue);
20580 return function(object) {
20581 var objValue = get$2(object, path);
20582 return (objValue === undefined && objValue === srcValue)
20583 ? hasIn(object, path)
20584 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20589 * This method returns the first argument it receives.
20595 * @param {*} value Any value.
20596 * @returns {*} Returns `value`.
20599 * var object = { 'a': 1 };
20601 * console.log(_.identity(object) === object);
20604 function identity$8(value) {
20609 * The base implementation of `_.property` without support for deep paths.
20612 * @param {string} key The key of the property to get.
20613 * @returns {Function} Returns the new accessor function.
20615 function baseProperty(key) {
20616 return function(object) {
20617 return object == null ? undefined : object[key];
20622 * A specialized version of `baseProperty` which supports deep paths.
20625 * @param {Array|string} path The path of the property to get.
20626 * @returns {Function} Returns the new accessor function.
20628 function basePropertyDeep(path) {
20629 return function(object) {
20630 return baseGet(object, path);
20635 * Creates a function that returns the value at `path` of a given object.
20641 * @param {Array|string} path The path of the property to get.
20642 * @returns {Function} Returns the new accessor function.
20646 * { 'a': { 'b': 2 } },
20647 * { 'a': { 'b': 1 } }
20650 * _.map(objects, _.property('a.b'));
20653 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20656 function property(path) {
20657 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20661 * The base implementation of `_.iteratee`.
20664 * @param {*} [value=_.identity] The value to convert to an iteratee.
20665 * @returns {Function} Returns the iteratee.
20667 function baseIteratee(value) {
20668 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20669 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20670 if (typeof value == 'function') {
20673 if (value == null) {
20676 if (typeof value == 'object') {
20677 return isArray(value)
20678 ? baseMatchesProperty(value[0], value[1])
20679 : baseMatches(value);
20681 return property(value);
20685 * Creates a function like `_.groupBy`.
20688 * @param {Function} setter The function to set accumulator values.
20689 * @param {Function} [initializer] The accumulator object initializer.
20690 * @returns {Function} Returns the new aggregator function.
20692 function createAggregator(setter, initializer) {
20693 return function(collection, iteratee) {
20694 var func = isArray(collection) ? arrayAggregator : baseAggregator,
20695 accumulator = initializer ? initializer() : {};
20697 return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20701 /** Used for built-in method references. */
20702 var objectProto$15 = Object.prototype;
20704 /** Used to check objects for own properties. */
20705 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
20708 * Creates an object composed of keys generated from the results of running
20709 * each element of `collection` thru `iteratee`. The order of grouped values
20710 * is determined by the order they occur in `collection`. The corresponding
20711 * value of each key is an array of elements responsible for generating the
20712 * key. The iteratee is invoked with one argument: (value).
20717 * @category Collection
20718 * @param {Array|Object} collection The collection to iterate over.
20719 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20720 * @returns {Object} Returns the composed aggregate object.
20723 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20724 * // => { '4': [4.2], '6': [6.1, 6.3] }
20726 * // The `_.property` iteratee shorthand.
20727 * _.groupBy(['one', 'two', 'three'], 'length');
20728 * // => { '3': ['one', 'two'], '5': ['three'] }
20730 var groupBy = createAggregator(function(result, value, key) {
20731 if (hasOwnProperty$12.call(result, key)) {
20732 result[key].push(value);
20734 baseAssignValue(result, key, [value]);
20739 * Gets the last element of `array`.
20745 * @param {Array} array The array to query.
20746 * @returns {*} Returns the last element of `array`.
20749 * _.last([1, 2, 3]);
20752 function last(array) {
20753 var length = array == null ? 0 : array.length;
20754 return length ? array[length - 1] : undefined;
20758 * The base implementation of `_.slice` without an iteratee call guard.
20761 * @param {Array} array The array to slice.
20762 * @param {number} [start=0] The start position.
20763 * @param {number} [end=array.length] The end position.
20764 * @returns {Array} Returns the slice of `array`.
20766 function baseSlice(array, start, end) {
20768 length = array.length;
20771 start = -start > length ? 0 : (length + start);
20773 end = end > length ? length : end;
20777 length = start > end ? 0 : ((end - start) >>> 0);
20780 var result = Array(length);
20781 while (++index < length) {
20782 result[index] = array[index + start];
20788 * Gets the parent value at `path` of `object`.
20791 * @param {Object} object The object to query.
20792 * @param {Array} path The path to get the parent value of.
20793 * @returns {*} Returns the parent value.
20795 function parent(object, path) {
20796 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20800 * The base implementation of `_.unset`.
20803 * @param {Object} object The object to modify.
20804 * @param {Array|string} path The property path to unset.
20805 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20807 function baseUnset(object, path) {
20808 path = castPath(path, object);
20809 object = parent(object, path);
20810 return object == null || delete object[toKey(last(path))];
20813 /** `Object#toString` result references. */
20814 var objectTag$4 = '[object Object]';
20816 /** Used for built-in method references. */
20817 var funcProto$2 = Function.prototype,
20818 objectProto$16 = Object.prototype;
20820 /** Used to resolve the decompiled source of functions. */
20821 var funcToString$2 = funcProto$2.toString;
20823 /** Used to check objects for own properties. */
20824 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
20826 /** Used to infer the `Object` constructor. */
20827 var objectCtorString = funcToString$2.call(Object);
20830 * Checks if `value` is a plain object, that is, an object created by the
20831 * `Object` constructor or one with a `[[Prototype]]` of `null`.
20837 * @param {*} value The value to check.
20838 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20845 * _.isPlainObject(new Foo);
20848 * _.isPlainObject([1, 2, 3]);
20851 * _.isPlainObject({ 'x': 0, 'y': 0 });
20854 * _.isPlainObject(Object.create(null));
20857 function isPlainObject(value) {
20858 if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20861 var proto = getPrototype(value);
20862 if (proto === null) {
20865 var Ctor = hasOwnProperty$13.call(proto, 'constructor') && proto.constructor;
20866 return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20867 funcToString$2.call(Ctor) == objectCtorString;
20871 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20875 * @param {*} value The value to inspect.
20876 * @param {string} key The key of the property to inspect.
20877 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20879 function customOmitClone(value) {
20880 return isPlainObject(value) ? undefined : value;
20883 /** Built-in value references. */
20884 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20887 * Checks if `value` is a flattenable `arguments` object or array.
20890 * @param {*} value The value to check.
20891 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20893 function isFlattenable(value) {
20894 return isArray(value) || isArguments(value) ||
20895 !!(spreadableSymbol && value && value[spreadableSymbol]);
20899 * The base implementation of `_.flatten` with support for restricting flattening.
20902 * @param {Array} array The array to flatten.
20903 * @param {number} depth The maximum recursion depth.
20904 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20905 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20906 * @param {Array} [result=[]] The initial result value.
20907 * @returns {Array} Returns the new flattened array.
20909 function baseFlatten(array, depth, predicate, isStrict, result) {
20911 length = array.length;
20913 predicate || (predicate = isFlattenable);
20914 result || (result = []);
20916 while (++index < length) {
20917 var value = array[index];
20918 if (depth > 0 && predicate(value)) {
20920 // Recursively flatten arrays (susceptible to call stack limits).
20921 baseFlatten(value, depth - 1, predicate, isStrict, result);
20923 arrayPush(result, value);
20925 } else if (!isStrict) {
20926 result[result.length] = value;
20933 * Flattens `array` a single level deep.
20939 * @param {Array} array The array to flatten.
20940 * @returns {Array} Returns the new flattened array.
20943 * _.flatten([1, [2, [3, [4]], 5]]);
20944 * // => [1, 2, [3, [4]], 5]
20946 function flatten(array) {
20947 var length = array == null ? 0 : array.length;
20948 return length ? baseFlatten(array, 1) : [];
20952 * A faster alternative to `Function#apply`, this function invokes `func`
20953 * with the `this` binding of `thisArg` and the arguments of `args`.
20956 * @param {Function} func The function to invoke.
20957 * @param {*} thisArg The `this` binding of `func`.
20958 * @param {Array} args The arguments to invoke `func` with.
20959 * @returns {*} Returns the result of `func`.
20961 function apply(func, thisArg, args) {
20962 switch (args.length) {
20963 case 0: return func.call(thisArg);
20964 case 1: return func.call(thisArg, args[0]);
20965 case 2: return func.call(thisArg, args[0], args[1]);
20966 case 3: return func.call(thisArg, args[0], args[1], args[2]);
20968 return func.apply(thisArg, args);
20971 /* Built-in method references for those with the same name as other `lodash` methods. */
20972 var nativeMax = Math.max;
20975 * A specialized version of `baseRest` which transforms the rest array.
20978 * @param {Function} func The function to apply a rest parameter to.
20979 * @param {number} [start=func.length-1] The start position of the rest parameter.
20980 * @param {Function} transform The rest array transform.
20981 * @returns {Function} Returns the new function.
20983 function overRest(func, start, transform) {
20984 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20985 return function() {
20986 var args = arguments,
20988 length = nativeMax(args.length - start, 0),
20989 array = Array(length);
20991 while (++index < length) {
20992 array[index] = args[start + index];
20995 var otherArgs = Array(start + 1);
20996 while (++index < start) {
20997 otherArgs[index] = args[index];
20999 otherArgs[start] = transform(array);
21000 return apply(func, this, otherArgs);
21005 * Creates a function that returns `value`.
21011 * @param {*} value The value to return from the new function.
21012 * @returns {Function} Returns the new constant function.
21015 * var objects = _.times(2, _.constant({ 'a': 1 }));
21017 * console.log(objects);
21018 * // => [{ 'a': 1 }, { 'a': 1 }]
21020 * console.log(objects[0] === objects[1]);
21023 function constant$13(value) {
21024 return function() {
21030 * The base implementation of `setToString` without support for hot loop shorting.
21033 * @param {Function} func The function to modify.
21034 * @param {Function} string The `toString` result.
21035 * @returns {Function} Returns `func`.
21037 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21038 return defineProperty(func, 'toString', {
21039 'configurable': true,
21040 'enumerable': false,
21041 'value': constant$13(string),
21046 /** Used to detect hot functions by number of calls within a span of milliseconds. */
21047 var HOT_COUNT = 800,
21050 /* Built-in method references for those with the same name as other `lodash` methods. */
21051 var nativeNow = Date.now;
21054 * Creates a function that'll short out and invoke `identity` instead
21055 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21059 * @param {Function} func The function to restrict.
21060 * @returns {Function} Returns the new shortable function.
21062 function shortOut(func) {
21066 return function() {
21067 var stamp = nativeNow(),
21068 remaining = HOT_SPAN - (stamp - lastCalled);
21070 lastCalled = stamp;
21071 if (remaining > 0) {
21072 if (++count >= HOT_COUNT) {
21073 return arguments[0];
21078 return func.apply(undefined, arguments);
21083 * Sets the `toString` method of `func` to return `string`.
21086 * @param {Function} func The function to modify.
21087 * @param {Function} string The `toString` result.
21088 * @returns {Function} Returns `func`.
21090 var setToString = shortOut(baseSetToString);
21093 * A specialized version of `baseRest` which flattens the rest array.
21096 * @param {Function} func The function to apply a rest parameter to.
21097 * @returns {Function} Returns the new function.
21099 function flatRest(func) {
21100 return setToString(overRest(func, undefined, flatten), func + '');
21103 /** Used to compose bitmasks for cloning. */
21104 var CLONE_DEEP_FLAG$1 = 1,
21105 CLONE_FLAT_FLAG$1 = 2,
21106 CLONE_SYMBOLS_FLAG$2 = 4;
21109 * The opposite of `_.pick`; this method creates an object composed of the
21110 * own and inherited enumerable property paths of `object` that are not omitted.
21112 * **Note:** This method is considerably slower than `_.pick`.
21118 * @param {Object} object The source object.
21119 * @param {...(string|string[])} [paths] The property paths to omit.
21120 * @returns {Object} Returns the new object.
21123 * var object = { 'a': 1, 'b': '2', 'c': 3 };
21125 * _.omit(object, ['a', 'c']);
21126 * // => { 'b': '2' }
21128 var omit = flatRest(function(object, paths) {
21130 if (object == null) {
21133 var isDeep = false;
21134 paths = arrayMap(paths, function(path) {
21135 path = castPath(path, object);
21136 isDeep || (isDeep = path.length > 1);
21139 copyObject(object, getAllKeysIn(object), result);
21141 result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21143 var length = paths.length;
21145 baseUnset(result, paths[length]);
21151 * Creates an array with all falsey values removed. The values `false`, `null`,
21152 * `0`, `""`, `undefined`, and `NaN` are falsey.
21158 * @param {Array} array The array to compact.
21159 * @returns {Array} Returns the new array of filtered values.
21162 * _.compact([0, 1, false, 2, '', 3]);
21165 function compact(array) {
21167 length = array == null ? 0 : array.length,
21171 while (++index < length) {
21172 var value = array[index];
21174 result[resIndex++] = value;
21181 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21184 * @param {Function} func The function to apply a rest parameter to.
21185 * @param {number} [start=func.length-1] The start position of the rest parameter.
21186 * @returns {Function} Returns the new function.
21188 function baseRest(func, start) {
21189 return setToString(overRest(func, start, identity$8), func + '');
21193 * Checks if the given arguments are from an iteratee call.
21196 * @param {*} value The potential iteratee value argument.
21197 * @param {*} index The potential iteratee index or key argument.
21198 * @param {*} object The potential iteratee object argument.
21199 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21202 function isIterateeCall(value, index, object) {
21203 if (!isObject(object)) {
21206 var type = typeof index;
21207 if (type == 'number'
21208 ? (isArrayLike(object) && isIndex(index, object.length))
21209 : (type == 'string' && index in object)
21211 return eq(object[index], value);
21217 * Creates a function like `_.assign`.
21220 * @param {Function} assigner The function to assign values.
21221 * @returns {Function} Returns the new assigner function.
21223 function createAssigner(assigner) {
21224 return baseRest(function(object, sources) {
21226 length = sources.length,
21227 customizer = length > 1 ? sources[length - 1] : undefined,
21228 guard = length > 2 ? sources[2] : undefined;
21230 customizer = (assigner.length > 3 && typeof customizer == 'function')
21231 ? (length--, customizer)
21234 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21235 customizer = length < 3 ? undefined : customizer;
21238 object = Object(object);
21239 while (++index < length) {
21240 var source = sources[index];
21242 assigner(object, source, index, customizer);
21250 * This method is like `_.assign` except that it iterates over own and
21251 * inherited source properties.
21253 * **Note:** This method mutates `object`.
21260 * @param {Object} object The destination object.
21261 * @param {...Object} [sources] The source objects.
21262 * @returns {Object} Returns `object`.
21274 * Foo.prototype.b = 2;
21275 * Bar.prototype.d = 4;
21277 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21278 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21280 var assignIn = createAssigner(function(object, source) {
21281 copyObject(source, keysIn$1(source), object);
21285 * The base implementation of `_.filter` without support for iteratee shorthands.
21288 * @param {Array|Object} collection The collection to iterate over.
21289 * @param {Function} predicate The function invoked per iteration.
21290 * @returns {Array} Returns the new filtered array.
21292 function baseFilter(collection, predicate) {
21294 baseEach(collection, function(value, index, collection) {
21295 if (predicate(value, index, collection)) {
21296 result.push(value);
21303 * Iterates over elements of `collection`, returning an array of all elements
21304 * `predicate` returns truthy for. The predicate is invoked with three
21305 * arguments: (value, index|key, collection).
21307 * **Note:** Unlike `_.remove`, this method returns a new array.
21312 * @category Collection
21313 * @param {Array|Object} collection The collection to iterate over.
21314 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21315 * @returns {Array} Returns the new filtered array.
21320 * { 'user': 'barney', 'age': 36, 'active': true },
21321 * { 'user': 'fred', 'age': 40, 'active': false }
21324 * _.filter(users, function(o) { return !o.active; });
21325 * // => objects for ['fred']
21327 * // The `_.matches` iteratee shorthand.
21328 * _.filter(users, { 'age': 36, 'active': true });
21329 * // => objects for ['barney']
21331 * // The `_.matchesProperty` iteratee shorthand.
21332 * _.filter(users, ['active', false]);
21333 * // => objects for ['fred']
21335 * // The `_.property` iteratee shorthand.
21336 * _.filter(users, 'active');
21337 * // => objects for ['barney']
21339 function filter(collection, predicate) {
21340 var func = isArray(collection) ? arrayFilter : baseFilter;
21341 return func(collection, baseIteratee(predicate, 3));
21345 * Creates a `_.find` or `_.findLast` function.
21348 * @param {Function} findIndexFunc The function to find the collection index.
21349 * @returns {Function} Returns the new find function.
21351 function createFind(findIndexFunc) {
21352 return function(collection, predicate, fromIndex) {
21353 var iterable = Object(collection);
21354 if (!isArrayLike(collection)) {
21355 var iteratee = baseIteratee(predicate, 3);
21356 collection = keys$1(collection);
21357 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21359 var index = findIndexFunc(collection, predicate, fromIndex);
21360 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21365 * The base implementation of `_.findIndex` and `_.findLastIndex` without
21366 * support for iteratee shorthands.
21369 * @param {Array} array The array to inspect.
21370 * @param {Function} predicate The function invoked per iteration.
21371 * @param {number} fromIndex The index to search from.
21372 * @param {boolean} [fromRight] Specify iterating from right to left.
21373 * @returns {number} Returns the index of the matched value, else `-1`.
21375 function baseFindIndex(array, predicate, fromIndex, fromRight) {
21376 var length = array.length,
21377 index = fromIndex + (fromRight ? 1 : -1);
21379 while ((fromRight ? index-- : ++index < length)) {
21380 if (predicate(array[index], index, array)) {
21387 /** Used as references for various `Number` constants. */
21390 /** Used to match leading and trailing whitespace. */
21391 var reTrim = /^\s+|\s+$/g;
21393 /** Used to detect bad signed hexadecimal string values. */
21394 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21396 /** Used to detect binary string values. */
21397 var reIsBinary = /^0b[01]+$/i;
21399 /** Used to detect octal string values. */
21400 var reIsOctal = /^0o[0-7]+$/i;
21402 /** Built-in method references without a dependency on `root`. */
21403 var freeParseInt = parseInt;
21406 * Converts `value` to a number.
21412 * @param {*} value The value to process.
21413 * @returns {number} Returns the number.
21419 * _.toNumber(Number.MIN_VALUE);
21422 * _.toNumber(Infinity);
21425 * _.toNumber('3.2');
21428 function toNumber(value) {
21429 if (typeof value == 'number') {
21432 if (isSymbol(value)) {
21435 if (isObject(value)) {
21436 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21437 value = isObject(other) ? (other + '') : other;
21439 if (typeof value != 'string') {
21440 return value === 0 ? value : +value;
21442 value = value.replace(reTrim, '');
21443 var isBinary = reIsBinary.test(value);
21444 return (isBinary || reIsOctal.test(value))
21445 ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21446 : (reIsBadHex.test(value) ? NAN : +value);
21449 /** Used as references for various `Number` constants. */
21450 var INFINITY$2 = 1 / 0,
21451 MAX_INTEGER = 1.7976931348623157e+308;
21454 * Converts `value` to a finite number.
21460 * @param {*} value The value to convert.
21461 * @returns {number} Returns the converted number.
21467 * _.toFinite(Number.MIN_VALUE);
21470 * _.toFinite(Infinity);
21471 * // => 1.7976931348623157e+308
21473 * _.toFinite('3.2');
21476 function toFinite(value) {
21478 return value === 0 ? value : 0;
21480 value = toNumber(value);
21481 if (value === INFINITY$2 || value === -INFINITY$2) {
21482 var sign = (value < 0 ? -1 : 1);
21483 return sign * MAX_INTEGER;
21485 return value === value ? value : 0;
21489 * Converts `value` to an integer.
21491 * **Note:** This method is loosely based on
21492 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21498 * @param {*} value The value to convert.
21499 * @returns {number} Returns the converted integer.
21502 * _.toInteger(3.2);
21505 * _.toInteger(Number.MIN_VALUE);
21508 * _.toInteger(Infinity);
21509 * // => 1.7976931348623157e+308
21511 * _.toInteger('3.2');
21514 function toInteger(value) {
21515 var result = toFinite(value),
21516 remainder = result % 1;
21518 return result === result ? (remainder ? result - remainder : result) : 0;
21521 /* Built-in method references for those with the same name as other `lodash` methods. */
21522 var nativeMax$1 = Math.max;
21525 * This method is like `_.find` except that it returns the index of the first
21526 * element `predicate` returns truthy for instead of the element itself.
21532 * @param {Array} array The array to inspect.
21533 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21534 * @param {number} [fromIndex=0] The index to search from.
21535 * @returns {number} Returns the index of the found element, else `-1`.
21539 * { 'user': 'barney', 'active': false },
21540 * { 'user': 'fred', 'active': false },
21541 * { 'user': 'pebbles', 'active': true }
21544 * _.findIndex(users, function(o) { return o.user == 'barney'; });
21547 * // The `_.matches` iteratee shorthand.
21548 * _.findIndex(users, { 'user': 'fred', 'active': false });
21551 * // The `_.matchesProperty` iteratee shorthand.
21552 * _.findIndex(users, ['active', false]);
21555 * // The `_.property` iteratee shorthand.
21556 * _.findIndex(users, 'active');
21559 function findIndex(array, predicate, fromIndex) {
21560 var length = array == null ? 0 : array.length;
21564 var index = fromIndex == null ? 0 : toInteger(fromIndex);
21566 index = nativeMax$1(length + index, 0);
21568 return baseFindIndex(array, baseIteratee(predicate, 3), index);
21572 * Iterates over elements of `collection`, returning the first element
21573 * `predicate` returns truthy for. The predicate is invoked with three
21574 * arguments: (value, index|key, collection).
21579 * @category Collection
21580 * @param {Array|Object} collection The collection to inspect.
21581 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21582 * @param {number} [fromIndex=0] The index to search from.
21583 * @returns {*} Returns the matched element, else `undefined`.
21587 * { 'user': 'barney', 'age': 36, 'active': true },
21588 * { 'user': 'fred', 'age': 40, 'active': false },
21589 * { 'user': 'pebbles', 'age': 1, 'active': true }
21592 * _.find(users, function(o) { return o.age < 40; });
21593 * // => object for 'barney'
21595 * // The `_.matches` iteratee shorthand.
21596 * _.find(users, { 'age': 1, 'active': true });
21597 * // => object for 'pebbles'
21599 * // The `_.matchesProperty` iteratee shorthand.
21600 * _.find(users, ['active', false]);
21601 * // => object for 'fred'
21603 * // The `_.property` iteratee shorthand.
21604 * _.find(users, 'active');
21605 * // => object for 'barney'
21607 var find$1 = createFind(findIndex);
21610 * The base implementation of `_.map` without support for iteratee shorthands.
21613 * @param {Array|Object} collection The collection to iterate over.
21614 * @param {Function} iteratee The function invoked per iteration.
21615 * @returns {Array} Returns the new mapped array.
21617 function baseMap(collection, iteratee) {
21619 result = isArrayLike(collection) ? Array(collection.length) : [];
21621 baseEach(collection, function(value, key, collection) {
21622 result[++index] = iteratee(value, key, collection);
21628 * Creates an array of values by running each element in `collection` thru
21629 * `iteratee`. The iteratee is invoked with three arguments:
21630 * (value, index|key, collection).
21632 * Many lodash methods are guarded to work as iteratees for methods like
21633 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21635 * The guarded methods are:
21636 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21637 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21638 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21639 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21644 * @category Collection
21645 * @param {Array|Object} collection The collection to iterate over.
21646 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21647 * @returns {Array} Returns the new mapped array.
21650 * function square(n) {
21654 * _.map([4, 8], square);
21657 * _.map({ 'a': 4, 'b': 8 }, square);
21658 * // => [16, 64] (iteration order is not guaranteed)
21661 * { 'user': 'barney' },
21662 * { 'user': 'fred' }
21665 * // The `_.property` iteratee shorthand.
21666 * _.map(users, 'user');
21667 * // => ['barney', 'fred']
21669 function map$3(collection, iteratee) {
21670 var func = isArray(collection) ? arrayMap : baseMap;
21671 return func(collection, baseIteratee(iteratee, 3));
21675 * The base implementation of `_.values` and `_.valuesIn` which creates an
21676 * array of `object` property values corresponding to the property names
21680 * @param {Object} object The object to query.
21681 * @param {Array} props The property names to get values for.
21682 * @returns {Object} Returns the array of property values.
21684 function baseValues(object, props) {
21685 return arrayMap(props, function(key) {
21686 return object[key];
21691 * Creates an array of the own enumerable string keyed property values of `object`.
21693 * **Note:** Non-object values are coerced to objects.
21699 * @param {Object} object The object to query.
21700 * @returns {Array} Returns the array of property values.
21708 * Foo.prototype.c = 3;
21710 * _.values(new Foo);
21711 * // => [1, 2] (iteration order is not guaranteed)
21716 function values$1(object) {
21717 return object == null ? [] : baseValues(object, keys$1(object));
21721 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21722 * of key-value pairs for `object` corresponding to the property names of `props`.
21725 * @param {Object} object The object to query.
21726 * @param {Array} props The property names to get values for.
21727 * @returns {Object} Returns the key-value pairs.
21729 function baseToPairs(object, props) {
21730 return arrayMap(props, function(key) {
21731 return [key, object[key]];
21736 * Converts `set` to its value-value pairs.
21739 * @param {Object} set The set to convert.
21740 * @returns {Array} Returns the value-value pairs.
21742 function setToPairs(set) {
21744 result = Array(set.size);
21746 set.forEach(function(value) {
21747 result[++index] = [value, value];
21752 /** `Object#toString` result references. */
21753 var mapTag$6 = '[object Map]',
21754 setTag$6 = '[object Set]';
21757 * Creates a `_.toPairs` or `_.toPairsIn` function.
21760 * @param {Function} keysFunc The function to get the keys of a given object.
21761 * @returns {Function} Returns the new pairs function.
21763 function createToPairs(keysFunc) {
21764 return function(object) {
21765 var tag = getTag$1(object);
21766 if (tag == mapTag$6) {
21767 return mapToArray(object);
21769 if (tag == setTag$6) {
21770 return setToPairs(object);
21772 return baseToPairs(object, keysFunc(object));
21777 * Creates an array of own enumerable string keyed-value pairs for `object`
21778 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21779 * entries are returned.
21786 * @param {Object} object The object to query.
21787 * @returns {Array} Returns the key-value pairs.
21795 * Foo.prototype.c = 3;
21797 * _.toPairs(new Foo);
21798 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21800 var toPairs = createToPairs(keys$1);
21803 * The base implementation of `_.isNaN` without support for number objects.
21806 * @param {*} value The value to check.
21807 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21809 function baseIsNaN(value) {
21810 return value !== value;
21814 * A specialized version of `_.indexOf` which performs strict equality
21815 * comparisons of values, i.e. `===`.
21818 * @param {Array} array The array to inspect.
21819 * @param {*} value The value to search for.
21820 * @param {number} fromIndex The index to search from.
21821 * @returns {number} Returns the index of the matched value, else `-1`.
21823 function strictIndexOf(array, value, fromIndex) {
21824 var index = fromIndex - 1,
21825 length = array.length;
21827 while (++index < length) {
21828 if (array[index] === value) {
21836 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21839 * @param {Array} array The array to inspect.
21840 * @param {*} value The value to search for.
21841 * @param {number} fromIndex The index to search from.
21842 * @returns {number} Returns the index of the matched value, else `-1`.
21844 function baseIndexOf(array, value, fromIndex) {
21845 return value === value
21846 ? strictIndexOf(array, value, fromIndex)
21847 : baseFindIndex(array, baseIsNaN, fromIndex);
21851 * A specialized version of `_.includes` for arrays without support for
21852 * specifying an index to search from.
21855 * @param {Array} [array] The array to inspect.
21856 * @param {*} target The value to search for.
21857 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21859 function arrayIncludes(array, value) {
21860 var length = array == null ? 0 : array.length;
21861 return !!length && baseIndexOf(array, value, 0) > -1;
21865 * This function is like `arrayIncludes` except that it accepts a comparator.
21868 * @param {Array} [array] The array to inspect.
21869 * @param {*} target The value to search for.
21870 * @param {Function} comparator The comparator invoked per element.
21871 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21873 function arrayIncludesWith(array, value, comparator) {
21875 length = array == null ? 0 : array.length;
21877 while (++index < length) {
21878 if (comparator(value, array[index])) {
21886 * This method returns `undefined`.
21894 * _.times(2, _.noop);
21895 * // => [undefined, undefined]
21897 function noop$3() {
21898 // No operation performed.
21901 /** Used as references for various `Number` constants. */
21902 var INFINITY$3 = 1 / 0;
21905 * Creates a set object of `values`.
21908 * @param {Array} values The values to add to the set.
21909 * @returns {Object} Returns the new set.
21911 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21912 return new Set$1(values);
21915 /** Used as the size to enable large array optimizations. */
21916 var LARGE_ARRAY_SIZE$1 = 200;
21919 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21922 * @param {Array} array The array to inspect.
21923 * @param {Function} [iteratee] The iteratee invoked per element.
21924 * @param {Function} [comparator] The comparator invoked per element.
21925 * @returns {Array} Returns the new duplicate free array.
21927 function baseUniq(array, iteratee, comparator) {
21929 includes = arrayIncludes,
21930 length = array.length,
21937 includes = arrayIncludesWith;
21939 else if (length >= LARGE_ARRAY_SIZE$1) {
21940 var set = iteratee ? null : createSet(array);
21942 return setToArray(set);
21945 includes = cacheHas;
21946 seen = new SetCache;
21949 seen = iteratee ? [] : result;
21952 while (++index < length) {
21953 var value = array[index],
21954 computed = iteratee ? iteratee(value) : value;
21956 value = (comparator || value !== 0) ? value : 0;
21957 if (isCommon && computed === computed) {
21958 var seenIndex = seen.length;
21959 while (seenIndex--) {
21960 if (seen[seenIndex] === computed) {
21965 seen.push(computed);
21967 result.push(value);
21969 else if (!includes(seen, computed, comparator)) {
21970 if (seen !== result) {
21971 seen.push(computed);
21973 result.push(value);
21980 * This method is like `_.isArrayLike` except that it also checks if `value`
21987 * @param {*} value The value to check.
21988 * @returns {boolean} Returns `true` if `value` is an array-like object,
21992 * _.isArrayLikeObject([1, 2, 3]);
21995 * _.isArrayLikeObject(document.body.children);
21998 * _.isArrayLikeObject('abc');
22001 * _.isArrayLikeObject(_.noop);
22004 function isArrayLikeObject(value) {
22005 return isObjectLike(value) && isArrayLike(value);
22009 * Creates an array of unique values, in order, from all given arrays using
22010 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22011 * for equality comparisons.
22017 * @param {...Array} [arrays] The arrays to inspect.
22018 * @returns {Array} Returns the new array of combined values.
22021 * _.union([2], [1, 2]);
22024 var union = baseRest(function(arrays) {
22025 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22028 /** Used as the size to enable large array optimizations. */
22029 var LARGE_ARRAY_SIZE$2 = 200;
22032 * The base implementation of methods like `_.difference` without support
22033 * for excluding multiple arrays or iteratee shorthands.
22036 * @param {Array} array The array to inspect.
22037 * @param {Array} values The values to exclude.
22038 * @param {Function} [iteratee] The iteratee invoked per element.
22039 * @param {Function} [comparator] The comparator invoked per element.
22040 * @returns {Array} Returns the new array of filtered values.
22042 function baseDifference(array, values, iteratee, comparator) {
22044 includes = arrayIncludes,
22046 length = array.length,
22048 valuesLength = values.length;
22054 values = arrayMap(values, baseUnary(iteratee));
22057 includes = arrayIncludesWith;
22060 else if (values.length >= LARGE_ARRAY_SIZE$2) {
22061 includes = cacheHas;
22063 values = new SetCache(values);
22066 while (++index < length) {
22067 var value = array[index],
22068 computed = iteratee == null ? value : iteratee(value);
22070 value = (comparator || value !== 0) ? value : 0;
22071 if (isCommon && computed === computed) {
22072 var valuesIndex = valuesLength;
22073 while (valuesIndex--) {
22074 if (values[valuesIndex] === computed) {
22078 result.push(value);
22080 else if (!includes(values, computed, comparator)) {
22081 result.push(value);
22088 * Creates an array excluding all given values using
22089 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22090 * for equality comparisons.
22092 * **Note:** Unlike `_.pull`, this method returns a new array.
22098 * @param {Array} array The array to inspect.
22099 * @param {...*} [values] The values to exclude.
22100 * @returns {Array} Returns the new array of filtered values.
22101 * @see _.difference, _.xor
22104 * _.without([2, 1, 2, 3], 1, 2);
22107 var without = baseRest(function(array, values) {
22108 return isArrayLikeObject(array)
22109 ? baseDifference(array, values)
22113 function osmIsInterestingTag(key) {
22114 return key !== 'attribution' &&
22115 key !== 'created_by' &&
22116 key !== 'source' &&
22118 key.indexOf('tiger:') !== 0;
22123 var osmOneWayTags = {
22125 'chair_lift': true,
22126 'mixed_lift': true,
22131 'magic_carpet': true,
22142 'piste:halfpipe': true
22159 var osmPavedTags = {
22164 'concrete:lanes': true,
22165 'concrete:plates': true
22289 "беларуская (тарашкевіца)",
22290 "беларуская (тарашкевіца)",
22330 "বিষ্ণুপ্রিয়া মণিপুরী",
22359 "Chavacano de Zamboanga",
22360 "Chavacano de Zamboanga",
22364 "Min Dong Chinese",
22405 "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22425 "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22479 "Emiliano-Romagnolo",
22480 "emiliàn e rumagnòl",
22535 "Na Vosa Vakaviti",
22554 "Northern Frisian",
22605 "गोंयची कोंकणी / Gõychi Konknni",
22685 "Bahasa Indonesia",
22725 "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22734 "Jamaican Creole English",
22810 "къарачай-малкъар",
22950 "Baso Minangkabau",
23049 "Norwegian Nynorsk",
23070 "Sesotho sa Leboa",
23134 "Pennsylvania German",
23149 "Norfuk / Pitkern",
23150 "Norfuk / Pitkern",
23275 "srpskohrvatski / српскохрватски",
23339 "Saterland Frisian",
23465 "ئۇيغۇرچە / Uyghurche",
23480 "oʻzbekcha/ўзбекча",
23574 "Classical Chinese",
23579 "Chinese (Min Nan)",
23595 var wikipedia$1 = Object.freeze({
23599 var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23601 var wikipedia$2 = require$$6;
23603 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 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},"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},"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 Gasoline":{"count":203},"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},"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},"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 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},"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},"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},"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"}},"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},"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},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56}}};
23604 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},"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}}};
23605 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23606 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},"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},"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 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},"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},"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":{"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":{"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 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}},"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},"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":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65}},"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 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},"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},"Спортмастер":{"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},"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 Gasoline":{"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 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},"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}},"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},"Вулканизация":{"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}}};
23607 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"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}},"guest_house":{"Casa":{"count":61},"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 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23608 var dataSuggestions = {
23611 man_made: man_made,
23616 var dataAddressFormats = [{"format":[["housenumber","street"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street"],["city"],["postcode"]]},{"countryCodes":["at","ch","de","si","pl"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],"format":[["street","housenumber","unit"],["postcode","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["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"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
23618 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"}}];
23620 var dataDiscarded = {"created_by":true,"odbl":true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true,"SK53_bulk:load":true};
23622 var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"be":{"rtl":false},"bg":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"ckb":{"rtl":true},"cs":{"rtl":false},"cy":{"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":false},"lij":{},"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},"so":{"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}};
23624 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"};
23626 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"},{"modifiers":["⌘"],"shortcuts":["F"],"text":"shortcuts.browsing.selecting.search"},{"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"}]}]}];
23628 var type$2 = "FeatureCollection";
23629 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]]]}}];
23630 var dataImperial = {
23635 var type$3 = "FeatureCollection";
23636 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]]]}}];
23637 var dataDriveLeft = {
23639 features: features$1
23642 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."},"drag_node":{"connected_to_hidden":"This can't be edited because it is connected to a hidden feature."}},"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":{"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"restriction":{"controls":{"distance":"Distance","distance_up_to":"Up to {distance}","via":"Via","via_node_only":"Node only","via_up_to_one":"Up to 1 way","via_up_to_two":"Up to 2 ways"},"help":{"indirect":"(indirect)","turn":{"no_left_turn":"NO Left Turn {indirect}","no_right_turn":"NO Right Turn {indirect}","no_u_turn":"NO U-Turn {indirect}","no_straight_on":"NO Straight On {indirect}","only_left_turn":"ONLY Left Turn {indirect}","only_right_turn":"ONLY Right Turn {indirect}","only_u_turn":"ONLY U-Turn {indirect}","only_straight_on":"ONLY Straight On {indirect}","allowed_left_turn":"Left Turn Allowed {indirect}","allowed_right_turn":"Right Turn Allowed {indirect}","allowed_u_turn":"U-Turn Allowed {indirect}","allowed_straight_on":"Straight On Allowed {indirect}"},"from":"FROM","via":"VIA","to":"TO","from_name":"{from} {fromName}","from_name_to_name":"{from} {fromName} {to} {toName}","via_names":"{via} {viaNames}","select_from":"Click to select a {from} segment","select_from_name":"Click to select {from} {fromName}","toggle":"Click for \"{turn}\""}},"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":"https://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","show_vintage":"Show Vintage","hide_vintage":"Hide Vintage"},"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_line":"closed line","closed_area":"closed area","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial","node_count":"Number of nodes"}},"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","backgrounds":"Backgrounds","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} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {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}","overlays":"Overlays","imagery_source_faq":"Imagery Info / Report a Problem","reset":"reset","display_options":"Display Options","brightness":"Brightness","contrast":"Contrast","saturation":"Saturation","sharpness":"Sharpness","minimap":{"description":"Show Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"},"fix_misalignment":"Adjust imagery offset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},"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...","conflict_progress":"Checking for conflicts: {num} of {total}","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: {p} nodes, {l} lines, {a} areas, {r} relations. 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"},"openstreetcam_images":{"tooltip":"Street-level photos from OpenStreetCam","title":"Photo Overlay (OpenStreetCam)"},"openstreetcam":{"view_on_openstreetcam":"View this image on OpenStreetCam"},"help":{"title":"Help","key":"H","help":{"title":"Help","welcome":"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.","open_data_h":"Open Data","open_data":"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).","before_start_h":"Before you start","before_start":"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.","open_source_h":"Open Source","open_source":"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).","open_source_help":"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},"overview":{"title":"Overview","navigation_h":"Navigation","navigation_drag":"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.","navigation_zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.","features_h":"Map Features","features":"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.","nodes_ways":"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},"editing":{"title":"Editing & Saving","select_h":"Select","select_left_click":"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.","select_right_click":"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.","multiselect_h":"Multiselect","multiselect_shift_click":"`{shift}`+{leftclick} left-click to select several features together. This makes it easier to move or delete multiple items.","multiselect_lasso":"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.","undo_redo_h":"Undo & Redo","undo_redo":"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.","save_h":"Save","save":"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!","save_validation":"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.","upload_h":"Upload","upload":"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.","backups_h":"Automatic Backups","backups":"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.","keyboard_h":"Keyboard Shortcuts","keyboard":"You can view a list of keyboard shortcuts by pressing the `?` key."},"feature_editor":{"title":"Feature Editor","intro":"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.","definitions":"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.","type_h":"Feature Type","type":"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.","type_picker":"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.","fields_h":"Fields","fields_all_fields":"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.","fields_example":"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.","fields_add_field":"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.","tags_h":"Tags","tags_all_tags":"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.","tags_resources":"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},"points":{"title":"Points","intro":"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.","add_point_h":"Adding Points","add_point":"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.","add_point_finish":"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.","move_point_h":"Moving Points","move_point":"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.","delete_point_h":"Deleting Points","delete_point":"It's OK to delete features that don't exist in the real world. 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.","delete_point_command":"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},"lines":{"title":"Lines","intro":"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.","add_line_h":"Adding Lines","add_line":"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.","add_line_draw":"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_line_finish":"To finish a line, press `{return}` or click again on the last node.","modify_line_h":"Modifying Lines","modify_line_dragnode":"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.","modify_line_addnode":"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.","connect_line_h":"Connecting Lines","connect_line":"Having roads connected properly is important for the map and essential for providing driving directions.","connect_line_display":"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.","connect_line_drag":"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.","connect_line_tag":"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.","disconnect_line_h":"Disconnecting Lines","disconnect_line_command":"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.","move_line_h":"Moving Lines","move_line_command":"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.","move_line_connected":"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.","delete_line_h":"Deleting Lines","delete_line":"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.","delete_line_command":"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},"areas":{"title":"Areas","intro":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.","point_or_area_h":"Points or Areas?","point_or_area":"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.","add_area_h":"Adding Areas","add_area_command":"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.","add_area_draw":"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_area_finish":"To finish an area, press `{return}` or click again on either the first or last node.","square_area_h":"Square Corners","square_area_command":"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.","modify_area_h":"Modifying Areas","modify_area_dragnode":"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.","modify_area_addnode":"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.","delete_area_h":"Deleting Areas","delete_area":"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.","delete_area_command":"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},"relations":{"title":"Relations","intro":"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.","edit_relation_h":"Editing Relations","edit_relation":"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.","edit_relation_add":"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.","edit_relation_delete":"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.","maintain_relation_h":"Maintaining Relations","maintain_relation":"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.","relation_types_h":"Relation Types","multipolygon_h":"Multipolygons","multipolygon":"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.","multipolygon_create":"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.","multipolygon_merge":"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.","turn_restriction_h":"Turn restrictions","turn_restriction":"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.","turn_restriction_field":"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.","turn_restriction_editing":"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.","route_h":"Routes","route":"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.","route_add":"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.","boundary_h":"Boundaries","boundary":"A *boundary* relation is a group of one or more line features that together form an administrative boundary.","boundary_add":"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},"imagery":{"title":"Background Imagery","intro":"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.","sources_h":"Imagery Sources","choosing":"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.","sources":"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.","offsets_h":"Adjusting Imagery Offset","offset":"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.","offset_change":"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},"streetlevel":{"title":"Street Level Photos","intro":"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).","using_h":"Using Street Level Photos","using":"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.","photos":"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.","viewer":"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},"gps":{"title":"GPS Traces","intro":"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.","survey":"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).","using_h":"Using GPS Traces","using":"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.","tracing":"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.","upload":"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},"field":{"restrictions":{"title":"Turn Restrictions Help","about":{"title":"About","about":"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.","from_via_to":"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.","maxdist":"The \"{distField}\" slider controls how far to search for additional connected roads.","maxvia":"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},"inspecting":{"title":"Inspecting","about":"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.","from_shadow":"{fromShadow} **FROM segment**","allow_shadow":"{allowShadow} **TO Allowed**","restrict_shadow":"{restrictShadow} **TO Restricted**","only_shadow":"{onlyShadow} **TO Only**","restricted":"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".","only":"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},"modifying":{"title":"Modifying","about":"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.","indicators":"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".","allow_turn":"{allowTurn} **TO Allowed**","restrict_turn":"{restrictTurn} **TO Restricted**","only_turn":"{onlyTurn} **TO Only**"},"tips":{"title":"Tips","simple":"**Prefer simple restrictions over complex ones.**","simple_example":"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.","indirect":"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**","indirect_example":"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.","indirect_noedit":"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},"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 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","search":"Find features matching search text"},"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"}}},"units":{"feet":"{quantity} ft","miles":"{quantity} mi","square_feet":"{quantity} sq ft","square_miles":"{quantity} sq mi","acres":"{quantity} ac","meters":"{quantity} m","kilometers":"{quantity} km","square_meters":"{quantity} m²","square_kilometers":"{quantity} km²","hectares":"{quantity} ha","area_pair":"{area1} ({area2})","arcdegrees":"{quantity}°","arcminutes":"{quantity}′","arcseconds":"{quantity}″","north":"N","south":"S","east":"E","west":"W","coordinate":"{coordinate}{direction}","coordinate_pair":"{latitude}, {longitude}"},"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"},"agrarian":{"label":"Products"},"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"},"boules":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"brewery":{"label":"Draft Beers"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"cables":{"label":"Cables","placeholder":"1, 2, 3..."},"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..."},"castle_type":{"label":"Type"},"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"}}},"dance/style":{"label":"Dance Styles"},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"devices":{"label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"label":"Diaper Changing Available"},"direction_cardinal":{"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"}},"direction_clock":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"direction_vertex":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"dispensing":{"label":"Dispenses Prescriptions"},"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"}},"fitness_station":{"label":"Equipment Type"},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"frequency":{"label":"Operating Frequency"},"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"},"government":{"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"},"monitoring_multi":{"label":"Monitoring"},"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","reversible":"Reversible","alternating":"Alternating"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"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"},"phases":{"label":"Phases","placeholder":"1, 2, 3..."},"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"},"railway/position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"railway/signal/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"rating":{"label":"Power Rating"},"recycling_accepts":{"label":"Accepts"},"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"},"ref/isil":{"label":"ISIL 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"},"substance":{"label":"Substance"},"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"},"switch":{"label":"Type","options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}},"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"},"traffic_signals/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"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"}},"transformer":{"label":"Type","options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}},"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"}},"voltage":{"label":"Voltage"},"voltage/primary":{"label":"Primary Voltage"},"voltage/secondary":{"label":"Secondary Voltage"},"voltage/tertiary":{"label":"Tertiary Voltage"},"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"},"wholesale":{"label":"Wholesale"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"},"windings":{"label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"label":"Windings Configuration","options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"circular":{"name":"Traffic Circle","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/station":{"name":"Aerialway Station","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/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/bus_station":{"name":"Bus Station / Terminal","terms":""},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/ferry_terminal":{"name":"Ferry Station / Terminal","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/scrapyard":{"name":"Scrap Yard","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,cattery,dog,horse,kennel,kitten,pet,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/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_pooling":{"name":"Car Pooling","terms":""},"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/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/love_hotel":{"name":"Love Hotel","terms":""},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/music_school":{"name":"Music School","terms":"school of music"},"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":"kovil,devasthana,mandir,kshetram,alayam,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 Container","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/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/smoking_area":{"name":"Smoking Area","terms":""},"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/kerb":{"name":"Kerb","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/boathouse":{"name":"Boathouse","terms":""},"building/bungalow":{"name":"Bungalow","terms":"home,detached"},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/civic":{"name":"Civic 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/farm_auxiliary":{"name":"Farm Building","terms":""},"building/farm":{"name":"Farm House","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/mosque":{"name":"Mosque Building","terms":""},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/ruins":{"name":"Building Ruins","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/service":{"name":"Service Building","terms":""},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/stadium":{"name":"Stadium Building","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/temple":{"name":"Temple Building","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{"name":"Transportation Building","terms":""},"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/chimney_sweeper":{"name":"Chimney Sweeper","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/sculptor":{"name":"Sculptor","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"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":""},"emergency/water_tank":{"name":"Emergency Water Tank","terms":"water tank,cistern,reservoir"},"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/bus_stop":{"name":"Bus Stop / Platform","terms":""},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_guideway":{"name":"Bus Guideway","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_area":{"name":"Pedestrian Area","terms":"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{"name":"Pedestrian Street","terms":"center,centre,plaza,quad,square,walkway"},"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/brownfield":{"name":"Brownfield","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":"Garage Landuse","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/greenfield":{"name":"Greenfield","terms":""},"landuse/greenhouse_horticulture":{"name":"Greenhouse Horticulture","terms":"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/industrial/scrap_yard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{"name":"Slaughterhouse","terms":"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"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/religious":{"name":"Religious Area","terms":""},"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/amusement_arcade":{"name":"Amusement Arcade","terms":"pay-to-play games,video games,driving simulators,pinball machines"},"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/dancing_school":{"name":"Dance School","terms":"jive,swing,tango,waltz,dance teaching"},"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":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{"name":"Exercise Balance Beam","terms":"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{"name":"Exercise Box","terms":"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{"name":"Exercise Horizontal Bar","terms":"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{"name":"Exercise Monkey Bars","terms":"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{"name":"Hyperextension Station","terms":"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{"name":"Parallel Bars","terms":"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{"name":"Push-Up Station","terms":"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{"name":"Exercise Rings","terms":"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{"name":"Exercise Instruction Sign","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{"name":"Sit-Up Station","terms":"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{"name":"Exercise Stairs","terms":"exercise,fitness,gym,steps,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/boules":{"name":"Boules/Bocce Court","terms":"bocce,lyonnaise,pétanque"},"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/sauna":{"name":"Sauna","terms":""},"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/monitoring_station":{"name":"Monitoring Station","terms":"weather,earthquake,seismology,air,gps"},"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/administrative":{"name":"Administrative Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant Office","terms":""},"office/adoption_agency":{"name":"Adoption Agency","terms":""},"office/advertising_agency":{"name":"Advertising Agency","terms":"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{"name":"Architect Office","terms":""},"office/association":{"name":"Nonprofit Organization Office","terms":"association,non-profit,nonprofit,organization,society"},"office/charity":{"name":"Charity Office","terms":"charitable organization"},"office/company":{"name":"Corporate 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/energy_supplier":{"name":"Energy Supplier Office","terms":"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/forestry":{"name":"Forestry Office","terms":"forest,ranger"},"office/foundation":{"name":"Foundation Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/government/tax":{"name":"Tax and Revenue Office","terms":"fiscal authorities,revenue office,tax office"},"office/guide":{"name":"Tour Guide Office","terms":"dive guide,mountain guide,tour guide"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"Information Technology Office","terms":"computer,information,software,technology"},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":""},"office/moving_company":{"name":"Moving Company Office","terms":"relocation"},"office/newspaper":{"name":"Newspaper Office","terms":""},"office/ngo":{"name":"NGO Office","terms":"ngo,non government,non-government,organization,organisation"},"office/notary":{"name":"Notary Office","terms":"clerk,deeds,estate,signature,wills"},"office/political_party":{"name":"Political Party","terms":""},"office/private_investigator":{"name":"Private Investigator Office","terms":"PI,private eye,private detective"},"office/quango":{"name":"Quasi-NGO Office","terms":"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{"name":"Research Office","terms":""},"office/surveyor":{"name":"Surveyor Office","terms":""},"office/tax_advisor":{"name":"Tax Advisor Office","terms":"tax,tax consultant"},"office/telecommunication":{"name":"Telecom Office","terms":"communication,internet,phone,voice"},"office/therapist":{"name":"Therapist Office","terms":"therapy"},"office/water_utility":{"name":"Water Utility Office","terms":"water board,utility"},"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/islet":{"name":"Islet","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/plot":{"name":"Plot","terms":"tract,land,lot,parcel"},"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":"Play 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":"Play 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/switch":{"name":"Power Switch","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/linear_platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{"name":"Aerialway Station","terms":"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{"name":"Bus Station / Terminal","terms":"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{"name":"Ferry Station / Terminal","terms":"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{"name":"Light Rail Station","terms":"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{"name":"Monorail Station","terms":"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{"name":"Subway Station","terms":"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{"name":"Train Station (Halt / Request)","terms":"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{"name":"Train Station","terms":"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{"name":"Tram Station","terms":"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{"name":"Trolleybus Station / Terminal","terms":"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{"name":"Transit Station","terms":"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{"name":"Transit Stop Area","terms":""},"public_transport/stop_position_aerialway":{"name":"Aerialway Stopping Location","terms":"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{"name":"Bus Stopping Location","terms":"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{"name":"Ferry Stopping Location","terms":"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{"name":"Light Rail Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{"name":"Monorail Stopping Location","terms":"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{"name":"Subway Stopping Location","terms":"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{"name":"Train Stopping Location","terms":"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{"name":"Tram Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{"name":"Trolleybus Stopping Location","terms":"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{"name":"Transit Stopping Location","terms":"public transit,public transportation,transit,transportation"},"railway/halt":{"name":"Train Station (Halt / Request)","terms":"break,interrupt,rest,wait,interruption"},"railway/platform":{"name":"Train Stop / Platform","terms":""},"railway/station":{"name":"Train Station","terms":"train station,station"},"railway/tram_stop":{"name":"Tram Stopping Position","terms":"light rail,streetcar,tram,trolley"},"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/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{"name":"Light Rail","terms":"light rail,streetcar,trolley"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/miniature":{"name":"Miniature Railway","terms":"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"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":{"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/agrarian":{"name":"Farm Supply Shop","terms":"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"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/health_food":{"name":"Health Food Shop","terms":"wholefood,vitamins,vegetarian,vegan"},"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":"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/wholesale":{"name":"Wholesale Store","terms":"warehouse club,cash and carry"},"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":"climbing hut"},"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":"Holiday Cottage","terms":"holiday,holiday cottage,holiday home,vacation,vacation home"},"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/wilderness_hut":{"name":"Wilderness Hut","terms":"wilderness hut,backcountry hut,bothy"},"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/light_rail":{"name":"Light Rail Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/piste":{"name":"Piste/Ski Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/subway":{"name":"Subway 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-Premium-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Standard Imagery Vintage"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"EsriWorldImageryClarity":{"attribution":{"text":"Terms & Feedback"},"description":"Esri archive imagery that may be clearer and more accurate than the default layer.","name":"Esri World Imagery (Clarity) Beta"},"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":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.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"}}};
23644 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]]],"terms_url":"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523","terms_text":"Pictometry Inc, San Juan County GIS","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":"https://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":"AGIV10cm","name":"AGIV Flanders 2013-2015 aerial imagery 10cm","type":"wms","template":"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[5.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"terms_text":"Orthophoto Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{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":"alagoas_litoral","name":"Alagoas Litoral 2006","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.523842344,-9.48089222803],[-35.52360077082,-9.44514935417],[-35.51571944592,-9.44517914145],[-35.51584023251,-9.44228976382],[-35.50542238925,-9.44237912638],[-35.50518081607,-9.43064264549],[-35.4933437304,-9.43073201107],[-35.49304176392,-9.39820141319],[-35.48929737968,-9.39817162186],[-35.48920678974,-9.38628467767],[-35.4854020122,-9.38634426236],[-35.48525102896,-9.37809168429],[-35.48126507154,-9.37812147735],[-35.48114428495,-9.36986870367],[-35.47697714765,-9.36995808494],[-35.47685636106,-9.36385031181],[-35.47459161253,-9.36388010609],[-35.47447082594,-9.36152635042],[-35.47211548746,-9.36140717249],[-35.47205509417,-9.35917257881],[-35.46976014899,-9.35920237349],[-35.46966955904,-9.35681879126],[-35.46652910774,-9.3567592015],[-35.46640832115,-9.35288584487],[-35.46387180279,-9.35276666399],[-35.46387180279,-9.35118751337],[-35.44134510403,-9.3513066948],[-35.44125451409,-9.34540716508],[-35.43177276689,-9.34537736922],[-35.4317123736,-9.33602134361],[-35.39463089092,-9.33631931008],[-35.39441951439,-9.30124690873],[-35.38164633265,-9.30142570645],[-35.38146515277,-9.28637657868],[-35.37799253835,-9.28625737508],[-35.3779623417,-9.28110178087],[-35.36941669056,-9.28122098621],[-35.36920531403,-9.27260829561],[-35.35966317354,-9.2727573059],[-35.35969337019,-9.2646510545],[-35.35051358946,-9.26474046271],[-35.35036260622,-9.25562070859],[-35.34115262885,-9.25565051209],[-35.34118282549,-9.24501050089],[-35.31775022732,-9.24518932726],[-35.31759924408,-9.22566691185],[-35.30292367358,-9.22578613599],[-35.30283308363,-9.2113001083],[-35.307936317,-9.2113597228],[-35.30784572706,-9.19979432149],[-35.29102619461,-9.19988374615],[-35.29090540802,-9.19660482728],[-35.29018068849,-9.19669425274],[-35.28996931196,-9.16515547298],[-35.27758868663,-9.16521509525],[-35.27749809669,-9.16417170413],[-35.27541452804,-9.16420151535],[-35.27535413474,-9.16151849576],[-35.27375371245,-9.16148868432],[-35.2736631225,-9.15838828064],[-35.27182112703,-9.15841809234],[-35.27185132368,-9.15728524588],[-35.27148896391,-9.15728524588],[-35.27142857062,-9.15469161013],[-35.26964696844,-9.1546319861],[-35.26958657514,-9.15361837601],[-35.26919401873,-9.15361837601],[-35.26907323214,-9.13158654923],[-35.26403039207,-9.13164617712],[-35.26400019542,-9.12317891652],[-35.26055777765,-9.12320873117],[-35.260527581,-9.11781223884],[-35.25599808393,-9.11784205394],[-35.25572631411,-9.08945695375],[-35.25113642374,-9.08954640613],[-35.25107603045,-9.08650501259],[-35.25026072098,-9.08647519487],[-35.25029091762,-9.08474576336],[-35.24449316137,-9.08477558121],[-35.24449316137,-9.07988541975],[-35.24092995701,-9.07997487452],[-35.24080917042,-9.0731166106],[-35.237336556,-9.0731166106],[-35.23718557277,-9.06321662455],[-35.23655144318,-9.06321662455],[-35.23652124653,-9.04654705576],[-35.23322981199,-9.04651723473],[-35.23332040193,-9.04344565539],[-35.23060270369,-9.04347547668],[-35.23060270369,-9.04013547745],[-35.22897208475,-9.04007583433],[-35.22900228139,-9.03834617941],[-35.22504652062,-9.03825671427],[-35.22501632397,-9.03166605486],[-35.22229862573,-9.03160641033],[-35.22232882238,-9.02012465516],[-35.21834286496,-9.02009483194],[-35.21831266831,-9.01341436936],[-35.21671224601,-9.01341436936],[-35.21668204936,-9.00998461959],[-35.21175999588,-9.00998461959],[-35.21172979923,-9.00646536424],[-35.20970662388,-9.00652501292],[-35.20973682052,-9.00437765419],[-35.20765325187,-9.00431800516],[-35.20768344852,-9.00226010741],[-35.20566027316,-9.00226010741],[-35.20563007651,-8.99987412434],[-35.20390886763,-8.99987412434],[-35.20393906427,-8.99784602637],[-35.20212726545,-8.99790567647],[-35.20212726545,-8.9957880918],[-35.1984432745,-8.99581791702],[-35.1984432745,-8.99361084394],[-35.19433653049,-8.99361084394],[-35.19427613719,-8.99122480384],[-35.19065253954,-8.99131428063],[-35.19062234289,-8.98833170914],[-35.18766307147,-8.98842118664],[-35.18763287482,-8.98543859134],[-35.1847339967,-8.98540876526],[-35.1846736034,-8.98254545043],[-35.18237865822,-8.98251562411],[-35.18234846157,-8.9805172554],[-35.17950997674,-8.98060673484],[-35.1794797801,-8.97741528813],[-35.17809073433,-8.97744511486],[-35.17803034103,-8.97306055853],[-35.17558441262,-8.97303073144],[-35.17549382268,-8.96912336076],[-35.17292710767,-8.96909353334],[-35.17283651773,-8.96291920489],[-35.17063216249,-8.96288937697],[-35.17048117925,-8.95579026036],[-35.16851839719,-8.95564111777],[-35.16851839719,-8.94806459361],[-35.16794466089,-8.94800493531],[-35.16791446424,-8.9399509755],[-35.16244887111,-8.9399509755],[-35.16241867447,-8.92977886806],[-35.15870448687,-8.9298086987],[-35.15873468352,-8.92661680615],[-35.15547344563,-8.92667646795],[-35.15550364227,-8.92378285946],[-35.15348046692,-8.92381269059],[-35.15338987697,-8.92065057698],[-35.15130630832,-8.92062074559],[-35.15121571838,-8.91193970728],[-35.1526349608,-8.91193970728],[-35.1526349608,-8.90821067559],[-35.15438636633,-8.908240508],[-35.15429577639,-8.90215464709],[-35.15592639533,-8.90212481419],[-35.15592639533,-8.90051383392],[-35.15767780087,-8.90048400089],[-35.15773819416,-8.89905201236],[-35.15958018964,-8.89908184551],[-35.15954999299,-8.89747085185],[-35.16139198846,-8.89750068513],[-35.16133159517,-8.89624768526],[-35.16362654035,-8.89624768526],[-35.1635963437,-8.89526318235],[-35.16552892912,-8.89526318235],[-35.16549873247,-8.89314500045],[-35.16794466089,-8.89314500045],[-35.16791446424,-8.89147431313],[-35.17023960607,-8.89153398066],[-35.17026980272,-8.89040029582],[-35.17301769761,-8.89043012968],[-35.17301769761,-8.88875942997],[-35.17790955445,-8.88875942997],[-35.17793975109,-8.88795391132],[-35.17893624045,-8.88792407726],[-35.17893624045,-8.8889085999],[-35.17966095998,-8.88893843387],[-35.17978174657,-8.88858042598],[-35.18098961245,-8.88861025998],[-35.18098961245,-8.88816274965],[-35.1851869464,-8.88816274965],[-35.1851869464,-8.88896826785],[-35.18591166594,-8.88899810182],[-35.18591166594,-8.88971411645],[-35.18932388706,-8.88971411645],[-35.1894748703,-8.88929644142],[-35.19013919653,-8.88926660747],[-35.19016939318,-8.88831191982],[-35.19071293283,-8.88831191982],[-35.19077332612,-8.8878942432],[-35.1915282423,-8.88792407726],[-35.19155843895,-8.88619369772],[-35.19753737508,-8.8860743609],[-35.19756757173,-8.88729756147],[-35.19968133703,-8.88729756147],[-35.19974173032,-8.88777490693],[-35.20079861297,-8.88777490693],[-35.20079861297,-8.88822241773],[-35.20330493468,-8.88822241773],[-35.20336532798,-8.88869976198],[-35.20563007651,-8.88861025998],[-35.20556968322,-8.88983345208],[-35.20741167869,-8.88980361818],[-35.20744187534,-8.89022129263],[-35.21124665288,-8.8902511265],[-35.21127684953,-8.8876854047],[-35.21245451877,-8.88777490693],[-35.21248471541,-8.88861025998],[-35.21622909966,-8.88858042598],[-35.21622909966,-8.88747656609],[-35.21870522472,-8.887446732],[-35.21870522472,-8.88896826785],[-35.22136252967,-8.88896826785],[-35.22263078885,-8.88792407726],[-35.22401983462,-8.88747656609],[-35.22453317762,-8.88762573654],[-35.22643556639,-8.88717822501],[-35.22706969598,-8.88598485826],[-35.2331090254,-8.88446331002],[-35.23932953471,-8.88338927217],[-35.24129231678,-8.88416496649],[-35.25010973774,-8.88514949923],[-35.25623965711,-8.88505999636],[-35.26167505359,-8.88294175546],[-35.2616146603,-8.88094284086],[-35.26406058872,-8.88109201397],[-35.26877126567,-8.87930193267],[-35.27420666215,-8.87748200772],[-35.27810202963,-8.87518471252],[-35.28498686518,-8.87506537212],[-35.28501706183,-8.875811249],[-35.28809711983,-8.87578141395],[-35.29404585932,-8.87545322829],[-35.30781553041,-8.87208184942],[-35.31756904744,-8.86960550716],[-35.32783590746,-8.86715898394],[-35.33206343806,-8.8661445671],[-35.34103184226,-8.86375769289],[-35.34710136833,-8.86244490546],[-35.3522046017,-8.86113211335],[-35.35256696146,-8.86390687298],[-35.34903395375,-8.86611473127],[-35.34495740639,-8.87205201407],[-35.34326639415,-8.87488636144],[-35.3431758042,-8.8756919088],[-35.34380993379,-8.87667646429],[-35.34480642315,-8.87679580417],[-35.34888297051,-8.87721349344],[-35.35042299952,-8.87781019157],[-35.35253676482,-8.87891408057],[-35.35398620388,-8.88010747033],[-35.35576780606,-8.88252407272],[-35.35754940824,-8.88395612587],[-35.36035769642,-8.88511966494],[-35.36114280925,-8.88508983065],[-35.36120320254,-8.88586552137],[-35.36174674219,-8.8858953556],[-35.36177693884,-8.88777490693],[-35.36253185502,-8.88783457507],[-35.36247146172,-8.89099697249],[-35.36310559131,-8.89111630771],[-35.36310559131,-8.89481568015],[-35.36440404714,-8.89487534714],[-35.36506837338,-8.8966951857],[-35.3663668292,-8.90021550347],[-35.36754449844,-8.90427277684],[-35.36793705485,-8.90782285411],[-35.36863157774,-8.90916531133],[-35.37207399551,-8.91155188976],[-35.37409717087,-8.91349097325],[-35.37276851839,-8.91599685052],[-35.37261753516,-8.91817456324],[-35.37083593298,-8.92229129973],[-35.37062455645,-8.92485677869],[-35.37234576533,-8.93037548043],[-35.37153045586,-8.93192666805],[-35.37153045586,-8.93362700074],[-35.37171163574,-8.93386564329],[-35.37171163574,-8.94362002373],[-35.36817862803,-8.94376917125],[-35.36814843138,-8.9450518374],[-35.36926570733,-8.94511149618],[-35.36920531403,-8.94863134694],[-35.37077553968,-8.94872083423],[-35.37080573633,-8.95182304658],[-35.3721947821,-8.9517633889],[-35.37222497875,-8.9552831753],[-35.37319127145,-8.95531300385],[-35.37313087816,-8.95737116808],[-35.37439913734,-8.95737116808],[-35.37445953063,-8.96011536892],[-35.37566739652,-8.96017502523],[-35.37569759317,-8.96205419397],[-35.3768752624,-8.96208402197],[-35.3769356557,-8.964440426],[-35.37781135847,-8.964440426],[-35.37775096517,-8.96617043441],[-35.38074043324,-8.96617043441],[-35.38074043324,-8.96330696774],[-35.38288439518,-8.96327713984],[-35.38291459183,-8.95981708722],[-35.38542091354,-8.9598469154],[-35.38542091354,-8.95722202613],[-35.38723271237,-8.95722202613],[-35.38720251572,-8.95406020253],[-35.38946726426,-8.95409003118],[-35.38946726426,-8.9508386936],[-35.39158102956,-8.95086852252],[-35.39158102956,-8.94791544785],[-35.39586895345,-8.94791544785],[-35.39580856016,-8.94651347472],[-35.39719760593,-8.94654330399],[-35.39710701598,-8.94472371393],[-35.39837527516,-8.94469388451],[-35.39837527516,-8.93914556972],[-35.4010741005,-8.93915302719],[-35.40106277676,-8.93895167547],[-35.4016667097,-8.93893676052],[-35.40172710299,-8.93687849204],[-35.40236123258,-8.93687849204],[-35.40236123258,-8.9362818903],[-35.40323693535,-8.93640121073],[-35.40329732865,-8.93583443836],[-35.40426362135,-8.93580460821],[-35.40420322806,-8.93362700074],[-35.40574325706,-8.93359717041],[-35.40577345371,-8.93124056665],[-35.40809859554,-8.93133005821],[-35.40803820225,-8.92927174677],[-35.40936685472,-8.92930157745],[-35.40927626478,-8.92739240878],[-35.41084649043,-8.92742223962],[-35.41084649043,-8.92542356812],[-35.41238651943,-8.92545339912],[-35.41235632279,-8.92390218397],[-35.41335281214,-8.92387235285],[-35.41329241885,-8.92193332448],[-35.41522500426,-8.92196315577],[-35.41522500426,-8.91999428582],[-35.41655365674,-8.92002411726],[-35.41655365674,-8.91754809927],[-35.4196035181,-8.91754809927],[-35.41966391139,-8.91963630832],[-35.42183806999,-8.91963630832],[-35.42186826663,-8.92264927462],[-35.42389144199,-8.92267910584],[-35.42392163864,-8.92512525801],[-35.4253710777,-8.92512525801],[-35.4253710777,-8.92766088623],[-35.42724326982,-8.92766088623],[-35.42727346647,-8.92986835998],[-35.42814916924,-8.92983852934],[-35.42817936588,-8.93159853276],[-35.42987037812,-8.93153887177],[-35.42990057477,-8.93407445539],[-35.43141040713,-8.93407445539],[-35.43141040713,-8.9355957971],[-35.43225591325,-8.93556596693],[-35.43228610989,-8.93586426851],[-35.43340338584,-8.93583443836],[-35.43340338584,-8.94001063511],[-35.4343394819,-8.94004046492],[-35.4343394819,-8.94096518765],[-35.43530577461,-8.94096518765],[-35.43533597125,-8.94260581897],[-35.43566813437,-8.94263564856],[-35.43569833102,-8.94329189897],[-35.43627206732,-8.94332172851],[-35.43624187067,-8.94421661344],[-35.43729875332,-8.94421661344],[-35.43726855667,-8.94520098434],[-35.43823484938,-8.94520098434],[-35.43826504603,-8.94684159657],[-35.4390199622,-8.94687142582],[-35.4390199622,-8.94797510616],[-35.44025802474,-8.94797510616],[-35.44031841803,-8.94952621882],[-35.44158667721,-8.94955604785],[-35.4416470705,-8.95152475808],[-35.4427341498,-8.95152475808],[-35.4427341498,-8.95334431412],[-35.44436476875,-8.95334431412],[-35.44436476875,-8.95498488964],[-35.44569342122,-8.95501471821],[-35.44563302793,-8.9567447715],[-35.44720325358,-8.95680442836],[-35.44717305693,-8.95865378627],[-35.44895465911,-8.95871344282],[-35.44892446246,-8.95999605627],[-35.45100803112,-8.95993639993],[-35.45097783447,-8.96101021254],[-35.45469202207,-8.96095055636],[-35.45466182542,-8.96235247383],[-35.46048977832,-8.96235247383],[-35.46055017161,-8.96557388071],[-35.46652910774,-8.96548439758],[-35.46658950104,-8.9688549139],[-35.46770677698,-8.96882508646],[-35.46773697363,-8.97052524668],[-35.47389708964,-8.97052524668],[-35.47398767958,-8.97529758369],[-35.47791324371,-8.97520810295],[-35.47797363701,-8.97816095576],[-35.48410355637,-8.97813112908],[-35.48416394967,-8.98200857638],[-35.49083740868,-8.98194892366],[-35.49083740868,-8.98561754775],[-35.49720890123,-8.98561754775],[-35.49720890123,-8.99068794266],[-35.5022517413,-8.99056864006],[-35.50234233124,-8.99566879088],[-35.5064792719,-8.99566879088],[-35.50650946855,-8.99856182695],[-35.51203545497,-8.99850217696],[-35.51206565162,-9.00163378838],[-35.51662534534,-9.00166361312],[-35.51665554198,-9.00616712068],[-35.52118503905,-9.00613729631],[-35.5212152357,-9.00738991769],[-35.5312707192,-9.00733026915],[-35.5312707192,-9.01064074815],[-35.54818084159,-9.01049162813],[-35.54818084159,-9.01359331193],[-35.56968085435,-9.01344419313],[-35.56974124764,-9.01738090893],[-35.58574547062,-9.01732126204],[-35.58577566727,-9.01994571582],[-35.60957062521,-9.01982642288],[-35.60954042856,-9.02301749544],[-35.62910785591,-9.02286838053],[-35.62904746261,-9.02507527493],[-35.65220829096,-9.02489633805],[-35.65223848761,-9.02758038195],[-35.67552010255,-9.02740144631],[-35.6755502992,-9.03056262951],[-35.68294847774,-9.03056262951],[-35.68297867439,-9.03435004835],[-35.69128275235,-9.03432022631],[-35.69128275235,-9.03766027947],[-35.69949624037,-9.03760063593],[-35.69949624037,-9.04034422831],[-35.70668304239,-9.04031440677],[-35.70671323904,-9.04517528582],[-35.71115214617,-9.04517528582],[-35.71133332605,-9.06691424164],[-35.70870621775,-9.06691424164],[-35.70876661104,-9.07869268732],[-35.7065622558,-9.07872250568],[-35.7065622558,-9.08653483029],[-35.70429750727,-9.08653483029],[-35.70432770391,-9.09103727588],[-35.69991899343,-9.09106709321],[-35.69988879679,-9.09559929877],[-35.69535929972,-9.09556948181],[-35.69541969301,-9.1000121806],[-35.69092039259,-9.10013144692],[-35.69101098253,-9.10206951907],[-35.63366754962,-9.10245713224],[-35.63369774627,-9.10540894182],[-35.62584661802,-9.10552820634],[-35.62590701131,-9.10964280796],[-35.6223136103,-9.10964280796],[-35.62234380695,-9.11202806257],[-35.61989787853,-9.11199824698],[-35.61989787853,-9.11500960843],[-35.61473425187,-9.11506923909],[-35.61473425187,-9.11706686056],[-35.61177498045,-9.11700723023],[-35.6118051771,-9.11819983493],[-35.60960082186,-9.11825946506],[-35.60963101851,-9.12571315292],[-35.59975671489,-9.12583241066],[-35.59978691154,-9.12923123948],[-35.59634449377,-9.12926105363],[-35.59640488706,-9.13501513686],[-35.59196597993,-9.13507476418],[-35.59208676652,-9.14899746988],[-35.59018437775,-9.14896765739],[-35.5901541811,-9.15108433815],[-35.60159871037,-9.15105452583],[-35.60153831707,-9.14911671983],[-35.60552427449,-9.14911671983],[-35.60549407785,-9.14556901687],[-35.61183537375,-9.14553920409],[-35.61183537375,-9.14234922223],[-35.61760293335,-9.14237903528],[-35.6175727367,-9.13853313161],[-35.62400462254,-9.13853313161],[-35.62397442589,-9.13465737274],[-35.63176516085,-9.13465737274],[-35.63164437426,-9.13063250159],[-35.6392237327,-9.13060268756],[-35.63919353605,-9.12878402702],[-35.66386419676,-9.12869458446],[-35.66380380346,-9.12610074043],[-35.71278276511,-9.12577278179],[-35.71275256846,-9.12407335495],[-35.72425749102,-9.12401372579],[-35.71963740401,-9.15323081845],[-35.72111703972,-9.15320100631],[-35.72123782631,-9.17257836825],[-35.72066409001,-9.17254855774],[-35.72081507325,-9.18557551362],[-35.71211843887,-9.18566494187],[-35.71329610811,-9.34415573683],[-35.69040704959,-9.34433451257],[-35.69064862276,-9.3718946735],[-35.68898780717,-9.3718946735],[-35.68901800382,-9.37597637093],[-35.68756856476,-9.37597637093],[-35.6876591547,-9.38232227231],[-35.6849716531,-9.38235206501],[-35.6850320464,-9.39093225328],[-35.68168021856,-9.39099183718],[-35.68177080851,-9.39936327296],[-35.67715072149,-9.39933348173],[-35.67724131144,-9.40889633403],[-35.6729231909,-9.40892612443],[-35.67301378084,-9.41753544361],[-35.6697223463,-9.41759502292],[-35.66978273959,-9.42498277846],[-35.66721602459,-9.42498277846],[-35.66727641788,-9.43269804791],[-35.6607539421,-9.43287677797],[-35.6607539421,-9.43704711987],[-35.65130239155,-9.43707690785],[-35.65142317814,-9.44211103864],[-35.64514227553,-9.44217061371],[-35.64523286547,-9.44651956613],[-35.63644564116,-9.44660892759],[-35.63644564116,-9.44991528532],[-35.62711487719,-9.4500046459],[-35.62726586043,-9.46504667925],[-35.62086417124,-9.46510625035],[-35.62092456453,-9.47219513764],[-35.60938944533,-9.47222492257],[-35.60938944533,-9.47529275674],[-35.59673705018,-9.47535232607],[-35.59673705018,-9.47350567221],[-35.57843788202,-9.47371416589],[-35.57846807866,-9.47594801874],[-35.57267032241,-9.47603737255],[-35.57270051906,-9.48041568084],[-35.56823141529,-9.48047524927],[-35.56826161193,-9.48881472807],[-35.54168856246,-9.48893386201],[-35.54162816916,-9.48071352291],[-35.523842344,-9.48089222803]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"arapiraca_al","name":"Arapiraca AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.60875162133,-9.83071802463],[-36.60783704041,-9.74047303963],[-36.61718167158,-9.74051223078],[-36.61630685505,-9.65075247124],[-36.70736730351,-9.64977242883],[-36.70832164882,-9.74043384847],[-36.69897701764,-9.74047303963],[-36.69997112734,-9.82967973955],[-36.60875162133,-9.83071802463]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"CRAIG-Auvergne-2013","name":"Auvergne 2013 25cm CRAIG","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","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":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"CRAIG-Auvergne-2016","name":"Auvergne 2016 25cm CRAIG","type":"tms","template":"http://tiles.craig.fr/ortho/tms/1.0.0/ortho_2016/webmercator/{zoom-1}/{x}/{-y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[2.493891,46.6682909],[2.7136176,46.8414109],[3.6474555,46.8075834],[4.0484565,46.4832686],[4.0374701,46.2482538],[4.4604438,46.2596487],[4.4934028,46.1455925],[4.3835395,46.0922853],[4.4549506,45.6908367],[4.7625678,45.5717589],[4.8120063,45.344428],[4.2242377,44.8441895],[3.8616889,44.6959969],[3.3782905,44.8052283],[3.3343451,44.8909082],[3.1805365,44.8247122],[3.0322211,44.6061167],[2.927851,44.6022057],[2.7191108,44.8519786],[2.5103705,44.6022057],[2.125849,44.5826468],[2.0049994,44.9725746],[2.3071235,45.4678399],[2.4334662,45.4408666],[2.4114936,45.7291949],[2.3455756,45.8240183],[2.5488227,45.9797905],[2.4609321,46.2216563],[2.2137397,46.3393472],[2.2782844,46.5390305],[2.5488227,46.5664179],[2.493891,46.6682909]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{"id":"BANO","name":"BANO","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"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 Ouverte","overlay":true},{"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_url":"http://basemap.at/","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_url":"http://basemap.at/","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-2m","name":"Bavaria (2 m)","type":"wms","template":"http://geodaten.bayern.de/ogc/ogc_dop200_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=adv_dop200c&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","scaleExtent":[8,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]]],"terms_url":"www.geodaten.bayern.de","terms_text":"Bayerische Vermessungsverwaltung"},{"id":"bavaria-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[7,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]]],"terms_url":"www.geodaten.bayern.de","terms_text":"Bayerische Vermessungsverwaltung","best":true},{"id":"route500hydro","name":"BD Carthage","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png","scaleExtent":[6,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence","terms_text":"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL","description":"Réseau hydrographique: cours et plans d'eau et POI","overlay":true},{"id":"fr.ign.bdortho","name":"BDOrtho IGN","type":"tms","template":"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg","scaleExtent":[2,21],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]],[[-61.2750098,14.9021787],[-60.7236843,14.9010106],[-60.7248947,14.3668637],[-61.2762202,14.3680347],[-61.2750098,14.9021787]],[[-61.9280191,16.5861824],[-61.9268639,15.7393966],[-60.8812792,15.7407152],[-60.8824344,16.5874955],[-61.9280191,16.5861824]],[[-53.8934381,6.0040017],[-52.4652154,5.4464962],[-51.5203912,4.5107197],[-51.5368707,4.1163329],[-52.2345025,3.1021265],[-52.6409967,2.251623],[-52.9266412,2.0759672],[-53.7286431,2.2186891],[-54.2010552,2.0320501],[-54.8053033,2.2735786],[-54.3109185,2.8058902],[-54.3164117,3.2008539],[-54.124151,3.4640797],[-54.1296441,3.5956655],[-54.4207818,4.0012658],[-54.5800836,4.9596205],[-53.8934381,6.0040017]],[[55.088162,-20.7793549],[55.9595858,-20.7728126],[55.9657599,-21.4900002],[55.0943361,-21.496511],[55.088162,-20.7793549]],[[44.9205447,-12.5736261],[45.3482619,-12.5702887],[45.3527389,-13.116298],[44.9250218,-13.1196281],[44.9205447,-12.5736261]],[[-178.577276,-14.7058162],[-178.4256804,-14.0033368],[-176.3415582,-12.8385765],[-175.7153375,-12.9189012],[-175.9185845,-13.587255],[-177.8463838,-14.6498253],[-178.577276,-14.7058162]]],"terms_url":"http://openstreetmap.fr/bdortho","terms_text":"BDOrtho IGN","best":true,"icon":"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{"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":[[[5.9849448,50.7072276],[5.9849448,50.7671973],[5.9107871,50.8227527],[5.7556052,50.8353303],[5.7542319,50.8626424],[5.8331961,50.9332328],[5.8551688,51.026611],[5.9094138,51.0775439],[5.9121604,51.1822548],[5.8785147,51.2080728],[5.7741446,51.2368858],[5.684194,51.2407548],[5.6230826,51.2699769],[5.6230826,51.2978925],[5.5399985,51.34724],[5.4473013,51.3485267],[5.3985495,51.321071],[5.3120322,51.3232166],[5.2667136,51.3618196],[5.1994223,51.3725369],[5.1829428,51.3961061],[5.1589102,51.4923992],[5.0833792,51.5308596],[5.0325675,51.539829],[4.9556632,51.5052229],[4.9014182,51.5056503],[4.8382468,51.5436725],[4.7709555,51.5586163],[4.711904,51.5470886],[4.6404929,51.4966741],[4.6144003,51.4971016],[4.5656485,51.5317139],[4.4825644,51.5304324],[4.4262595,51.5218884],[4.3006034,51.4697351],[4.2951102,51.4256575],[4.181127,51.4243731],[4.1371817,51.3952492],[4.138555,51.3506709],[4.0520377,51.3004685],[3.933248,51.272984],[3.8652701,51.2708361],[3.8632102,51.2901637],[3.7629599,51.3240748],[3.5933585,51.359247],[3.4773154,51.3313688],[3.425817,51.3973913],[3.2356162,51.3515286],[3.2260031,51.3656781],[3.1779379,51.3618196],[3.1600852,51.3322268],[3.0625815,51.3021857],[2.7508444,51.1702014],[2.4700064,51.0745241],[2.4926657,50.9937771],[2.5311179,50.9557299],[2.5091452,50.9115907],[2.5304312,50.8214514],[2.5990958,50.7641572],[2.6650138,50.7645915],[2.7700705,50.66677],[2.8970999,50.6589354],[2.991857,50.7254874],[3.1133933,50.7263567],[3.2369895,50.7059231],[3.3626456,50.6585001],[3.4711356,50.7020092],[3.6393637,50.6672052],[3.6984152,50.681565],[3.727941,50.7124454],[3.8185782,50.6841754],[3.8748831,50.6415206],[4.0925498,50.642827],[4.150228,50.6632881],[4.2065329,50.6441333],[4.3136496,50.642827],[4.452352,50.6876557],[4.5347495,50.6780842],[4.6130271,50.6954855],[4.6768851,50.6959204],[4.7270102,50.732007],[4.7805686,50.732007],[4.7997946,50.7128802],[4.8622794,50.7128802],[4.8856253,50.6954855],[4.9611563,50.6954855],[5.0311942,50.6576295],[5.1074118,50.6502288],[5.2007956,50.6489227],[5.2358145,50.6654643],[5.3250784,50.6658995],[5.3669638,50.6820001],[5.4212088,50.6641586],[5.5221457,50.6746032],[5.622396,50.7241834],[5.6752677,50.69853],[5.7398123,50.6972252],[5.7727713,50.6719923],[5.8125968,50.6602413],[5.9080405,50.659806],[5.9849448,50.7072276]]],"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}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","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":"Bordeaux_2012","name":"Bordeaux - 2012","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"terms_text":"Communauté urbaine de Bordeaux - 2012"},{"id":"Bordeaux_2016","name":"Bordeaux 2016","type":"tms","template":"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[14,20],"polygon":[[[-0.5992269128228901,45.041932410852176],[-0.542312560140509,45.02756808640373],[-0.509790072893434,45.006014839274926],[-0.4772675856463589,45.002062530648324],[-0.47066145542429677,44.97366975755017],[-0.4554165395272304,44.95101733966983],[-0.4645634890654702,44.91792155099146],[-0.47320227474047455,44.91936089493768],[-0.48793902677430534,44.90928473014602],[-0.49810230403901634,44.89056716544938],[-0.48946351836401203,44.87796537368711],[-0.46659614451841236,44.87076311041642],[-0.4762512579198878,44.84734952959955],[-0.4950533208596031,44.839783107079846],[-0.4909880099537187,44.83185531284354],[-0.46964512769782574,44.825368124499924],[-0.4970859763125452,44.80445999547304],[-0.5245268249272648,44.80013322923096],[-0.5102982367566694,44.76767213918935],[-0.5346901021919757,44.76514662270613],[-0.5621309508066953,44.75107386670688],[-0.5600982953537531,44.7416901252491],[-0.5728023919346418,44.741329181695264],[-0.5946534380537702,44.760095258488434],[-0.6342902193861429,44.73988538494593],[-0.650043299146445,44.7770516622697],[-0.6790086393508712,44.77488729214841],[-0.688155588889111,44.779215951267936],[-0.7150882736405949,44.76839369504671],[-0.7516760717935543,44.74710400814933],[-0.7633638406479719,44.755765166198834],[-0.7384638113494302,44.77560875786918],[-0.7420209583920789,44.785708331523864],[-0.7277923702214837,44.81239155746571],[-0.7399883029391369,44.828611809936305],[-0.7643801683744431,44.82933260413425],[-0.8030006219803447,44.821763815493405],[-0.8400965839965395,44.82753060173851],[-0.8390802562700685,44.840143435448645],[-0.875668054423028,44.8502317148731],[-0.8853231678245034,44.85851719417739],[-0.88684765941421,44.887686999278294],[-0.8660129410215526,44.88696693520083],[-0.8456863864921306,44.8966870397005],[-0.8334904537744775,44.92763642292355],[-0.818245537877411,44.92763642292355],[-0.8019842942538735,44.92223947466319],[-0.7984271472112248,44.94849985224626],[-0.7872475422200427,44.948140202171814],[-0.7557413826994388,44.97007473283782],[-0.7216944038626572,44.95784996320919],[-0.6957780468376442,44.930874348504034],[-0.6886637527523465,44.93447182951288],[-0.6713861814023379,44.93267311717697],[-0.6693535259493957,44.940946727451696],[-0.6251432698479031,44.95065770536977],[-0.6322575639332009,44.95892872413991],[-0.6312412362067297,44.96719855081702],[-0.6002432405493613,44.967558081456815],[-0.5514595096787488,44.97834295278015],[-0.5407880685508023,44.97726455691398],[-0.5545084928581621,44.99739126890938],[-0.5936371103272993,45.01751091397198],[-0.6078656984978945,45.0340324785955],[-0.5992269128228901,45.041932410852176]]],"terms_text":"Bordeaux Métropole - 2016"},{"id":"branquinha_al","name":"Branquinha AL","type":"wms","template":"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.96968237108,-9.29279539826],[-35.97062650865,-9.20260556139],[-35.97726765817,-9.20263733363],[-35.98365131562,-9.20270087809],[-35.98765317147,-9.20265851512],[-35.99159065431,-9.20274324105],[-36.00498024171,-9.20283855771],[-36.01473275369,-9.20293387434],[-36.01651374048,-9.20295505581],[-36.01871315187,-9.20293387434],[-36.02487150377,-9.20285973919],[-36.02891627496,-9.20296564655],[-36.03307906335,-9.2028915114],[-36.03769246286,-9.20294446508],[-36.04581419175,-9.20299741875],[-36.05160776323,-9.20305037241],[-36.05456892198,-9.20300800948],[-36.06022301858,-9.20303978168],[-36.06190744584,-9.20303978168],[-36.06180015748,-9.21318555747],[-36.06167141145,-9.21805712081],[-36.06156412309,-9.21914791817],[-36.06162849611,-9.22156248675],[-36.06143537706,-9.22276976485],[-36.06139246171,-9.22716464584],[-36.06133881753,-9.23226899309],[-36.06140319055,-9.23391041686],[-36.06144610589,-9.23493762655],[-36.06130663102,-9.23646255088],[-36.0613280887,-9.23773331611],[-36.06142464822,-9.23904643537],[-36.06144610589,-9.24133379272],[-36.0613602752,-9.24229744345],[-36.06141391938,-9.24357877714],[-36.06139246171,-9.24530486392],[-36.06126371568,-9.24726390922],[-36.06123152917,-9.24948767715],[-36.06127444452,-9.25106548492],[-36.0612100715,-9.25517410549],[-36.06118861383,-9.25794845615],[-36.06107059663,-9.2594521027],[-36.0610920543,-9.26183462807],[-36.06105986779,-9.26492659247],[-36.06085601991,-9.27145986606],[-36.06083456224,-9.27510235154],[-36.06073800271,-9.28273662427],[-36.06080237573,-9.29234011263],[-36.06073800271,-9.29363185173],[-36.05477276986,-9.29356832368],[-36.04621115869,-9.29349420762],[-36.03940907663,-9.29348361961],[-36.03501025384,-9.29338832751],[-36.02978531068,-9.29340950353],[-36.02167431062,-9.29332479942],[-36.01278010553,-9.29328244736],[-36.0046798343,-9.29320833124],[-35.99678341096,-9.29314480312],[-35.98969165033,-9.29312362708],[-35.98483148759,-9.29304951092],[-35.98305050081,-9.29289069053],[-35.98173085397,-9.29294363067],[-35.97884479707,-9.29281657433],[-35.96968237108,-9.29279539826]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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":"Budapest_XI_2015","name":"Budapest district XI orthophoto 2015","type":"wms","template":"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"terms_url":"http://terinfo.ujbuda.hu/","terms_text":"Budapest XI. kerület önkormányzata","description":"5 cm resolution bald image"},{"id":"Budapest_XI_2017","name":"Budapest district XI orthophoto 2017","type":"wms","template":"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[19.047674,47.487889],[19.051565,47.489898],[19.064336,47.479203],[19.066498,47.476323],[19.067662,47.473428],[19.068374,47.470774],[19.06846,47.468765],[19.067223,47.465006],[19.056829,47.452588],[19.054896,47.449065],[19.05176,47.434991],[19.048625,47.428997],[19.043844,47.429684],[19.040234,47.429319],[19.035087,47.438181],[19.032205,47.437794],[19.025205,47.442004],[19.020705,47.445763],[19.019153,47.446579],[19.015447,47.447588],[19.01347,47.443613],[19.012663,47.44271],[19.011776,47.442473],[19.011903,47.441883],[19.009799,47.439443],[19.005705,47.431105],[19.000464,47.430974],[18.995338,47.428211],[18.975454,47.428179],[18.973426,47.429037],[18.973615,47.429982],[18.975482,47.430671],[18.977187,47.434024],[18.978227,47.438171],[18.977329,47.446572],[18.970039,47.449876],[18.968611,47.451422],[18.975678,47.455063],[18.975859,47.455563],[18.976247,47.455842],[18.97658,47.455945],[18.977633,47.455967],[18.980167,47.456049],[18.981619,47.460669],[18.977933,47.468574],[18.968669,47.476431],[18.977448,47.481943],[18.980348,47.481687],[18.985653,47.478204],[18.989075,47.478377],[18.991166,47.47898],[18.991766,47.481021],[18.992875,47.481817],[18.998357,47.482378],[18.999022,47.483001],[19.003999,47.481886],[19.004156,47.483992],[19.010272,47.485348],[19.012373,47.484043],[19.0138,47.483506],[19.016739,47.484651],[19.016303,47.485392],[19.016889,47.485946],[19.018085,47.486054],[19.021081,47.484921],[19.021239,47.486124],[19.023013,47.487414],[19.026373,47.488854],[19.029954,47.489037],[19.031349,47.488554],[19.031889,47.487587],[19.032855,47.48712],[19.03364,47.487018],[19.035138,47.487249],[19.035851,47.487292],[19.03616,47.487507],[19.036651,47.487668],[19.037475,47.487738],[19.038474,47.487368],[19.039179,47.486793],[19.041049,47.486492],[19.04181,47.487373],[19.04387,47.488104],[19.045423,47.488169],[19.046945,47.488104],[19.047674,47.487889]]],"terms_url":"http://terinfo.ujbuda.hu/","terms_text":"Budapest XI. kerület önkormányzata","best":true,"description":"5 cm resolution bald image"},{"id":"Cadastre","name":"Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,22],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"https://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":"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":"cajueiro_al","name":"Cajueiro AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.10752645677,-9.43884254591],[-36.10751572793,-9.43420690643],[-36.10766593164,-9.42959237236],[-36.10779467767,-9.42361243708],[-36.10768738931,-9.41927295015],[-36.10780540651,-9.41390672873],[-36.10803071206,-9.41094309933],[-36.10809508508,-9.40965179571],[-36.10810581392,-9.40747138685],[-36.1081594581,-9.40693157477],[-36.1081916446,-9.4041795785],[-36.10810581392,-9.40175568673],[-36.10817018693,-9.40001978874],[-36.10826674646,-9.39952230418],[-36.10826674646,-9.39646328763],[-36.10833111947,-9.39474853296],[-36.10832039064,-9.39272680513],[-36.10836330598,-9.39039809877],[-36.10840622133,-9.38447041196],[-36.10847059434,-9.38165472521],[-36.10845986551,-9.37767461773],[-36.10835257714,-9.37572688892],[-36.10844913667,-9.37431901292],[-36.10849205201,-9.37233950842],[-36.10844913667,-9.36970368011],[-36.10867444223,-9.36278056588],[-36.10863152688,-9.36102330087],[-36.10872808641,-9.35927661299],[-36.10873881524,-9.35736053922],[-36.10854569619,-9.35478811418],[-36.1086958999,-9.35230035993],[-36.10870662873,-9.34996079609],[-36.10872808641,-9.34893392374],[-36.11268702691,-9.34908213231],[-36.11725751107,-9.3491244776],[-36.12137738412,-9.34905037333],[-36.12806144899,-9.34910330495],[-36.1321705932,-9.34906095966],[-36.13694492524,-9.34914565024],[-36.14024940675,-9.34913506392],[-36.14134374803,-9.34931503136],[-36.14458385652,-9.34915623657],[-36.14683691209,-9.34913506392],[-36.14842477983,-9.34905037333],[-36.1527592296,-9.34907154598],[-36.15400377458,-9.34921975449],[-36.15626755899,-9.34923034081],[-36.160258686,-9.34920916817],[-36.16085950082,-9.34929385872],[-36.16599861329,-9.34932561767],[-36.16937819665,-9.34942089451],[-36.17175999826,-9.34935737662],[-36.17627683824,-9.34945265345],[-36.18027869409,-9.34936796294],[-36.1822742576,-9.34946323976],[-36.18826094812,-9.34937854925],[-36.19038525766,-9.34945265345],[-36.19353953546,-9.34946323976],[-36.19552437013,-9.3494103082],[-36.19918290323,-9.34950558501],[-36.19925800508,-9.35146404706],[-36.19912925904,-9.35234270483],[-36.19911853021,-9.35352836],[-36.19919363206,-9.35646072192],[-36.19921508973,-9.35770987942],[-36.19930092042,-9.35832387044],[-36.19933310693,-9.3611185745],[-36.19921508973,-9.36177490326],[-36.19918290323,-9.36257943359],[-36.19931164926,-9.36399794306],[-36.19925800508,-9.36499301341],[-36.19921508973,-9.36562816321],[-36.19927946275,-9.36660205731],[-36.19917217439,-9.36795703586],[-36.19917217439,-9.36867686607],[-36.19921508973,-9.36911088062],[-36.19911853021,-9.37016945042],[-36.19887176698,-9.37149265813],[-36.19886103814,-9.37263590554],[-36.19902197068,-9.37321811341],[-36.19915071672,-9.37503882993],[-36.19910780137,-9.37688070785],[-36.19895759767,-9.37747349407],[-36.19898978418,-9.37914599257],[-36.19917217439,-9.38053267826],[-36.19919363206,-9.38124189704],[-36.19925800508,-9.38174999318],[-36.19927946275,-9.38302023029],[-36.19912925904,-9.38374002925],[-36.19907561486,-9.38592058756],[-36.19878593629,-9.38786825912],[-36.19880739396,-9.3893501758],[-36.19902197068,-9.39091676655],[-36.19904342836,-9.39199643982],[-36.19898978418,-9.39347833885],[-36.19879666513,-9.39450507945],[-36.19866791909,-9.39704545549],[-36.19845334237,-9.39949054982],[-36.19863573259,-9.40313169724],[-36.19865719026,-9.40476173338],[-36.19864646142,-9.40836048727],[-36.19875374978,-9.40901672659],[-36.19857135957,-9.41058322831],[-36.19859281724,-9.4127318644],[-36.19874302095,-9.41445711425],[-36.19867864793,-9.41711377049],[-36.19860354608,-9.41901892972],[-36.19846407121,-9.41965398046],[-36.19849625772,-9.42235293308],[-36.19871083444,-9.42428981548],[-36.19858208841,-9.42696756397],[-36.19839969819,-9.42894675602],[-36.19857135957,-9.43412223664],[-36.19871083444,-9.43470434105],[-36.19864646142,-9.43595321629],[-36.19857135957,-9.43626014256],[-36.19859281724,-9.43667290505],[-36.19876447862,-9.43748784493],[-36.19889322465,-9.43905421746],[-36.1988181228,-9.43995382008],[-36.1784977073,-9.43977389974],[-36.17717806047,-9.43967864776],[-36.17265049165,-9.43966806421],[-36.17098752206,-9.43971039843],[-36.16396013444,-9.43962572998],[-36.15386429971,-9.43949872728],[-36.13983098214,-9.43929763957],[-36.12874809449,-9.43912830247],[-36.11497226899,-9.43891663097],[-36.10752645677,-9.43884254591]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"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":"campo_alegre_al","name":"Campo Alegre AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.30642834848,-9.82332496055],[-36.30602585634,-9.78597356977],[-36.30602065271,-9.78263262201],[-36.30608502572,-9.7816810657],[-36.30604211038,-9.78081408979],[-36.30590263551,-9.77530556809],[-36.30585972017,-9.76496494896],[-36.3054520244,-9.73335957439],[-36.39633599466,-9.73248189831],[-36.39627162164,-9.73744126654],[-36.39635745233,-9.74336280376],[-36.39644328302,-9.7553535947],[-36.39660421556,-9.75855741026],[-36.3966471309,-9.75979451892],[-36.39655057138,-9.76243789809],[-36.39661494439,-9.76489093519],[-36.39658275789,-9.76647694093],[-36.39661494439,-9.76683643452],[-36.39659348672,-9.76959606352],[-36.39670077508,-9.77896382877],[-36.39675441926,-9.78464145418],[-36.39684024995,-9.7906678778],[-36.39692608064,-9.79681048826],[-36.397033369,-9.80298470156],[-36.39719430154,-9.82033320249],[-36.39721575921,-9.82234180629],[-36.39392200654,-9.82233123473],[-36.35375324434,-9.8227858118],[-36.34821716493,-9.82285981267],[-36.31697479432,-9.82316638748],[-36.3119107837,-9.82324038826],[-36.30878869241,-9.82327210287],[-36.30642834848,-9.82332496055]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Geneve-SITG-2011","name":"Canton de Génève 5cm (SITG 2011)","type":"wms","template":"http://etat.geneve.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[6.126755,46.140923],[6.137654,46.141979],[6.143259,46.146112],[6.146397,46.145461],[6.150278,46.150561],[6.179239,46.16006],[6.19068,46.167201],[6.188283,46.176608],[6.189304,46.180941],[6.199386,46.183905],[6.207892,46.192481],[6.213824,46.193335],[6.219192,46.198334],[6.223522,46.199301],[6.223947,46.201286],[6.229577,46.202887],[6.234054,46.206246],[6.243581,46.204849],[6.250976,46.205426],[6.257218,46.210407],[6.27856,46.216044],[6.296258,46.225677],[6.311314,46.243494],[6.311526,46.251427],[6.308503,46.253043],[6.311779,46.25767],[6.309369,46.258698],[6.303094,46.257032],[6.297211,46.258037],[6.296141,46.259574],[6.298698,46.264455],[6.297309,46.266398],[6.29208,46.265404],[6.28949,46.261738],[6.283231,46.257845],[6.283958,46.256179],[6.268083,46.25019],[6.262682,46.253393],[6.263327,46.256461],[6.251851,46.26392],[6.240021,46.278615],[6.240599,46.28224],[6.243996,46.285534],[6.25049,46.287004],[6.255025,46.291635],[6.251397,46.295795],[6.250494,46.303987],[6.245616,46.306228],[6.240885,46.306036],[6.241482,46.299003],[6.235141,46.290823],[6.22845,46.287853],[6.21,46.267619],[6.201241,46.266946],[6.197483,46.26476],[6.193593,46.258897],[6.191105,46.246299],[6.193034,46.24105],[6.190084,46.234562],[6.181586,46.22644],[6.175418,46.217192],[6.164591,46.210825],[6.157743,46.212251],[6.154675,46.214794],[6.153646,46.218593],[6.155639,46.222746],[6.151095,46.227975],[6.155884,46.246685],[6.153735,46.25231],[6.163857,46.263563],[6.168381,46.263711],[6.172824,46.27372],[6.173199,46.276216],[6.169149,46.282836],[6.171033,46.286509],[6.173558,46.28752],[6.172275,46.29639],[6.154827,46.301212],[6.142821,46.306545],[6.126372,46.319634],[6.115664,46.316386],[6.010923,46.247101],[5.979715,46.219401],[5.972945,46.215415],[5.9687,46.208214],[5.972311,46.20425],[5.965603,46.20153],[5.963283,46.197831],[5.981455,46.191643],[5.983876,46.189335],[5.990526,46.188139],[5.994304,46.183363],[5.990734,46.180491],[5.988186,46.174182],[5.983853,46.176298],[5.980843,46.17465],[5.979577,46.168441],[5.964504,46.147603],[5.963805,46.143652],[5.965833,46.139681],[5.956025,46.134032],[5.956731,46.129325],[5.974342,46.132072],[5.983657,46.138085],[5.985233,46.143589],[5.988073,46.14294],[5.994177,46.144445],[6.003944,46.142112],[6.017712,46.143144],[6.030847,46.13943],[6.036377,46.134682],[6.040866,46.140179],[6.043575,46.141312],[6.046297,46.140367],[6.049486,46.142973],[6.050433,46.147997],[6.053703,46.151663],[6.075433,46.149173],[6.092211,46.152187],[6.098635,46.144226],[6.12516,46.141824],[6.126755,46.140923]],[[6.1883445,46.3490083],[6.1869587,46.3486226],[6.1819521,46.35015],[6.1796053,46.3520013],[6.1714248,46.3544387],[6.1702178,46.3591128],[6.1741516,46.3603622],[6.1727212,46.3618892],[6.1734811,46.3628764],[6.1799852,46.3654676],[6.1876963,46.3613185],[6.1944686,46.3617504],[6.1990506,46.3608558],[6.2011339,46.3563388],[6.202582,46.3556728],[6.2079112,46.3558251],[6.213743,46.3537853],[6.2124652,46.3508462],[6.2084644,46.3466497],[6.2085985,46.3399069],[6.2065869,46.3379163],[6.2049329,46.3386107],[6.2034801,46.3379318],[6.1918129,46.3433324],[6.1931763,46.3478686],[6.1907624,46.3476988],[6.1883445,46.3490083]],[[6.181818,46.3428059],[6.180164,46.3431762],[6.1752021,46.3453209],[6.173414,46.3439785],[6.1732352,46.3405377],[6.1714024,46.3395192],[6.1658818,46.3425436],[6.1656359,46.3433922],[6.1709107,46.3505357],[6.173414,46.3502888],[6.1745763,46.3519241],[6.1758726,46.3520476],[6.1857942,46.345934],[6.181818,46.3428059]]],"terms_text":"Orthophotos du SITG 2011"},{"id":"Canvec","name":"Canvec","type":"wms","template":"http://wms.sst-sw.rncan.gc.ca/wms/toporama_fr?REQUEST=GetMap&SERVICE=wms&VERSION=1.1.1&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS={proj}&FORMAT=image/png&transparent=true&layers=SCW-Toporama&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"capela_al","name":"Capela AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.03320780938,-9.4574082918],[-36.03321853822,-9.45581025359],[-36.03335801309,-9.45482602768],[-36.03340092843,-9.45291048318],[-36.0332721824,-9.45140767284],[-36.03335801309,-9.44286692894],[-36.03349748796,-9.43821017639],[-36.03352967447,-9.42881181147],[-36.03362623399,-9.42027050777],[-36.03389445489,-9.41091399212],[-36.03389445489,-9.40031880838],[-36.03401247209,-9.38880239663],[-36.03413048928,-9.38527753599],[-36.03428069299,-9.38265239127],[-36.03417340463,-9.37849234301],[-36.03444162553,-9.3668799342],[-36.05245534127,-9.36710223556],[-36.05790558999,-9.36711282133],[-36.0715955848,-9.36727160792],[-36.08621898835,-9.367313951],[-36.10299888795,-9.36750449479],[-36.11651722139,-9.36754683784],[-36.12515393441,-9.36768445271],[-36.12521830743,-9.37473449571],[-36.12520757859,-9.37721150385],[-36.12511101907,-9.38037654408],[-36.12514320558,-9.38528812121],[-36.12504664605,-9.39026313917],[-36.12503591722,-9.39477234906],[-36.12505737489,-9.40171599404],[-36.12499300187,-9.40382234661],[-36.12479988282,-9.40678603705],[-36.12462822145,-9.41123152509],[-36.12473550981,-9.41360242867],[-36.12456384843,-9.41630142857],[-36.1245853061,-9.42460998216],[-36.12466040796,-9.42690670628],[-36.12464967912,-9.42924575062],[-36.12457457727,-9.42970085695],[-36.12463895028,-9.4353843436],[-36.12438145822,-9.44108890357],[-36.12445656007,-9.44387235589],[-36.12452093309,-9.44578795069],[-36.12438145822,-9.4473648688],[-36.12447801774,-9.44856078174],[-36.12447801774,-9.45095259517],[-36.12436000055,-9.45391588079],[-36.12433854287,-9.45790569291],[-36.11757937616,-9.45783161194],[-36.10889974778,-9.45777869695],[-36.10418978875,-9.45779986294],[-36.10116425699,-9.45772578195],[-36.09529558366,-9.45772578195],[-36.08460966295,-9.45767286695],[-36.07361260598,-9.45756703691],[-36.05726185983,-9.4574082918],[-36.04816380685,-9.45747178985],[-36.04176942056,-9.45738712578],[-36.03767100518,-9.45738712578],[-36.03320780938,-9.4574082918]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Catastro-Spain","name":"Catastro Spain","type":"wms","template":"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","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]]]},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"https://{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":"https://{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":"Czech_CUZK-KM","name":"Czech CUZK:KM","type":"wms","template":"http://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","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]]]},{"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/","terms_text":"Czech RUIAN"},{"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/","terms_text":"Czech RUIAN"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","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","description":"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{"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","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","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":"delmiro_gouveia","name":"Delmiro Gouveia AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.94962469285,-9.42956855866],[-37.94833723253,-9.33972104942],[-38.03902808374,-9.33834478757],[-38.04033700174,-9.42845725102],[-37.94962469285,-9.42956855866]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"der-es","name":"DER-ES","type":"wms","template":"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-40.94577071764,-21.31403802661],[-40.62309586758,-20.86277859527],[-40.38881524148,-20.65176928183],[-40.22208792475,-20.29831315792],[-39.80383232847,-19.66412347768],[-39.69603449437,-19.42573412636],[-39.6730376231,-19.30437313323],[-39.70537697333,-18.61383779319],[-39.65291536073,-18.33096390659],[-40.22280657698,-17.97586605847],[-40.34282149894,-17.91980423648],[-40.45277528971,-17.91501764849],[-40.46499237758,-17.92048802421],[-40.48367733549,-17.90407639054],[-40.50164364117,-17.90681176832],[-40.51601668572,-17.8890310587],[-40.53326433917,-17.8890310587],[-40.54548142703,-17.90134097056],[-40.5893192129,-17.91501764849],[-40.5893192129,-17.93211201178],[-40.61519069308,-17.9341632245],[-40.62956373763,-17.98680287756],[-40.64609273886,-17.98680287756],[-40.65902847895,-18.00730758632],[-40.68777456804,-18.00594067991],[-40.70574087372,-18.01755904646],[-40.71364604822,-18.00183989709],[-40.72155122272,-17.9977390189],[-40.75101596404,-18.00252336752],[-40.76754496527,-17.99842250522],[-40.76754496527,-17.98133455271],[-40.80922679445,-17.94852104795],[-40.82431849123,-17.96014319437],[-40.8315050135,-17.94988839894],[-40.86528166818,-17.9827016498],[-40.88396662609,-17.9676629996],[-40.90911945405,-17.98475227559],[-40.77760609645,-18.1077461392],[-40.77832474868,-18.15145652556],[-40.79054183654,-18.15350518192],[-40.83509827463,-18.14531041238],[-40.89546506173,-18.10364773093],[-40.93283497755,-18.12755376077],[-40.95583184882,-18.12550480038],[-40.95295723991,-18.14462749757],[-40.96014376218,-18.1500907413],[-40.96373702332,-18.14326165996],[-40.97954737232,-18.13643231189],[-40.99248311241,-18.1500907413],[-40.99104580796,-18.16306526069],[-41.00901211364,-18.16306526069],[-41.0578804651,-18.16579661567],[-41.0578804651,-18.17535602159],[-41.09596903314,-18.19242508686],[-41.09596903314,-18.20539645898],[-41.10890477323,-18.21290575936],[-41.09812498982,-18.22997114669],[-41.1053115121,-18.23270145336],[-41.09884364205,-18.25590732904],[-41.1290270356,-18.27501572272],[-41.16136638583,-18.30572123183],[-41.15058660242,-18.37393619787],[-41.16424099474,-18.3793922314],[-41.16424099474,-18.40189654461],[-41.15058660242,-18.407351693],[-41.15849177692,-18.41144294087],[-41.17358347369,-18.41144294087],[-41.18867517046,-18.44485115689],[-41.0212292015,-18.46666526175],[-41.04638202946,-18.60362157901],[-41.03775820273,-18.61451885232],[-41.0578804651,-18.6267774504],[-41.04710068169,-18.64856833073],[-41.03488359382,-18.65401561396],[-40.99895098246,-18.67716461675],[-40.94505206541,-18.69418392578],[-40.94433341318,-18.76972898283],[-40.92133654191,-18.81055006856],[-40.93714689091,-18.82347468178],[-40.94720802209,-18.82143401943],[-40.97092354559,-18.83571813552],[-41.08375194528,-18.83231726565],[-41.10674881655,-18.83571813552],[-41.11752859996,-18.80782897078],[-41.13118299228,-18.79286214638],[-41.23610621747,-18.79490315535],[-41.25119791424,-18.81667237761],[-41.2476046531,-18.85544182257],[-41.22029586847,-18.8799231739],[-41.2080787806,-18.8799231739],[-41.20664147615,-18.86632286449],[-41.16424099474,-18.86700290617],[-41.15633582024,-18.88876278307],[-41.1290270356,-18.90440094845],[-41.1211218611,-18.92411655188],[-41.03919550719,-18.98664720231],[-41.07584677078,-19.00567361403],[-41.06506698737,-19.06341902698],[-40.96876758891,-19.12725524781],[-40.96158106664,-19.15101775756],[-40.92996036864,-19.20599786475],[-40.94648936987,-19.2229633254],[-40.94792667432,-19.24264106543],[-40.92564845527,-19.262994866],[-40.94936397877,-19.27859773554],[-40.92277384636,-19.31047723804],[-40.94361476096,-19.352521543],[-40.934272282,-19.38099701507],[-40.95726915327,-19.39184350499],[-40.9737981545,-19.42641186672],[-40.95439454437,-19.46165046782],[-40.97882872009,-19.50297829748],[-41.013324027,-19.50297829748],[-41.04638202946,-19.48333195583],[-41.05428720396,-19.48400945558],[-41.04135146387,-19.56664313353],[-41.09237577201,-19.58966465422],[-41.14627468905,-19.6560023745],[-41.16495964696,-19.65870945459],[-41.17933269151,-19.69389733589],[-41.19658034496,-19.74598826039],[-41.16999021255,-19.80617607525],[-41.18939382269,-19.82375473895],[-41.18867517046,-19.88526474348],[-41.21239069396,-19.89742873112],[-41.22963834742,-19.90215891837],[-41.24688600088,-19.93323948769],[-41.25479117538,-19.92918584689],[-41.26988287215,-19.93796860383],[-41.30653413574,-19.93391508438],[-41.31515796247,-19.9697175726],[-41.32450044142,-19.97647184801],[-41.31300200579,-20.01226467389],[-41.33671752929,-20.05547534637],[-41.34821596492,-20.08652567207],[-41.3554024872,-20.12094384129],[-41.37768070624,-20.1580529872],[-41.3870231852,-20.1863849412],[-41.4107387087,-20.19447883957],[-41.42079983988,-20.2025723174],[-41.7635969523,-20.20459562113],[-41.78515651912,-20.28483210523],[-41.8505538718,-20.32459783588],[-41.86348961189,-20.37513273815],[-41.85127252403,-20.38186947551],[-41.84336734953,-20.40948702116],[-41.80887204262,-20.4249776227],[-41.80671608594,-20.47211333219],[-41.83115026167,-20.4788458242],[-41.8110279993,-20.54211679742],[-41.83115026167,-20.55086497994],[-41.86205230744,-20.61814193832],[-41.82108913048,-20.64437190401],[-41.85342848071,-20.68068284947],[-41.87139478639,-20.72101815833],[-41.86780152526,-20.73849345818],[-41.88001861312,-20.73983762845],[-41.88289322203,-20.76739048664],[-41.85414713294,-20.77478186241],[-41.83330621835,-20.79829746931],[-41.80887204262,-20.80904624047],[-41.78443786689,-20.80568733178],[-41.75137986444,-20.82382454951],[-41.74706795107,-20.87486573082],[-41.72335242757,-20.87553720984],[-41.74131873325,-20.92723207622],[-41.72335242757,-20.97756707786],[-41.74347468994,-21.09763138917],[-41.72910164539,-21.12578887114],[-41.59399502666,-21.16332386392],[-41.57243545984,-21.18677840236],[-41.49050910593,-21.18878861828],[-41.48332258366,-21.20084933958],[-41.43948479779,-21.22094835332],[-41.41289466538,-21.20955924815],[-41.34965326938,-21.21290907619],[-41.27994400333,-21.24640317418],[-41.24473004419,-21.2323365795],[-41.17717673483,-21.25511039335],[-41.09237577201,-21.22429792287],[-41.04853798614,-21.25912893631],[-41.01547998369,-21.25578015812],[-41.00254424359,-21.28725566578],[-40.94577071764,-21.31403802661]]],"terms_url":"https://der.es.gov.br/","terms_text":"Departamento de Estradas de Rodagem do Estado do Espírito Santo"},{"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg","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-Premium-vintage","name":"DigitalGlobe Premium Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ","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":"DigitalGlobe-Standard-vintage","name":"DigitalGlobe Standard Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"Erlangen-2011","name":"Erlangen Luftbild (2011 5,0 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[10.909347,49.529292],[10.909347,49.65211],[11.077808,49.65211],[11.077808,49.529292],[10.909347,49.529292]]],"terms_text":"© Stadt Erlangen | © Aerowest GmbH"},{"id":"Erlangen-2013","name":"Erlangen Luftbild (2013 6,25 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[10.905885,49.529259],[10.905885,49.65197],[11.060541,49.65197],[11.060541,49.529259],[10.905885,49.529259]]],"terms_text":"© Stadt Erlangen | © Aerowest GmbH"},{"id":"Erlangen-2016","name":"Erlangen Luftbild (2016 5,0 cm)","type":"wms","template":"https://secure.erlangen.de/arcgiser/services/Luftbild2016/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2016-03-18T00:00:00.000Z","startDate":"2016-03-18T00:00:00.000Z","polygon":[[[10.97664,49.537646],[10.9910133,49.5339157],[10.9938879,49.538346],[11.0278442,49.532545],[11.034604,49.5346153],[11.034065,49.537588],[11.0431829,49.543213],[11.035569,49.5530346],[11.0383994,49.5584249],[11.0350756,49.569291],[11.037905,49.5865909],[11.047966,49.5902015],[11.0492241,49.5936954],[11.0574886,49.595209],[11.056231,49.5990522],[11.0512678,49.600304],[11.053513,49.609036],[11.043093,49.613809],[11.040757,49.618232],[11.0284955,49.61735],[11.0192878,49.6189603],[11.0152,49.613722],[11.005813,49.6144788],[11.00639,49.6193095],[11.0008274,49.622103],[10.9856009,49.616515],[10.978369,49.617534],[10.973698,49.6249544],[10.9653888,49.6255654],[10.9606278,49.6285622],[10.9638168,49.6317624],[10.9547438,49.6379],[10.9483658,49.636998],[10.941853,49.643775],[10.9273003,49.648371],[10.9206303,49.639631],[10.9113552,49.6377259],[10.9242909,49.6050488],[10.9220451,49.580038],[10.9122086,49.5700778],[10.914409,49.5618046],[10.9235273,49.5584249],[10.9271206,49.559765],[10.9334537,49.55892],[10.9307139,49.544671],[10.930669,49.5322541],[10.9405953,49.533245],[10.9548785,49.5302135],[10.9719915,49.531263],[10.97664,49.537646]]],"terms_text":"© Stadt Erlangen | © Geocart GmbH"},{"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":"EsriWorldImageryClarity","name":"Esri World Imagery (Clarity) Beta","type":"tms","template":"https://clarity.maptiles.arcgis.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 archive imagery that may be clearer and more accurate than the default layer.","icon":"data:image/png;base64,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"},{"id":"maaamet.ee-pohi_vr2","name":"Estonia Basemap (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[22.3536433,58.8538478],[22.0941083,58.8503765],[22.09179,58.8950979],[22.0050343,58.8937111],[21.9997875,58.9837386],[22.3475423,58.9884539],[22.3453459,59.0333735],[22.5193454,59.0353825],[22.5155628,59.1251033],[22.6901723,59.1268565],[22.6921246,59.0821845],[22.7791243,59.0829995],[22.7808326,59.0381447],[22.8680763,59.0387725],[22.8692965,58.9939856],[22.9562963,58.9948656],[22.954954,59.0395885],[23.1289535,59.0409695],[23.1278553,59.0858205],[23.4767083,59.0877011],[23.4741459,59.2672589],[23.6492435,59.2678824],[23.6488774,59.3128106],[23.7369753,59.3129974],[23.7364872,59.3578039],[23.9115848,59.3578661],[23.9120729,59.4027997],[24.1760005,59.4027997],[24.1763666,59.4477979],[24.2644645,59.4476738],[24.2647085,59.4923646],[24.7060521,59.490816],[24.7089805,59.6255274],[24.7974445,59.6249721],[24.7965903,59.5800862],[24.9732742,59.5788506],[24.9746164,59.6238615],[24.8860304,59.6247253],[24.8872506,59.6691818],[24.9762027,59.6686273],[24.9773008,59.7134564],[25.0660088,59.7125949],[25.0632024,59.6230593],[25.2403743,59.621455],[25.2418385,59.6664705],[25.3305465,59.6654845],[25.3288383,59.6207762],[25.4175462,59.6197889],[25.4193765,59.6646834],[25.6855005,59.6614786],[25.6875748,59.7061327],[25.8651128,59.7038552],[25.8627944,59.6590132],[26.1285523,59.6550682],[26.1257459,59.6100991],[26.3911377,59.6056544],[26.3880872,59.5609901],[26.8296748,59.552149],[26.8262583,59.5072897],[26.9142342,59.5054941],[26.9105736,59.4605107],[27.9668941,59.4330327],[27.9718969,59.4778048],[28.0366891,59.4756977],[28.0437662,59.472227],[28.0476708,59.4657804],[28.0518195,59.4634246],[28.0691462,59.4625567],[28.0845206,59.4593946],[28.1217365,59.4409124],[28.1357687,59.4276958],[28.1371109,59.4226684],[28.1416256,59.419006],[28.1665176,59.4120525],[28.1722525,59.4078922],[28.1927517,59.4014954],[28.2106885,59.383603],[28.2106885,59.3799364],[28.2038555,59.3745911],[28.2105665,59.3723533],[28.2110546,59.3693693],[28.2067839,59.3671933],[28.207028,59.3637736],[28.1997068,59.3609133],[28.2020252,59.3573064],[28.1926297,59.3522685],[28.1939719,59.3464212],[28.1696901,59.3335411],[28.1362568,59.2924414],[28.1251531,59.2890141],[28.1172218,59.2889518],[28.1099006,59.2906343],[28.0535278,59.2901981],[28.0202165,59.2833429],[27.998253,59.2753018],[27.9798281,59.2729328],[27.9643317,59.2726834],[27.95335,59.2686307],[27.9492013,59.2653258],[27.9056404,59.2404352],[27.9011257,59.2348807],[27.9010037,59.2263912],[27.8978312,59.2174624],[27.9023459,59.207282],[27.8923404,59.1922244],[27.8897779,59.1837868],[27.8764779,59.1737214],[27.8718411,59.1684062],[27.8681805,59.161589],[27.8441428,59.1481382],[27.8320629,59.1440081],[27.820349,59.133618],[27.8098553,59.1290479],[27.8059507,59.1216592],[27.8053406,59.1127031],[27.8107095,59.1081928],[27.8100994,59.1060627],[27.8020461,59.1028047],[27.788868,59.0908979],[27.7906983,59.0811186],[27.7937488,59.0784226],[27.7941149,59.0756636],[27.7927727,59.0729044],[27.7930167,59.069267],[27.788502,59.06657],[27.7826451,59.0650019],[27.7750799,59.0581013],[27.7731276,59.0510739],[27.7766661,59.0474341],[27.769833,59.0332479],[27.7660504,59.0315527],[27.7515302,59.0301714],[27.7462833,59.0271573],[27.7456732,59.0170459],[27.7416466,59.0095074],[27.7478696,58.9926656],[27.7427448,58.9884539],[27.7321291,58.9854991],[27.6544028,58.9878252],[27.6550129,58.9924142],[27.3941358,58.9996422],[27.3897431,58.9547414],[27.1293541,58.9613481],[27.1255715,58.9163975],[27.0388158,58.9184133],[27.027102,58.784103],[27.1136136,58.7818263],[27.1093429,58.7370852],[27.1953665,58.7351221],[27.1873132,58.6453349],[27.2730927,58.6430491],[27.2525935,58.4188307],[27.5339699,58.4114172],[27.5552012,58.3657519],[27.5176193,58.3326492],[27.5140807,58.322142],[27.4999265,58.3224624],[27.4868704,58.1880305],[27.528723,58.1868727],[27.592051,58.1187543],[27.6369541,58.0973519],[27.6093777,58.053992],[27.6226778,58.0057957],[27.6448853,58.0020458],[27.6529386,58.0064422],[27.6478138,58.0142638],[27.6478138,58.020856],[27.661724,58.0186587],[27.6685571,58.0104502],[27.6839315,58.0084463],[27.6964995,58.0045027],[27.7006481,57.9986189],[27.6988178,57.9882713],[27.6912527,57.9854899],[27.680637,57.9744915],[27.6821012,57.9719031],[27.6889343,57.9718384],[27.6858838,57.9592823],[27.6589176,57.955398],[27.6675809,57.9509954],[27.6716076,57.9462684],[27.6691672,57.9417351],[27.6764883,57.9355171],[27.6824673,57.9365535],[27.6861278,57.9279374],[27.6824673,57.9243737],[27.7107757,57.9239202],[27.7202932,57.9203561],[27.7205373,57.9117361],[27.7083353,57.9061612],[27.6988178,57.9061612],[27.706139,57.9013635],[27.7289566,57.9073929],[27.7467714,57.9016877],[27.7536045,57.9040866],[27.7573871,57.9031789],[27.7559228,57.8980566],[27.769589,57.8956572],[27.7809368,57.8983159],[27.7989956,57.8996128],[27.8185187,57.8957869],[27.8209591,57.890469],[27.8194949,57.8880043],[27.8105875,57.8861232],[27.8182747,57.8824905],[27.8116856,57.8720446],[27.8158343,57.8716552],[27.8183967,57.8651005],[27.8163224,57.8613359],[27.7987516,57.8520525],[27.7946029,57.8463384],[27.8005819,57.8441954],[27.7957011,57.8401688],[27.788624,57.8418575],[27.7841093,57.837246],[27.7771542,57.8325041],[27.7584853,57.8353623],[27.7416466,57.8267869],[27.7238318,57.8317895],[27.7054069,57.8419224],[27.6877141,57.8341931],[27.6663607,57.8365315],[27.6602598,57.8389348],[27.6481799,57.8377007],[27.636344,57.8397792],[27.6248742,57.8375058],[27.6220677,57.8387399],[27.5979079,57.8332836],[27.5625224,57.8302303],[27.5562994,57.8312698],[27.5522727,57.8211338],[27.5444635,57.8220436],[27.5451956,57.8180795],[27.5505645,57.8176896],[27.5566654,57.81366],[27.5408029,57.81288],[27.5447076,57.8080049],[27.5372644,57.8064447],[27.5395827,57.8014386],[27.5359222,57.7966269],[27.5386066,57.7939607],[27.5292111,57.7885626],[27.5174973,57.7887577],[27.5184734,57.7920097],[27.502977,57.7879772],[27.5000485,57.7897333],[27.4958999,57.7886927],[27.5077357,57.783489],[27.5145688,57.7751615],[27.5081018,57.7715827],[27.5111523,57.7641637],[27.515911,57.7639034],[27.5201817,57.7599329],[27.5281129,57.7581753],[27.5300652,57.7536834],[27.5311634,57.7407253],[27.5480021,57.7332999],[27.5419011,57.7303684],[27.5279909,57.7294564],[27.5235982,57.7161637],[27.5276249,57.708994],[27.5235982,57.7080162],[27.5165211,57.7087333],[27.5106642,57.7110147],[27.5085899,57.707234],[27.4999265,57.7049523],[27.4952898,57.7074947],[27.4871145,57.7190963],[27.4735703,57.7154468],[27.4706419,57.7080162],[27.4614904,57.706191],[27.4480683,57.7161637],[27.4308636,57.7075599],[27.4281792,57.6990193],[27.4134149,57.6991498],[27.4164653,57.6952374],[27.4074359,57.6927593],[27.4023111,57.6849328],[27.3913294,57.6853894],[27.3937698,57.679127],[27.3914514,57.676713],[27.3819339,57.6733202],[27.3777852,57.668361],[27.3836422,57.6605944],[27.3801036,57.658832],[27.3875468,57.6555028],[27.3804697,57.6494964],[27.3835201,57.6479947],[27.3815678,57.643685],[27.3907193,57.6430972],[27.3881569,57.6400931],[27.4008469,57.6374154],[27.4031652,57.6290542],[27.401823,57.6237622],[27.3959661,57.6211486],[27.3902312,57.6203644],[27.3908413,57.616901],[27.401945,57.6177506],[27.4063377,57.6154633],[27.4068258,57.6124569],[27.3857165,57.603044],[27.3782733,57.5951327],[27.35692,57.5969636],[27.3413015,57.5898357],[27.3417896,57.5853883],[27.3288555,57.5796974],[27.3214124,57.5789778],[27.3341024,57.5659571],[27.331784,57.5606559],[27.3377629,57.5600668],[27.3388611,57.5467119],[27.3438639,57.5454024],[27.3547236,57.5257533],[27.3513071,57.516318],[27.3456942,57.5210359],[27.3244628,57.5227395],[27.2966424,57.5385919],[27.2801699,57.5364306],[27.2737028,57.5431105],[27.2643074,57.5437654],[27.2636973,57.5484143],[27.2577183,57.5497892],[27.2479568,57.5476941],[27.2248951,57.5538482],[27.1932922,57.5496583],[27.1614451,57.5592159],[27.1165421,57.5611795],[27.1009236,57.5653027],[27.0850611,57.5753796],[27.0726151,57.5773423],[27.0722491,57.5798936],[27.0558985,57.5825102],[27.052848,57.5808749],[27.0468691,57.5804824],[27.0449168,57.5825102],[27.0332029,57.5853229],[27.0412562,57.5876121],[27.0441847,57.596702],[27.0310066,57.604613],[26.9951329,57.604613],[26.9923265,57.6107575],[26.9869576,57.6086659],[26.9836631,57.6117379],[26.9754878,57.6119994],[26.9709731,57.6044822],[26.9595033,57.6062473],[26.957795,57.6046784],[26.9459592,57.6027171],[26.9396142,57.6093195],[26.951328,57.61579],[26.9499858,57.6205605],[26.9405903,57.6197763],[26.9296086,57.6237622],[26.9264361,57.6331044],[26.906791,57.6330391],[26.8997139,57.6305568],[26.900568,57.6291849],[26.8958093,57.6257223],[26.8884881,57.6235662],[26.8889762,57.6219327],[26.8745779,57.6190575],[26.8727476,57.6173585],[26.8655485,57.6159207],[26.8578613,57.6099732],[26.8646944,57.6084044],[26.8581053,57.6004943],[26.8599356,57.5959828],[26.8643283,57.5941518],[26.8617659,57.5910783],[26.8468795,57.5883969],[26.8350437,57.5824448],[26.8158867,57.581529],[26.8095417,57.5847342],[26.7968517,57.5817907],[26.799292,57.5800245],[26.792947,57.573155],[26.7868461,57.5752487],[26.7765965,57.5599359],[26.7691533,57.5603941],[26.7635404,57.563143],[26.7536569,57.5624885],[26.7581716,57.5653027],[26.7689093,57.5704069],[26.77379,57.5747253],[26.7676891,57.5775385],[26.748044,57.5778002],[26.7531688,57.5800899],[26.7381604,57.5877429],[26.729009,57.5801553],[26.7382824,57.5758375],[26.7307172,57.5690328],[26.7238842,57.5724353],[26.7110721,57.5659571],[26.6997244,57.5710612],[26.697528,57.5706032],[26.697406,57.5673314],[26.6915491,57.5661534],[26.6756866,57.5666769],[26.6710498,57.5632739],[26.671904,57.5538482],[26.6653149,57.5528663],[26.646524,57.5539137],[26.6426194,57.546581],[26.6344441,57.5435689],[26.6144329,57.5290944],[26.6171173,57.5088466],[26.6046714,57.5121237],[26.6047934,57.5144175],[26.5953979,57.5137621],[26.5947878,57.5159248],[26.5880768,57.5161869],[26.5901511,57.5251637],[26.5869786,57.5262119],[26.5877107,57.537806],[26.5838061,57.5395743],[26.5797794,57.5369546],[26.5796574,57.5337452],[26.5612325,57.5285048],[26.5618426,57.5226085],[26.5666014,57.5194633],[26.557938,57.5136966],[26.5258469,57.5161869],[26.4996128,57.5245085],[26.4909494,57.5453369],[26.4699621,57.5755104],[26.4015093,57.5723699],[26.3448924,57.5840801],[26.3347648,57.5796974],[26.3278097,57.579632],[26.3263455,57.5827719],[26.3117032,57.5847342],[26.3085307,57.5929094],[26.3005994,57.5934325],[26.2929122,57.5911437],[26.2835167,57.5923208],[26.2821745,57.5951981],[26.2775378,57.5950019],[26.2703387,57.600102],[26.2702166,57.604613],[26.2542321,57.6138294],[26.247155,57.6208219],[26.2481312,57.6277476],[26.2394678,57.6340842],[26.2420302,57.6353906],[26.2466669,57.6355865],[26.2395898,57.6464929],[26.2323907,57.6461011],[26.2311705,57.6490394],[26.2421522,57.6514551],[26.2362953,57.6575265],[26.2303164,57.6580487],[26.2104272,57.6660116],[26.2137217,57.668883],[26.2109153,57.6707102],[26.2101832,57.6790617],[26.2007877,57.6810188],[26.1989574,57.6835629],[26.1944427,57.6851937],[26.1854133,57.6845414],[26.177116,57.687607],[26.1887078,57.6947157],[26.1985914,57.7090592],[26.2056685,57.7148602],[26.1726013,57.7286746],[26.1409983,57.7327788],[26.1356294,57.7392273],[26.139046,57.7454793],[26.1355074,57.7502978],[26.1053687,57.7570036],[26.0803547,57.7654654],[26.0797446,57.7638383],[26.0732776,57.7637081],[26.0704712,57.7655956],[26.0591234,57.7598678],[26.0489958,57.7611046],[26.0435049,57.7670274],[26.0332553,57.7705416],[26.0237378,57.7676131],[26.0177589,57.7722985],[26.0245919,57.7751615],[26.024958,57.7816025],[26.0225176,57.7835541],[26.0277644,57.7897984],[26.0308149,57.7909691],[26.0333773,57.8010485],[26.0367939,57.8059246],[26.0360617,57.8108],[26.0485077,57.8228883],[26.057049,57.8384152],[26.0555848,57.8476372],[26.0366718,57.8492605],[26.0200772,57.8451696],[26.0095836,57.8573112],[25.9984798,57.8581552],[25.9627282,57.8449098],[25.9310032,57.8524421],[25.8953736,57.849715],[25.8882964,57.8459488],[25.8808533,57.8494553],[25.885734,57.8527667],[25.8842698,57.8559479],[25.8756064,57.8579604],[25.8747523,57.8632183],[25.8594999,57.8561427],[25.8192336,57.8641919],[25.7831159,57.8994831],[25.7862884,57.9042811],[25.7716461,57.9120602],[25.7510248,57.9169213],[25.7372366,57.9229482],[25.7283292,57.9213281],[25.7224723,57.9124491],[25.7035593,57.9033086],[25.6791555,57.9046052],[25.6754949,57.9127732],[25.6620728,57.9151066],[25.6560938,57.9143936],[25.6488947,57.9166621],[25.6498709,57.9184119],[25.638279,57.9305937],[25.5798318,57.9441961],[25.593986,57.9596059],[25.5893493,57.9650431],[25.5823942,57.9678261],[25.5804419,57.9720973],[25.574829,57.9741033],[25.5655556,57.9671789],[25.5660436,57.9625835],[25.5571362,57.9603827],[25.555672,57.9671142],[25.5507912,57.9725502],[25.5372471,57.9713855],[25.5256553,57.9718384],[25.5226048,57.9680203],[25.5163818,57.9673731],[25.5121111,57.9697676],[25.5221167,57.9748797],[25.5194323,57.9803146],[25.4853889,57.9747503],[25.4784338,57.9800558],[25.4784338,57.9826436],[25.4421941,57.9961616],[25.4481731,58.0011406],[25.4664759,58.0051492],[25.4481731,58.0169784],[25.4069306,58.0289329],[25.371545,58.0292559],[25.3637358,58.0317109],[25.3533641,58.0433376],[25.3448228,58.0467603],[25.3360374,58.0570909],[25.3292043,58.0585757],[25.3266419,58.0638042],[25.3198088,58.0659987],[25.3190767,58.0692901],[25.295527,58.0816142],[25.2868636,58.0814852],[25.2811287,58.0701936],[25.2659983,58.0671604],[25.2650222,58.0599959],[25.2799085,58.0506346],[25.2930866,58.0466957],[25.3043124,58.0344888],[25.3011399,58.0150395],[25.2974793,58.014587],[25.3028482,58.0001061],[25.295771,57.9997181],[25.2973573,57.9966143],[25.3035803,57.9939628],[25.3013839,57.9927341],[25.2918664,57.9928634],[25.283081,57.9896296],[25.2672185,57.9945449],[25.2561148,57.9938982],[25.2550166,58.0034682],[25.2454991,58.0030157],[25.2276843,58.0178186],[25.2458652,58.0187234],[25.2356156,58.0228592],[25.2363477,58.02441],[25.2273182,58.0243454],[25.2253659,58.0219545],[25.2190209,58.0297728],[25.2165806,58.0408834],[25.2269522,58.0479872],[25.2281724,58.0534755],[25.2212173,58.0530236],[25.2214613,58.0505055],[25.2178007,58.0490849],[25.2159705,58.059544],[25.2121879,58.0622551],[25.2052328,58.0612223],[25.2038906,58.0650951],[25.2162145,58.07413],[25.2120658,58.0805175],[25.1996199,58.0853558],[25.1894923,58.0800659],[25.1916886,58.0761302],[25.1534966,58.0747752],[25.1515443,58.0770335],[25.1339735,58.0797433],[25.1057871,58.0774852],[25.105177,58.0664505],[25.0766245,58.0664505],[25.0203736,58.0176893],[24.9951156,58.010838],[24.9486263,58.0094159],[24.832342,57.9717737],[24.8080602,57.9906644],[24.7422918,57.9818673],[24.74339,57.9649137],[24.7328963,57.9623894],[24.7150815,57.962713],[24.6918978,57.9465274],[24.6733509,57.9589586],[24.6446764,57.9588939],[24.64187,57.9542327],[24.6457746,57.9526788],[24.6286919,57.9419294],[24.6161239,57.943678],[24.6089248,57.9512544],[24.5846429,57.9617421],[24.5731731,57.9543622],[24.5479151,57.9493766],[24.5435225,57.9447789],[24.5301003,57.9470455],[24.5207049,57.9430304],[24.5183865,57.9367478],[24.5096011,57.9344158],[24.5132617,57.9306585],[24.4625017,57.9249569],[24.445785,57.9079764],[24.4601833,57.906615],[24.4522521,57.8994183],[24.4600613,57.8797658],[24.4113756,57.8649058],[24.4090573,57.8719148],[24.3370659,57.8739264],[24.3382861,58.0109027],[24.4227234,58.0109673],[24.42614,58.280018],[24.5115534,58.2796972],[24.5121635,58.324705],[24.426384,58.3250254],[24.4271161,58.3697196],[24.3418247,58.3701675],[24.3404825,58.2354672],[24.1701436,58.2357242],[24.1701436,58.1907961],[24.0848522,58.1909248],[24.0850962,58.2360454],[24.0006589,58.2357884],[23.9999268,58.2809162],[23.8297099,58.2804671],[23.8294659,58.325538],[23.658639,58.3249613],[23.6579069,58.4149324],[23.5722493,58.4146768],[23.5712732,58.5043556],[23.3993481,58.5035906],[23.4010564,58.4139098],[23.1442059,58.4123759],[23.1456701,58.3673518],[23.0598906,58.3670318],[23.0617209,58.3222061],[22.9756973,58.3215653],[22.9771615,58.2768102],[22.8918701,58.2759761],[22.8935784,58.2310348],[22.808653,58.2301996],[22.8101172,58.1853932],[22.8952866,58.1861008],[22.8966288,58.1413032],[22.726412,58.1398218],[22.7249478,58.18475],[22.555219,58.1827558],[22.5569273,58.1374387],[22.6417307,58.1388557],[22.6434389,58.0939986],[22.3890288,58.0909029],[22.3852462,58.1806329],[22.2999548,58.1796678],[22.3067879,58.045275],[22.2219845,58.0435959],[22.2262552,57.9540384],[22.1420619,57.9528083],[22.1445023,57.9080412],[22.060065,57.9068095],[22.0626274,57.8618552],[21.978068,57.8604272],[21.9683065,58.0400438],[22.0527438,58.0413355],[22.0450566,58.1758075],[21.9603753,58.1747137],[21.9578129,58.219405],[21.78723,58.2163845],[21.7821052,58.3063113],[21.6968137,58.304901],[21.6940073,58.3497486],[21.7794207,58.3512212],[21.7679509,58.5307369],[22.0256555,58.5348771],[22.0279739,58.4900096],[22.1137534,58.4916676],[22.1114351,58.5362146],[22.1970926,58.5374247],[22.1945302,58.5822952],[22.4523568,58.5857297],[22.4463779,58.7203003],[22.3602323,58.7191599],[22.3536433,58.8538478]],[[23.4741459,59.2672589],[23.2986822,59.2663235],[23.2979501,59.3113783],[23.4729257,59.3119388],[23.4741459,59.2672589]],[[24.1701436,58.1907961],[24.255069,58.1907318],[24.2545809,58.1458112],[24.1700216,58.1458756],[24.1701436,58.1907961]],[[24.0848522,58.1909248],[24.0849742,58.1012852],[23.9996827,58.1011563],[23.9999268,58.0563162],[23.9152454,58.0561225],[23.9150014,58.1461332],[23.83032,58.1460044],[23.8297099,58.2357242],[23.9145133,58.2358527],[23.9147573,58.1909891],[24.0848522,58.1909248]],[[24.6185366,59.5361187],[24.4418254,59.5367966],[24.4430922,59.6265878],[24.6201552,59.6258049],[24.6185366,59.5361187]],[[26.4040316,59.7851966],[26.3150064,59.7866741],[26.3181415,59.8315183],[26.4073159,59.8299428],[26.4040316,59.7851966]],[[26.4830816,59.6490028],[26.4864655,59.6938311],[26.5751422,59.692023],[26.5716589,59.6471923],[26.4830816,59.6490028]],[[23.1594369,57.784083],[23.2434645,57.7846083],[23.2444497,57.73971],[23.3284773,57.740311],[23.3267883,57.8299754],[23.1584517,57.8288513],[23.1594369,57.784083]]],"terms_text":"Maa-Ameti põhikaart"},{"id":"maaamet.ee-cir_ngr","name":"Estonia Forestry (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","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 metsanduslik ortofoto"},{"id":"maaamet.ee-reljeef","name":"Estonia Hillshading (Maaamet)","type":"wms","template":"http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","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 reljeefikaart"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png","scaleExtent":[14,18],"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":"estrela_de_alagoas","name":"Estrela de Alagoas","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.71382371133,-9.43475990551],[-36.7147678489,-9.34442676518],[-36.80585566705,-9.34497726095],[-36.80525485223,-9.43541609465],[-36.71382371133,-9.43475990551]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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":"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":"Geobase_Hydrography","name":"Geobase Hydrography","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nhn:hydrography,nhn:network&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"Geobase_Roads","name":"Geobase Roads","type":"wms","template":"http://ows.geobase.ca/wms/geobase_en?service=wms&request=GetMap&version=1.1.1&SRS={proj}&style=&format=image/png&transparent=true&layers=nrn:addressrange,nrn:streetnames,nrn:streetnames:streetnames_primary,nrn:streetnames:streetnames_secondary,nrn:streetnames:streetnames_other,nhn:hydrography,nrn:roadnetwork&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.1923701,48.6550408],[-122.9958159,48.5106543],[-122.4868966,48.4098005],[-122.3291531,48.4527983],[-122.229391,48.5064943],[-122.1790836,48.5296509],[-122.1841996,48.566905],[-121.7783298,48.5759321],[-121.6657777,48.4279093],[-121.3306793,48.3571354],[-121.0271296,48.3497692],[-121.0305403,48.4940645],[-120.6979999,48.5149675],[-120.510413,48.8718034],[-119.9757904,48.8813368],[-119.9544737,48.5149675],[-119.907577,48.2942056],[-119.7319275,48.1550316],[-119.7438648,48.0741943],[-119.622786,48.1095051],[-119.602322,48.1470674],[-119.2527283,48.1624259],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{"id":"geoimage.at","name":"Geoimage.at MaxRes","type":"wms","template":"http://gis.lebensministerium.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","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":"geoimage.at","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QwTFA8gQvGHigAAAwtJREFUOMvtk19oW1Ucx7/nnntukpvGtF2btHG1o52bYxULOp99sYggiM7pVKbbQNCH+SYOFMHCHhR88g9jjPmgm32YMpGNTbpp1W5D7NyfJnYLTdNm3ZI0SZPc5N5zzz3n+CIiCtM9+KQf+D39+H74Pfy+wH8Ocqvlh4enyblMO7JpKHl/X080sbhcnH3r3eNXkR1XtyU8cHiS2Hakf+iuxJ7enq7n4x12ijFDtz3fW11tzBZL1YMnpjKfvrN3m/O3ws+OTRnxmP1gsrf7g2RizUbGLCtkGdSkBnigtPCFaLXc1ZvF8vfZXOG1HdvGcn/M0z8Ln9nx8vBAas0ngwN9dzPGmGlSCkIMrTQxQABCSDjE2B2xyJ2E0A0d/Q+cPP/tMb7v0Kwx+tBz5PcL9350mXZFVuzR4b73Nm3o326HQpYdNonWMEAIgdZQWmvP8yECpZptKetNtzqTLkz8UpBfKmJ1tJo1SgBgfP8V2mhVn2JYet0Osc09Xabp+DFdbpgkV7SQ6jbRdCXaHAgU4AsFj0sQAFGbgguNhsPRqiyeM/d/PkezS4WxRilzpLM5ga5EEu5qGJvXDZFDuXvA4sO4b30MXCi4XCLRGYZhaFQaEtTQ6I5bKNV8HJ3ML1cLM+Pm1fnCaNFZmLhRORkkUltIpl2mI/duxMW8Rk0N4okRG3OLDtb2RlB3AthhgXI9QLbgIp13QQ0CrQSEU57JnX3/OBnbfWBfpVIZjEb7DClb8WRv50jMDqesSNzwpU+UFAiZFIGmaHsKFjNAKNOub8LhkC6XbiD4wvXLR19dOH/wzF9+8McL6Uev31jJNlrc8Xjg+4GSvlBKSKXaLpfFUk3kl5bddOZa7dTk1PTT2194DED3LfqxlZz+7qc35uZvXitXHdf1ROALKX+boO353nKpXr2UyU9/deLMzn9aPfLNDz+/NLC2/0WDhgZNxnqYSUzOA0f4vMg9J33xytzHz2595Ivb6vKet48kHx/b8mQ40vFwNMKS9UbzQmWleHrXK29+XZs/1cD//Cv8CriEgFStQ2K4AAAAAElFTkSuQmCC"},{"id":"Geolittoral-Orthophotos2000","name":"Géolittoral - Orthophotos 2000","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","polygon":[[[-1.0796243,46.1095893],[-0.9411452,46.0147437],[-0.5630573,45.1517801],[-0.7265951,45.0842493],[-0.8790355,45.340936],[-0.9979449,45.3377907],[-0.9555838,44.6998247],[-1.1586189,44.1986482],[-1.2151202,44.2055773],[-1.2465448,44.1162047],[-1.2790262,44.0393718],[-1.2882474,44.0230397],[-1.3211693,43.9409384],[-1.321506,43.922956],[-1.3092024,43.9233665],[-1.308503,43.914392],[-1.2836627,43.9151384],[-1.2830152,43.9062373],[-1.2760964,43.9065485],[-1.2821086,43.8925378],[-1.3010173,43.8515886],[-1.3038406,43.8423978],[-1.3092283,43.8349806],[-1.3347421,43.7694562],[-1.3440669,43.7487464],[-1.3455951,43.742141],[-1.3467348,43.7368823],[-1.432844,43.53152],[-1.4280594,43.4681233],[-1.6062745,43.4059107],[-1.6060955,43.3601202],[-1.7744064,43.3035717],[-1.8299531,43.384841],[-1.5855116,43.4685563],[-1.3570598,44.0337366],[-1.4021655,44.0646122],[-1.3358385,44.2283161],[-1.218361,44.2303255],[-1.1679453,44.4109713],[-1.3074387,44.418472],[-1.1697949,45.5910689],[-1.486847,46.0604176],[-1.3636417,46.0914593],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.5859481,46.304264],[-1.5100772,46.3388783],[-1.756428,46.4221446],[-2.1871988,46.8185697],[-2.1642284,46.8553436],[-2.2365406,46.9337048],[-2.3976918,46.9671834],[-2.2820042,47.0763113],[-2.1256261,47.018745],[-2.0901262,47.065624],[-2.184872,47.1069799],[-2.2647018,47.1076296],[-2.2448935,47.1856218],[-2.5677926,47.2446686],[-2.6672667,47.4668599],[-2.7478721,47.4712158],[-2.7577135,47.4346122],[-2.8932063,47.4629031],[-2.9036899,47.5090529],[-3.0338252,47.5383308],[-3.0711295,47.5118452],[-3.0165289,47.4987314],[-3.1250228,47.4269256],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.2966969,47.6316051],[-3.2875957,47.6715415],[-3.3407355,47.6689257],[-3.3891187,47.5947342],[-3.55087,47.6382724],[-3.5338384,47.724884],[-3.7657669,47.7647571],[-3.7759528,47.737096],[-3.9116771,47.7591549],[-3.8959022,47.7991129],[-3.9723628,47.8152607],[-3.9972201,47.7975006],[-3.97956,47.7626769],[-3.8945008,47.7219346],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.0898857,47.7894357],[-4.0379763,47.7990868],[-4.0412502,47.8310926],[-4.0876491,47.8422143],[-4.1478057,47.8252534],[-4.1431427,47.7884708],[-4.3516237,47.7414997],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.63576,48.0779844],[-4.6014717,48.1146852],[-4.3850007,48.1096154],[-4.3895513,48.1454286],[-4.3092543,48.1500888],[-4.3126821,48.1769373],[-4.4636854,48.1846773],[-4.4974841,48.1453035],[-4.5921009,48.1475763],[-4.5753669,48.22488],[-4.6710089,48.2330974],[-4.654341,48.3104921],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.81465,48.3941286],[-4.8351542,48.5431896],[-4.6338697,48.6637334],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6501973,48.7535602],[-3.6585313,48.8252653],[-3.539314,48.8583372],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.4075537,48.8736644],[-3.0276871,48.9275037],[-2.6786137,48.5884071],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.8039194,48.6612609],[-1.6116146,48.6858177],[-1.7164548,49.2478104],[-1.8026014,49.3272144],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1713375,49.5541159],[-1.2735291,49.5524476],[-1.1327984,49.3933982],[-0.930595,49.4080413],[-0.7482671,49.3597647],[-0.3893456,49.34167],[-0.2470445,49.2999494],[-0.1245368,49.2935335],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.452105,51.1214375],[2.5928557,51.1212359],[2.6068264,51.0577932],[1.7975971,50.8990562],[1.6645759,50.8237878],[1.7078633,50.1282048],[1.0593618,49.85],[0.6160689,49.7906207],[0.2473107,49.6502699],[0.1709048,49.5317374],[0.5706464,49.496223],[0.4111492,49.3395965],[0.1950421,49.3573571],[0.0171786,49.2547917],[-0.2445265,49.2631234],[-0.3840751,49.3049516],[-0.7409079,49.3243829],[-0.995405,49.3713264],[-1.0545337,49.2517481],[-1.27704,49.2902182],[-1.2596644,49.4346254],[-1.3914123,49.5398482],[-1.2753453,49.6205575],[-1.2977482,49.6594602],[-1.490498,49.5713903],[-1.77517,49.6339843],[-1.7460051,49.4815523],[-1.5129407,49.2469097],[-1.4826149,48.7260698],[-1.3057444,48.725312],[-1.283234,48.5973085],[-2.7611439,48.4347142],[-3.0017371,48.6764625],[-3.210615,48.7209691],[-3.9540369,48.5605102],[-4.1564328,48.6079181],[-4.4447478,48.5585184],[-4.6368255,48.482991],[-4.6318979,48.4472691],[-4.2502228,48.43088],[-4.0614098,48.2180466],[-4.1757039,48.0516486],[-4.3190366,48.0140984],[-4.2678092,47.8997734],[-3.8848444,47.9817224],[-3.7637481,47.8640348],[-2.3272701,47.5263402],[-2.3691075,47.3338959],[-1.7406713,47.3350685],[-1.7706224,47.204506],[-2.0367815,47.2194206],[-2.096803,47.1554772],[-1.8878613,47.0123909],[-2.0879728,46.8300739],[-2.0121404,46.8343598],[-1.8407867,46.6965096],[-1.873184,46.654836],[-1.688585,46.5039205],[-1.6211652,46.5151306],[-1.4242755,46.4167482],[-1.0176087,46.3591735],[-1.0796243,46.1095893]],[[-2.4123238,46.6924223],[-2.3719717,46.676112],[-2.2674923,46.680326],[-2.270068,46.7070521],[-2.2982682,46.7328597],[-2.4165505,46.7371145],[-2.4123238,46.6924223]],[[-3.06018,47.4054194],[-2.8258703,47.2963471],[-2.7878715,47.3341715],[-3.0243638,47.4456259],[-3.06018,47.4054194]],[[-3.2648203,47.4295047],[-3.334303,47.3592752],[-3.2961388,47.3413278],[-3.3148902,47.3005706],[-3.1994054,47.2449216],[-3.1656728,47.2775103],[-3.086864,47.2361201],[-3.0063687,47.3085541],[-3.2648203,47.4295047]],[[-1.939663,48.8634633],[-1.9399349,48.9117889],[-1.7009983,48.9110507],[-1.6972613,48.8617305],[-1.939663,48.8634633]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho littorale 2000"},{"id":"Geolittoral-Sentiers","name":"Géolittoral - Sentiers","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-0.9838474,46.1880746],[-0.8949679,46.156277],[-0.934552,46.1016299],[-0.843878,46.0694893],[-0.8824065,46.0163689],[-0.5378663,45.8955775],[-0.6349793,45.7644353],[-0.8666589,45.8479032],[-0.7626356,45.6245041],[-0.6969519,45.6265921],[-0.6939663,45.6018445],[-0.6875472,45.6017401],[-0.6879951,45.5098594],[-0.6379859,45.5089178],[-0.6397773,45.4474748],[-0.615743,45.4469511],[-0.6161909,45.3858599],[-0.585439,45.3859647],[-0.5852897,45.3233381],[-0.5537914,45.323443],[-0.5527464,45.1966145],[-0.490944,45.195773],[-0.4918397,45.1331467],[-0.4566094,45.133252],[-0.4551166,45.0716113],[-0.4161067,45.0708893],[-0.4162123,45.0269636],[-0.2907042,44.9827801],[-0.2199988,45.0677104],[-0.1225183,45.0256272],[-0.1892469,44.9459114],[-0.0926621,44.9101881],[-0.145209,44.8392042],[-0.1549123,44.8423797],[-0.1938747,44.7867829],[-0.4354115,44.8731731],[-0.3904779,44.6841324],[-0.5879767,44.6601403],[-0.6662784,44.9912911],[-0.7783806,44.9926348],[-0.7776417,45.0538898],[-0.8158437,45.0532114],[-0.818377,45.1196158],[-0.8839284,45.1205096],[-0.8817117,45.1808092],[-0.9343849,45.1818509],[-0.9328016,45.2448356],[-1.0016252,45.2443896],[-1.0024696,45.3082702],[-1.0523984,45.3101261],[-1.0482817,45.3691125],[-1.0641153,45.3691125],[-1.0503928,45.1825205],[-1.1076051,44.8078702],[-1.0151366,44.8011296],[-1.0194644,44.7691388],[-0.933646,44.7614944],[-0.9404017,44.7018029],[-0.9603521,44.5643388],[-1.014081,44.5676478],[-1.0991605,44.1456002],[-1.2268852,44.140222],[-1.2185281,44.0324931],[-1.3076188,44.029002],[-1.3957164,43.7430052],[-1.3129592,43.7295057],[-1.3743937,43.5310863],[-1.3458932,43.506056],[-1.599642,43.3542258],[-1.7654877,43.255483],[-1.7928061,43.2803753],[-1.8028079,43.4042503],[-1.7283167,43.4503267],[-1.5853054,43.4890037],[-1.3358385,44.2283161],[-1.3074387,44.418472],[-1.2251061,45.4441615],[-1.486847,46.0604176],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.756428,46.4221446],[-2.0348287,46.6189544],[-2.3465983,46.6238164],[-2.4656134,46.7119647],[-2.3232967,46.8381171],[-2.4528645,46.9385605],[-2.3173318,47.1621397],[-2.9284827,47.2841337],[-2.967417,47.2214691],[-3.3560228,47.3247359],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.3891187,47.5947342],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.1431427,47.7884708],[-4.3761893,47.7106674],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.6014717,48.1146852],[-4.5921009,48.1475763],[-4.6710089,48.2330974],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.8351542,48.5431896],[-4.6311736,48.6612896],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6701315,48.895078],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.3334381,48.904579],[-3.0276871,48.9275037],[-2.8020731,48.7979285],[-2.6935289,48.7672208],[-2.4578583,48.7089607],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.7243003,48.7582771],[-1.7055705,48.8451195],[-1.9030442,48.8628775],[-1.9102707,48.9234787],[-1.6871357,48.9324898],[-1.7427683,49.244734],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1854462,49.5483609],[-0.9646323,49.4250945],[-0.7442883,49.3680181],[-0.3901362,49.3621973],[-0.2497648,49.3157973],[-0.1334235,49.3129316],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.5971186,51.1735455],[2.6607107,51.0195972],[2.0712386,50.9202211],[2.05937,50.9470929],[1.7975971,50.8990562],[1.6808947,50.8717016],[1.6556923,50.5972904],[1.7535714,50.5931978],[1.7229475,50.2470239],[1.8215592,50.2426198],[1.8014852,50.0511647],[1.5456517,50.063112],[1.541549,50.0126688],[1.4246216,50.0174707],[1.426673,50.0527642],[1.0383804,49.8460945],[0.9827008,49.8891609],[0.5796091,49.8213328],[0.420629,49.76297],[0.4281018,49.7544509],[0.2083136,49.6726862],[0.147652,49.5776743],[0.1346112,49.5809045],[0.1111672,49.543649],[0.5659823,49.520445],[0.5631983,49.4998946],[0.6300139,49.496659],[0.6147753,49.3744072],[0.5482527,49.3785094],[0.5425382,49.3346073],[0.4574069,49.3393812],[0.4584326,49.3449183],[0.3259735,49.354559],[0.3284645,49.3812758],[0.280111,49.3843283],[0.2768875,49.363339],[0.210951,49.3665834],[0.208167,49.3508366],[0.1432562,49.3553225],[0.1376883,49.3114953],[0.0720449,49.3153162],[0.0675026,49.2871299],[0.0027383,49.2907616],[0.0050827,49.2571106],[-0.0202662,49.260362],[-0.0349188,49.1973043],[-0.194485,49.2146316],[-0.389657,49.127263],[-0.4536886,49.1879201],[-0.3561026,49.2321443],[-0.8208815,49.2833068],[-0.9977772,49.3014908],[-1.1672818,49.2454506],[-1.1951526,49.2818265],[-1.2676791,49.2409863],[-1.341138,49.2975045],[-1.2476825,49.3502459],[-1.4458287,49.6068946],[-1.8110511,49.6175689],[-1.7747878,49.4433325],[-1.7277493,49.4650871],[-1.5338965,49.2909826],[-1.4790873,49.2923341],[-1.4760826,49.2402747],[-1.4355714,49.2032589],[-1.4722491,49.182201],[-1.4509056,48.7572466],[-1.3115513,48.7640766],[-1.3053347,48.7021631],[-1.2583998,48.7042144],[-1.2522868,48.6435279],[-1.2351913,48.6443494],[-1.2269026,48.5682354],[-1.8521839,48.5308559],[-1.8490756,48.4974996],[-1.9232598,48.4918694],[-1.9281294,48.4409635],[-2.0427212,48.4360144],[-2.0388876,48.4819121],[-2.2895011,48.4610214],[-2.3021023,48.5243337],[-2.4086263,48.5161813],[-2.4203484,48.5695361],[-2.4308411,48.5785185],[-2.4908308,48.5492405],[-2.4735281,48.5332572],[-2.5497844,48.4964697],[-2.5400451,48.4874747],[-2.7068057,48.4074551],[-3.0297895,48.6911498],[-4.0103381,48.5317872],[-4.0534166,48.6441199],[-4.3828059,48.5734929],[-4.3548195,48.5117951],[-4.3885293,48.5047279],[-4.1349543,48.4486809],[-4.1641129,48.389361],[-4.01832,48.3568516],[-4.0473321,48.2991791],[-3.9881358,48.2867008],[-4.0213971,48.216063],[-4.0363427,48.2195777],[-4.0662339,48.160284],[-4.1667504,48.1824662],[-4.1833077,48.149336],[-4.1723183,48.106499],[-4.2011062,48.1028546],[-4.1864321,48.0438867],[-4.1880639,48.0406137],[-4.3568595,48.0230513],[-4.2565705,47.9399726],[-4.2336349,47.9349658],[-4.2137074,47.9759839],[-4.2185428,47.977259],[-4.1805957,48.0556897],[-3.6172022,47.9312353],[-2.1799085,47.5864218],[-2.25449,47.4450059],[-2.3018177,47.4567969],[-2.3204265,47.4209203],[-2.3037225,47.4175495],[-2.3475337,47.3349949],[-2.3621862,47.3383711],[-2.380795,47.3039043],[-2.3585231,47.2985385],[-2.2996198,47.297843],[-2.297422,47.3617996],[-2.1319947,47.3585242],[-2.1347787,47.3910707],[-2.0156534,47.3962286],[-2.0140417,47.3809517],[-1.9286173,47.3825391],[-1.9289103,47.3795626],[-1.8322035,47.3818446],[-1.8298591,47.3416477],[-1.7360828,47.3430378],[-1.734178,47.3049972],[-1.6408412,47.3063882],[-1.6401086,47.2942654],[-1.5835498,47.2956567],[-1.5853081,47.3370802],[-1.461201,47.3396619],[-1.4600288,47.3292351],[-1.3721135,47.3322144],[-1.360538,47.1123893],[-1.4856707,47.1114918],[-1.4858173,47.1187709],[-1.6689741,47.1168765],[-1.6697068,47.1286411],[-1.725533,47.1276442],[-1.7261191,47.1376124],[-1.9397532,47.1326285],[-1.9401928,47.1421971],[-1.9925024,47.1430941],[-1.8106643,47.0058819],[-1.947226,46.9207831],[-1.9289103,46.9067703],[-1.9952864,46.8646098],[-1.7365224,46.6683945],[-1.7753516,46.643855],[-1.8267821,46.6417425],[-1.8247307,46.6207134],[-1.1819234,46.399869],[-0.9126096,46.3048021],[-0.9548089,46.2488984],[-0.9423542,46.2442372],[-0.9838474,46.1880746]],[[3.1476937,42.4007197],[3.1494906,42.4001543],[3.1530531,42.4005236],[3.1580376,42.4024274],[3.1876974,42.4280509],[3.142265,42.5247964],[3.0683711,42.5463547],[3.0488369,42.6941959],[3.0798953,43.0307277],[3.226405,43.1872688],[3.4091582,43.2603206],[3.5210352,43.258773],[3.6642877,43.3762765],[3.738414,43.3905396],[4.0097937,43.536068],[4.1769217,43.4563611],[4.5435531,43.4334906],[4.5494282,43.3540119],[4.8350582,43.3089126],[4.9750606,43.3830905],[5.0321866,43.3192811],[5.2591906,43.3192811],[5.3108165,43.2050388],[5.3568173,43.1864485],[5.3688175,43.1678525],[5.4023181,43.1621085],[5.4138183,43.1712257],[5.4091932,43.1992072],[5.5423205,43.1882713],[5.6058216,43.1479741],[5.6196969,43.1528987],[5.6383222,43.1715904],[5.6715728,43.1673966],[5.6909481,43.13411],[5.7760746,43.1063726],[5.7761996,43.0943247],[5.7540742,43.0832788],[5.7570743,43.0725048],[5.7703245,43.0646514],[5.8593261,43.0346897],[5.8877016,43.0627336],[5.9567028,43.0610897],[5.9638279,43.092773],[6.0003285,43.0918601],[6.0174538,43.068487],[6.1023303,43.0741485],[6.1048304,43.0525954],[6.0665981,43.0431845],[6.0672168,43.0378549],[6.1427018,43.0092284],[6.1567558,42.9871518],[6.1963544,42.9733134],[6.2222085,42.9801037],[6.2689052,42.996508],[6.2551549,43.0362655],[6.201904,43.0271281],[6.1837787,43.0918826],[6.3015307,43.0990937],[6.3247811,43.0797407],[6.3777821,43.0801059],[6.3886572,43.1339501],[6.5134094,43.1460813],[6.5770355,43.1788145],[6.6229113,43.1456253],[6.6977876,43.1996853],[6.6801623,43.2335736],[6.7211631,43.26007],[6.7224131,43.2747245],[6.6705372,43.2919232],[6.6874125,43.3311252],[6.7241631,43.3426718],[6.7529136,43.4089993],[6.7910393,43.3967387],[6.9062913,43.4167176],[6.9676674,43.5027333],[6.9661673,43.5281154],[7.006168,43.5384464],[7.0355435,43.4981997],[7.0689191,43.5001038],[7.0907945,43.5164228],[7.062669,43.5367247],[7.0825444,43.5456046],[7.1237951,43.5307436],[7.1557957,43.5437019],[7.1432954,43.622841],[7.1686709,43.6463635],[7.2137967,43.6346939],[7.2541724,43.6849746],[7.3402989,43.6674354],[7.3644243,43.6894038],[7.3530491,43.7082017],[7.4163002,43.7109124],[7.4540509,43.7450573],[7.4943016,43.7452379],[7.5794281,43.7842366],[7.6055156,43.7860269],[7.6036815,43.7889781],[7.5958811,43.7952788],[7.5962789,43.7954862],[7.5385252,43.8419488],[7.4599632,43.7998784],[7.4478096,43.8093355],[7.3235339,43.7480609],[7.3082211,43.7635679],[6.6487795,43.3885012],[6.6686548,43.3717842],[6.510027,43.2780293],[6.5658405,43.2250863],[6.1268057,43.105272],[5.4822945,43.2493904],[5.4726693,43.2309046],[5.4156683,43.2465678],[5.4526689,43.3450985],[4.8019076,43.4815759],[4.7641569,43.3924419],[4.657155,43.423681],[4.6722803,43.4560836],[4.4320261,43.5241904],[4.4145258,43.4925498],[4.1610214,43.5643292],[4.1445211,43.5706693],[4.141646,43.5739296],[4.1867718,43.5994627],[4.1056454,43.6819639],[3.79689,43.5216525],[3.7785147,43.5131316],[3.7646394,43.5059696],[3.7620144,43.5033403],[3.7422641,43.4932752],[3.7160136,43.5207461],[3.2621307,43.2814311],[3.2463804,43.2973542],[3.1838793,43.2805211],[3.1067529,43.2408312],[3.1547538,43.1941898],[2.9062494,43.1938252],[2.9067495,42.761892],[2.9461251,42.7620755],[2.9465001,42.6151551],[2.992376,42.6149711],[2.992376,42.5125003],[3.0410018,42.5125924],[3.0412052,42.5009317],[3.0908647,42.5008187],[3.1476937,42.4007197]],[[6.3594494,43.0232125],[6.4247695,43.0244403],[6.4524356,43.0350368],[6.4698484,43.0546098],[6.5112149,43.0576453],[6.5215565,43.0431768],[6.4836372,43.0244403],[6.471793,43.0072494],[6.4117762,42.9917993],[6.3985177,42.980484],[6.3517753,42.9990494],[6.3594494,43.0232125]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho littorale 2000"},{"id":"GeolittoralV2-Orthophotos","name":"Géolittoral V2 - Orthophotos 2011-2014","type":"wms","template":"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2014-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","polygon":[[[-0.9838474,46.1880746],[-0.8949679,46.156277],[-0.934552,46.1016299],[-0.843878,46.0694893],[-0.8824065,46.0163689],[-0.5378663,45.8955775],[-0.6349793,45.7644353],[-0.8666589,45.8479032],[-0.7626356,45.6245041],[-0.6969519,45.6265921],[-0.6939663,45.6018445],[-0.6875472,45.6017401],[-0.6879951,45.5098594],[-0.6379859,45.5089178],[-0.6397773,45.4474748],[-0.615743,45.4469511],[-0.6161909,45.3858599],[-0.585439,45.3859647],[-0.5852897,45.3233381],[-0.5537914,45.323443],[-0.5527464,45.1966145],[-0.490944,45.195773],[-0.4918397,45.1331467],[-0.4566094,45.133252],[-0.4551166,45.0716113],[-0.4161067,45.0708893],[-0.4162123,45.0269636],[-0.2907042,44.9827801],[-0.2199988,45.0677104],[-0.1225183,45.0256272],[-0.1892469,44.9459114],[-0.0926621,44.9101881],[-0.145209,44.8392042],[-0.1549123,44.8423797],[-0.1938747,44.7867829],[-0.4354115,44.8731731],[-0.3904779,44.6841324],[-0.5879767,44.6601403],[-0.6662784,44.9912911],[-0.7783806,44.9926348],[-0.7776417,45.0538898],[-0.8158437,45.0532114],[-0.818377,45.1196158],[-0.8839284,45.1205096],[-0.8817117,45.1808092],[-0.9343849,45.1818509],[-0.9328016,45.2448356],[-1.0016252,45.2443896],[-1.0024696,45.3082702],[-1.0523984,45.3101261],[-1.0482817,45.3691125],[-1.0641153,45.3691125],[-1.0503928,45.1825205],[-1.1076051,44.8078702],[-1.0151366,44.8011296],[-1.0194644,44.7691388],[-0.933646,44.7614944],[-0.9404017,44.7018029],[-0.9603521,44.5643388],[-1.014081,44.5676478],[-1.0991605,44.1456002],[-1.2268852,44.140222],[-1.2185281,44.0324931],[-1.3076188,44.029002],[-1.3957164,43.7430052],[-1.3129592,43.7295057],[-1.3743937,43.5310863],[-1.3458932,43.506056],[-1.599642,43.3542258],[-1.7654877,43.255483],[-1.7928061,43.2803753],[-1.8028079,43.4042503],[-1.7283167,43.4503267],[-1.5853054,43.4890037],[-1.3358385,44.2283161],[-1.3074387,44.418472],[-1.2251061,45.4441615],[-1.486847,46.0604176],[-1.601759,46.1701852],[-1.6444184,46.2237487],[-1.756428,46.4221446],[-2.0348287,46.6189544],[-2.3465983,46.6238164],[-2.4656134,46.7119647],[-2.3232967,46.8381171],[-2.4528645,46.9385605],[-2.3173318,47.1621397],[-2.9284827,47.2841337],[-2.967417,47.2214691],[-3.3560228,47.3247359],[-3.1880328,47.4844142],[-3.2279087,47.6113186],[-3.3891187,47.5947342],[-3.9161956,47.6783103],[-4.1016259,47.7092072],[-4.1431427,47.7884708],[-4.3761893,47.7106674],[-4.4796232,47.9776016],[-4.9856536,47.9989633],[-4.9693825,48.0897202],[-4.6014717,48.1146852],[-4.5921009,48.1475763],[-4.6710089,48.2330974],[-4.8424298,48.3004956],[-5.1986731,48.4492607],[-5.103461,48.5172155],[-4.8351542,48.5431896],[-4.6311736,48.6612896],[-3.9669223,48.7797813],[-3.9493945,48.7471474],[-3.6701315,48.895078],[-3.5444401,48.9029653],[-3.4095425,48.9186584],[-3.3334381,48.904579],[-3.0276871,48.9275037],[-2.8020731,48.7979285],[-2.6935289,48.7672208],[-2.4578583,48.7089607],[-2.2847486,48.7190877],[-2.1754283,48.650163],[-2.0136968,48.7322121],[-1.8095282,48.7317759],[-1.7243003,48.7582771],[-1.7055705,48.8451195],[-1.9030442,48.8628775],[-1.9102707,48.9234787],[-1.6871357,48.9324898],[-1.7427683,49.244734],[-1.8574757,49.3253007],[-1.9262013,49.6557284],[-2.03908,49.6787215],[-2.0044546,49.7608677],[-1.6175855,49.6849834],[-1.2837344,49.7606702],[-1.1492009,49.6350423],[-1.1854462,49.5483609],[-0.9646323,49.4250945],[-0.7442883,49.3680181],[-0.3901362,49.3621973],[-0.2497648,49.3157973],[-0.1334235,49.3129316],[0.0273095,49.3761879],[0.0180063,49.5465556],[0.1221093,49.6929183],[0.5171306,49.8646551],[1.057268,49.9490353],[1.4390814,50.1181936],[1.5317687,50.4643666],[1.5254895,50.8586668],[1.6411818,50.9591925],[2.5971186,51.1735455],[2.6607107,51.0195972],[2.0712386,50.9202211],[2.05937,50.9470929],[1.7975971,50.8990562],[1.6808947,50.8717016],[1.6556923,50.5972904],[1.7535714,50.5931978],[1.7229475,50.2470239],[1.8215592,50.2426198],[1.8014852,50.0511647],[1.5456517,50.063112],[1.541549,50.0126688],[1.4246216,50.0174707],[1.426673,50.0527642],[1.0383804,49.8460945],[0.9827008,49.8891609],[0.5796091,49.8213328],[0.420629,49.76297],[0.4281018,49.7544509],[0.2083136,49.6726862],[0.147652,49.5776743],[0.1346112,49.5809045],[0.1111672,49.543649],[0.5659823,49.520445],[0.5631983,49.4998946],[0.6300139,49.496659],[0.6147753,49.3744072],[0.5482527,49.3785094],[0.5425382,49.3346073],[0.4574069,49.3393812],[0.4584326,49.3449183],[0.3259735,49.354559],[0.3284645,49.3812758],[0.280111,49.3843283],[0.2768875,49.363339],[0.210951,49.3665834],[0.208167,49.3508366],[0.1432562,49.3553225],[0.1376883,49.3114953],[0.0720449,49.3153162],[0.0675026,49.2871299],[0.0027383,49.2907616],[0.0050827,49.2571106],[-0.0202662,49.260362],[-0.0349188,49.1973043],[-0.194485,49.2146316],[-0.389657,49.127263],[-0.4536886,49.1879201],[-0.3561026,49.2321443],[-0.8208815,49.2833068],[-0.9977772,49.3014908],[-1.1672818,49.2454506],[-1.1951526,49.2818265],[-1.2676791,49.2409863],[-1.341138,49.2975045],[-1.2476825,49.3502459],[-1.4458287,49.6068946],[-1.8110511,49.6175689],[-1.7747878,49.4433325],[-1.7277493,49.4650871],[-1.5338965,49.2909826],[-1.4790873,49.2923341],[-1.4760826,49.2402747],[-1.4355714,49.2032589],[-1.4722491,49.182201],[-1.4509056,48.7572466],[-1.3115513,48.7640766],[-1.3053347,48.7021631],[-1.2583998,48.7042144],[-1.2522868,48.6435279],[-1.2351913,48.6443494],[-1.2269026,48.5682354],[-1.8521839,48.5308559],[-1.8490756,48.4974996],[-1.9232598,48.4918694],[-1.9281294,48.4409635],[-2.0427212,48.4360144],[-2.0388876,48.4819121],[-2.2895011,48.4610214],[-2.3021023,48.5243337],[-2.4086263,48.5161813],[-2.4203484,48.5695361],[-2.4308411,48.5785185],[-2.4908308,48.5492405],[-2.4735281,48.5332572],[-2.5497844,48.4964697],[-2.5400451,48.4874747],[-2.7068057,48.4074551],[-3.0297895,48.6911498],[-4.0103381,48.5317872],[-4.0534166,48.6441199],[-4.3828059,48.5734929],[-4.3548195,48.5117951],[-4.3885293,48.5047279],[-4.1349543,48.4486809],[-4.1641129,48.389361],[-4.01832,48.3568516],[-4.0473321,48.2991791],[-3.9881358,48.2867008],[-4.0213971,48.216063],[-4.0363427,48.2195777],[-4.0662339,48.160284],[-4.1667504,48.1824662],[-4.1833077,48.149336],[-4.1723183,48.106499],[-4.2011062,48.1028546],[-4.1864321,48.0438867],[-4.1880639,48.0406137],[-4.3568595,48.0230513],[-4.2565705,47.9399726],[-4.2336349,47.9349658],[-4.2137074,47.9759839],[-4.2185428,47.977259],[-4.1805957,48.0556897],[-3.6172022,47.9312353],[-2.1799085,47.5864218],[-2.25449,47.4450059],[-2.3018177,47.4567969],[-2.3204265,47.4209203],[-2.3037225,47.4175495],[-2.3475337,47.3349949],[-2.3621862,47.3383711],[-2.380795,47.3039043],[-2.3585231,47.2985385],[-2.2996198,47.297843],[-2.297422,47.3617996],[-2.1319947,47.3585242],[-2.1347787,47.3910707],[-2.0156534,47.3962286],[-2.0140417,47.3809517],[-1.9286173,47.3825391],[-1.9289103,47.3795626],[-1.8322035,47.3818446],[-1.8298591,47.3416477],[-1.7360828,47.3430378],[-1.734178,47.3049972],[-1.6408412,47.3063882],[-1.6401086,47.2942654],[-1.5835498,47.2956567],[-1.5853081,47.3370802],[-1.461201,47.3396619],[-1.4600288,47.3292351],[-1.3721135,47.3322144],[-1.360538,47.1123893],[-1.4856707,47.1114918],[-1.4858173,47.1187709],[-1.6689741,47.1168765],[-1.6697068,47.1286411],[-1.725533,47.1276442],[-1.7261191,47.1376124],[-1.9397532,47.1326285],[-1.9401928,47.1421971],[-1.9925024,47.1430941],[-1.8106643,47.0058819],[-1.947226,46.9207831],[-1.9289103,46.9067703],[-1.9952864,46.8646098],[-1.7365224,46.6683945],[-1.7753516,46.643855],[-1.8267821,46.6417425],[-1.8247307,46.6207134],[-1.1819234,46.399869],[-0.9126096,46.3048021],[-0.9548089,46.2488984],[-0.9423542,46.2442372],[-0.9838474,46.1880746]],[[3.1476937,42.4007197],[3.1494906,42.4001543],[3.1530531,42.4005236],[3.1580376,42.4024274],[3.1876974,42.4280509],[3.142265,42.5247964],[3.0683711,42.5463547],[3.0488369,42.6941959],[3.0798953,43.0307277],[3.226405,43.1872688],[3.4091582,43.2603206],[3.5210352,43.258773],[3.6642877,43.3762765],[3.738414,43.3905396],[4.0097937,43.536068],[4.1769217,43.4563611],[4.5435531,43.4334906],[4.5494282,43.3540119],[4.8350582,43.3089126],[4.9750606,43.3830905],[5.0321866,43.3192811],[5.2591906,43.3192811],[5.3108165,43.2050388],[5.3568173,43.1864485],[5.3688175,43.1678525],[5.4023181,43.1621085],[5.4138183,43.1712257],[5.4091932,43.1992072],[5.5423205,43.1882713],[5.6058216,43.1479741],[5.6196969,43.1528987],[5.6383222,43.1715904],[5.6715728,43.1673966],[5.6909481,43.13411],[5.7760746,43.1063726],[5.7761996,43.0943247],[5.7540742,43.0832788],[5.7570743,43.0725048],[5.7703245,43.0646514],[5.8593261,43.0346897],[5.8877016,43.0627336],[5.9567028,43.0610897],[5.9638279,43.092773],[6.0003285,43.0918601],[6.0174538,43.068487],[6.1023303,43.0741485],[6.1048304,43.0525954],[6.0665981,43.0431845],[6.0672168,43.0378549],[6.1427018,43.0092284],[6.1567558,42.9871518],[6.1963544,42.9733134],[6.2222085,42.9801037],[6.2689052,42.996508],[6.2551549,43.0362655],[6.201904,43.0271281],[6.1837787,43.0918826],[6.3015307,43.0990937],[6.3247811,43.0797407],[6.3777821,43.0801059],[6.3886572,43.1339501],[6.5134094,43.1460813],[6.5770355,43.1788145],[6.6229113,43.1456253],[6.6977876,43.1996853],[6.6801623,43.2335736],[6.7211631,43.26007],[6.7224131,43.2747245],[6.6705372,43.2919232],[6.6874125,43.3311252],[6.7241631,43.3426718],[6.7529136,43.4089993],[6.7910393,43.3967387],[6.9062913,43.4167176],[6.9676674,43.5027333],[6.9661673,43.5281154],[7.006168,43.5384464],[7.0355435,43.4981997],[7.0689191,43.5001038],[7.0907945,43.5164228],[7.062669,43.5367247],[7.0825444,43.5456046],[7.1237951,43.5307436],[7.1557957,43.5437019],[7.1432954,43.622841],[7.1686709,43.6463635],[7.2137967,43.6346939],[7.2541724,43.6849746],[7.3402989,43.6674354],[7.3644243,43.6894038],[7.3530491,43.7082017],[7.4163002,43.7109124],[7.4540509,43.7450573],[7.4943016,43.7452379],[7.5794281,43.7842366],[7.6055156,43.7860269],[7.6036815,43.7889781],[7.5958811,43.7952788],[7.5962789,43.7954862],[7.5385252,43.8419488],[7.4599632,43.7998784],[7.4478096,43.8093355],[7.3235339,43.7480609],[7.3082211,43.7635679],[6.6487795,43.3885012],[6.6686548,43.3717842],[6.510027,43.2780293],[6.5658405,43.2250863],[6.1268057,43.105272],[5.4822945,43.2493904],[5.4726693,43.2309046],[5.4156683,43.2465678],[5.4526689,43.3450985],[4.8019076,43.4815759],[4.7641569,43.3924419],[4.657155,43.423681],[4.6722803,43.4560836],[4.4320261,43.5241904],[4.4145258,43.4925498],[4.1610214,43.5643292],[4.1445211,43.5706693],[4.141646,43.5739296],[4.1867718,43.5994627],[4.1056454,43.6819639],[3.79689,43.5216525],[3.7785147,43.5131316],[3.7646394,43.5059696],[3.7620144,43.5033403],[3.7422641,43.4932752],[3.7160136,43.5207461],[3.2621307,43.2814311],[3.2463804,43.2973542],[3.1838793,43.2805211],[3.1067529,43.2408312],[3.1547538,43.1941898],[2.9062494,43.1938252],[2.9067495,42.761892],[2.9461251,42.7620755],[2.9465001,42.6151551],[2.992376,42.6149711],[2.992376,42.5125003],[3.0410018,42.5125924],[3.0412052,42.5009317],[3.0908647,42.5008187],[3.1476937,42.4007197]],[[6.3594494,43.0232125],[6.4247695,43.0244403],[6.4524356,43.0350368],[6.4698484,43.0546098],[6.5112149,43.0576453],[6.5215565,43.0431768],[6.4836372,43.0244403],[6.471793,43.0072494],[6.4117762,42.9917993],[6.3985177,42.980484],[6.3517753,42.9990494],[6.3594494,43.0232125]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral","terms_text":"Ortho Littorale V2 - MEDDE"},{"id":"lu.geoportail.opendata.ortho_10cm_proto_lidar","name":"geoportail.lu LIDAR prototype Nordstad 2017","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-04-09T00:00:00.000Z","startDate":"2017-04-09T00:00:00.000Z","scaleExtent":[0,21],"polygon":[[[6.050007108761704,49.82175399016297],[6.049789364226169,49.91165980309075],[6.18901175543688,49.91171720394339],[6.188971338193781,49.821811209128995],[6.050007108761704,49.82175399016297]]],"terms_url":"https://act.public.lu/fr/cartographie/lidar/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.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":"girau_do_pnciano","name":"Girau do Ponciano","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.78012791818,-9.92939325541],[-36.78086820787,-9.83891760784],[-36.87233153527,-9.83917131263],[-36.87173072046,-9.90542386241],[-36.87036815828,-9.92988995709],[-36.86155978387,-9.92994279765],[-36.85565892404,-9.92980541218],[-36.85146394914,-9.92973143536],[-36.84574547952,-9.92977370783],[-36.83213058656,-9.92966802665],[-36.81455675309,-9.92960461792],[-36.78012791818,-9.92939325541]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"GRAFCAN-Canary_Islands","name":"GRAFCAN - Canary Islands","type":"wms","template":"http://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[-17.9291733,28.8910589],[-18.0333424,28.7998146],[-18.0374275,28.7317767],[-17.87811,28.4322434],[-17.8311317,28.4178731],[-17.7269626,28.5632821],[-17.7310476,28.6798232],[-17.6840694,28.7371497],[-17.7535155,28.8678081],[-17.8576846,28.860653],[-17.9291733,28.8910589]],[[-18.0781762,27.7721138],[-18.1370743,27.7875098],[-18.1705392,27.7644149],[-18.1779014,27.7069523],[-18.1578225,27.687989],[-18.0580973,27.6790988],[-18.0065614,27.6257423],[-17.9610492,27.6221843],[-17.9389624,27.7081374],[-17.9075054,27.7193953],[-17.8619932,27.8046798],[-17.872702,27.8407872],[-17.9255764,27.8680077],[-18.0052228,27.8360525],[-18.0139237,27.8034958],[-18.0781762,27.7721138]],[[-17.2687764,28.2399643],[-17.3340329,28.2193251],[-17.3633146,28.1536956],[-17.3666611,28.0880258],[-17.3306864,28.0474233],[-17.2729595,28.0068054],[-17.2001735,28.0053281],[-17.1441199,28.0289625],[-17.0780268,28.0835972],[-17.0872296,28.1536956],[-17.1826044,28.2149019],[-17.2687764,28.2399643]],[[-16.9358012,28.3762297],[-16.945004,28.3357366],[-16.7199529,27.9831662],[-16.6254147,27.9831662],[-16.52753,28.0164074],[-16.3995269,28.146319],[-16.3359437,28.3092236],[-16.3300873,28.3644515],[-16.1025263,28.524082],[-16.0983432,28.5814018],[-16.1426842,28.6254727],[-16.3392902,28.5960942],[-16.4380115,28.5314325],[-16.5392427,28.4402508],[-16.8395897,28.4122923],[-16.9358012,28.3762297]],[[-15.6883306,28.2058483],[-15.4739464,28.1643685],[-15.424272,28.2104562],[-15.3628326,28.1724353],[-15.3837481,28.0559841],[-15.3314593,27.9844367],[-15.3576037,27.8042042],[-15.5915962,27.6977727],[-15.7000956,27.7336471],[-15.7994443,27.8030479],[-15.8713415,27.9243925],[-15.8478115,28.036371],[-15.7471555,28.0894335],[-15.7314689,28.1839582],[-15.6883306,28.2058483]],[[-14.5088179,28.1344754],[-14.4107763,28.1344754],[-14.248681,28.2427804],[-14.2382232,28.3463737],[-14.0395256,28.7391056],[-13.8944241,28.7826519],[-13.7859248,28.7769232],[-13.8212198,28.3843326],[-13.9153397,28.190946],[-14.1859344,28.1356282],[-14.3088131,28.0052882],[-14.5401912,28.0514443],[-14.5088179,28.1344754]],[[-13.5524989,29.3772716],[-13.5086799,29.3682409],[-13.4795521,29.3872775],[-13.4754312,29.4096331],[-13.5003013,29.4280698],[-13.5504986,29.4071183],[-13.5524989,29.3772716]],[[-13.3976004,29.1610205],[-13.4281427,29.1215664],[-13.4417378,28.9908417],[-13.538995,28.9194675],[-13.7084109,28.8846777],[-13.7711575,28.8086488],[-13.9008338,28.8352194],[-13.9071084,28.8892559],[-13.8579569,28.936858],[-13.8569111,29.0365684],[-13.6759918,29.1498834],[-13.567231,29.1571898],[-13.5542776,29.3507259],[-13.399879,29.2180634],[-13.3976004,29.1610205]],[[-13.3379231,29.2866715],[-13.3503484,29.2743558],[-13.3385966,29.2653346],[-13.3261713,29.2776514],[-13.3379231,29.2866715]]],"terms_text":"GRAFCAN OrtoExpress Urbana 2009"},{"id":"GrandNancy_Orthophotographie_2012","name":"GrandNancy - Orthophoto - 2012","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[6.06066031366,48.60554459242],[6.29717112787,48.59922593248],[6.30611158204,48.74076820528],[6.06896018357,48.74710338225],[6.06066031366,48.60554459242]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie","terms_text":"GrandNancy Orthophotographie 2012"},{"id":"hamburg-40cm","name":"Hamburg (40 cm)","type":"wms","template":"http://geodienste.hamburg.de/HH_WMS_DOP40?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4825961,53.9356013],[8.4827386,53.9092447],[8.5274957,53.9094126],[8.5279233,53.9357691],[8.4825961,53.9356013]],[[9.7723167,53.543523],[9.7743354,53.5543296],[9.7631359,53.5552115],[9.7304736,53.5578689],[9.7346453,53.5653605],[9.7579266,53.6182757],[9.7712877,53.6313071],[9.770699,53.6160708],[9.7963361,53.6102995],[9.7899342,53.6038562],[9.8181678,53.5859147],[9.8377278,53.5919808],[9.8449827,53.5949795],[9.8541578,53.5980542],[9.8681371,53.6092959],[9.8693051,53.6132263],[9.885052,53.6219916],[9.8869663,53.6252015],[9.8935594,53.6302636],[9.8963672,53.6312186],[9.8968811,53.6349162],[9.9067823,53.6523063],[9.9311454,53.6526154],[9.9455232,53.6527604],[9.9502445,53.6508457],[9.9515493,53.6506547],[9.9779541,53.6488699],[9.9849181,53.6482971],[9.9873906,53.6507159],[9.9995963,53.6815314],[10.0228185,53.6815708],[10.0433756,53.6819823],[10.0514778,53.6775926],[10.0692494,53.679547],[10.0604009,53.6883344],[10.0709998,53.6958498],[10.0707046,53.7099642],[10.0819849,53.7204444],[10.1190792,53.7132448],[10.1693902,53.7389576],[10.1936896,53.7310028],[10.1779029,53.7099228],[10.1569421,53.7045133],[10.1582858,53.6894414],[10.1434248,53.6805732],[10.1417595,53.6774354],[10.144728,53.6761294],[10.1464311,53.6758841],[10.1495537,53.6754497],[10.1715323,53.6686937],[10.1988496,53.6467523],[10.1897268,53.6383796],[10.2220152,53.6334888],[10.1888726,53.6131597],[10.1923583,53.5947431],[10.2011737,53.5839226],[10.1516942,53.5761904],[10.1506692,53.5697309],[10.1479994,53.5639032],[10.1530759,53.5624246],[10.1594205,53.5609125],[10.1518903,53.5416987],[10.154649,53.5365725],[10.1687379,53.5374002],[10.1632659,53.5218549],[10.1661094,53.5201314],[10.169185,53.5196505],[10.1895059,53.5114835],[10.2104308,53.5199588],[10.218276,53.4992345],[10.2366988,53.4962928],[10.2500849,53.4789784],[10.2659161,53.4707878],[10.2904343,53.4551223],[10.3096151,53.4430928],[10.3122326,53.4522908],[10.3251401,53.4497898],[10.3079865,53.4333199],[10.2559794,53.4162256],[10.2508909,53.4102422],[10.2457816,53.402611],[10.2415493,53.3979725],[10.1655462,53.399327],[10.1450604,53.416136],[10.1094899,53.4264876],[10.1067973,53.4265817],[10.075805,53.4543638],[10.0515477,53.4639369],[10.0351698,53.446896],[10.0144851,53.4420285],[10.0229369,53.4322826],[9.9975402,53.4254609],[9.9824345,53.4147804],[9.9787266,53.4142015],[9.958105,53.4270802],[9.9295317,53.4200676],[9.92552,53.4192417],[9.9066683,53.4159559],[9.9230535,53.4363147],[9.9170421,53.4466391],[9.9043636,53.4570665],[9.8949316,53.4558313],[9.8688468,53.4446225],[9.8621101,53.4294212],[9.8487204,53.4411135],[9.806634,53.4664838],[9.8002119,53.4737243],[9.8028025,53.4938287],[9.7820338,53.4923568],[9.7688507,53.5053032],[9.7710683,53.5218512],[9.7810509,53.5183751],[9.773523,53.527956],[9.7723167,53.543523]]]},{"id":"Hamburg-DK5","name":"Hamburg (DK5)","type":"wms","template":"http://geodienste.hamburg.de/HH_WMS_Geobasisdaten?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=13&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[8.4825961,53.9356013],[8.4827386,53.9092447],[8.5274957,53.9094126],[8.5279233,53.9357691],[8.4825961,53.9356013]],[[9.7723167,53.543523],[9.7743354,53.5543296],[9.7631359,53.5552115],[9.7304736,53.5578689],[9.7346453,53.5653605],[9.7579266,53.6182757],[9.7712877,53.6313071],[9.770699,53.6160708],[9.7963361,53.6102995],[9.7899342,53.6038562],[9.8181678,53.5859147],[9.8377278,53.5919808],[9.8449827,53.5949795],[9.8541578,53.5980542],[9.8681371,53.6092959],[9.8693051,53.6132263],[9.885052,53.6219916],[9.8869663,53.6252015],[9.8935594,53.6302636],[9.8963672,53.6312186],[9.8968811,53.6349162],[9.9067823,53.6523063],[9.9311454,53.6526154],[9.9455232,53.6527604],[9.9502445,53.6508457],[9.9515493,53.6506547],[9.9779541,53.6488699],[9.9849181,53.6482971],[9.9873906,53.6507159],[9.9995963,53.6815314],[10.0228185,53.6815708],[10.0433756,53.6819823],[10.0514778,53.6775926],[10.0692494,53.679547],[10.0604009,53.6883344],[10.0709998,53.6958498],[10.0707046,53.7099642],[10.0819849,53.7204444],[10.1190792,53.7132448],[10.1693902,53.7389576],[10.1936896,53.7310028],[10.1779029,53.7099228],[10.1569421,53.7045133],[10.1582858,53.6894414],[10.1434248,53.6805732],[10.1417595,53.6774354],[10.144728,53.6761294],[10.1464311,53.6758841],[10.1495537,53.6754497],[10.1715323,53.6686937],[10.1988496,53.6467523],[10.1897268,53.6383796],[10.2220152,53.6334888],[10.1888726,53.6131597],[10.1923583,53.5947431],[10.2011737,53.5839226],[10.1516942,53.5761904],[10.1506692,53.5697309],[10.1479994,53.5639032],[10.1530759,53.5624246],[10.1594205,53.5609125],[10.1518903,53.5416987],[10.154649,53.5365725],[10.1687379,53.5374002],[10.1632659,53.5218549],[10.1661094,53.5201314],[10.169185,53.5196505],[10.1895059,53.5114835],[10.2104308,53.5199588],[10.218276,53.4992345],[10.2366988,53.4962928],[10.2500849,53.4789784],[10.2659161,53.4707878],[10.2904343,53.4551223],[10.3096151,53.4430928],[10.3122326,53.4522908],[10.3251401,53.4497898],[10.3079865,53.4333199],[10.2559794,53.4162256],[10.2508909,53.4102422],[10.2457816,53.402611],[10.2415493,53.3979725],[10.1655462,53.399327],[10.1450604,53.416136],[10.1094899,53.4264876],[10.1067973,53.4265817],[10.075805,53.4543638],[10.0515477,53.4639369],[10.0351698,53.446896],[10.0144851,53.4420285],[10.0229369,53.4322826],[9.9975402,53.4254609],[9.9824345,53.4147804],[9.9787266,53.4142015],[9.958105,53.4270802],[9.9295317,53.4200676],[9.92552,53.4192417],[9.9066683,53.4159559],[9.9230535,53.4363147],[9.9170421,53.4466391],[9.9043636,53.4570665],[9.8949316,53.4558313],[9.8688468,53.4446225],[9.8621101,53.4294212],[9.8487204,53.4411135],[9.806634,53.4664838],[9.8002119,53.4737243],[9.8028025,53.4938287],[9.7820338,53.4923568],[9.7688507,53.5053032],[9.7710683,53.5218512],[9.7810509,53.5183751],[9.773523,53.527956],[9.7723167,53.543523]]]},{"id":"Hampshire-Aerial-FCIR","name":"Hampshire Aerial FCIR","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png","endDate":"2014-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"Hampshire-Aerial-RGB","name":"Hampshire Aerial RGB","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"Yverdon_les_Bains-HEIG_VD-2007","name":"HEIG-VD / Orthophoto Yverdon-les-Bains 25cm (2007)","type":"wms","template":"http://ogc.heig-vd.ch/mapserver/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=orthophoto_yverdon&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2007-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","polygon":[[[6.6620704,46.7757613],[6.6593637,46.7749931],[6.6604976,46.7745171],[6.6596563,46.7733731],[6.658242,46.7710934],[6.6580469,46.7705088],[6.6573276,46.7693898],[6.6554865,46.7697656],[6.6548159,46.7700412],[6.6536333,46.7702917],[6.6488782,46.7683208],[6.6473176,46.7700579],[6.6461837,46.7696153],[6.6454034,46.7704838],[6.645001,46.7703251],[6.6435257,46.7718115],[6.6422821,46.7712771],[6.6406239,46.7729556],[6.6403191,46.7728303],[6.6387097,46.7744336],[6.6373929,46.7738407],[6.6355275,46.7756778],[6.6349057,46.7753772],[6.6327598,46.777473],[6.6314308,46.776947],[6.6286875,46.7798025],[6.6241398,46.7808713],[6.6244202,46.7813138],[6.6207868,46.7823825],[6.6210185,46.7825995],[6.6192872,46.7832006],[6.6208722,46.7847786],[6.6188239,46.7855216],[6.6247738,46.7909228],[6.625993,46.7903385],[6.6261271,46.7904971],[6.6306139,46.7880344],[6.6287729,46.7912985],[6.6362834,46.7938695],[6.6373198,46.7924838],[6.6380087,46.7927176],[6.6387158,46.7917993],[6.6396546,46.7909187],[6.6411238,46.7892533],[6.6414896,46.7894119],[6.6443548,46.7867321],[6.6458057,46.7875169],[6.6468543,46.7866737],[6.6473176,46.7869158],[6.6507923,46.7842933],[6.6511115,46.7844456],[6.6533285,46.7824158],[6.6544349,46.7828427],[6.6560687,46.7809766],[6.6567332,46.7812522],[6.6583609,46.7793736],[6.6589722,46.7796176],[6.6620704,46.7757613]]],"terms_text":"Orthophoto Yverdon 2007 / HEIG-VD"},{"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]]],"terms_text":"IBGE","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":"IBGE_BC250_Aglomerado_Rural","name":"IBGE-BC250-Aglomerado Rural Isolado","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Pista_Pouso","name":"IBGE-BC250-Pista de Pouso","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Rios_Drenagem","name":"IBGE-BC250-Rios Drenagem","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Terra_Indegina","name":"IBGE-BC250-Terra Indigena","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Rodoviario","name":"IBGE-BC250-Trecho Rodoviario","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Uso_Sustentavel","name":"IBGE-BC250-Unidade de Uso Sistentável - APA","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BC250_Villa","name":"IBGE-BC250-Villa","type":"wms","template":"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BCIM_Gerador_Eletrica","name":"IBGE-BCIM-Estações Geradora de Energia Elétrica","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"id":"IBGE_BCIM_Municipio","name":"IBGE-BCIM-Município","type":"wms","template":"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE","projection":"EPSG:3857","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]]],"terms_text":"IBGE","overlay":true},{"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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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_R017_S67_20170223T022551","name":"imagico.de: Bunger Hills","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}","endDate":"2017-02-23T00:00:00.000Z","startDate":"2017-02-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (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: Central 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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-larsen_2018","name":"imagico.de: Larsen C ice shelf after calving","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}","endDate":"2018-01-06T00:00:00.000Z","startDate":"2018-01-06T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"For updating the ice edge after the 2017 iceberg calving (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: 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: 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: 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_R042_S78_20170214T202521","name":"imagico.de: McMurdo Sound and Dry Valleys","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}","endDate":"2017-02-14T00:00:00.000Z","startDate":"2017-02-14T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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-walps_autumn_2017","name":"imagico.de: Western Alps autumn colors 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-10-17T00:00:00.000Z","startDate":"2017-10-17T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Autumn colors in the Alps, Jura and southwestern Germany (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: 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: 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":"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":"https://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":"ITACyL-Castile-and-Leon","name":"ITACyL - Castile and León","type":"wms","template":"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","polygon":[[[-1.9357991,41.4383441],[-1.8960064,41.438692],[-1.895356,41.3968709],[-1.9767014,41.3961593],[-1.9763916,41.376229],[-2.0620081,41.3754798],[-2.0626179,41.4147091],[-2.104577,41.4143421],[-2.103634,41.3536716],[-2.1444816,41.353314],[-2.1418984,41.1868282],[-2.0620415,41.1875291],[-2.0617117,41.1662438],[-2.0204638,41.1666059],[-2.0188653,41.0633378],[-2.100826,41.0626171],[-2.1011407,41.0829596],[-2.2273263,41.0818503],[-2.2270424,41.0634991],[-2.2691206,41.0631291],[-2.2688026,41.0425666],[-2.3532519,41.0418238],[-2.3535559,41.0614821],[-2.3948686,41.0611188],[-2.3945738,41.0420594],[-2.4372246,41.0416842],[-2.4375565,41.0631457],[-2.4792811,41.0627788],[-2.4799141,41.1036906],[-2.5207759,41.1033316],[-2.5211004,41.1242948],[-2.6041532,41.1235652],[-2.6048148,41.1662833],[-2.6470964,41.1659121],[-2.6480789,41.2293052],[-2.728739,41.2285978],[-2.7290669,41.2497401],[-2.8955197,41.2482806],[-2.8964873,41.3106325],[-2.9363011,41.3102838],[-2.9357117,41.2723089],[-3.1469203,41.2704576],[-3.1472307,41.2904534],[-3.2282807,41.2897432],[-3.2276653,41.2500782],[-3.3958112,41.2486039],[-3.3951828,41.2080777],[-3.4349215,41.207729],[-3.4342897,41.166962],[-3.4787658,41.1665716],[-3.4784403,41.1455556],[-3.6033615,41.1444585],[-3.6026994,41.1016871],[-3.6453878,41.101312],[-3.6450826,41.0815903],[-3.6873474,41.0812188],[-3.6867259,41.0410356],[-3.7286604,41.0406667],[-3.7280287,40.9997997],[-3.7689605,40.9994394],[-3.7686426,40.9788648],[-3.8547306,40.9781068],[-3.8543974,40.9565345],[-3.8985743,40.9561454],[-3.8976421,40.8957522],[-3.9390572,40.8953871],[-3.9371558,40.7720359],[-4.061976,40.7709334],[-4.0613345,40.7292585],[-4.1037236,40.7288838],[-4.1031129,40.6891834],[-4.146278,40.6888017],[-4.1449778,40.6042134],[-4.1902455,40.6038125],[-4.1899353,40.5836167],[-4.2294603,40.5832666],[-4.2297921,40.604873],[-4.2705425,40.6045122],[-4.2695844,40.5421064],[-4.3138364,40.5417142],[-4.3116268,40.397575],[-4.3937599,40.3968455],[-4.3934525,40.3767688],[-4.4372265,40.3763799],[-4.4362295,40.3112251],[-4.5219173,40.3104631],[-4.5203662,40.2089652],[-4.5613148,40.2086005],[-4.5609947,40.1876316],[-4.6889523,40.1864916],[-4.6893267,40.2110086],[-4.7319244,40.2106292],[-4.7325206,40.2496574],[-4.7683768,40.2493382],[-4.7680867,40.2303451],[-4.8110432,40.2299626],[-4.8114661,40.2072641],[-4.8542024,40.1841364],[-4.8526373,40.1256293],[-4.9369855,40.1248771],[-4.9363819,40.0852905],[-5.3553832,40.0815518],[-5.3560552,40.1256221],[-5.4402699,40.1248711],[-5.4409085,40.1667265],[-5.6038169,40.1652746],[-5.6044816,40.2088137],[-5.6864643,40.2080835],[-5.6871247,40.2513133],[-6.0216585,40.2483356],[-6.0229464,40.3325684],[-6.1043332,40.3318449],[-6.1055986,40.4145069],[-6.1895128,40.4137618],[-6.1901823,40.4574544],[-6.2697076,40.4567487],[-6.2690913,40.4165255],[-6.35192,40.41579],[-6.3512834,40.374216],[-6.4332493,40.3734877],[-6.4326391,40.3336127],[-6.5224541,40.3328142],[-6.5211648,40.2484909],[-6.599422,40.2477943],[-6.5988642,40.2112799],[-6.8556786,40.2089926],[-6.8563443,40.2525719],[-6.9362181,40.2518609],[-6.9375132,40.3365682],[-6.8511064,40.3373363],[-6.8600092,40.9167165],[-6.9354421,40.9160518],[-6.9374109,41.0435015],[-6.8548179,41.0442279],[-6.8554804,41.0870562],[-6.7701541,41.0878063],[-6.7724533,41.2362299],[-6.6837886,41.2370075],[-6.6043553,41.2377041],[-6.6052401,41.2947359],[-6.5193011,41.295489],[-6.5199114,41.3347937],[-6.4367251,41.3355221],[-6.4380091,41.4181379],[-6.3531841,41.4188797],[-6.3544684,41.501409],[-6.2688882,41.5021564],[-6.2707951,41.6245018],[-6.3566149,41.6237537],[-6.3572432,41.6640106],[-6.435477,41.663329],[-6.4349024,41.6265132],[-6.5227923,41.625747],[-6.523426,41.6663463],[-6.6034046,41.6656495],[-6.60733,41.9166043],[-7.0220912,41.9130049],[-7.0240633,42.0387169],[-7.1054035,42.0380124],[-7.1061291,42.0842081],[-7.0207976,42.0849466],[-7.0227551,42.2093958],[-6.9369897,42.2101367],[-6.9376312,42.25087],[-6.8547973,42.2515851],[-6.8554546,42.2932892],[-6.7734213,42.2939969],[-6.7740277,42.3324438],[-6.853255,42.3317608],[-6.8552311,42.4569007],[-7.1034126,42.4547653],[-7.1081086,42.7511487],[-7.0219933,42.7518861],[-7.0224121,42.7782497],[-6.9397569,42.7789573],[-6.9419944,42.9196184],[-6.7730194,42.9210615],[-6.7736331,42.959583],[-6.5232855,42.9617196],[-6.5239109,43.0009499],[-6.4389317,43.0016747],[-6.4402391,43.0836074],[-5.9378159,43.0878866],[-5.9370816,43.0418887],[-5.854205,43.0425951],[-5.8535667,43.0025804],[-5.7723612,43.003273],[-5.7736346,43.0830757],[-5.6026996,43.0845317],[-5.6020243,43.0422247],[-5.5216051,43.0429102],[-5.5222624,43.0840869],[-5.4375994,43.084808],[-5.4382655,43.1265078],[-5.1044441,43.1293491],[-5.1057321,43.2099008],[-5.0238581,43.2105967],[-5.0245075,43.2511672],[-4.9001667,43.2522234],[-4.899411,43.2050092],[-4.8112607,43.2057585],[-4.8096559,43.105375],[-4.7697514,43.1057148],[-4.7693676,43.0816804],[-4.7294463,43.0820204],[-4.7288105,43.0421933],[-4.5632192,43.0436047],[-4.5635281,43.0629569],[-4.3959936,43.0643843],[-4.395658,43.0433568],[-4.3537016,43.0437144],[-4.3526592,42.978357],[-4.2301346,42.9794024],[-4.2291284,42.9162469],[-4.1877354,42.9166004],[-4.1870583,42.8740657],[-4.1055199,42.8747626],[-4.1048632,42.8334825],[-3.978008,42.8345674],[-3.9773335,42.7921387],[-3.9374989,42.7924796],[-3.9378064,42.8118263],[-3.853966,42.8125436],[-3.8542743,42.8319306],[-3.8957255,42.831576],[-3.8960731,42.8534282],[-3.9382057,42.853068],[-3.9388853,42.8957718],[-3.9805995,42.8954154],[-3.9809315,42.916265],[-4.0221962,42.9159125],[-4.0229008,42.9601447],[-3.9785114,42.9605236],[-3.9794595,43.0199892],[-3.938827,43.0203357],[-3.9391788,43.042387],[-3.8970383,43.0427461],[-3.8973798,43.0641401],[-3.8542367,43.0645077],[-3.8548965,43.1058288],[-3.7708592,43.1065444],[-3.7711564,43.1251478],[-3.7281894,43.1255135],[-3.7285258,43.1465582],[-3.6871289,43.1469104],[-3.6877837,43.1878633],[-3.6036492,43.1885787],[-3.6033117,43.16747],[-3.5227798,43.168155],[-3.5224286,43.1461867],[-3.3966874,43.1472567],[-3.3969871,43.1660054],[-3.3544386,43.1663674],[-3.3547905,43.1883699],[-3.312676,43.188728],[-3.3129888,43.2082817],[-3.2299295,43.2089878],[-3.2295886,43.1876784],[-3.1034303,43.1887511],[-3.1027407,43.1456249],[-3.145455,43.1452614],[-3.1451648,43.1271],[-3.1061749,43.1274319],[-3.1044462,43.0191538],[-3.0207548,43.0198674],[-3.0201036,42.9790294],[-2.9811034,42.9793622],[-2.9797722,42.8957965],[-3.1047595,42.8947286],[-3.1027646,42.7692834],[-3.0219949,42.7699749],[-3.021675,42.7498344],[-2.9802357,42.7501893],[-2.9798754,42.7275008],[-2.8961284,42.7282183],[-2.8967866,42.7696661],[-2.853397,42.7700376],[-2.854046,42.8108748],[-2.6857742,42.8123144],[-2.6854448,42.7915941],[-2.645233,42.7919382],[-2.6448881,42.7702354],[-2.5200461,42.7713042],[-2.5193626,42.7282661],[-2.5607021,42.7279119],[-2.5603797,42.7075982],[-2.5194387,42.7079491],[-2.5181004,42.6235669],[-2.6040367,42.6228294],[-2.6043876,42.6449665],[-2.7715364,42.6435327],[-2.7718838,42.6654388],[-2.8117632,42.6650968],[-2.8120986,42.6862446],[-2.8546876,42.6858795],[-2.853374,42.6030248],[-2.8941263,42.602675],[-2.8937924,42.581594],[-3.0618985,42.5801504],[-3.0603059,42.4795203],[-3.0219106,42.4798505],[-3.0198987,42.3524957],[-3.0625473,42.3521282],[-3.0602922,42.20906],[-3.101203,42.2087066],[-3.1008585,42.1868215],[-3.0617541,42.1871594],[-3.0611,42.1455897],[-3.02029,42.1459425],[-3.0196265,42.1037456],[-2.8960202,42.1048151],[-2.8950131,42.0407115],[-2.8122232,42.0414286],[-2.8135302,42.1246034],[-2.7687117,42.1249911],[-2.7690537,42.1467421],[-2.7269484,42.1471061],[-2.7265985,42.1248518],[-2.6870598,42.1251938],[-2.6860524,42.0610919],[-2.7280396,42.0607283],[-2.7273889,42.0192954],[-2.6034263,42.0203694],[-2.6037558,42.0413549],[-2.561002,42.0417251],[-2.561982,42.1041055],[-2.5226586,42.1044458],[-2.5229938,42.1257676],[-2.4793313,42.1261453],[-2.4796279,42.1450019],[-2.3551669,42.1460781],[-2.3555034,42.1674688],[-2.3118382,42.1678462],[-2.3114953,42.1460516],[-2.2698957,42.1464113],[-2.2692414,42.1048011],[-2.2295004,42.105145],[-2.2298147,42.1251384],[-2.1446652,42.1258749],[-2.1443191,42.1038592],[-2.1038544,42.1042093],[-2.1015605,41.958109],[-1.9768889,41.9591902],[-1.9765512,41.9376488],[-1.9347344,41.9380116],[-1.9350441,41.9577593],[-1.8945308,41.9581106],[-1.8948295,41.9771541],[-1.8540002,41.9775081],[-1.8530417,41.9163796],[-1.8138054,41.9167201],[-1.8115061,41.7698387],[-1.7705981,41.7701945],[-1.7686552,41.6458221],[-1.8533513,41.645084],[-1.8530483,41.6256663],[-1.8947057,41.6253032],[-1.8940326,41.5821499],[-1.9771633,41.5814247],[-1.9768326,41.5602127],[-1.9377021,41.5605541],[-1.9357991,41.4383441]]],"terms_text":"ITACyL"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[5,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]]],"terms_url":"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html","terms_text":"GSI Japan"},{"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":"https://mapproxy.osm.ch/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":"https://mapproxy.osm.ch/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":"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","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":"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","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":"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[7.6713752,47.5952248],[7.6799583,47.6007811],[7.6845073,47.6018228],[7.6943779,47.601707],[7.6939487,47.5966718],[7.6870823,47.5935462],[7.6788425,47.5871208],[7.685709,47.585384],[7.6890564,47.5761205],[7.6941204,47.573399],[7.6924038,47.5669132],[7.6847005,47.5617009],[7.6642513,47.5616429],[7.6487159,47.5568934],[7.6303482,47.558689],[7.6235675,47.5566617],[7.6278591,47.5514483],[7.6273763,47.5365801],[7.6183319,47.5366163],[7.6133537,47.5326179],[7.5996208,47.5191137],[7.5850296,47.5191717],[7.5840854,47.5263589],[7.5771331,47.5316327],[7.581253,47.5398612],[7.5718975,47.5414835],[7.553873,47.5414835],[7.5537872,47.5512166],[7.5565338,47.5582836],[7.5537014,47.5603108],[7.5537872,47.5747308],[7.5643444,47.5812157],[7.5793647,47.579884],[7.583313,47.5901889],[7.5856304,47.5923306],[7.5920677,47.5923885],[7.598505,47.5907098],[7.609148,47.5864261],[7.6092338,47.5810999],[7.6191043,47.580463],[7.6368713,47.593141],[7.6378154,47.595572],[7.6416778,47.5988711],[7.6452827,47.6002602],[7.664938,47.5961798],[7.6713752,47.5952248]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn (SOGIS)","type":"tms","template":"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2017-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[15,19],"polygon":[[[7.9559502,47.4716195],[7.9823893,47.4715536],[7.9823893,47.453533],[7.9955263,47.453533],[7.995209,47.4174733],[8.0218003,47.4174304],[8.0215465,47.3993483],[8.0345565,47.3992624],[8.0346835,47.3902835],[8.0478839,47.3902236],[8.0476936,47.3722351],[8.0345565,47.372321],[8.0343661,47.3543954],[8.0211657,47.3542664],[8.0207214,47.3273881],[7.9944474,47.3274741],[7.994257,47.318569],[7.9677291,47.3186551],[7.9676656,47.3096624],[7.9412227,47.3097751],[7.9413282,47.3277752],[7.9148637,47.3278613],[7.9146733,47.3098775],[7.9015998,47.3100497],[7.9014015,47.3009748],[7.8750084,47.3010986],[7.8750084,47.2922321],[7.861655,47.292122],[7.8615371,47.2740879],[7.8483207,47.2741634],[7.8482988,47.2652268],[7.8350156,47.2651964],[7.8350156,47.2562425],[7.7953454,47.2563643],[7.7953005,47.2474089],[7.7292435,47.2475612],[7.7292884,47.2565166],[7.7162295,47.2566689],[7.7161847,47.2655923],[7.7030361,47.2655923],[7.7030361,47.2746055],[7.6897529,47.2746664],[7.6898875,47.2836781],[7.6634108,47.2837085],[7.6633211,47.2746968],[7.6105472,47.2747577],[7.6104126,47.2478658],[7.6235163,47.2477691],[7.6235612,47.2387871],[7.6498584,47.2387566],[7.649993,47.2297678],[7.6499025,47.2208313],[7.6630766,47.220732],[7.6631044,47.2117803],[7.6629675,47.2027317],[7.6761677,47.2026985],[7.6762267,47.1937182],[7.6893753,47.1936878],[7.6892406,47.1757237],[7.7024341,47.1756017],[7.7023444,47.14869],[7.6626742,47.1488121],[7.6628088,47.1397774],[7.6363322,47.1398995],[7.6364668,47.14869],[7.5967967,47.1489341],[7.5968415,47.1399606],[7.5704098,47.1399911],[7.5704216,47.1579174],[7.5573628,47.1579479],[7.5573179,47.1488843],[7.5442142,47.1489453],[7.5441693,47.1399107],[7.5309759,47.1399107],[7.5309535,47.1309652],[7.5176703,47.1309652],[7.5176478,47.121959],[7.5176927,47.1129198],[7.4913057,47.1130114],[7.4913506,47.1040318],[7.478202,47.1040013],[7.4781282,47.0770534],[7.4649349,47.0770839],[7.4649797,47.0680676],[7.4255179,47.0680065],[7.4254282,47.0860069],[7.372789,47.0859763],[7.3728787,47.1040318],[7.3595955,47.1040318],[7.3595506,47.1309967],[7.4122796,47.1309967],[7.4122347,47.1490064],[7.4253833,47.1490064],[7.4255179,47.1580089],[7.3726992,47.157965],[7.3726992,47.1849769],[7.3462674,47.1849159],[7.3463572,47.2028721],[7.333074,47.2029026],[7.333074,47.2209598],[7.346142,47.2209598],[7.346142,47.2299135],[7.3725646,47.2299135],[7.3726992,47.2389023],[7.3989964,47.2389632],[7.399131,47.2479201],[7.4122796,47.2479201],[7.4122796,47.2659206],[7.45186,47.2658901],[7.4519497,47.2749033],[7.4650534,47.2749337],[7.4650983,47.2838541],[7.4782918,47.2838541],[7.4783367,47.2929251],[7.504596,47.2928845],[7.5047307,47.3018322],[7.5312002,47.3018119],[7.53129,47.3197941],[7.5444835,47.3198549],[7.5445283,47.3287981],[7.5576769,47.3288285],[7.5576769,47.3378614],[7.5312451,47.3378614],[7.5313349,47.3558617],[7.5180068,47.3558313],[7.5180965,47.3648291],[7.3987991,47.3648373],[7.3988853,47.3918171],[7.3856422,47.391813],[7.3856361,47.4008028],[7.3723427,47.4007987],[7.3723427,47.4097769],[7.3458375,47.4097769],[7.3458375,47.4187804],[7.3192515,47.4187804],[7.3192515,47.4457788],[7.4121035,47.4457788],[7.4121035,47.4907816],[7.4253513,47.4907816],[7.4253513,47.4998066],[7.4385572,47.4998066],[7.4385572,47.5087647],[7.4917722,47.5087647],[7.4917832,47.6346827],[7.7844981,47.6342779],[7.7841548,47.5712255],[7.8107408,47.5711386],[7.8107408,47.5621621],[7.8239482,47.5620566],[7.8238715,47.5441362],[7.8636799,47.5439699],[7.8636317,47.5349751],[7.8767918,47.5349474],[7.8767504,47.5259917],[7.8900971,47.5259637],[7.8900555,47.5169501],[7.9031858,47.5169225],[7.9031025,47.4988609],[7.9164877,47.4988327],[7.9164458,47.4897557],[7.9561223,47.4896722],[7.9559502,47.4716195]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"Solothurn-infrared-SOGIS","name":"Kanton Solothurn Infrarot (SOGIS)","type":"wms","template":"http://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:4326","endDate":"2017-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[15,19],"polygon":[[[7.5704216,47.1579174],[7.5573628,47.1579479],[7.5573179,47.1488843],[7.5442142,47.1489453],[7.5441693,47.1399107],[7.5309759,47.1399107],[7.530931,47.121959],[7.5176478,47.121959],[7.5176927,47.1129198],[7.4913057,47.1130114],[7.4913506,47.1040318],[7.478202,47.1040013],[7.4781572,47.094959],[7.4914404,47.0949896],[7.4913955,47.0770227],[7.4781572,47.0770533],[7.478202,47.068037],[7.4255179,47.0680065],[7.4254282,47.0860069],[7.372789,47.0859763],[7.3728787,47.1040318],[7.3595955,47.1040318],[7.3595506,47.1309967],[7.4122796,47.1309967],[7.4122347,47.1490064],[7.4253833,47.1490064],[7.4255179,47.1580089],[7.399131,47.1580394],[7.399131,47.1490064],[7.3726992,47.1489758],[7.3726992,47.1849769],[7.3462674,47.1849159],[7.3463572,47.1939124],[7.333074,47.1939429],[7.333074,47.2299135],[7.3725646,47.2299135],[7.3726992,47.2389023],[7.3989964,47.2389632],[7.399131,47.2479201],[7.4122796,47.2479201],[7.4122796,47.2659206],[7.45186,47.2658901],[7.4519497,47.2749033],[7.4650534,47.2749337],[7.4650983,47.2838541],[7.4782918,47.2838541],[7.4783367,47.2929251],[7.4914852,47.2928946],[7.4916199,47.3018423],[7.5312002,47.3018119],[7.53129,47.3197941],[7.5444835,47.3198549],[7.5445283,47.3287981],[7.5576769,47.3288285],[7.5576769,47.3378614],[7.5312451,47.3378614],[7.5313349,47.3558617],[7.5180068,47.3558313],[7.5180965,47.3648291],[7.4386216,47.3649203],[7.4386665,47.3738862],[7.4253833,47.373947],[7.4254282,47.4008052],[7.3855786,47.4008963],[7.3856683,47.4097954],[7.3591468,47.4097954],[7.3591468,47.418784],[7.3723851,47.4188447],[7.3724748,47.4368174],[7.3857132,47.4368174],[7.3857132,47.4410365],[7.3956307,47.4401563],[7.3963039,47.4425844],[7.4076125,47.4410972],[7.4079267,47.4422505],[7.403125,47.442463],[7.3973809,47.4433128],[7.3983233,47.4458318],[7.412145,47.4458318],[7.4122796,47.4547839],[7.4386665,47.454875],[7.4388012,47.47053],[7.450065,47.4694076],[7.450065,47.4722287],[7.4464749,47.4722287],[7.4464749,47.473806],[7.4429297,47.473897],[7.4428848,47.4755349],[7.439205,47.4755956],[7.439205,47.4772032],[7.4355701,47.4772941],[7.4354803,47.4789926],[7.4173954,47.4789623],[7.4174403,47.4857254],[7.4209855,47.4857254],[7.4210752,47.4908199],[7.4276271,47.4907289],[7.4285246,47.4934882],[7.4309928,47.4964293],[7.4348521,47.4988852],[7.4418976,47.4955197],[7.4466544,47.4945495],[7.4501098,47.4917599],[7.4508727,47.4906986],[7.4645149,47.4907289],[7.4645598,47.4890308],[7.4681947,47.4890005],[7.4681947,47.4856648],[7.4718746,47.4857254],[7.4719194,47.4823288],[7.4826896,47.4823895],[7.4826447,47.4838755],[7.4862348,47.4839665],[7.4863694,47.4856648],[7.4899146,47.4856648],[7.4900043,47.4906986],[7.4996975,47.4907289],[7.4996526,47.491396],[7.4917545,47.4919418],[7.4917545,47.4951256],[7.4982166,47.494792],[7.4988897,47.4958533],[7.4956587,47.4962777],[7.4917096,47.4962474],[7.4917994,47.4997341],[7.5050377,47.4997038],[7.5050377,47.5087377],[7.5447976,47.5087074],[7.5447426,47.4548204],[7.4916868,47.4546917],[7.4917503,47.445808],[7.4652859,47.4457651],[7.4652224,47.409829],[7.4915599,47.409786],[7.4917503,47.3919161],[7.5048873,47.3918302],[7.5048873,47.40068],[7.5182147,47.4007659],[7.5183416,47.4187616],[7.5579431,47.4187187],[7.5581335,47.445808],[7.5845344,47.4457222],[7.5844075,47.4366653],[7.6109354,47.4366224],[7.6109988,47.4637025],[7.5976714,47.4637025],[7.5979253,47.4996448],[7.6243263,47.4996877],[7.6244532,47.4905972],[7.6377806,47.4905543],[7.6378441,47.4996019],[7.6775724,47.4994733],[7.6774455,47.4904686],[7.7038465,47.4904257],[7.7039099,47.4814623],[7.7171104,47.4812907],[7.7171104,47.45452],[7.7039734,47.45452],[7.7038465,47.4455934],[7.6904556,47.4455076],[7.6903287,47.4095713],[7.6771282,47.4094854],[7.6771282,47.40068],[7.6506638,47.40068],[7.6504734,47.3736534],[7.6770647,47.3735674],[7.6770647,47.3825062],[7.7166661,47.3825062],[7.7167931,47.3734385],[7.7430671,47.3733955],[7.7430671,47.3553843],[7.7562041,47.3553413],[7.7563311,47.3463979],[7.7826051,47.3462689],[7.7829224,47.3643262],[7.7961229,47.3642832],[7.7961863,47.3732666],[7.8226508,47.3731376],[7.8227142,47.3822914],[7.8491152,47.3821195],[7.8492421,47.3910568],[7.8625061,47.3909709],[7.862633,47.4090559],[7.8758969,47.40897],[7.8760239,47.4180316],[7.9024248,47.4179457],[7.9024248,47.40897],[7.9288892,47.4087982],[7.9291431,47.4178169],[7.9421532,47.4176881],[7.9426609,47.4627586],[7.9559248,47.462587],[7.9561152,47.4716394],[7.9823893,47.4715536],[7.9823893,47.453533],[7.9955263,47.453533],[7.995209,47.4174733],[8.0218003,47.4174304],[8.0215465,47.3993483],[8.0345565,47.3992624],[8.0346835,47.3902835],[8.0478839,47.3901546],[8.0476936,47.3722351],[8.0345565,47.372321],[8.0343661,47.3543954],[8.0211657,47.3542664],[8.0207214,47.3273881],[7.9944474,47.3274741],[7.994257,47.318569],[7.9677291,47.3186551],[7.9676656,47.3096624],[7.9412012,47.3099206],[7.9413282,47.3277752],[7.9148637,47.3278613],[7.9146733,47.3098775],[7.9015998,47.3100497],[7.9014015,47.3009748],[7.8750084,47.3010986],[7.8750084,47.2922321],[7.861655,47.292122],[7.8615371,47.2740879],[7.8484334,47.2741488],[7.8482988,47.2652268],[7.8350156,47.2651964],[7.8350156,47.2562425],[7.7953454,47.2563643],[7.7953005,47.2474089],[7.7292435,47.2475612],[7.7292884,47.2565166],[7.7162295,47.2566689],[7.7161847,47.2655923],[7.7030361,47.2655923],[7.7030361,47.2746055],[7.6897529,47.2746664],[7.6898875,47.2836781],[7.6634108,47.2837085],[7.6633211,47.2746968],[7.6105472,47.2747577],[7.6104126,47.2478658],[7.6235163,47.2476526],[7.6235612,47.2387871],[7.6498584,47.2387566],[7.649993,47.2297678],[7.6630518,47.2297068],[7.6631044,47.2117803],[7.6762081,47.2116888],[7.6762267,47.1937182],[7.6893753,47.1936878],[7.6892406,47.1757237],[7.7024341,47.1756017],[7.702479,47.1666326],[7.7156724,47.1666326],[7.7155827,47.1576926],[7.7023892,47.1576621],[7.7023444,47.14869],[7.6626742,47.1488121],[7.6628088,47.1397774],[7.6363322,47.1398995],[7.6364668,47.14869],[7.5967967,47.1489341],[7.5968415,47.1399606],[7.5704098,47.1399911],[7.5704216,47.1579174]]],"terms_text":"Orthofoto WMS Solothurn","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTTHURGAU2017","name":"Kanton Thurgau OF 2017","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.63768410076,47.7004145356],[8.78327839646,47.69879895418],[8.78303977274,47.68533252804],[8.87027412213,47.68426691888],[8.8699714813,47.67089514045],[8.89900814897,47.67047199109],[8.89866777324,47.65698230742],[8.92770444091,47.65661195321],[8.92828046137,47.67015462681],[8.95726476355,47.66973147144],[8.95773605301,47.68327074156],[9.19060541482,47.6799391377],[9.1902650391,47.66645190099],[9.21922315852,47.6660287156],[9.21898751379,47.65255552096],[9.24784090222,47.65209694793],[9.24747434375,47.63863780005],[9.30570477557,47.63764983607],[9.30525966885,47.62420461255],[9.33416542278,47.62371049645],[9.33348467133,47.59673879302],[9.39150564117,47.59576769355],[9.3911390827,47.58234701941],[9.42007101938,47.58176420165],[9.41860478548,47.54139270755],[9.44753672216,47.5408447841],[9.44717016368,47.52730395336],[9.47604973486,47.52680892203],[9.47518570418,47.49985802607],[9.5041438236,47.49934504674],[9.50309651368,47.47241544181],[9.41596032792,47.47391975877],[9.41554140395,47.46045016443],[9.35759898235,47.4614060707],[9.35817500281,47.47498160364],[9.32895505591,47.47533554716],[9.32864086293,47.46188401733],[9.18361462107,47.46420288184],[9.18411209329,47.47768921094],[9.15491832913,47.47809622481],[9.15465650165,47.4646277009],[9.0673632194,47.46583133624],[9.06717994017,47.45234196418],[9.0960856941,47.45193475084],[9.09582386661,47.43853036098],[9.06663010246,47.43883142176],[9.06642064047,47.42537055101],[9.00829493964,47.42620309948],[9.00714289872,47.385729558],[8.97810623105,47.38615501083],[8.97739929685,47.3591319418],[8.91940450976,47.35989459356],[8.92032090594,47.38697045248],[8.89136278652,47.38725408141],[8.89285520316,47.44116901155],[8.86397563198,47.44148776574],[8.86604406908,47.52251256102],[8.80783982,47.52316676216],[8.80893949543,47.56372896753],[8.77985046226,47.56402931121],[8.78024320348,47.57750766919],[8.7220913199,47.57814352175],[8.72337427456,47.63212747913],[8.66519620823,47.63272738003],[8.66579841143,47.65980396746],[8.63673556102,47.65999795099],[8.63768410076,47.7004145356]]],"terms_text":"Kanton Thurgau OF 2017","best":true},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015 10cm","type":"tms","template":"https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2015-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","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":"kartverket-friluft","name":"Kartverket Hiking Trails","type":"wms","template":"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[6,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/","terms_text":"© Kartverket","description":"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png","overlay":true},{"id":"kartverket-topo4","name":"Kartverket N50 topo","type":"tms","template":"http://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}","scaleExtent":[3,15],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://wiki.openstreetmap.org/wiki/No:Kartverket_import","terms_text":"© Kartverket","description":"Topographic map N50, equivalent to Norway 1:50.000 paper map series.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{"id":"kartverket-vegnett","name":"Kartverket Road Network","type":"wms","template":"http://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[3,24],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://www.kartverket.no/data/kartdata/vegdata/","terms_text":"© Kartverket","description":"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png","overlay":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":"lu.geoportail.opendata.ortholatest","name":"Latest available ortho geoportail.lu","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-06-22T00:00:00.000Z","startDate":"2017-06-14T00: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":"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":"Loire_Atlantique-Orthophotos-2012","name":"Loire-Atlantique - Orthophotos 2012 - 20 cm","type":"tms","template":"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-1.4863838,46.8769078],[-1.5443674,46.8487272],[-1.7346797,46.8724645],[-1.8927568,46.9423436],[-1.9547478,46.980844],[-2.070671,47.0852054],[-2.2678023,47.1265555],[-2.2262684,47.1712448],[-2.1921733,47.1691377],[-2.1934131,47.2554621],[-2.2969381,47.2276852],[-2.4165807,47.2533583],[-2.5486216,47.2857476],[-2.6391284,47.4167844],[-2.5057256,47.5081195],[-2.3106273,47.5302088],[-2.2483636,47.5238409],[-2.2322311,47.5149928],[-2.1210893,47.5467415],[-2.117832,47.6012606],[-2.1001019,47.6112276],[-2.099813,47.6200473],[-2.1114061,47.6287298],[-2.1005485,47.6514139],[-2.0812094,47.6657768],[-1.9801641,47.7075082],[-1.8307658,47.7241914],[-1.6745485,47.7254424],[-1.6373539,47.7746256],[-1.4960144,47.8175187],[-1.499114,47.8416565],[-1.3813311,47.8441529],[-1.3459962,47.810858],[-1.230073,47.7858729],[-1.216435,47.7583753],[-1.2263536,47.7362834],[-1.2108558,47.7316971],[-1.1866793,47.7346157],[-1.1519644,47.6933233],[-1.1315073,47.6365449],[-1.0912132,47.6332031],[-0.9926475,47.6026991],[-0.9845887,47.585977],[-1.0317018,47.5500064],[-1.1358467,47.5562822],[-1.1327472,47.5161046],[-1.0317018,47.5177793],[-0.9486339,47.5010301],[-0.9368556,47.4771532],[-0.9337561,47.4385923],[-0.9009008,47.3987442],[-0.926937,47.3748209],[-0.9715706,47.358446],[-1.2833853,47.3273618],[-1.2337925,47.2609316],[-1.2003173,47.2693451],[-1.1649825,47.2495712],[-1.1414259,47.1763017],[-1.1563037,47.1581792],[-1.2065164,47.1240248],[-1.2083762,47.1096818],[-1.1556838,47.1050406],[-1.140806,47.0805621],[-1.0943127,47.0716964],[-1.0998919,47.0319939],[-1.1445254,47.0163582],[-1.2158151,47.0290362],[-1.2672676,47.0632516],[-1.285245,47.0218524],[-1.3497157,47.0239654],[-1.3391772,46.9690007],[-1.3490957,46.9444597],[-1.4501411,46.9118621],[-1.4750393,46.9176026],[-1.4877512,46.9306253],[-1.4923538,46.9843293],[-1.4864362,46.9994285],[-1.4921346,47.0272238],[-1.5276404,47.0054072],[-1.5296129,46.9725161],[-1.5050657,46.944393],[-1.5022165,46.9297273],[-1.5114217,46.9137101],[-1.486217,46.8972388],[-1.4863838,46.8769078]]],"terms_url":"http://data.loire-atlantique.fr/licence/","terms_text":"Département de Loire-Atlantique"},{"id":"Lombardia-Italy-CTR-DBT","name":"Lombardia - Italy (CTR DBT)","type":"wms","template":"http://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4815995,45.2893842],[8.6308463,45.0137199],[8.7800932,44.9818911],[8.8677461,45.0271162],[9.0714799,44.8006338],[9.1496568,44.7905472],[9.1946678,44.6710553],[9.3154866,44.6575759],[9.3699736,44.6980046],[9.3794496,44.8275228],[9.3320696,44.9148254],[9.4102465,45.0371613],[9.7869171,45.0438571],[9.7869171,45.0003204],[9.938533,45.0019955],[9.933795,45.0890333],[10.0001269,45.0907058],[10.0001269,44.9969701],[10.2014917,45.0019955],[10.2014917,44.9500447],[10.4052255,44.9533977],[10.4052255,44.9047588],[10.4928784,44.9030808],[10.4928784,44.8627956],[10.6516012,44.8577579],[10.6468633,44.9030808],[11.3528245,44.8946904],[11.3551935,44.9366303],[11.4570604,44.9332763],[11.4475844,44.9735122],[11.3623005,45.0003204],[11.3528245,45.0923782],[11.2580646,45.095723],[11.2580646,45.137516],[11.1609357,45.1425291],[11.1609357,45.1826181],[11.0519618,45.1909664],[11.0519618,45.234358],[10.9572019,45.2326897],[10.9572019,45.2860508],[10.857704,45.284384],[10.855335,45.3227074],[10.7463612,45.3293697],[10.7534681,45.4740809],[10.6468633,45.4807254],[10.6030084,45.5107366],[10.5763572,45.4737864],[10.535492,45.5003598],[10.5911634,45.5314845],[10.6166585,45.613036],[10.874287,45.840014],[10.8221691,45.8598152],[10.6752912,45.8581654],[10.5734243,45.8102989],[10.5862444,46.0077329],[10.5016004,46.015957],[10.593248,46.1152934],[10.6089593,46.3558255],[10.6563392,46.3868822],[10.6468633,46.4603672],[10.4147015,46.5728517],[10.3270486,46.5679659],[10.2512407,46.6542168],[10.0735658,46.6249395],[10.0238169,46.5321233],[10.0285549,46.4358832],[10.0735658,46.3983197],[10.1209458,46.3966859],[10.0783038,46.3280229],[10.1446358,46.2658249],[10.1043628,46.247807],[9.9740679,46.4081214],[9.7111092,46.3689041],[9.6874192,46.3231151],[9.6187183,46.3067526],[9.5571244,46.3247511],[9.5026374,46.3901503],[9.4789475,46.525604],[9.2562617,46.5158234],[9.2254647,46.4407808],[9.2728447,46.3443791],[9.1709778,46.190438],[9.0430519,46.1280838],[9.0620039,46.0919516],[8.974351,46.0459311],[8.988565,46.0015177],[8.938816,45.9735355],[9.0406829,45.8960992],[9.0193619,45.8482654],[8.8487941,46.0080997],[8.8985431,46.0705897],[8.8251041,46.1182319],[8.7090233,46.1165897],[8.6782263,46.0755201],[8.7184992,46.014681],[8.5550384,45.9043422],[8.5976804,45.8383636],[8.5337174,45.7937837],[8.6877023,45.4923513],[8.7800932,45.4159083],[8.6853333,45.379312],[8.7113923,45.3410269],[8.6948093,45.3210417],[8.6284773,45.377648],[8.5123965,45.3576757],[8.4815995,45.2893842]]],"terms_url":"http://www.dati.gov.it/iodl/2.0","terms_text":"CTR DBT 10000 Regione Lombardia"},{"id":"Lombardia-Italy-CTR","name":"Lombardia - Italy (CTR)","type":"wms","template":"http://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[8.4815995,45.2893842],[8.6308463,45.0137199],[8.7800932,44.9818911],[8.8677461,45.0271162],[9.0714799,44.8006338],[9.1496568,44.7905472],[9.1946678,44.6710553],[9.3154866,44.6575759],[9.3699736,44.6980046],[9.3794496,44.8275228],[9.3320696,44.9148254],[9.4102465,45.0371613],[9.7869171,45.0438571],[9.7869171,45.0003204],[9.938533,45.0019955],[9.933795,45.0890333],[10.0001269,45.0907058],[10.0001269,44.9969701],[10.2014917,45.0019955],[10.2014917,44.9500447],[10.4052255,44.9533977],[10.4052255,44.9047588],[10.4928784,44.9030808],[10.4928784,44.8627956],[10.6516012,44.8577579],[10.6468633,44.9030808],[11.3528245,44.8946904],[11.3551935,44.9366303],[11.4570604,44.9332763],[11.4475844,44.9735122],[11.3623005,45.0003204],[11.3528245,45.0923782],[11.2580646,45.095723],[11.2580646,45.137516],[11.1609357,45.1425291],[11.1609357,45.1826181],[11.0519618,45.1909664],[11.0519618,45.234358],[10.9572019,45.2326897],[10.9572019,45.2860508],[10.857704,45.284384],[10.855335,45.3227074],[10.7463612,45.3293697],[10.7534681,45.4740809],[10.6468633,45.4807254],[10.6030084,45.5107366],[10.5763572,45.4737864],[10.535492,45.5003598],[10.5911634,45.5314845],[10.6166585,45.613036],[10.874287,45.840014],[10.8221691,45.8598152],[10.6752912,45.8581654],[10.5734243,45.8102989],[10.5862444,46.0077329],[10.5016004,46.015957],[10.593248,46.1152934],[10.6089593,46.3558255],[10.6563392,46.3868822],[10.6468633,46.4603672],[10.4147015,46.5728517],[10.3270486,46.5679659],[10.2512407,46.6542168],[10.0735658,46.6249395],[10.0238169,46.5321233],[10.0285549,46.4358832],[10.0735658,46.3983197],[10.1209458,46.3966859],[10.0783038,46.3280229],[10.1446358,46.2658249],[10.1043628,46.247807],[9.9740679,46.4081214],[9.7111092,46.3689041],[9.6874192,46.3231151],[9.6187183,46.3067526],[9.5571244,46.3247511],[9.5026374,46.3901503],[9.4789475,46.525604],[9.2562617,46.5158234],[9.2254647,46.4407808],[9.2728447,46.3443791],[9.1709778,46.190438],[9.0430519,46.1280838],[9.0620039,46.0919516],[8.974351,46.0459311],[8.988565,46.0015177],[8.938816,45.9735355],[9.0406829,45.8960992],[9.0193619,45.8482654],[8.8487941,46.0080997],[8.8985431,46.0705897],[8.8251041,46.1182319],[8.7090233,46.1165897],[8.6782263,46.0755201],[8.7184992,46.014681],[8.5550384,45.9043422],[8.5976804,45.8383636],[8.5337174,45.7937837],[8.6877023,45.4923513],[8.7800932,45.4159083],[8.6853333,45.379312],[8.7113923,45.3410269],[8.6948093,45.3210417],[8.6284773,45.377648],[8.5123965,45.3576757],[8.4815995,45.2893842]]],"terms_url":"http://www.dati.gov.it/iodl/2.0","terms_text":"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{"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":"LPI_NSW_Administrative_Boundaries_County","name":"LPI NSW Administrative Boundaries County","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_LGA","name":"LPI NSW Administrative Boundaries LGA","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_NPWS_Reserve","name":"LPI NSW Administrative Boundaries NPWS Reserve","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_Parish","name":"LPI NSW Administrative Boundaries Parish","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_StateForest","name":"LPI NSW Administrative Boundaries State Forest","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"id":"LPI_NSW_Administrative_Boundaries_Suburb","name":"LPI NSW Administrative Boundaries Suburb","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","scaleExtent":[0,21],"polygon":[[[159.0033934,-31.4876656],[159.0378887,-31.7055793],[159.3109766,-31.8595241],[159.3727807,-31.7789183],[159.1744327,-31.4373999],[159.0033934,-31.4876656]],[[140.998648,-28.9989332],[148.9451961,-28.9948656],[149.4856226,-28.5615019],[150.2991369,-28.5337256],[151.0954036,-28.7179218],[151.3943629,-28.9797786],[151.9894069,-28.7355674],[151.9290401,-28.4983634],[152.4924635,-28.2353023],[153.5790657,-28.1415563],[153.6969246,-28.6498321],[153.2584694,-30.9735401],[152.7543708,-32.508492],[151.9087862,-33.0553457],[151.2583364,-34.3808144],[151.0144178,-35.1156752],[150.4615355,-36.1202975],[150.4127518,-36.6178579],[149.9784687,-37.5069984],[148.2013511,-36.805656],[148.0791803,-36.8171632],[147.8854228,-36.0901856],[147.6902879,-36.0441802],[146.828442,-36.188678],[145.2348401,-35.9849909],[144.8445703,-36.2149218],[144.5193454,-36.1295974],[143.2021846,-35.1317425],[142.4785593,-34.811943],[140.9937045,-34.070169],[141.0025961,-34.0197399],[140.998648,-28.9989332]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","overlay":true},{"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_Imagery_Dates","name":"LPI NSW Imagery Dates","type":"wms","template":"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE","projection":"EPSG:3857","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","overlay":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":"orthophoto_lyon_2012","name":"Lyon Orthophoto 2012-03 10cm","type":"wms","template":"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-03-01T00:00:00.000Z","startDate":"2012-03-01T00:00:00.000Z","polygon":[[[4.690486,45.546522],[4.831309,45.546522],[4.831309,45.571307],[4.883437,45.571307],[4.883437,45.59745],[5.166222,45.59745],[5.166222,45.745327],[5.107934,45.745327],[5.107934,45.881452],[4.906982,45.881452],[4.906982,45.92107],[4.84377,45.92107],[4.84377,45.940115],[4.715432,45.940115],[4.715432,45.870179],[4.674581,45.870179],[4.674581,45.717805],[4.695675,45.717805],[4.690486,45.546522]]],"terms_url":"http://smartdata.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon/","terms_text":"Grand Lyon Smart Data DSIT"},{"id":"orthophoto_lyon_2015_8cm","name":"Lyon Orthophoto 2015-05 8cm","type":"wms","template":"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1835_5155_8cm_CC46,1835_5160_8cm_CC46,1835_5165_8cm_CC46,1835_5170_8cm_CC46,1835_5180_8cm_CC46,1835_5175_8cm_CC46,1845_5175_8cm_CC46,1845_5180_8cm_CC46,1845_5185_8cm_CC46,1845_5190_8cm_CC46,1850_5165_8cm_CC46,1850_5160_8cm_CC46,1850_5155_8cm_CC46,1850_5170_8cm_CC46,1850_5175_8cm_CC46,1850_5180_8cm_CC46,1850_5185_8cm_CC46,1855_5155_8cm_CC46,1855_5160_8cm_CC46,1855_5185_8cm_CC46,1855_5180_8cm_CC46,1855_5175_8cm_CC46,1855_5170_8cm_CC46,1855_5165_8cm_CC46,1860_5160_8cm_CC46,1860_5155_8cm_CC46,1860_5165_8cm_CC46,1835_5185_8cm_CC46,1835_5190_8cm_CC46,1835_5195_8cm_CC46,1840_5160_8cm_CC46,1840_5155_8cm_CC46,1840_5150_8cm_CC46,1830_5195_8cm_CC46,1830_5190_8cm_CC46,1830_5175_8cm_CC46,1830_5170_8cm_CC46,1830_5165_8cm_CC46,1830_5160_8cm_CC46,1830_5155_8cm_CC46,1830_5180_8cm_CC46,1830_5185_8cm_CC46,1835_5150_8cm_CC46,1860_5170_8cm_CC46,1860_5175_8cm_CC46,1840_5180_8cm_CC46,1840_5175_8cm_CC46,1840_5185_8cm_CC46,1840_5190_8cm_CC46,1840_5195_8cm_CC46,1845_5150_8cm_CC46,1845_5155_8cm_CC46,1845_5160_8cm_CC46,1845_5170_8cm_CC46,1845_5165_8cm_CC46,1840_5170_8cm_CC46,1840_5165_8cm_CC46,1860_5180_8cm_CC46,1860_5185_8cm_CC46,1865_5155_8cm_CC46,1865_5160_8cm_CC46,1865_5165_8cm_CC46,1865_5170_8cm_CC46,1830_5150_8cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-05-01T00:00:00.000Z","startDate":"2015-05-01T00:00:00.000Z","polygon":[[[4.664889,45.546882],[4.882528,45.543476],[4.884346,45.597449],[5.166229,45.592416],[5.17217,45.745324],[5.107932,45.746531],[5.113048,45.88145],[4.906978,45.885083],[4.908215,45.921064],[4.84377,45.922124],[4.844965,45.958104],[4.677293,45.96069],[4.664889,45.546882]]],"terms_url":"http://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon/","terms_text":"Métropole de Lyon DINSI","best":true},{"id":"major_isidoro","name":"Major Isidoro AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.94048110193,-9.57587518044],[-36.94106045907,-9.48535688436],[-37.03214827722,-9.48605530547],[-37.03164402192,-9.57639356782],[-36.94048110193,-9.57587518044]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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/png;base64,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"},{"id":"mar_vermelho_al","name":"Mar Vermelho AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.34201321548,-9.49288996873],[-36.34219560569,-9.47533412032],[-36.34275350517,-9.4029001574],[-36.344727611,-9.4029001574],[-36.34537134116,-9.40279431056],[-36.34702358192,-9.40293191144],[-36.35080013221,-9.40291074208],[-36.35899696296,-9.40306951227],[-36.36108908599,-9.40299541952],[-36.36289153045,-9.40306951227],[-36.36589560455,-9.40304834292],[-36.36712942069,-9.4030060042],[-36.37571248954,-9.40306951227],[-36.38048682159,-9.40308009695],[-36.38663444465,-9.40319652837],[-36.3885227198,-9.40312243565],[-36.39285716956,-9.40324945173],[-36.396558618,-9.40321769772],[-36.40309247916,-9.40327062108],[-36.41973290389,-9.40337646777],[-36.43368039077,-9.4033976371],[-36.43355164474,-9.41685048724],[-36.43344435638,-9.4238571931],[-36.43337998336,-9.43753150237],[-36.43329415267,-9.45011519778],[-36.4330044741,-9.49358837449],[-36.40839252418,-9.49350371932],[-36.40442285484,-9.49353546501],[-36.40007767623,-9.49351430122],[-36.397867536,-9.49341906413],[-36.3916769976,-9.49328149941],[-36.38756785339,-9.49331324512],[-36.38535771316,-9.49340848223],[-36.37673172897,-9.49331324512],[-36.37427482551,-9.49318626226],[-36.36706504768,-9.49298520596],[-36.36501583999,-9.49299578788],[-36.36043462699,-9.49298520596],[-36.35955486243,-9.49295346022],[-36.35895404762,-9.49303811553],[-36.35703358596,-9.49294287831],[-36.35664734786,-9.49299578788],[-36.35260257667,-9.49299578788],[-36.34766731208,-9.49297462405],[-36.34201321548,-9.49288996873]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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_ThreeInchImagery","name":"MD Three Inch Aerial Imagery","type":"wms","template":"http://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[0,20],"polygon":[[[-76.46298868788,38.98080463627],[-76.46325795583,38.94779459044],[-76.49498669632,38.93690418359],[-76.51616910865,38.93697399921],[-76.54762858119,38.95910208849],[-76.54744906922,38.98666527704],[-76.51558569475,39.0030585399],[-76.48390183225,39.00291903879],[-76.46298868788,38.98080463627]],[[-76.09548280964,38.8413320581],[-76.04279604678,38.84089512141],[-76.04288580276,38.82980476995],[-76.0322945966,38.8296998884],[-76.03276581552,38.79667199901],[-76.02545070279,38.79663702224],[-76.0254058248,38.7746157424],[-76.03307996147,38.77472070505],[-76.03366337536,38.7307278267],[-76.05462139773,38.73093788097],[-76.0548009097,38.72004925436],[-76.10753255055,38.72043441094],[-76.10713709241,38.75338442343],[-76.11753984459,38.75346037077],[-76.11701334711,38.79730508527],[-76.09601366219,38.79715186708],[-76.09548280964,38.8413320581]],[[-77.23397015511,39.16838491616],[-77.25516378693,39.14647458509],[-77.25496183597,39.11342872174],[-77.18093418537,39.05337051467],[-77.14907221334,39.04769565692],[-77.12797815456,39.04779422613],[-77.10683080317,39.05325234984],[-77.1068770836,39.09169503464],[-77.11774597234,39.10827342699],[-77.16011079699,39.12484737677],[-77.15975177305,39.15213714767],[-77.17047901562,39.16302432313],[-77.21284384027,39.17271658577],[-77.23397015511,39.16838491616]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{"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":"minador_do_negrao","name":"Minador do Negrão","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.81960228856,-9.35174057847],[-36.82016893109,-9.26141767312],[-36.82465236584,-9.26132936954],[-36.83063690623,-9.26146673066],[-36.83673079868,-9.26149616517],[-36.84227793081,-9.26147654216],[-36.8456181394,-9.26160409172],[-36.85563876517,-9.26160409172],[-36.8621402426,-9.26159428022],[-36.86589797726,-9.26146673066],[-36.86724002536,-9.26149616517],[-36.86951653657,-9.26148635367],[-36.87126616964,-9.26157465721],[-36.87475549468,-9.26152559969],[-36.87815534986,-9.26163352623],[-36.88320542713,-9.26170220674],[-36.88565093699,-9.26167277223],[-36.88857361951,-9.26147654216],[-36.89217229662,-9.26150597668],[-36.89383245981,-9.26163352623],[-36.89740131364,-9.26175126423],[-36.91121943846,-9.26182975621],[-36.91110014529,-9.26650980886],[-36.91112002749,-9.28541580138],[-36.91120949736,-9.29066455986],[-36.91117967407,-9.29367642875],[-36.91099079323,-9.2992880502],[-36.91091126445,-9.30729328446],[-36.91090132335,-9.3122964628],[-36.91083173567,-9.31596541472],[-36.91084167677,-9.32013463149],[-36.91098085213,-9.32395064743],[-36.91099079323,-9.3258733543],[-36.91079197129,-9.32964025951],[-36.91079197129,-9.33523168439],[-36.9107422658,-9.33943990818],[-36.91092120555,-9.34310857462],[-36.91084167677,-9.3447074733],[-36.91066273702,-9.35228988056],[-36.89276876244,-9.35225064472],[-36.877350121,-9.35212312823],[-36.86462551685,-9.35203484755],[-36.85760710237,-9.35193675789],[-36.84344103915,-9.35190733098],[-36.83115384327,-9.3517994323],[-36.81960228856,-9.35174057847]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"NC-US","name":"NC Latest Orthoimagery","type":"wms","template":"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_All/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"1995-01-01T00:00:00.000Z","polygon":[[[-81.6792,36.5974],[-80.2535886,36.5479298],[-75.8409,36.5671],[-75.4323,35.6441],[-75.5047482,35.1880648],[-75.7052487,35.1768406],[-76.1474484,34.9407747],[-76.5347165,34.5548667],[-76.6967648,34.6678918],[-77.2790402,34.5322432],[-77.688281,34.2648225],[-77.9435,33.8269],[-78.2128781,33.8940169],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.8468503,34.9632866],[-80.9512204,35.0555205],[-81.0638303,35.0172898],[-81.0748166,35.1341745],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.2718381,35.2822869],[-84.0905637,35.2733181],[-83.9147824,35.53301],[-83.5549802,35.591102],[-83.2556027,35.7339181],[-82.9864377,35.8141398],[-82.9232663,35.9676717],[-82.6788205,36.0853997],[-82.6019162,36.0898388],[-82.5359982,35.9698946],[-82.3547238,36.1475245],[-82.0443601,36.1430887],[-81.9042844,36.3380291],[-81.742236,36.3734205],[-81.6792,36.5974]]],"description":"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{"id":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"wms","template":"http://geodata.state.nj.us/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}","projection":"EPSG:3857","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":"wms","template":"http://geodata.state.nj.us/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}","projection":"EPSG:3857","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":"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":"IBGE_Salvador_Streets","name":"Nomes de Ruas IBGE Salvador-BA","type":"tms","template":"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-38.489742279052734,-12.811131765117107],[-38.54484558105469,-13.013924052026558],[-38.47755432128906,-13.034662471471638],[-38.33473205566406,-12.946846814654444],[-38.30005645751953,-12.906692193510644],[-38.33953857421875,-12.904349641337422],[-38.35481643676758,-12.830213284310222],[-38.38090896606445,-12.821844374997415],[-38.40717315673828,-12.867535227819912],[-38.46536636352539,-12.815985972925704],[-38.489742279052734,-12.811131765117107]]],"description":"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.","overlay":true},{"id":"orthos.dhses.ny.gov_latest","name":"NYS Orthos Online","type":"wms","template":"http://www.orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2018-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-74.91231104790405,45.036060871422514],[-73.47787904626531,45.02996489601911],[-73.33846123282218,45.03098119095642],[-73.31977627491248,45.005581106608915],[-73.32265088382167,44.98525292658083],[-73.34852236400432,44.92829565917409],[-73.36720732191401,44.83969633391092],[-73.34277314618596,44.81727029165119],[-73.34564775509514,44.7764733152644],[-73.37295653973237,44.73462648007473],[-73.37008193082319,44.6794648966887],[-73.39739071546042,44.64470656126996],[-73.39307880209665,44.60276438225357],[-73.39739071546042,44.54542854468756],[-73.34995966845892,44.512639828752185],[-73.34564775509514,44.49521331585934],[-73.37870575755073,44.47060231167881],[-73.30827783927576,44.43571894999882],[-73.30396592591198,44.4182694555537],[-73.3327120150038,44.3391682816244],[-73.30827783927576,44.27128222420617],[-73.30827783927576,44.25172471526754],[-73.38014306200533,44.14868323115224],[-73.40457723773338,44.0413289327325],[-73.33989853727677,43.79595697288363],[-73.28096905463853,43.642215731803084],[-73.20910383190896,43.549573305004984],[-73.21341574527274,43.51205945175996],[-73.24647374772834,42.6755714070924],[-73.45919480700785,42.142839357113225],[-73.47069324264457,42.03937970922349],[-73.48794089609967,41.737642097452465],[-73.4994393317364,41.643191171126794],[-73.47787976491753,41.62707774888845],[-73.4318860223706,41.57978847312145],[-73.42613680455224,41.56365920821005],[-73.42685473812732,41.45925887814987],[-73.43979047821864,41.403222667065656],[-73.44985160940078,41.383275042836544],[-73.43835317376404,41.37033277045519],[-73.42757339035461,41.35900616964153],[-73.41751225917248,41.34390096839462],[-73.41894956362707,41.27642429018757],[-73.43044799926379,41.24455103927662],[-73.46566195840128,41.19752312226992],[-73.52962200663059,41.145049831455864],[-73.55477483458594,41.133684100459654],[-73.61586027390607,41.13530789690045],[-73.6266400573155,41.1087808553827],[-73.62735870954279,41.054068843422385],[-73.63957579740682,40.99117509837295],[-73.61873488281525,40.98195286582785],[-73.59933127267827,40.96567519162947],[-73.59933127267827,40.93473654650821],[-73.63454523181575,40.91681807360894],[-73.68053897436268,40.89183270232195],[-73.69850528004507,40.8798798402391],[-73.68628819218104,40.87064205907731],[-73.66257266868028,40.87933647703018],[-73.63813849295222,40.90541287946855],[-73.59789396822369,40.91193037416514],[-73.57561574917752,40.91790417996723],[-73.52674739772141,40.92387744595259],[-73.50159456976607,40.9428797007417],[-73.49009613412935,40.953735678064604],[-73.41751225917248,40.960791106211715],[-73.38373560448959,40.9613338002184],[-73.33702320971537,40.95590665935183],[-73.30827712062354,40.93636525766628],[-73.27090720480417,40.92659238839886],[-73.20910311325675,40.91953330604491],[-73.18682489421059,40.92713536350369],[-73.16813993630089,40.93147900372728],[-73.165983979619,40.95970570481162],[-73.1688585885282,40.970016297449746],[-73.12933271602694,40.98195286582785],[-73.10777314920807,40.98195286582785],[-73.06680997225222,40.97489970011966],[-72.85840082633648,40.97435711767307],[-72.71826364201384,40.98195286582785],[-72.65574089823912,41.00527719453338],[-72.64424246260239,41.004734862008505],[-72.62627615692,40.99225998211336],[-72.54147519409912,41.03889309392365],[-72.47679649364251,41.063280983759014],[-72.45811153573283,41.08928476815911],[-72.41858566323157,41.093076127227],[-72.36612405063899,41.138555369199075],[-72.36037483282063,41.14180268071838],[-72.32228626477396,41.15479031895286],[-72.29066556677296,41.16398833949227],[-72.21448843067962,41.182380507948444],[-72.20083403836101,41.19157465575383],[-72.04847976617432,41.25913903369694],[-72.02548289490088,41.29370497046782],[-71.9392446276254,41.30774215335454],[-71.9234342786249,41.30666247732331],[-71.90259336403332,41.299104244517785],[-71.90187471180603,41.2893852294372],[-71.99458084912716,41.24509139345555],[-72.10453463990339,41.19806386514946],[-72.1828677326786,41.16723439148816],[-72.18933560272427,41.16236525319468],[-72.25185834649899,41.12231639996208],[-72.30431995909157,41.10444889166786],[-72.3158183947283,41.09524251989042],[-72.27916713113622,41.08440984216064],[-72.27269926109055,41.080617983013646],[-72.26838734772679,41.04973327212589],[-72.2173630395888,41.04810735923019],[-72.19652212499723,41.04214533487485],[-72.18646099381509,41.05298497738375],[-72.17136929704188,41.05840412900452],[-72.14980973022301,41.058946019612705],[-72.15627760026867,41.09632568943114],[-72.1526843391322,41.10769789124652],[-72.1490910779957,41.146673346530676],[-72.13399938122251,41.145049831455864],[-72.07075798522048,41.10553190938901],[-72.07435124635697,41.05677843039375],[-72.086568334221,41.0318460205672],[-72.10956520549446,41.006904165328564],[-72.08728698644829,41.01286938123731],[-72.06213415849294,41.02534036020521],[-72.04560515726514,41.03238812991624],[-72.01901502485521,41.03293023480147],[-72.00895389367307,41.04214533487485],[-72.00176737140012,41.05135914484385],[-71.96367880335345,41.07736764390088],[-71.9219969741703,41.088743127574865],[-71.889657623942,41.08765983301127],[-71.8558809692591,41.080617983013646],[-71.84581983807696,41.07465890519177],[-71.8558809692591,41.05298497738375],[-71.89037627616929,41.03726691318444],[-71.91624775635194,41.03021966573728],[-71.99098758799067,41.00365018356915],[-72.07938181194804,40.97272934355811],[-72.31941165586478,40.88205324847025],[-72.44230118673232,40.84020260474275],[-72.6277134613746,40.78689990926171],[-72.76569468901535,40.75043362643005],[-72.88499095874643,40.71285788340029],[-72.95973079038517,40.68670572169275],[-73.0373452309331,40.65999813364621],[-73.08118301679814,40.64854874971067],[-73.22994402784832,40.616370919338586],[-73.32193151294216,40.61309772897009],[-73.35211490648857,40.61855295716485],[-73.55477483458594,40.56943986927557],[-73.75959071936519,40.57708205228237],[-73.88248025023275,40.548146328651804],[-73.93350455837073,40.53449306094386],[-73.94500299400745,40.533946872353866],[-73.94572164623476,40.56288873200082],[-74.08226556942093,40.562342774949634],[-74.08010961273904,40.5492384698493],[-74.12251009414948,40.52083701052971],[-74.15772405328697,40.51373476465814],[-74.18718879460609,40.50116740969577],[-74.22887062378922,40.48695799891573],[-74.26120997401753,40.48531825788795],[-74.27630167079074,40.49570260781157],[-74.27917627969993,40.54377758575639],[-74.26983380074509,40.56671030667376],[-74.25833536510835,40.57216932054787],[-74.22527736265275,40.57216932054787],[-74.22599601488004,40.58308601230896],[-74.25114884283539,40.59563800556682],[-74.25258614728999,40.622371351867315],[-74.24324366833514,40.64091473558487],[-74.23390118938029,40.64909400302126],[-74.2022804913793,40.65400108233582],[-74.12538470305866,40.65672708157882],[-74.11532357187652,40.691065128306576],[-74.09951322287603,40.68997530338939],[-74.07795365605716,40.71067892875261],[-74.06286195928395,40.71830495805569],[-74.0520821758745,40.743900238938934],[-74.02549204346457,40.79288499840126],[-73.98093560537225,40.869011728592994],[-73.96225064746255,40.92550642480473],[-73.94931490737123,40.964589870550604],[-73.94644029846205,40.99876890966543],[-73.98165425759954,41.01612290773734],[-74.04561430582885,41.04322937947981],[-74.18072092456043,41.09524251989042],[-74.30792236879175,41.14937911566324],[-74.44087303084143,41.215365278476916],[-74.5278299503442,41.25913903369694],[-74.61334956539238,41.30234359441648],[-74.65790600348473,41.310981074177676],[-74.70246244157704,41.33580745460507],[-74.76714114203365,41.38974521327815],[-74.79660588335277,41.41022983858581],[-74.85337940930913,41.42262529077297],[-74.90727832635629,41.431785626305874],[-74.99782850699555,41.471106493417004],[-75.04166629286057,41.527084094166106],[-75.08478542649831,41.593225913275326],[-75.08406677427102,41.61848173934118],[-75.07328699086159,41.664668930702504],[-75.0876600354075,41.70277526731324],[-75.0876600354075,41.71350537258048],[-75.12143669009038,41.76176868230114],[-75.1192807334085,41.792316684103675],[-75.13077916904523,41.816958847412266],[-75.18755269500159,41.838379111347166],[-75.25295004768549,41.84962188079648],[-75.28744535459568,41.85497488617851],[-75.29822513800511,41.88226824503906],[-75.30613031250536,41.93040456765947],[-75.34062561941555,41.940027476740525],[-75.36649709959819,41.95659686103546],[-75.37224631741655,41.97743609810382],[-75.58065546333229,41.97957307031645],[-75.58137411555958,41.923988488332995],[-75.78906460924802,41.92666193313772],[-75.78690865256613,41.98277839417683],[-79.7768658185114,41.98117575241552],[-79.7818971027547,42.20994439336295],[-79.77183597157256,42.28016852623668],[-79.72153031566185,42.29824389979878],[-79.57348795683896,42.367307788746416],[-79.42975751137983,42.46599037989962],[-79.37370263765078,42.499909767684656],[-79.2572809768289,42.54545998533663],[-79.1897276674631,42.56240042582576],[-79.16529349173506,42.56981042255861],[-79.12073705364273,42.62482855594211],[-79.09630287791468,42.64597644140587],[-79.06899409327744,42.696702043447694],[-79.03162417745807,42.7104331026147],[-78.98850504382034,42.723105230911976],[-78.88358181863518,42.776932904700104],[-78.88645642754436,42.814900763418876],[-78.93963669236422,42.88655426672713],[-78.93963669236422,42.93603089533893],[-79.04887183091316,42.96969438273069],[-79.04743452645856,43.05167198470151],[-79.09342826900549,43.05272226918912],[-79.0919909645509,43.09261975149211],[-79.08624174673254,43.265557535860246],[-79.06468217991367,43.27602287004617],[-78.84908651172498,43.33041359857192],[-78.72979024199391,43.35236529048099],[-78.63924006135466,43.370129894376525],[-78.54868988071541,43.379532578835416],[-78.47826196244044,43.38788929664161],[-77.95508314096922,43.38475566245842],[-77.73158157962807,43.34713889446963],[-77.7114593172638,43.340344586318594],[-77.66259096580768,43.311591022674435],[-77.61515991880619,43.28387016659478],[-77.55335582725876,43.25299623609951],[-77.52820299930342,43.25508987878669],[-77.45633777657385,43.27863839921907],[-77.42256112189095,43.28491646608342],[-77.16384632006454,43.29433235167476],[-77.05029926815182,43.29380928516081],[-76.94178278183018,43.29328621414787],[-76.91447399719296,43.3079305018789],[-76.85051394896364,43.31629708261557],[-76.80236424973484,43.328322024532355],[-76.7599637683244,43.35184220081927],[-76.64785402086628,43.42808936716575],[-76.545086752363,43.4802581022461],[-76.51993392440767,43.49485728312425],[-76.44303813608703,43.52717148354531],[-76.42219722149545,43.538112693359565],[-76.28206003717281,43.538633653838865],[-76.23822225130777,43.55686443488524],[-76.24037820798966,43.74146501378322],[-76.30649421290086,43.82914593255031],[-76.31152477849193,43.86749827350751],[-76.34602008540212,43.861798810265746],[-76.40063765467659,43.8612806502232],[-76.47178422517885,43.8840754318208],[-76.46675365958778,43.90893252243542],[-76.41860396035898,43.93119152129071],[-76.37189156558476,43.93222662089228],[-76.36973560890287,43.90271922256843],[-76.33308434531081,43.92963883810956],[-76.27846677603632,43.92963883810956],[-76.27846677603632,43.90427260833489],[-76.2669683403996,43.8959874158668],[-76.2360662946259,43.91203892916922],[-76.19294716098815,43.93326170247849],[-76.19007255207897,43.95085533306909],[-76.21522538003431,43.96016750024623],[-76.2504393391718,43.94982055774786],[-76.31224343071922,43.94775095305809],[-76.30577556067355,43.97620170069497],[-76.33092838862892,44.004638823445866],[-76.39560708908552,44.024795072402476],[-76.3984816979947,44.06250502187776],[-76.37548482672123,44.064570626786484],[-76.37620347894854,44.090900771655065],[-76.47106557295156,44.0929653855436],[-76.46603500736049,44.109479701923],[-76.44231948385973,44.129600288113295],[-76.3984816979947,44.13217935491029],[-76.3977630457674,44.2043474993423],[-76.37620347894854,44.21671031511876],[-76.23965955576237,44.2192855751065],[-76.23965955576237,44.2280406165722],[-76.2173813367162,44.228555578463435],[-76.21522538003431,44.34790496257489],[-76.1189259815767,44.37102654591561],[-76.04634210661985,44.39157140443917],[-75.93423235916174,44.43417898509957],[-75.83721430847683,44.50341416416661],[-75.76822369465644,44.558231111426025],[-75.69923308083607,44.60378721108942],[-75.63167977147027,44.64828507610631],[-75.56772044189319,44.70500920154141],[-75.50447904589117,44.7458566542504],[-75.4527360855259,44.78157451471142],[-75.31762946679432,44.872300455880584],[-75.15377675897092,44.937453318614374],[-75.0905353629689,44.973052557209364],[-74.97411370214701,45.027933775754924],[-74.91985438100785,45.03682085482298],[-74.91231104790405,45.036060871422514]]],"terms_url":"https://gis.ny.gov/gateway/orthoprogram/index.cfm","terms_text":"New York State Statewide Digital Orthoimagery Program","description":"New York State High Resolution Digital Orthoimagery, 1 foot resolution","icon":"data:image/png:base64,iVBORw0KGgoAAAANSUhEUgAAAG0AAABCCAYAAABdAli1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTA1Nzc1NjVGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTA1Nzc1NjZGNjM2MTFFMzk5NkFGRERGMEYyODU3RTciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMDU3NzU2M0Y2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBMDU3NzU2NEY2MzYxMUUzOTk2QUZEREYwRjI4NTdFNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhMlZyIAAA02SURBVHja7F1djNxWFb7XyRMvYyQUUbHJeBuoeJtpkUAg0Dj9gYS22dmgIkVUXW+aFvoD8Sr8CRDrVAVFRTSzgBRImuysCEUqauNt0lDSVplFQgiBqPcNNSTrSaMk5CXeF56oL+fYx7t3bzy/2Z3Mz17Ja8/19b32+XzOPX/Xy1mflI//wjMF547QeIExzpjGmODwR+PReY57zqM9j85zFuJvHrfldIx1msbnzn81a3brs/JeB+sTh/6ZB7BK8CQFBAVAW4TfXhpwuOfpwPlwnQ4/dTjOQ10GgLsbgPO68Zk39jJgd/38H0UWijKAkxGMLwJEzoVn86Vb4tiXLwYAMwtD5nfrc/csaHe98HcLAJuORFvIZmBvn7fvCW6131Aggwp2Yfdw0K3PrvUiYJ88+LcyD8NpoC1SeeK9/Z+yzk/cszpEFsJD4IDj8uuctgpl6/N/1TWNuaEQBQ3nIiHG//XdT5dXdZBQFPBV/vfXtnrroK0OG7igWRQEE4shY+Z73//MqhNWE2IWONjvZir0jPaYfe4vFjDANGh1oPSBZvfDz3psQEvvcJoQqIpHc9iFH39uVQD77+832rArwobzofOh3f/zpHOoheK85tM5H+oqdbqzYLPVa6gvi8bxoM6hOh3bpLXvC9CGJv/swDy2DzhtEYBbzTkMCVmg4zwQMg+ESxSafbTH82UibKFOX0h8NMhz1M4nULDgC5CBbQTGKBM4pjQGjmv1Bafd8aOKrjFeBm1uBNVwmMfs9yc/v1aqeJY4xWmy/TxxaFKQSysEWvJCOPgiEGBJMeklKEp1lb5Q+Tf94JwtQuGHTIzwEBQPwUbfd75QXuNhJ4nIzRQbuMOUNuQeVzqfIxFoKteZyp4p1/Ump2363jtgh4mxEJUO0OZCzqyrzxU6ZeyWUgidOocBKEm7SOTBVoG6RYmzzJS+8vRiZNvltK4D7SPfecsCMTgGYFV5yKxrB++tdPgWCqSgNCpj0rFPIi8BYEQSkSpoOUU0zjergHSteNTwocMQ56+sEMLq4NBz0rHT4rV+DVFXlLhuURbD7XJZV4J2/WcP+HBTs8BpCNwYiEq7Q0Mj8aboONNE+23AIZy2Sg0QMorYTStuz4NGwBXBLjtAwOkdHNpROKLlQqJuvsZcqfa9qADew4rI/rM6gGbTW1Xq1Lhoo5EhfLJFRSTiMAkAWfVP5q2AjPORWxGNXQsaF6IoGAfRImaA6zoaIgHiukDcWYW4jRQRLIYEgisZzjI4KmhuO/eodSdozADgWAcct56kJMhj2ZKIqypGdENlhDhOvt6VQKtKik9bnNaVDuOP2m+ajPNzgrO5/7z4JZOtl+4Wj3d8648GqPp5Eb1RfB2hbgZt6Jk3dOCuKMAZCwCBgek1E48wb6ENlZc9GtI52ZPhJt5/UlLytAUkXl0lOqCTfWZIffhSW3kcFMOJdlxKnNVQj9cmNip6WspdJx6Hnj5two24goPywXk15KwMxwHTePlqaXuwRqCVJGWhCoQxJIItyPYYAeQqrie5zCReegL8XJ2hxxMQoK1Q7L4Kge5JY82hb7MtTht65OU8QGxhihmMVEjyBAWPcwYxfS16CzQ+D+c9qKtUZ75Srtfn8Ndfx1xFE8Th5Adx+kDkZ7zyywc7oTE69DajAZzFtx6IU5LcUVhmiYCeAtg8cVJiPI/B9X4SK0vxtMie/mlU/eu4rkrSWIsSxzXPaZt3/c4BYCxomY2AIZAAmHnYB7DpBFwAf6Kbw7zCaE7iHNpEHGTADyNKP+TxTIXgw0EmpARROJ6qHn7Y7iSHk7iblrQ8S+GSYRJx0yqnEEeUJRUeDWVd5TT0mFDbG1Ifo2RaCIWjDWWsqF1Lc9rm0RM2GLmTSGYRPZQog/3kXn5ld83I8ZZH/2CIUFgAHBBA5ITgOR7PTyyEfjAuJng8Z3HB5+A3qr2VhV/vrHRaLBPxbTKEswqXHaBotezcnUtEGxnLtgRaRjG21bLYwD1mKK6uqTTAGotHIfQoa5eJ8cuvPlpuhhCXTjyCbO8AeKUIOC5A/PEKj8HRE+AuvjTacZBqFFviDFksJQTUa3kwCFQZDEOx95CbZTGs2oeqWMxI4tdpT3sU8R/gtNLQrhPs8mvNAUfgBXQjJdbFhSZ/1QNiS2kHzRjVuVqgsZUe/YSD0uazjMJ17XlEQDEoA2ZV4LgM7K0+Nn1Kqtis0S7NeZ1rwZeIPsha8/aMAmC5LdAuvf6YD8DlkeMit9JgFlmUFUmpkBWZVFeWomAsAazMkXIpK8CN1ArGNvQ9AnAB+QGNAQVNfuNxzkNxWiSClhQlxU8Tv2Q6LHG1DHzK/CqHdZy0nJWmHMaRei9EdvPIb/ODhhh5O6YUcYihm0NsZVTabqDsyMDbNcYKFLssVUw2BG3LQzMmFywn4jlO71NsAkU1V4mJRB5nyx56phjgpuTKuqkv4sAJWcymjBVIL8l4PZFa17jOPli2waY6FLfk85dOPTZwnJZikOuJ71H2OXay1ATN2DGNadjvoh0MwB24dHrMYeulK0oqaMb2aUvgJMtZBgCbunTGsvucc4qKbeQl3gjF41+rLKUaUH8WmQdyCkJiaDdjfuTrjFlZAZrxwDGdadxNHMKwn6u+OW72MWB5sq3S3EuJLxHPFxp0teSJV6IHWIbJc4JjvdvEbY3TCzRZa6wlRcS4/5jBo5xDUYB9VQgx2s+AUXFZbX9gpo7txerYZ1YNzdFv8p4atfMjN5Zx30s2LjIXgmeAweZDwczq2T1BP6NFYk8Ot9yNigVpamZiVFOczKJrZK47oIZiyNhWXwKsS9xiXGp7UyxNubebuDgpG4fvPVqJxCHaz1zMAnBW9a3+BqzWXILLkFgcXXbb7MNK41gEs45rrFHRJRAxZudjPigAJqqA2Tb/7b1F/+3HBwUwT7GTkIMwlnUDiOQ2CLPUmh8Liv1WD8xmCxrz52grLxnXAJzvv7O3MmCejqCOFwM9/ufq+AkbeT0wWi2LzgKlMaxK0QbYEZx484fJTZWWyu00yWU6W7kSJvF6LNYAtZWC97WNtohjN5J7Km9sOypix0dkTMf5UMupBXFdnG2QpAcs1VFqQdQeTwhKK2DJnjqO65fPJX3XyTeRzsfj4QFUz1Hagg/nSheOjrTlmaC3P0jCJfTbZcvhllyTXRUVBaSQYiZYbQIXqPn+qD1OAWH2IcchUZDxOKUERMoJBkEjikVH8SenooURcRJCFCKNTou4hkdpBJRgEKcVUAO6IhLIcV/UtyBuX+6RQAY1NvoQGdaK5GyUtlCgtAUgjBjb+sTsBADXTrA1MmRxDiOwDMXInm9DNNYq7SokujK/Bhv9ypP2LbDubSvZPSfzAJwJsB6Ct+QQAIfJR8ULR0b8FrgsiVbvUwxi2Y5rRgHJqca0dB5BGpPAbRW0RBFZntN6dT6qHh/1Fo6NloAFRzG6DnyXg33TigMR9gBLX9q0mGaHsfScfkuxqfw682KuhTXdrfkee60MP37SADG7AE8ze/Fosdjq9URIXQK00qAtU7KKE6+/X0dRySd2Vq06RQrU0jb7xyQD4MSde922VeFNE3/SN+0/6/TCs2r9AhroLIuo0ABwbRmyG5hwoJNJAM5cB61DBbRfFz/5B8A5AFzLEXbAO78BddNQrHNapwqQ2gbg5uEAv4pwA4Dz7nyiefB4KCJzB4Dz10HrlDY5vSsAmuNijikWi0rUJp0WQI/Y7eqh7V0PWl+u2jP2vGaAKb5AXhdcKGKD8V2pd83Hvnmm8gEa65x9+NrUjmCd0zpc/OO7fBB2sf0mcBGIOAfGd3nrk7N6nTkt2IBemx7IpO5L0Ag4d+H4qAHAHQDQUFyO4cJ7AG6F92fLU6f1zU+fdjQhRnBO03ogTXAgFjUP7zlpwJOWQEyOxA5pNh9ybi38Zqe35alTMO/xSRE7pKeg3rnyqy/XFI+bvn22CDIXNzOMndcV6NPTYIsd3pp39fm1/fjaQK1EH97rFuGBEbwsPjkQfVxEixox+MlnLh1+yBp65g0jjBc85kUcedCjxZLxMdZlkugGS/5jBkUntDhaMXHlJ2ZpHbTVBU7naB5wPglPX8UvtQIIkwAcfrU14PghteXVqYyAozBUdDwLxxXYXPiJn86YlkNNANzo1Z9uc9dBW4OCdhwQOUccx4jj8LiKWWnw2wcUPKgLJODwGjNezsxHQonjMAMb+nKuH7zPXet73ziooAkMeVCMjz61O6MxXgIRuSKgOvTsGSNkIg+o5AGbcihENonsgRY3FzLgOCbc6y/c3zH7biBBAzvOZHHQFxdMlgGE8sKRnRHRjW+cKgInmWCz5YF/ELCsBhUhwgTIahqvAnAOXONee/GLt8WeG0jQ0M8oIntHBNF/gBLCAjsOlQ8TAMF/NoTuLIafydBCUQ015gNwFQDOu1La4d7u+x/IOc2wXg3oQzNs6TMZnD7rFJsDLmwVOPaqhx/uOu/IoHIaaIkCE3GqMCd5wHEecBeAJLyLR4pdH2T8vwADANA824ekci98AAAAAElFTkSuQmCC"},{"id":"olho_dagua_do_casado","name":"Olho d'Agua do Casado AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.78219871045,-9.54444051839],[-37.78259635433,-9.45388353571],[-37.8114653,-9.45411888151],[-37.81735042942,-9.45451112414],[-37.82057134484,-9.45415810579],[-37.8739351535,-9.45427577861],[-37.87357727401,-9.54475422977],[-37.78219871045,-9.54444051839]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2017","name":"Ortho 2017 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-06-22T00:00:00.000Z","startDate":"2017-06-14T00: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":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"https://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":"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","scaleExtent":[6,22],"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":"https://{switch:a,b,c}.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":"https://ooc.openstreetmap.org/npescotland/{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":"al_palestina","name":"Palestina AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.28906746617,-9.71915617946],[-37.28903527966,-9.71114035022],[-37.28911038151,-9.70220427214],[-37.28915329685,-9.69174505681],[-37.28918548336,-9.68885787521],[-37.28927131405,-9.68069325658],[-37.28926058521,-9.67731947667],[-37.28935714474,-9.66999011394],[-37.28935714474,-9.66599221238],[-37.28931422939,-9.66132793384],[-37.28941078892,-9.6552568713],[-37.2894644331,-9.64555775166],[-37.28949661961,-9.6348852245],[-37.28953953495,-9.62925794841],[-37.29639526119,-9.62884541884],[-37.31187697163,-9.62897235107],[-37.32761617413,-9.62914159397],[-37.33181114903,-9.62919448235],[-37.3433768343,-9.629173327],[-37.35876198521,-9.62922621538],[-37.37175460568,-9.6293002591],[-37.37838502636,-9.62913101629],[-37.3805093359,-9.62921563771],[-37.38060589543,-9.63142636478],[-37.38054152241,-9.63784691108],[-37.38043423405,-9.63894695947],[-37.38053079357,-9.64147494171],[-37.3805093359,-9.64876261706],[-37.38049860706,-9.65430495262],[-37.38043423405,-9.65599725065],[-37.380241115,-9.66028084202],[-37.38021965733,-9.66550569201],[-37.38018747082,-9.6705400861],[-37.38015528431,-9.67895877835],[-37.38013382664,-9.68781086916],[-37.38009091129,-9.70115730775],[-37.38002653828,-9.7105269939],[-37.38010164013,-9.71743247513],[-37.38004799595,-9.71958974786],[-37.3793184351,-9.7195368737],[-37.37392183056,-9.71955802336],[-37.36582155934,-9.71945227502],[-37.35849376431,-9.71946284985],[-37.353343923,-9.71937825115],[-37.34413858166,-9.71936767631],[-37.33422513714,-9.71923020337],[-37.3293327879,-9.71927250275],[-37.32180114498,-9.71924077822],[-37.31982703915,-9.71927250275],[-37.31094356289,-9.71919847884],[-37.2958910059,-9.71920905369],[-37.28906746617,-9.71915617946]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"palmeira_dos_indios","name":"Palmeira dos Indios AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.58663984051,-9.46124293173],[-36.58665056935,-9.45851253477],[-36.58618922939,-9.41968140694],[-36.58603902569,-9.41451629413],[-36.58596392384,-9.4059322986],[-36.58584590664,-9.3950935092],[-36.58579226246,-9.39163222273],[-36.58565278759,-9.38983276351],[-36.58549185505,-9.3824866389],[-36.58528800717,-9.37964976527],[-36.58510561695,-9.37743741114],[-36.5850305151,-9.3705885508],[-36.58890362492,-9.37057796513],[-36.59064169636,-9.37065206481],[-36.59389253369,-9.37059913647],[-36.60037275067,-9.37072616447],[-36.61045785656,-9.37049327977],[-36.62288184872,-9.37020746651],[-36.63377161732,-9.3700169242],[-36.63835283032,-9.36985813887],[-36.64742942562,-9.36997458145],[-36.6514098238,-9.36994282439],[-36.6553365778,-9.36972052485],[-36.65647383442,-9.36974169624],[-36.6611086916,-9.37023922355],[-36.66276093235,-9.37026039491],[-36.66704173794,-9.36973111055],[-36.67051788082,-9.36965701067],[-36.67325373402,-9.36965701067],[-36.67602177372,-9.36986872456],[-36.6759252142,-9.3725998221],[-36.67596812954,-9.37679169746],[-36.67638655415,-9.38137517998],[-36.67653675785,-9.38463544939],[-36.67663331738,-9.39264838381],[-36.67675133457,-9.39829014058],[-36.67689080944,-9.40874778795],[-36.67707319966,-9.41886642501],[-36.67716975918,-9.43178948329],[-36.67724486103,-9.43394857114],[-36.67718048802,-9.43752585362],[-36.67727704754,-9.44311396022],[-36.67729850521,-9.449326389],[-36.67740579357,-9.45528471196],[-36.67739506474,-9.4593803377],[-36.67735214939,-9.46017405798],[-36.67567845097,-9.46020580675],[-36.66624780407,-9.46030105305],[-36.66223521938,-9.46030105305],[-36.65736432781,-9.46041746516],[-36.65040131321,-9.46047037975],[-36.63543458691,-9.46065028927],[-36.61979194393,-9.46083019869],[-36.61433096638,-9.46083019869],[-36.61028619518,-9.46096777643],[-36.60646672955,-9.46096777643],[-36.60186405888,-9.46098894223],[-36.59425731411,-9.461115937],[-36.58663984051,-9.46124293173]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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":"pao_de_acucar","name":"Pão de Açucar AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.39002812509,-9.78589413544],[-37.39018686777,-9.77619515195],[-37.38992540924,-9.76575048432],[-37.38990673363,-9.75256304825],[-37.39014951655,-9.7410224633],[-37.39002812509,-9.73201243097],[-37.39012150314,-9.72254197161],[-37.39014951655,-9.71288716505],[-37.39018686777,-9.7034069601],[-37.39019620557,-9.69548203924],[-37.40377337333,-9.6955004481],[-37.41727583865,-9.69560169682],[-37.43223500148,-9.69569374108],[-37.44318824617,-9.69573055877],[-37.44723151552,-9.69582260299],[-37.45682144076,-9.69585021626],[-37.47062271582,-9.69591464719],[-37.47373220472,-9.69590544277],[-37.47586122415,-9.69604350903],[-37.48127715077,-9.69605271344],[-37.48131450199,-9.69889686551],[-37.48122112394,-9.70086658775],[-37.48121178614,-9.70238529092],[-37.48135185321,-9.70545028909],[-37.48137986662,-9.71045731285],[-37.4813425154,-9.71617295985],[-37.48120244833,-9.71875003124],[-37.48124913736,-9.72035148703],[-37.48136119101,-9.7213362865],[-37.4813425154,-9.72409739103],[-37.48129582638,-9.72506377223],[-37.48103436785,-9.72731865083],[-37.48101569224,-9.73088040767],[-37.48126781296,-9.73461699032],[-37.48130516418,-9.73638402962],[-37.48131450199,-9.73893333547],[-37.48131450199,-9.74387543612],[-37.48129582638,-9.7498850055],[-37.48122112394,-9.75315203071],[-37.48101569224,-9.75855405565],[-37.48083827396,-9.76419525907],[-37.48084761176,-9.76526275174],[-37.48094098981,-9.76675355473],[-37.480931652,-9.76881490096],[-37.48083827396,-9.77210014513],[-37.48086628737,-9.77486082942],[-37.48076357152,-9.77993122654],[-37.48081026054,-9.78629902044],[-37.46381545633,-9.78622540502],[-37.45353453357,-9.78619779924],[-37.43978928533,-9.78610577993],[-37.42997525279,-9.78606897221],[-37.42079619096,-9.78600455867],[-37.40852631583,-9.785958549],[-37.39545338951,-9.78593094319],[-37.39002812509,-9.78589413544]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"PCN-Italy-2006","name":"PCN 2006 - Italy","type":"wms","template":"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2006-01-01T00:00:00.000Z","startDate":"2006-01-01T00:00:00.000Z","polygon":[[[7.5479525,43.731183],[8.106966,43.86700730000001],[8.7359333,44.389436700000005],[10.183382,43.85116399999999],[9.5501637,43.13604889999999],[10.2772473,42.27514580000001],[11.6974829,42.08117770000001],[12.900592000000001,40.84896839999998],[14.9746632,40.208691200000004],[16.0477306,38.895298899999986],[13.1085959,38.74113290000001],[11.7771711,37.9360538],[14.406238300000002,36.74298800000001],[15.134669000000002,36.59363599999999],[15.428667100000002,37.0270026],[15.2199268,37.43375560000001],[15.483598700000002,37.929356000000006],[16.0164356,37.8035964],[17.216692,38.87424630000002],[17.216692,39.40468200000001],[16.5547657,39.7877476],[17.0546436,40.451437900000016],[18.3290577,39.70538770000001],[18.687732,40.05870289999999],[18.0496375,40.67064450000001],[16.005449300000002,41.5212225],[16.3844776,41.85963759999999],[15.5183696,42.15369720000001],[14.5799732,42.246104100000004],[13.5609913,43.65127720000002],[12.5788936,44.08670100000001],[12.2879505,44.6220446],[12.563982,44.9709164],[12.3415089,45.1745803],[12.4169596,45.4055695],[13.092517900000002,45.6282626],[13.6954906,45.70805899999999],[13.78445,45.5825],[13.919100000000002,45.63220000000001],[13.8235,45.717600000000004],[13.59784,45.807199999999995],[13.64307,45.98326],[13.52963,45.965879999999984],[13.47474,46.00546],[13.66472,46.17392000000001],[13.47587,46.22724999999999],[13.42218,46.20758],[13.37671,46.296679999999995],[13.59777,46.441370000000006],[13.68684,46.43880999999999],[13.7148,46.522200000000005],[12.9151,46.60953],[12.38708,46.715289999999996],[12.27591,46.88651],[12.17486,46.908950000000004],[12.11675,47.01240999999999],[12.21781,47.039959999999994],[12.19254,47.09331000000001],[11.74789,46.984840000000005],[11.33355,46.99862000000002],[11.10618,46.92966000000001],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258000000001],[10.66405,46.87613999999999],[10.47197,46.85698000000001],[10.38659,46.678470000000004],[10.49375,46.620490000000004],[10.46136,46.53164],[10.25309,46.574319999999986],[10.23674,46.634840000000004],[10.10307,46.610030000000016],[10.03715,46.44479],[10.165,46.410509999999995],[10.10506,46.33719999999999],[10.17862,46.25625999999999],[10.07055,46.216680000000004],[9.95249,46.38045000000001],[9.73086,46.35071],[9.71273,46.292660000000005],[9.57015,46.29580000000001],[9.46117,46.374810000000004],[9.459360000000002,46.50873],[9.40487,46.46620999999998],[9.36128,46.5081],[9.28136,46.496849999999995],[9.24503,46.236160000000005],[8.9560061,45.96502739999999],[9.09065,45.89905999999999],[9.0298,45.821270000000005],[8.90992,45.833299999999994],[8.9408,45.86681999999999],[8.88904,45.95465000000001],[8.78551,45.99063000000001],[8.85617,46.07480000000001],[8.62242,46.121120000000005],[8.45032,46.26869000000001],[8.42464,46.46366999999999],[8.08814,46.266920000000006],[8.15493,46.183399999999985],[8.11383,46.11577],[8.02906,46.10330999999999],[7.98881,45.99867],[7.9049000000000005,45.99945],[7.859490000000001,45.91485000000001],[7.563430000000001,45.97421],[7.10685,45.85652999999999],[7.04151,45.92434999999999],[6.95315,45.85163000000001],[6.80785,45.832649999999994],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.50900000000001],[7.18019,45.40070999999998],[7.10572,45.32924],[7.13115,45.25386],[6.851440000000001,45.132259999999995],[6.7697,45.16044],[6.62803,45.111749999999994],[6.66981,45.02324000000001],[6.74791,45.01939],[6.75518,44.899150000000006],[7.022170000000001,44.82519],[7.07484,44.680730000000004],[6.9513300000000005,44.66264],[6.85507,44.53072],[6.94504,44.431119999999986],[6.88784,44.42043],[6.891710000000001,44.36637000000001],[7.007640000000001,44.23735999999999],[7.363640000000001,44.11881999999999],[7.68694,44.17487],[7.725079999999999,44.07578000000001],[7.493549999999999,43.86551],[7.5479525,43.731183]],[[8.171339,39.148484300000014],[8.6245251,38.75118870000001],[9.0983105,39.037636700000014],[9.0310192,39.13144220000001],[9.265852000000002,39.1857496],[9.6407604,39.0227016],[9.8989391,40.6799061],[9.5006847,41.392570299999996],[8.303175,40.91070760000001],[8.4130383,41.16138739999999],[8.2125378,41.1386378],[8.0752087,40.598623299999986],[8.3615398,40.34999509999999],[8.2791424,39.985851200000006],[8.3828259,39.65359839999999],[8.171339,39.148484300000014]],[[12.514886900000002,35.53423470000001],[12.640543,35.5306027],[12.6386149,35.486413600000006],[12.512958700000002,35.4900477],[12.514886900000002,35.53423470000001]],[[11.9121838,36.8568754],[12.081785200000002,36.8552271],[12.0795789,36.7097361],[11.9099774,36.71138750000001],[11.9121838,36.8568754]],[[12.8401852,35.881314200000006],[12.8918552,35.8814533],[12.891984,35.850033999999994],[12.840314,35.8498949],[12.8401852,35.881314200000006]]]},{"id":"PCN-Lazio_Umbria-2008","name":"PCN 2008 - IT Lazio+Umbria","type":"wms","template":"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2008-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","polygon":[[[12.3314895,41.6463669],[12.4117815,41.6479098],[12.4149931,41.5463482],[12.4957439,41.5478934],[12.4984968,41.4961949],[12.5794769,41.4984285],[12.580624,41.4293206],[12.6063174,41.4288046],[12.6074644,41.396632],[12.8292996,41.3981807],[12.8315936,41.3468793],[12.9128032,41.3484293],[12.9150973,41.297261],[12.995848,41.2982951],[12.9979127,41.1963575],[13.1679022,41.1980837],[13.167214,41.246915],[13.4133661,41.2482949],[13.4152014,41.197048],[13.8340959,41.1980837],[13.8334077,41.2476049],[13.9173702,41.2484673],[13.916682,41.3974924],[14.0011032,41.3978366],[13.9999562,41.4977413],[14.084148,41.4982567],[14.0834598,41.6501382],[14.0008738,41.6497954],[13.9997268,41.7505095],[13.8343254,41.7496537],[13.8336371,41.8004653],[13.7515099,41.7997813],[13.7499041,41.8498696],[13.4184131,41.8496988],[13.4168072,41.95027],[13.3344506,41.9495876],[13.3333036,42.000411],[13.2514058,41.9997291],[13.2500294,42.0505125],[13.0850868,42.0496608],[13.0839398,42.097],[13.3339918,42.0981915],[13.3337624,42.1471955],[13.4177249,42.148216],[13.4163484,42.2505237],[13.3339918,42.2498444],[13.333533,42.3009367],[13.2514058,42.2999186],[13.2500294,42.5469887],[13.4179543,42.5481718],[13.4158896,42.7506484],[13.33468,42.7494692],[13.3330742,42.9005609],[13.168361,42.8993846],[13.167214,42.9507867],[12.9641901,42.9501151],[12.9625842,43.0003005],[12.9187678,42.9997972],[12.9160149,43.2507803],[12.8352641,43.2499449],[12.8322819,43.5010663],[12.66321,43.4994022],[12.6648158,43.451125],[12.5856709,43.4499593],[12.5824592,43.5508],[12.5017084,43.5498024],[12.4998732,43.6513062],[12.1624176,43.6491484],[12.1649411,43.6013233],[12.078914,43.5994959],[12.0818963,43.4519577],[11.9954104,43.4491265],[11.9986221,43.3466146],[12.078914,43.3479492],[12.0807492,43.3018885],[11.9960986,43.2995511],[11.9986221,43.2021377],[11.9123656,43.1992948],[11.9146596,43.1521173],[11.8320736,43.1494395],[11.832303,43.0965284],[11.9109891,43.098371],[11.9146596,42.9019053],[11.8290913,42.8992165],[11.8313854,42.8523123],[11.7458171,42.8494532],[11.7481112,42.6523609],[11.6730956,42.6496612],[11.6749308,42.6105035],[11.4948474,42.5993593],[11.4985179,42.4959273],[11.5781217,42.4979571],[11.5815627,42.4524416],[11.4122614,42.4487177],[11.4152437,42.3465622],[11.4959945,42.3479186],[11.4992061,42.2963554],[11.5783511,42.2982219],[11.582251,42.2462783],[11.6618547,42.2483161],[11.6662134,42.0964893],[11.7453583,42.0981915],[11.7490288,41.9966603],[11.9144302,41.9992176],[11.9153478,41.9862596],[11.9940339,41.9874532],[11.9986221,41.8968453],[12.0786846,41.8990651],[12.0814375,41.8459392],[12.1631058,41.8479899],[12.1656293,41.6964038],[12.3291955,41.6986306],[12.3314895,41.6463669]]]},{"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":"https://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":"al_piranhas","name":"Piranhas AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.71917577496,-9.65235879937],[-37.71917577496,-9.63873541198],[-37.71914358845,-9.63210333094],[-37.71924014797,-9.62114477442],[-37.71929379215,-9.61022817566],[-37.7193367075,-9.59988246925],[-37.71940108051,-9.58891229023],[-37.71945472469,-9.57801581129],[-37.71944399586,-9.57173166346],[-37.71951909771,-9.56684391256],[-37.71956201306,-9.56225232497],[-37.71998043766,-9.5621782666],[-37.72257681599,-9.56194551161],[-37.72817726841,-9.56203014981],[-37.73254390469,-9.56199841049],[-37.74107332935,-9.56206188913],[-37.74845476856,-9.56201957003],[-37.75925870648,-9.56215710706],[-37.76971932163,-9.56227348451],[-37.78036232701,-9.56244276071],[-37.78537269344,-9.56235812262],[-37.78907414189,-9.56232638333],[-37.79561873188,-9.56245334047],[-37.79771085491,-9.56236870238],[-37.81005974522,-9.56243218095],[-37.81060691586,-9.56241102143],[-37.810531814,-9.5653098637],[-37.81048889866,-9.57629138499],[-37.81045671215,-9.58742065699],[-37.8103816103,-9.59756574935],[-37.81030650845,-9.61798195891],[-37.81017776241,-9.65196745198],[-37.81017776241,-9.65229533767],[-37.81024213543,-9.6525914922],[-37.80663724651,-9.65245399191],[-37.80205603352,-9.65252803054],[-37.79597278347,-9.65236937632],[-37.79178853741,-9.65251745359],[-37.78815146198,-9.65246456886],[-37.78722878208,-9.65242226107],[-37.78035159817,-9.65241168412],[-37.77864571324,-9.65223187594],[-37.77625318279,-9.65229533767],[-37.77475114575,-9.65218956812],[-37.77233715763,-9.65223187594],[-37.76960130444,-9.65245399191],[-37.76623244991,-9.65250687665],[-37.76345368138,-9.65246456886],[-37.7603959631,-9.6524962997],[-37.75101896038,-9.65236937632],[-37.75011773815,-9.65248572275],[-37.74154539814,-9.65247514581],[-37.74030085316,-9.65239053022],[-37.73785467854,-9.65246456886],[-37.73443217983,-9.65237995327],[-37.73106332531,-9.65243283802],[-37.72651429882,-9.65236937632],[-37.7219545435,-9.65225302985],[-37.71991606465,-9.65228476071],[-37.71917577496,-9.65235879937]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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":"poco_das_trincheiras","name":"Poço das Trincheiras AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.23941602841,-9.35156513689],[-37.23946967259,-9.34386884913],[-37.23941602841,-9.3379191951],[-37.23954477444,-9.33022260582],[-37.23972716465,-9.32791465461],[-37.23973789349,-9.32280111197],[-37.23964133396,-9.32085307601],[-37.23970570698,-9.31864034808],[-37.2398022665,-9.31706284448],[-37.23982372418,-9.31561238186],[-37.24053182736,-9.30933403261],[-37.24051036968,-9.30003805717],[-37.24008121624,-9.29687228705],[-37.23998465672,-9.29546409248],[-37.2399202837,-9.29318767574],[-37.23988809719,-9.28977831694],[-37.23995247021,-9.28817950681],[-37.24008121624,-9.28641127785],[-37.24036016598,-9.28212302085],[-37.24038162365,-9.27896767726],[-37.24051036968,-9.27556876869],[-37.2400383009,-9.26978737192],[-37.24017777577,-9.26721430207],[-37.24017777577,-9.26612365361],[-37.23995247021,-9.26454591343],[-37.23983445301,-9.26150689057],[-37.24333205357,-9.26135864488],[-37.24936165943,-9.26146453466],[-37.26444640293,-9.26161278031],[-37.28016414776,-9.26171867001],[-37.2829429163,-9.26170808105],[-37.29580679074,-9.26178220382],[-37.30684676304,-9.26178220382],[-37.31418528691,-9.26188809348],[-37.32436695233,-9.26191986037],[-37.33078279629,-9.26175043692],[-37.33056821957,-9.27275220267],[-37.33048238888,-9.28006887422],[-37.33053603306,-9.28117006773],[-37.33068623677,-9.28427245005],[-37.3306969656,-9.28535245384],[-37.33064332142,-9.28616774861],[-37.33070769444,-9.28717362916],[-37.33064332142,-9.28769245062],[-37.33062186375,-9.29026537022],[-37.3304287447,-9.29308179553],[-37.33037510052,-9.29655464967],[-37.33034291401,-9.3059142435],[-37.33039655819,-9.31203384249],[-37.33037510052,-9.321943554],[-37.33040728703,-9.33420325643],[-37.33035364285,-9.34184682509],[-37.33029999867,-9.3478281711],[-37.33035364285,-9.35202034528],[-37.31508650913,-9.35193565539],[-37.300109054,-9.35190389668],[-37.29531326428,-9.351829793],[-37.28899397984,-9.35171334434],[-37.28497066632,-9.35181920676],[-37.27851190701,-9.35173451683],[-37.27430620327,-9.35180862052],[-37.27115192547,-9.35170275809],[-37.2635129942,-9.3516815856],[-37.26045527592,-9.35163924062],[-37.25401797428,-9.35176627555],[-37.24705495968,-9.35162865438],[-37.23941602841,-9.35156513689]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"rio2013","name":"Rio Mosaic 2013","type":"wms","template":"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","polygon":[[[-43.17709320917647,-22.969707888781738],[-43.14585740870588,-22.969588308044617],[-43.14605222658823,-22.927190274347275],[-43.156247695764705,-22.92730989255725],[-43.15647498329411,-22.87556516592966],[-43.177385435999994,-22.8749369295143],[-43.177417905647054,-22.88552681203441],[-43.1980361315294,-22.885706294449527],[-43.198036131529406,-22.854293259693964],[-43.21875176635292,-22.85444286278469],[-43.2190115235294,-22.833646454489337],[-43.22936934094117,-22.833646454489337],[-43.2293368712941,-22.82371093306296],[-43.19868552447057,-22.823531368775274],[-43.19855564588234,-22.834125256479705],[-43.18826276776469,-22.8339756310387],[-43.18803548023528,-22.844478937331477],[-43.16667045247057,-22.844419091729687],[-43.166832800705855,-22.83403548123485],[-43.156377574352916,-22.83406540632306],[-43.1565399225882,-22.813355672227665],[-43.104361199764675,-22.813056375525143],[-43.10445860870584,-22.802879896393364],[-43.09387350376466,-22.80276016858602],[-43.094100791294075,-22.73997839409261],[-43.13598663599996,-22.739918502607807],[-43.13569440917644,-22.750668603713393],[-43.12572622752938,-22.750548830086732],[-43.12556387929409,-22.771178288335854],[-43.14595481764702,-22.7710884716159],[-43.14611716588231,-22.760549566225578],[-43.17771013247056,-22.760878919332278],[-43.17758025388233,-22.77114834943578],[-43.188067949882324,-22.771298043870523],[-43.188067949882324,-22.781656499945914],[-43.25066942941175,-22.78162656334464],[-43.25057202047057,-22.791984235249323],[-43.28054150470587,-22.792822393946437],[-43.30343260588235,-22.793121735089624],[-43.33353196870588,-22.792972064600175],[-43.33346702941175,-22.802580576677798],[-43.38574316117646,-22.8024009845329],[-43.38541846470588,-22.812547569621618],[-43.41691402235293,-22.81284686744212],[-43.41675167411763,-22.823411659118616],[-43.42717443082351,-22.82335180425081],[-43.42740171835291,-22.833736229990887],[-43.45844270094114,-22.833616529309033],[-43.45863751882349,-22.81275707816501],[-43.48984084964701,-22.812996516105756],[-43.48993825858821,-22.796504244335274],[-43.5020819065882,-22.797462107811715],[-43.515426931529376,-22.797372308396717],[-43.52078442329409,-22.795905576244728],[-43.54169487599998,-22.796025310073155],[-43.54179228494115,-22.802341120431993],[-43.54653285341174,-22.802460848607485],[-43.54666273199997,-22.811889112101724],[-43.55250726847058,-22.81278700793061],[-43.5699109992941,-22.812936656660003],[-43.56997593858822,-22.819700607555284],[-43.57361253905883,-22.823262021899716],[-43.583483311764695,-22.823291949356644],[-43.583515781411776,-22.833466903308615],[-43.59390606847059,-22.83373622999088],[-43.59393853811765,-22.854682227387414],[-43.66098835929414,-22.854592465710777],[-43.66098835929414,-22.859828464394095],[-43.708523922588235,-22.860187496913827],[-43.70836157435295,-22.865034343090006],[-43.72206376541177,-22.864884751657844],[-43.72212870470588,-22.86847490057084],[-43.75015001011764,-22.86859457056733],[-43.75008507082353,-22.87529592210752],[-43.76037794894117,-22.87526600609435],[-43.759923373882344,-22.87849689743878],[-43.759761025647045,-22.884569568478902],[-43.76131956870587,-22.885855862947494],[-43.78128840164704,-22.8857960355681],[-43.781255932,-22.895906488289704],[-43.802133915058825,-22.896205602636037],[-43.8013546435294,-22.911369835519228],[-43.80119229529411,-22.927579033143484],[-43.7921332637647,-22.927758459903885],[-43.7921982030588,-22.93822460957403],[-43.78190532494115,-22.93798539232952],[-43.78184038564702,-22.94868995021093],[-43.75066952447056,-22.94845075146181],[-43.75060458517645,-22.95909468650586],[-43.72985648070586,-22.958855506152936],[-43.72966166282351,-22.979841971833356],[-43.709043436941144,-22.97966261413784],[-43.70891355835292,-22.99033398260527],[-43.69845833199996,-22.990064966868836],[-43.698360923058786,-23.000645848451164],[-43.667352410117616,-23.000436630016143],[-43.66725500117644,-23.011166128679353],[-43.631246162588184,-23.00937295708379],[-43.631311101882304,-23.02078907569042],[-43.63585685247054,-23.020908611087243],[-43.636019200705846,-23.031636481368604],[-43.67771022752937,-23.031636481368604],[-43.67764528823524,-23.04233361870472],[-43.67085913199995,-23.04230373961572],[-43.67108641952936,-23.063097982243804],[-43.64598738235289,-23.06303823327472],[-43.646052321647005,-23.052761015940998],[-43.60475093058818,-23.052551878372743],[-43.60452364305876,-23.063068107762582],[-43.58380800823524,-23.06288886073593],[-43.583678129647005,-23.08403836134171],[-43.54185722423525,-23.083829272389394],[-43.54195463317643,-23.06318760564771],[-43.521466285882305,-23.06300835878022],[-43.52130393764702,-23.0735237710834],[-43.500425954588195,-23.073374410186133],[-43.500425954588195,-23.042184223193427],[-43.45876739741171,-23.042214102308932],[-43.45870245811759,-23.03193529561677],[-43.43782447505876,-23.031815769997003],[-43.43775953576465,-23.021536170182088],[-43.32349884776465,-23.021207449115728],[-43.32330402988229,-23.04212446494251],[-43.31291374282347,-23.041945190030685],[-43.31275139458817,-23.052671385594376],[-43.30239357717642,-23.052581755188086],[-43.30236110752935,-23.042273860520083],[-43.291938350823465,-23.042154344071257],[-43.291970820470524,-23.031935295616755],[-43.27109283741169,-23.031815769997003],[-43.27119024635288,-23.010927040510325],[-43.260605141411716,-23.01086726840187],[-43.26067008070583,-23.000586071788522],[-43.25057202047053,-23.000466518383856],[-43.25053955082347,-23.01125578663348],[-43.23988950658817,-23.01101669862337],[-43.23985703694111,-23.00061596012315],[-43.21907646282347,-23.000496406744954],[-43.21904399317641,-22.990214420121887],[-43.20901087223524,-22.99009485753265],[-43.20862123647049,-23.083889012123244],[-43.187678314117555,-23.083769532629013],[-43.18761337482344,-23.07334453798677],[-43.135824287764606,-23.073374410186123],[-43.135889227058726,-23.052492124722143],[-43.17732049670579,-23.052551878372732],[-43.17709320917647,-22.969707888781738]]],"terms_url":"http://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer","terms_text":"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{"id":"rio2015","name":"Rio Mosaic 2015","type":"wms","template":"http://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.30362723364694,-22.436982955891427],[-44.10842009576469,-22.06578551470817],[-44.53130477905882,-23.786301394919743],[-42.70469231411757,-24.161784722114145],[-42.30362723364694,-22.436982955891427]]],"terms_url":"http://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer","terms_text":"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{"id":"route500","name":"Route 500","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.358164,51.32937],[2.548804,51.09759],[2.570482,51.07409],[2.587412,51.01763],[2.598448,51.0051],[2.615575,50.99749],[2.639859,50.95766],[2.642247,50.94578],[2.624519,50.9256],[2.61962,50.91067],[2.623964,50.86071],[2.627811,50.85054],[2.637859,50.83696],[2.651102,50.82906],[2.732666,50.81738],[2.79995,50.73795],[2.816552,50.73092],[2.852648,50.73335],[2.890719,50.7162],[2.904925,50.71536],[2.916096,50.72418],[2.935084,50.75592],[3.007184,50.78377],[3.082183,50.78749],[3.092439,50.79092],[3.114119,50.80566],[3.148768,50.80195],[3.215401,50.73111],[3.221487,50.7267],[3.270507,50.70375],[3.275448,50.67757],[3.265761,50.6604],[3.265877,50.64054],[3.289219,50.60028],[3.292195,50.55037],[3.305598,50.53267],[3.375514,50.50839],[3.389804,50.50884],[3.474798,50.54445],[3.52173,50.53459],[3.532662,50.51873],[3.547788,50.51012],[3.615234,50.50558],[3.673778,50.45642],[3.684152,50.35277],[3.690097,50.34044],[3.702583,50.33482],[3.715758,50.33854],[3.749349,50.36279],[3.841089,50.36558],[3.901887,50.3436],[3.913173,50.34291],[4.026717,50.36904],[4.13761,50.29984],[4.143881,50.29727],[4.214438,50.28167],[4.229037,50.26664],[4.230782,50.25233],[4.170843,50.18579],[4.166015,50.16888],[4.176401,50.1547],[4.211948,50.13602],[4.240742,50.07102],[4.231934,50.05551],[4.181645,50.03436],[4.17177,50.02537],[4.169755,50.01217],[4.176498,50.00065],[4.206331,49.97546],[4.221639,49.97089],[4.308774,49.98145],[4.445423,49.9523],[4.454691,49.95251],[4.658098,50.00609],[4.669358,50.01392],[4.672929,50.02716],[4.66924,50.06972],[4.695168,50.10472],[4.831227,50.17941],[4.881497,50.16436],[4.904786,50.14451],[4.904264,50.12639],[4.880762,50.0815],[4.862772,50.0745],[4.851037,50.06216],[4.843307,50.03884],[4.843307,50.03883],[4.843295,50.03881],[4.826781,49.989],[4.826618,49.97692],[4.833433,49.96696],[4.896542,49.91753],[4.897546,49.89424],[4.879134,49.86942],[4.876249,49.85111],[4.889238,49.81266],[4.897691,49.80204],[4.910979,49.79926],[4.995343,49.81116],[5.01867,49.79272],[5.026862,49.78886],[5.099438,49.77323],[5.134584,49.73462],[5.141201,49.72984],[5.187609,49.70906],[5.196025,49.70732],[5.281572,49.70836],[5.333628,49.67308],[5.343996,49.65049],[5.354398,49.64041],[5.431412,49.60791],[5.482051,49.52815],[5.492943,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.607602,49.53761],[5.640997,49.56095],[5.706759,49.55267],[5.715782,49.55361],[5.775261,49.57414],[5.839902,49.55321],[5.861263,49.52038],[5.875997,49.5114],[5.975162,49.50129],[5.998015,49.47317],[6.016266,49.46597],[6.08635,49.47562],[6.093186,49.47787],[6.173966,49.52187],[6.246435,49.52511],[6.333999,49.48235],[6.344229,49.48037],[6.435145,49.487],[6.5451,49.44384],[6.606389,49.37868],[6.604972,49.33739],[6.616267,49.31869],[6.670133,49.29269],[6.729955,49.22917],[6.743276,49.19086],[6.760259,49.17752],[6.809042,49.17284],[6.824733,49.17826],[6.830928,49.19366],[6.829819,49.21802],[6.851186,49.23136],[6.884528,49.2239],[6.893221,49.22389],[6.937527,49.23369],[7.040549,49.19794],[7.046296,49.17503],[7.054777,49.16313],[7.069081,49.16018],[7.104945,49.16634],[7.143153,49.14159],[7.153499,49.13839],[7.286827,49.13488],[7.29893,49.13856],[7.360948,49.18259],[7.450116,49.19517],[7.50113,49.17672],[7.543788,49.10572],[7.557903,49.09626],[7.629604,49.08527],[7.647217,49.06722],[7.661197,49.06119],[7.754008,49.05963],[7.760731,49.06067],[7.802913,49.07489],[7.855253,49.05329],[7.867297,49.05227],[7.93826,49.06832],[8.080685,49.00688],[8.222498,48.98787],[8.23704,48.97683],[8.235894,48.95817],[8.208878,48.94863],[8.200888,48.94339],[8.158243,48.89753],[8.100873,48.7993],[7.990709,48.74478],[7.985341,48.7409],[7.904217,48.65865],[7.856051,48.63606],[7.848405,48.62977],[7.818424,48.58883],[7.81456,48.57704],[7.814491,48.50968],[7.785465,48.48337],[7.780554,48.47652],[7.745059,48.39484],[7.743573,48.38427],[7.751593,48.32322],[7.71085,48.29841],[7.702411,48.28803],[7.676613,48.21555],[7.596051,48.11698],[7.591652,48.10648],[7.585216,48.04694],[7.591268,48.03035],[7.624373,47.99865],[7.632049,47.97081],[7.575545,47.87436],[7.572802,47.86435],[7.572673,47.83631],[7.545808,47.78793],[7.544185,47.77232],[7.557581,47.72899],[7.535257,47.6989],[7.531364,47.68564],[7.536998,47.67302],[7.600164,47.60822],[7.589675,47.56755],[7.554237,47.55128],[7.54511,47.54283],[7.512557,47.48439],[7.387471,47.42111],[7.326527,47.4273],[7.244354,47.40939],[7.167083,47.4335],[7.152115,47.47612],[7.14279,47.48707],[7.128529,47.48893],[7.080105,47.47718],[7.035575,47.48695],[7.021019,47.48458],[7.012048,47.47287],[7.002995,47.44095],[6.955099,47.40808],[6.947157,47.39698],[6.94818,47.38337],[6.957691,47.37359],[6.971263,47.37218],[7.018004,47.38386],[7.05623,47.37035],[7.070073,47.35005],[7.05958,47.32257],[6.974243,47.27856],[6.963469,47.26233],[6.961339,47.23479],[6.89443,47.19393],[6.889128,47.18922],[6.855453,47.14636],[6.769073,47.10751],[6.760108,47.09953],[6.725613,47.0418],[6.623551,46.9811],[6.481204,46.9445],[6.46892,46.93522],[6.466862,46.91997],[6.475476,46.88771],[6.453496,46.8239],[6.45644,46.80534],[6.467224,46.79104],[6.460984,46.76887],[6.15817,46.59343],[6.148724,46.58069],[6.15152,46.56508],[6.165489,46.54399],[6.158111,46.52456],[6.101739,46.46979],[6.095717,46.45418],[6.097044,46.43317],[6.108289,46.41643],[6.166216,46.38839],[6.178173,46.36922],[6.137482,46.31297],[6.133713,46.30227],[6.130383,46.23737],[6.110298,46.22344],[6.088648,46.23081],[6.077173,46.23123],[6.018573,46.21601],[6.006813,46.20752],[6.003882,46.19332],[6.007866,46.16977],[6.017834,46.15564],[6.03509,46.15456],[6.055639,46.16288],[6.124683,46.15415],[6.137776,46.15702],[6.240258,46.22094],[6.249058,46.23299],[6.247073,46.24777],[6.21148,46.31057],[6.212186,46.32485],[6.239462,46.36705],[6.316478,46.41557],[6.410826,46.42495],[6.417483,46.42682],[6.504978,46.46871],[6.630473,46.47435],[6.746646,46.45695],[6.822442,46.42925],[6.818324,46.38181],[6.804843,46.36179],[6.801885,46.34639],[6.810949,46.33359],[6.864911,46.30038],[6.875036,46.28007],[6.860917,46.2439],[6.826978,46.21188],[6.820746,46.19862],[6.818627,46.16592],[6.822593,46.15261],[6.834266,46.14509],[6.903819,46.12971],[6.904911,46.09595],[6.909323,46.08406],[6.920006,46.07721],[6.948976,46.0699],[7.015561,46.00883],[7.051911,45.93066],[7.045335,45.92217],[7.044967,45.92064],[7.043936,45.92036],[6.995822,45.85822],[6.940965,45.83551],[6.843757,45.82387],[6.831016,45.81711],[6.826141,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.841405,45.71373],[6.907294,45.69124],[6.92419,45.66935],[6.942468,45.66172],[6.971313,45.66528],[7.00597,45.64945],[7.011511,45.63652],[6.997797,45.60877],[6.996431,45.59465],[7.015803,45.52354],[7.027743,45.5102],[7.107198,45.47877],[7.122797,45.44924],[7.13304,45.44001],[7.185604,45.41894],[7.19515,45.40409],[7.170749,45.35069],[7.142319,45.32298],[7.136488,45.30576],[7.14458,45.25048],[7.084166,45.20279],[6.992792,45.19823],[6.981064,45.19368],[6.900091,45.12689],[6.85843,45.11699],[6.782826,45.14228],[6.770557,45.14242],[6.677507,45.11356],[6.665295,45.10289],[6.665008,45.08667],[6.68237,45.04558],[6.696016,45.03395],[6.757442,45.01884],[6.783751,44.9146],[6.794195,44.90161],[6.866981,44.86519],[6.879801,44.86346],[6.936325,44.87461],[7.017954,44.84402],[7.034535,44.82282],[7.037114,44.75009],[7.049604,44.73226],[7.072236,44.72311],[7.086508,44.6968],[7.086656,44.68085],[7.07671,44.67134],[6.990071,44.67203],[6.974128,44.66431],[6.970564,44.64696],[6.978189,44.61784],[6.94659,44.57124],[6.882347,44.53479],[6.872327,44.5195],[6.878925,44.50245],[6.958945,44.43129],[6.958723,44.42908],[6.921668,44.41436],[6.912225,44.40659],[6.909075,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.999091,44.29414],[7.011806,44.256],[7.019835,44.24558],[7.032595,44.2424],[7.073117,44.2461],[7.165097,44.22112],[7.245331,44.18544],[7.260526,44.16682],[7.275371,44.15947],[7.338779,44.1574],[7.362775,44.13834],[7.377763,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.564785,44.15817],[7.605476,44.1634],[7.616198,44.16827],[7.639891,44.18928],[7.686079,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.694448,44.12276],[7.727862,44.08615],[7.724032,44.05704],[7.686028,44.02371],[7.680769,44.0164],[7.660161,43.9672],[7.596244,43.94466],[7.584187,43.93287],[7.568576,43.89159],[7.527096,43.87434],[7.516489,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.369681,41.35052],[9.273114,41.29196],[8.941857,41.27688],[5.8,41.64],[3.173576,42.41768],[3.160814,42.42757],[3.094399,42.41457],[3.034016,42.45331],[3.022142,42.45645],[2.878221,42.4487],[2.870188,42.44653],[2.784238,42.40256],[2.741304,42.41128],[2.729276,42.40998],[2.693308,42.39417],[2.683779,42.3854],[2.681621,42.37263],[2.685852,42.34679],[2.66719,42.33008],[2.581057,42.34418],[2.567769,42.34173],[2.533803,42.32197],[2.477948,42.32986],[2.419327,42.37658],[2.41222,42.38021],[2.267193,42.42055],[2.259731,42.42117],[2.206944,42.41558],[2.206525,42.41526],[2.205257,42.41541],[2.160278,42.41065],[2.148808,42.40545],[2.093931,42.35474],[2.008614,42.33818],[1.964998,42.36473],[1.930762,42.42442],[1.920889,42.43302],[1.884665,42.44761],[1.884588,42.44762],[1.884444,42.4477],[1.827736,42.47056],[1.725668,42.48452],[1.715606,42.50125],[1.727195,42.56103],[1.724794,42.57499],[1.710109,42.59992],[1.69377,42.60975],[1.602827,42.61382],[1.560687,42.6392],[1.546365,42.64166],[1.504443,42.6331],[1.492096,42.62502],[1.472384,42.59703],[1.437922,42.59264],[1.419356,42.60643],[1.38032,42.67415],[1.373353,42.68127],[1.333134,42.70563],[1.323642,42.7085],[1.232212,42.71248],[1.165543,42.69928],[1.085465,42.76635],[1.075637,42.77079],[0.9593748,42.78852],[0.9507323,42.78794],[0.9226515,42.7797],[0.8460624,42.8157],[0.7151135,42.8464],[0.7001699,42.84402],[0.6911674,42.83186],[0.6740937,42.76479],[0.6747382,42.75286],[0.6919171,42.70684],[0.6689955,42.67901],[0.4302428,42.67863],[0.3715037,42.70308],[0.3595376,42.70415],[0.3491168,42.69817],[0.3256688,42.67274],[0.2957095,42.66388],[0.2459353,42.70175],[0.2397249,42.70494],[0.189669,42.72039],[0.1791886,42.72075],[-0.01993262,42.67389],[-0.06725834,42.6848],[-0.1694885,42.77157],[-0.2998662,42.82697],[-0.3168349,42.82635],[-0.3920752,42.78766],[-0.4435404,42.78453],[-0.488418,42.80255],[-0.508683,42.79935],[-0.5449894,42.76906],[-0.5672068,42.76937],[-0.6744552,42.86392],[-0.6809365,42.86775],[-0.7337233,42.88666],[-0.747598,42.93879],[-0.757105,42.95107],[-0.7725328,42.95284],[-0.8211401,42.93865],[-0.9450847,42.94192],[-1.023131,42.98206],[-1.108517,43.00409],[-1.115597,43.00461],[-1.147753,43.00124],[-1.158452,43.01452],[-1.167362,43.02083],[-1.216216,43.0381],[-1.226121,43.03898],[-1.262362,43.03303],[-1.306428,43.05531],[-1.319918,43.05696],[-1.331346,43.0496],[-1.354196,43.0197],[-1.438684,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.476407,43.10248],[-1.434786,43.13087],[-1.427318,43.1404],[-1.394112,43.22935],[-1.395313,43.24596],[-1.408677,43.25591],[-1.526287,43.28099],[-1.546257,43.2737],[-1.571485,43.2412],[-1.610526,43.24223],[-1.650003,43.29323],[-1.669527,43.30065],[-1.733594,43.28856],[-1.756061,43.31966],[-1.762973,43.32565],[-1.791557,43.34067],[-1.800991,43.37017],[-1.785091,43.39037],[-1.783502,43.39686],[-2.7,43.9]]],"terms_url":"http://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE","terms_text":"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL","description":"Routes du réseau classé (autoroutes, nationales, départementales)","overlay":true},{"id":"santana_do_ipanema","name":"Santana do Ipanema AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-37.20224124741,-9.41355941666],[-37.20188336806,-9.37768274195],[-37.20208218992,-9.37455390013],[-37.20192313243,-9.36732508877],[-37.20169448729,-9.36044924119],[-37.20172431057,-9.35500535669],[-37.20195295571,-9.35101312056],[-37.20191319134,-9.34772709331],[-37.20175413385,-9.3383494838],[-37.20170442839,-9.33505352761],[-37.20171436948,-9.33301315816],[-37.20141613669,-9.32833399659],[-37.20120737373,-9.3246946053],[-37.20116760936,-9.32350762581],[-37.21425008782,-9.32345857698],[-37.21537343133,-9.32339971838],[-37.22078138595,-9.32328200115],[-37.23727365933,-9.32313485456],[-37.25180753737,-9.32292884922],[-37.26559583344,-9.32276208291],[-37.28029871006,-9.32258550672],[-37.29190990675,-9.32244816963],[-37.29204908205,-9.33522028804],[-37.29304319135,-9.41219621023],[-37.28356932967,-9.41235312635],[-37.27789296554,-9.41250023515],[-37.27160025364,-9.4124904279],[-37.26505901441,-9.41261792215],[-37.26164921949,-9.4127356091],[-37.25498868715,-9.41275522359],[-37.2499087886,-9.41296117565],[-37.24616099652,-9.41297098289],[-37.24108109797,-9.41302982631],[-37.23460944639,-9.41320635652],[-37.22839626323,-9.41324558544],[-37.22164626105,-9.41335346495],[-37.21686459529,-9.41346134443],[-37.21291798135,-9.41343192276],[-37.20224124741,-9.41355941666]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"Sao_miguel_dos_campos","name":"São Miguel dos Campos AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.14150176596,-9.83171289603],[-36.05047117688,-9.8324573223],[-36.04958641959,-9.74245778891],[-36.1405871854,-9.74166417216],[-36.14150176596,-9.83171289603]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"GEOSN-DOP-RGB","name":"Saxony latest aerial imagery","type":"wms","template":"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[13.549014,50.697922],[13.842514,50.711263],[13.93239,50.745042],[14.046138,50.79389],[14.252571,50.859532],[14.400023,50.889661],[14.426705,50.935703],[14.35649,50.971973],[14.325595,50.993191],[14.27504,50.990539],[14.315765,51.042662],[14.415471,51.012633],[14.519389,51.003797],[14.5882,50.981699],[14.544667,50.91977],[14.579775,50.906489],[14.647181,50.922426],[14.644373,50.909146],[14.605052,50.856873],[14.720205,50.817851],[14.810081,50.813415],[14.856423,50.890547],[14.912595,50.947206],[14.996853,51.086789],[15.053026,51.247932],[15.055834,51.292741],[14.99264,51.344524],[14.988427,51.398],[14.977193,51.45754],[14.909786,51.496025],[14.739865,51.537097],[14.739865,51.591221],[14.700545,51.60605],[14.67948,51.5982],[14.683693,51.578133],[14.673863,51.558056],[14.617691,51.557183],[14.583987,51.590349],[14.519389,51.569405],[14.435131,51.559802],[14.326999,51.52574],[14.13461,51.555437],[14.067203,51.499522],[14.027882,51.478536],[14.04333,51.45229],[13.995583,51.392743],[13.957667,51.405885],[13.888856,51.388362],[13.724552,51.374338],[13.554631,51.392743],[13.404371,51.45929],[13.352411,51.439161],[13.315899,51.443538],[13.286409,51.418147],[13.226024,51.400629],[13.213385,51.46104],[13.219002,51.526614],[13.174064,51.5982],[13.002739,51.677512],[12.905842,51.653123],[12.903033,51.66619],[12.853883,51.693183],[12.764007,51.659221],[12.688175,51.670545],[12.643237,51.629593],[12.577235,51.630464],[12.425569,51.610411],[12.230371,51.570278],[12.177007,51.530109],[12.139091,51.460165],[12.167177,51.417272],[12.174199,51.334874],[12.13207,51.318201],[12.186838,51.213637],[12.158751,51.188119],[12.220541,51.092963],[12.490168,51.054139],[12.521062,50.993191],[12.605321,50.972857],[12.626385,50.918885],[12.502806,50.910917],[12.237393,50.818738],[12.213519,50.729933],[12.286543,50.664999],[12.217732,50.646303],[12.133474,50.627599],[12.053428,50.563416],[12.019725,50.647193],[11.859634,50.548248],[11.876486,50.508076],[11.927041,50.505397],[11.936871,50.486637],[11.870869,50.441941],[11.934062,50.399888],[11.96917,50.339875],[12.120835,50.297732],[12.172794,50.306702],[12.185433,50.260938],[12.212115,50.253755],[12.257053,50.216029],[12.28233,50.156684],[12.355354,50.158483],[12.355354,50.22142],[12.414335,50.281582],[12.511232,50.347045],[12.537914,50.387354],[12.678345,50.402573],[12.712048,50.386459],[12.7289,50.396307],[12.756986,50.42584],[12.786476,50.433891],[12.817371,50.417787],[12.846861,50.436574],[12.947971,50.387354],[13.009761,50.414208],[13.046273,50.449989],[13.056103,50.48753],[13.214789,50.492891],[13.275174,50.566092],[13.341177,50.568768],[13.391732,50.613344],[13.477394,50.585711],[13.54761,50.634725],[13.568674,50.67212],[13.549014,50.697922]]],"terms_url":"https://geoportal.sachsen.de/md/cd01c334-7e32-482f-bd43-af286707178a","terms_text":"Staatsbetrieb Geobasisinformation und Vermessung Sachsen","best":true,"icon":"data:image/png;base64,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"},{"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":"Sicily-ATA2007","name":"Sicily - Italy","type":"wms","template":"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[15.711650848388677,38.25894105289697],[15.237178802490236,38.81938114846882],[14.271240234375,38.55246141354153],[13.150634765625,38.75408327579141],[11.964111328125,37.97451499202459],[12.5244140625,37.54022177661216],[11.87896728515625,36.796089518731506],[12.496948242187498,35.47409160773029],[12.689208984375,35.46961797120201],[14.5733642578125,36.6640126988417],[15.297088623046873,36.62875385775956],[15.398540496826199,37.42170795425973],[15.711650848388677,38.25894105289697]]]},{"id":"sc2012","name":"SIG Santa Catarina OrtoRGB 2012","type":"wms","template":"http://sigsc.sc.gov.br:80/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","polygon":[[[-48.62488448156965,-26.916236931410996],[-48.624164193144196,-26.83408805760915],[-48.5616254665196,-26.83412188528322],[-48.5616507397977,-26.749193916956184],[-48.626754704148055,-26.74918263262303],[-48.627146439958395,-26.73276274152515],[-48.6412615657696,-26.732999746505616],[-48.641741758053236,-26.709116191945647],[-48.624138919866105,-26.709127480253297],[-48.624176829783245,-26.500792500209887],[-48.570989216050585,-26.500769882438657],[-48.57154522816848,-26.474145680246586],[-48.55418248612319,-26.47380633457661],[-48.55449840209926,-26.45735818142214],[-48.56154964668535,-26.457471312923715],[-48.56161282988055,-26.41746108634898],[-48.49909937653404,-26.417472403421797],[-48.49908673989502,-26.250810301340856],[-48.43663646974372,-26.250787634582515],[-48.43661119646563,-26.207520071408148],[-48.460102708446854,-26.20750873380981],[-48.46194765774716,-26.124204304592393],[-48.56161282988057,-26.12419295889107],[-48.56162546651964,-25.95753087401021],[-48.624113646588064,-25.95753087401021],[-48.624113646588064,-25.945066276881477],[-48.688383592761575,-25.94606622032166],[-48.68839622940061,-25.9575195121708],[-49.25089094312879,-25.9575195121708],[-49.25090357976782,-25.999198717680073],[-49.31339175983624,-25.999198717680073],[-49.31337912319721,-26.0825014166478],[-49.37590521318276,-26.082501416647776],[-49.37590521318275,-26.124192958891047],[-49.50093211987576,-26.124181613188597],[-49.50091948323672,-26.16585828693744],[-49.68661489397596,-26.165846945284223],[-49.68661489397595,-26.12417026748506],[-49.74906516412725,-26.082456017648312],[-49.74907780076631,-26.04084043378188],[-49.81160389075186,-26.040851787565785],[-49.811591254112805,-25.999176002051062],[-49.93656761424967,-25.99915328641767],[-49.9366055241668,-25.98244474858429],[-50.000913380257444,-25.982876406234503],[-50.00093865353552,-25.99915328641767],[-50.313379553877645,-25.999164644234927],[-50.313417463794764,-26.040829079996882],[-50.37411124111907,-26.04084043378188],[-50.374098604480025,-25.999198717680073],[-50.49913814781211,-25.999176002051062],[-50.49911287453402,-25.984137291872997],[-50.62593418397117,-25.984523506389962],[-50.62594682061022,-26.04084043378188],[-50.6883970907615,-26.041612488584164],[-50.68844763731769,-26.124158921780424],[-50.75093581738611,-26.124136230367803],[-50.750948454025156,-26.207520071408148],[-51.12595335426997,-26.207474721008193],[-51.12595335426997,-26.249132949280156],[-51.18847944425552,-26.249178283438034],[-51.31344316775333,-26.33244989854678],[-51.31346844103143,-26.624140013763412],[-51.436599851867975,-26.62415131048226],[-51.43658721522893,-26.56476034464233],[-51.62408966535135,-26.564104792996805],[-51.62411493862942,-26.540796365619084],[-51.99906929231806,-26.540796365619084],[-52.06158274566456,-26.49910746406482],[-52.06158274566456,-26.457471312923687],[-52.12408356237202,-26.457493939210668],[-52.12405828909395,-26.41578614733],[-52.374074192562865,-26.41579746456714],[-52.37408682920191,-26.391327004376254],[-52.56156400604623,-26.389402650121472],[-52.561576642685274,-26.374153838977676],[-52.624077459392744,-26.37416516029677],[-52.62409009603178,-26.332472549349774],[-53.124083993052494,-26.332472549349752],[-53.12409662969154,-26.317068980284002],[-53.16180436059632,-26.31650263355217],[-53.161362078229814,-26.290821564697215],[-53.18655953648188,-26.29083289416888],[-53.24907298982837,-26.24911028219455],[-53.24906035318934,-26.23919300812073],[-53.31158644317491,-26.23824090528976],[-53.374099896521415,-26.22882146785218],[-53.43844566252919,-26.227767259506184],[-53.43843302589015,-26.249144282821256],[-53.5616023466438,-26.249155616361257],[-53.56158971000477,-26.239827739008902],[-53.655012382450856,-26.238138893809616],[-53.656225499799,-26.292634266082075],[-53.67011316610744,-26.316842441923516],[-53.68846156599812,-26.33241592233391],[-53.70322116040052,-26.374097232365553],[-53.70928674714123,-26.384489741468975],[-53.70980484934199,-26.395684982214643],[-53.70619077057565,-26.407218680242053],[-53.70721433833813,-26.459270088862837],[-53.714379312675604,-26.461679725793857],[-53.714758411846894,-26.48118122161117],[-53.73046575417756,-26.49913008216322],[-53.73146404866198,-26.54080767056338],[-53.750962382705566,-26.540796365619055],[-53.75094974606652,-26.624173903916578],[-53.76019976584611,-26.624140013763338],[-53.761248606886696,-26.667499888848678],[-53.75097501934461,-26.66751118127877],[-53.75096238270559,-26.742976079662007],[-53.727369777612,-26.743404906944193],[-53.72132946414936,-26.749047220537665],[-53.72140528398363,-26.750931690893374],[-53.745705540863625,-26.759428345833868],[-53.746122549952055,-26.777040237532006],[-53.71948451484907,-26.77754790691426],[-53.720836635226696,-26.834155712947112],[-53.700466373089114,-26.834144437060257],[-53.70276624139493,-26.931075520284146],[-53.71167507192037,-26.930906526843206],[-53.712243720677314,-26.955565624612287],[-53.751000292622685,-26.954788421555175],[-53.75092447278844,-26.999147992456276],[-53.764673136067394,-26.999147992456276],[-53.80369507743266,-27.037513523530937],[-53.80454173224855,-27.0725803974359],[-53.80809262781969,-27.07249038098803],[-53.8086233666595,-27.09612846681215],[-53.82689594671591,-27.095768476254833],[-53.82761623514137,-27.124136682787803],[-53.846444827315686,-27.124125435915396],[-53.84764530802479,-27.170138168249487],[-53.8350592155378,-27.18931578625989],[-53.83536249487484,-27.200544291231996],[-53.688474202637146,-27.202837060128804],[-53.688486839276194,-27.227885858850012],[-53.43653753003366,-27.23245898831079],[-53.43655016667271,-27.167507452480596],[-53.37598275573884,-27.167507452480574],[-53.376008029016916,-27.233515163499888],[-53.24904771655028,-27.235638719456546],[-53.24904771655028,-27.209220599589166],[-53.06344076228435,-27.209175646364237],[-53.06345339892339,-27.233402804913485],[-52.8134754053716,-27.23685216181505],[-52.81346276873256,-27.276528928524463],[-52.750961952025094,-27.277315131338465],[-52.750961952025094,-27.292487755808434],[-52.438495778404864,-27.292521445488386],[-52.438483141765836,-27.326890821722227],[-52.37603287161454,-27.327530725463642],[-52.3759949616974,-27.33419897625023],[-52.25098069164342,-27.33417652490038],[-52.25099332828246,-27.346692446966557],[-52.18654646916235,-27.34727611465991],[-52.18657174244043,-27.334187750575865],[-52.12597905822849,-27.33419897625023],[-52.12599169486754,-27.364133804119422],[-52.02978896183197,-27.364885718492065],[-52.03035761058891,-27.424416622283772],[-51.97533768419499,-27.42478676693274],[-51.97603269934236,-27.50087558818674],[-51.93845133482801,-27.500853170691318],[-51.93845133482801,-27.54251940627202],[-51.688460704637194,-27.542474588252876],[-51.68847334127622,-27.55742038383185],[-51.599031210128736,-27.557902111020763],[-51.599233396353426,-27.59480956901105],[-51.563509617778415,-27.594977556358298],[-51.563484344500324,-27.625860453692134],[-51.500882434680506,-27.62586045369211],[-51.50094561787572,-27.667535190923896],[-51.43936727581839,-27.667501615740118],[-51.439544188765,-27.709317103607006],[-51.37596925773886,-27.70949610256912],[-51.376007167655985,-27.750892905814947],[-51.31349371430947,-27.750904088992016],[-51.313455804392355,-27.792531093204254],[-51.18846680761643,-27.792508735404642],[-51.1884794442555,-27.875860156488773],[-51.12597862754804,-27.875860156488773],[-51.12596599090898,-27.91751742532308],[-51.06347781084055,-27.91749509328296],[-51.06346517420149,-27.959192137382583],[-51.000951720854985,-28.00086192326361],[-50.93850145070369,-28.00086192326361],[-50.93848881406464,-28.16754693055966],[-50.813461907371625,-28.167524650369067],[-50.813449270732576,-28.292532475134653],[-50.750961090664134,-28.29251022102188],[-50.68844763731762,-28.334184014870516],[-50.68848554723476,-28.417538143267095],[-50.625997367166335,-28.4175159153423],[-50.56352182373695,-28.44094155830843],[-50.43848228040489,-28.44050820876798],[-50.438469643765856,-28.459173964550686],[-50.37596882705837,-28.459207293310225],[-50.37598146369743,-28.475537121198975],[-50.188441103657894,-28.474537408344325],[-50.188491650214054,-28.51143164845026],[-50.12398160789872,-28.51104300453612],[-50.124019517815846,-28.5008600237691],[-49.87597493003768,-28.500848918564397],[-49.876012839954804,-28.514196530962266],[-49.813474113330216,-28.513685754912284],[-49.813474113330194,-28.58255155550104],[-49.830028110476746,-28.582507169109398],[-49.829510008275975,-28.625974659050915],[-49.87589911020343,-28.66572089511971],[-50.0010018367307,-28.749145575544063],[-50.00100183673066,-29.04083327722487],[-50.03318735637359,-29.04081118145324],[-50.0321890618892,-29.147114336184],[-50.12601610678465,-29.14774341401082],[-50.12597819686752,-29.165786374753505],[-50.13612541801917,-29.16580844371222],[-50.18850428685308,-29.19622599157441],[-50.18850428685309,-29.31905095330294],[-50.14220364139895,-29.31873143173735],[-50.14207727500852,-29.334221566678927],[-50.126003470145626,-29.334177501353437],[-50.125990833506584,-29.362375414604447],[-49.99905579431803,-29.361527388076844],[-49.99904315767897,-29.24030824385708],[-49.9384757467451,-29.239856157941617],[-49.93851365666223,-29.25087104871457],[-49.87601283995477,-29.25087104871457],[-49.876000203315726,-29.300979886173586],[-49.82262303999743,-29.30051704853271],[-49.82226921410422,-29.3341885176866],[-49.81347411333018,-29.334221566678927],[-49.81353729652554,-29.34109552421944],[-49.6865390741418,-29.339905833968423],[-49.6865138008637,-29.29254930022262],[-49.62398771087813,-29.292516237731153],[-49.6239750742391,-29.2508489980658],[-49.56148689417066,-29.2508269474122],[-49.561448984253516,-29.167485670694504],[-49.49901135074126,-29.167463602096316],[-49.49902398738031,-29.0841871105079],[-49.43649789739473,-29.084176067267432],[-49.43651053403379,-29.04251254202398],[-49.374047627243456,-29.04247939890416],[-49.37402235396536,-28.959201357408347],[-49.31153417389693,-28.959168187563616],[-49.311521537257896,-28.9174874156231],[-49.248982810633294,-28.917498476687246],[-49.24897017399424,-28.875823083095714],[-49.18654517712104,-28.875845214103762],[-49.18653254048198,-28.83414203544581],[-49.12401908713548,-28.834175245265325],[-49.12400645049644,-28.79249965988945],[-49.06149299714994,-28.79246643678005],[-49.06145508723281,-28.750840644227264],[-48.99903009035959,-28.75085172301705],[-48.999030090359604,-28.709187170256886],[-48.936579820208316,-28.709176087050047],[-48.936579820208316,-28.667517104639387],[-48.87405373022276,-28.667506017020735],[-48.874041093583735,-28.625852646864526],[-48.74911528000304,-28.625852646864555],[-48.749115280003025,-28.54254072237745],[-48.68656391673939,-28.54252962156217],[-48.68657655337841,-28.33417289217185],[-48.62407573667094,-28.334161769471883],[-48.62406310003189,-28.08417545272023],[-48.561600193241524,-28.08417545272023],[-48.56158755660246,-27.959192137382715],[-48.49904882997788,-27.959158652239882],[-48.49903619333884,-27.915809010935423],[-48.56157491996342,-27.915797844739515],[-48.561600193241524,-27.875837815851458],[-48.4990235566998,-27.875860156488873],[-48.49902355669978,-27.834220385416636],[-48.4365732865485,-27.83417568697334],[-48.43661119646565,-27.62582686571355],[-48.374059833202004,-27.625849257700484],[-48.374047196562984,-27.50086437943969],[-48.3115716531336,-27.50086437943969],[-48.311533743216444,-27.24913190347051],[-48.43657328654852,-27.24913190347051],[-48.4365353766314,-27.209164408055255],[-48.374021923284864,-27.20919812297907],[-48.37404719656297,-27.16579857825554],[-48.43656064990947,-27.16579857825554],[-48.43656064990947,-27.12414792965919],[-48.49906146661692,-27.124125435915495],[-48.49907031973662,-27.086668577138795],[-48.500216139509774,-27.08666004891293],[-48.5003124938822,-27.082470514310543],[-48.561600193241524,-27.082481765368538],[-48.56158755660248,-27.04252214011793],[-48.49906146661693,-27.04252214011793],[-48.49906146661693,-26.999125473627824],[-48.56156228332439,-26.999125473627824],[-48.56157491996343,-26.915786222397905],[-48.62488448156965,-26.916236931410996]]],"terms_url":"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf","terms_text":"Sistema de Informações Geográficas - Governo de Santa Catarina"},{"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","scaleExtent":[11,20],"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,"description":"5 cm resolution bald image of 4 settlement"},{"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","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-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 3.0"},{"id":"South-Tyrol-Orthofoto2011-20cm","name":"South Tyrol Orthofoto 2011 (highres)","type":"wms","template":"http://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","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","description":"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{"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":"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","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":"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2008-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","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":"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","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":"https://mapproxy.osm.ch/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":"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,21],"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","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","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,"description":"Inner part of Szeged"},{"id":"teotonio_vilela","name":"Teotonio Vilela AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.31163860301,-9.95467712399],[-36.31157895645,-9.94381824983],[-36.31144972224,-9.93197001342],[-36.31127078257,-9.92436145686],[-36.31123101819,-9.91847621012],[-36.31119125382,-9.91637081332],[-36.31140995787,-9.91323717443],[-36.31110178398,-9.90922215583],[-36.3110819018,-9.90317994983],[-36.31099243196,-9.8937883586],[-36.31089302103,-9.88420062824],[-36.31078366901,-9.87412292696],[-36.31068425808,-9.86457379995],[-36.33179913972,-9.86431915278],[-36.34001048258,-9.8643681234],[-36.34780429953,-9.86425059389],[-36.35916696889,-9.86420162324],[-36.37046999169,-9.86404491714],[-36.38447699181,-9.86385882853],[-36.40163531841,-9.86364335739],[-36.40221190181,-9.92250090776],[-36.40249025242,-9.9317741712],[-36.40258966335,-9.94183051783],[-36.40248031132,-9.94803846834],[-36.402659251,-9.95369797972],[-36.38550092439,-9.95384485155],[-36.38282677036,-9.95392318316],[-36.37095710525,-9.95399172331],[-36.36231829539,-9.95422671799],[-36.34746630237,-9.95421692655],[-36.33287277777,-9.9544617125],[-36.32909516241,-9.95455962683],[-36.32089376064,-9.95458900112],[-36.31163860301,-9.95467712399]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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/","terms_text":"Texas Natural Resources Information System"},{"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","endDate":"2017-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","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":"tirol.gv.at-contourlines","name":"Tiris: contour lines","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien 20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","scaleExtent":[15,22],"polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-DGM","name":"Tiris: DGM (Terrain model)","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-DOM","name":"Tiris: DOM (Surface model)","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-orthofoto","name":"Tiris: orthophoto","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"id":"tirol.gv.at-orthofoto-cir","name":"Tiris: orthophoto infrared","type":"wms","template":"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[10.4399766,47.5976781],[10.4788646,47.5992486],[10.5027725,47.5865589],[10.4837986,47.5597936],[10.513122,47.5434951],[10.5717689,47.5458237],[10.570044,47.5621216],[10.6010923,47.5807415],[10.6390403,47.5691048],[10.7080366,47.5702686],[10.7114864,47.5493166],[10.7684083,47.5504808],[10.7856574,47.5260267],[10.8960515,47.5504808],[10.9357244,47.5236971],[10.9339995,47.5050569],[10.8908768,47.4957344],[10.9512486,47.4910724],[10.9546984,47.4677567],[11.0029958,47.4327637],[10.9909215,47.4082547],[11.1030405,47.4047525],[11.1151148,47.4199271],[11.2099847,47.4455971],[11.2686316,47.4409308],[11.2669067,47.4105894],[11.2945052,47.4420974],[11.3307283,47.4607599],[11.3824755,47.4584275],[11.3704012,47.4759184],[11.4393975,47.5306855],[11.466996,47.5178728],[11.5739403,47.5236971],[11.5756652,47.5586296],[11.598089,47.5912123],[11.6343121,47.6063331],[11.6688102,47.5947021],[11.7930036,47.602844],[11.8395761,47.5923756],[11.8499255,47.6109847],[12.0068922,47.6365615],[12.0362156,47.6249373],[12.0776134,47.6272623],[12.1086617,47.6191242],[12.1949071,47.6226121],[12.1535093,47.6876775],[12.158684,47.7166984],[12.1811078,47.7120562],[12.2190558,47.7248214],[12.2414796,47.7538216],[12.272528,47.7515022],[12.2846023,47.7317829],[12.2656283,47.695805],[12.3363495,47.7108955],[12.3760224,47.695805],[12.4432938,47.7027704],[12.4536433,47.692322],[12.4536433,47.6749032],[12.5105652,47.6319121],[12.5312641,47.6458591],[12.589911,47.6342369],[12.5795615,47.6109847],[12.6658069,47.5947021],[12.6796062,47.5749235],[12.645108,47.5504808],[12.6675318,47.5318501],[12.6847809,47.5038917],[12.7123795,47.4817474],[12.6675318,47.4560949],[12.6416582,47.4595937],[12.6502828,47.443264],[12.6209593,47.4070873],[12.5743868,47.3860701],[12.5502381,47.3965797],[12.4915913,47.3720539],[12.5088403,47.3510227],[12.4881414,47.3206295],[12.4346693,47.322968],[12.4139704,47.3042567],[12.3639481,47.3089351],[12.3122008,47.3276449],[12.2708031,47.298408],[12.177658,47.2937286],[12.1483346,47.2843686],[12.1172863,47.2995778],[12.0983123,47.2750069],[12.1259108,47.2504245],[12.0965874,47.1977096],[12.1103866,47.1484618],[12.141435,47.109735],[12.1379852,47.0897738],[12.1500595,47.0756791],[12.0051672,47.0439523],[11.9206468,47.0298454],[11.8309516,46.9910324],[11.7878289,46.9863258],[11.7740296,46.9674955],[11.7309069,46.9651413],[11.7067582,46.9898558],[11.6429366,46.994562],[11.6118883,47.0051495],[11.5325425,46.9780884],[11.4928696,47.0086782],[11.4445722,46.9674955],[11.4048993,46.9616097],[11.3445276,46.9863258],[11.2030851,46.9569006],[11.1754866,46.9616097],[11.1772115,46.9439484],[11.1461632,46.922747],[11.1254643,46.922747],[11.1082152,46.9038944],[11.1151148,46.8885717],[11.0823416,46.853195],[11.0961408,46.8236966],[11.0512932,46.8024477],[11.0236947,46.762288],[10.9184753,46.7705586],[10.8839772,46.7575613],[10.8408545,46.7729214],[10.8236054,46.7693772],[10.7908322,46.7894581],[10.756334,46.778828],[10.7252857,46.7906391],[10.7477095,46.8272372],[10.6942373,46.8449371],[10.6735384,46.869707],[10.6079919,46.853195],[10.5545198,46.8272372],[10.5200216,46.8390378],[10.4682744,46.8366779],[10.4510253,46.8814982],[10.475174,46.9321709],[10.4130773,46.9557232],[10.3941034,46.9886791],[10.3665048,46.9804421],[10.3389063,46.9474811],[10.3285569,46.9180345],[10.2975085,46.9133215],[10.2595605,46.9251032],[10.2388617,46.8626311],[10.1664155,46.8390378],[10.1353672,46.8472966],[10.1319174,46.8720655],[10.1060438,46.886214],[10.0922445,46.9274592],[10.1250177,46.952191],[10.1457166,47.0004442],[10.1129434,47.0251423],[10.1526163,47.0498291],[10.1301925,47.0627556],[10.1336423,47.0909482],[10.1595159,47.126168],[10.2009137,47.1425959],[10.1922891,47.2000536],[10.2095382,47.2129438],[10.1871144,47.2398857],[10.2009137,47.2562785],[10.1681404,47.2633024],[10.1681404,47.2808581],[10.2026386,47.2913887],[10.2440364,47.2890488],[10.3337316,47.3206295],[10.3889286,47.3907413],[10.4148022,47.3942444],[10.4562,47.436264],[10.4475755,47.4817474],[10.419977,47.5050569],[10.4424008,47.5551374],[10.4130773,47.5714324],[10.4399766,47.5976781]],[[12.401896,47.1601916],[12.3570484,47.1390761],[12.3501488,47.1120829],[12.3104759,47.107387],[12.2552789,47.0721548],[12.2138811,47.0592305],[12.2000818,47.0263181],[12.1448848,47.0310212],[12.1155613,47.007502],[12.1362602,46.9592552],[12.1673086,46.9357044],[12.1431599,46.9109649],[12.1897324,46.9003588],[12.2173309,46.8661692],[12.2552789,46.8838562],[12.2742529,46.8826772],[12.2984016,46.8343179],[12.2759778,46.8201557],[12.2794276,46.7776467],[12.3501488,46.77174],[12.3811972,46.7150029],[12.4432938,46.6842454],[12.5140151,46.6700437],[12.5657623,46.6487342],[12.6295839,46.6534704],[12.70203,46.6534704],[12.7037549,46.6984434],[12.7296285,46.7008093],[12.7227289,46.7374685],[12.8020747,46.7492887],[12.8538219,46.744561],[12.9038442,46.77174],[12.9279929,46.7599247],[12.9573164,46.7764654],[12.9797402,46.7977246],[12.8952197,46.8331378],[12.8952197,46.8484763],[12.8451974,46.8638104],[12.8469223,46.9156781],[12.7968999,46.930993],[12.7882754,46.9474811],[12.7486025,46.9686726],[12.7365282,46.9969149],[12.7813758,47.0416014],[12.7624018,47.0510043],[12.7141044,47.0451277],[12.7106545,47.0780285],[12.6226842,47.126168],[12.5692121,47.1414227],[12.551963,47.1332091],[12.5260894,47.154327],[12.4829667,47.1648828],[12.4605429,47.1484618],[12.4346693,47.1578459],[12.4191451,47.1437691],[12.401896,47.1601916]]],"terms_text":"tiris.tirol.gv.at","icon":"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{"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":"Torokbalint-orthophoto-2013","name":"Törökbálint orthophoto 2013","type":"wms","template":"http://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true","projection":"EPSG:3857","startDate":"2013-09-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://www.torokbalint.hu/","terms_text":"Törökbálint","description":"5 cm resolution bald image"},{"id":"Torokbalint-orthophoto-2015","name":"Törökbálint orthophoto 2015","type":"wms","template":"http://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true","projection":"EPSG:3857","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[18.9173064,47.4085354],[18.9169121,47.4084901],[18.9160618,47.4088477],[18.9156514,47.4090528],[18.9145812,47.4093813],[18.913849,47.4097008],[18.9137605,47.4097607],[18.9131436,47.4103815],[18.9122048,47.4109805],[18.9104104,47.4117465],[18.9093161,47.4125778],[18.9084095,47.4131731],[18.9067599,47.4144328],[18.90481,47.4156797],[18.9036191,47.4159737],[18.9031738,47.4161643],[18.9006203,47.417422],[18.9004192,47.4175527],[18.8996789,47.4179738],[18.8988796,47.4181843],[18.898142,47.4183495],[18.897517,47.4185509],[18.896656,47.4190083],[18.8958004,47.4195436],[18.8942072,47.4205001],[18.8905513,47.4220862],[18.8874319,47.4233166],[18.8855383,47.4242421],[18.8843554,47.4247611],[18.8818851,47.4255287],[18.8808498,47.4259805],[18.8801014,47.4262872],[18.879557,47.4264922],[18.8774098,47.4273787],[18.8760151,47.4278868],[18.8750763,47.4283585],[18.8728072,47.4293384],[18.8716377,47.4296795],[18.8713963,47.4300061],[18.8725872,47.4323032],[18.8727321,47.4327822],[18.8727374,47.4332431],[18.872437,47.4348216],[18.8720562,47.4352642],[18.8689126,47.4371221],[18.8656135,47.4374994],[18.864664,47.4377353],[18.8640364,47.4380909],[18.8637762,47.4379113],[18.8634034,47.4378423],[18.8630037,47.437982],[18.8519503,47.4471521],[18.8521703,47.4484689],[18.8592969,47.4538685],[18.8583876,47.4551181],[18.857768,47.4556839],[18.8571779,47.4559977],[18.8571967,47.456355],[18.860151,47.4583903],[18.8619415,47.4594978],[18.8609867,47.4607128],[18.8597904,47.4620076],[18.8592862,47.4623594],[18.8585941,47.4627221],[18.8571297,47.4633313],[18.8563411,47.4636033],[18.8562821,47.4640277],[18.857194,47.4652825],[18.8566254,47.4655073],[18.8565288,47.4658047],[18.8569285,47.4665563],[18.8583635,47.4695253],[18.8582641,47.4698029],[18.8582669,47.4699079],[18.8583834,47.4701931],[18.8584438,47.4702729],[18.8585189,47.4703264],[18.8586221,47.4703609],[18.8587348,47.4703763],[18.8589011,47.4703609],[18.8614614,47.469732],[18.8627677,47.469286],[18.8661674,47.4678491],[18.8679403,47.4665581],[18.8699654,47.4652435],[18.8708009,47.4645698],[18.8726784,47.4633259],[18.8753606,47.4611281],[18.8768734,47.4592711],[18.8894261,47.4598659],[18.8902415,47.4598804],[18.9037116,47.4553357],[18.9042733,47.455203],[18.9049332,47.4550579],[18.9054213,47.4551014],[18.9056735,47.4550543],[18.9062877,47.4547659],[18.9064835,47.4545301],[18.9065968,47.4544712],[18.9067819,47.454395],[18.9081149,47.4539888],[18.9083731,47.4539507],[18.9089048,47.4538437],[18.9095419,47.4536959],[18.9132587,47.4531717],[18.9135296,47.4532043],[18.9137201,47.4531717],[18.9138649,47.4530738],[18.9143117,47.4529381],[18.9159773,47.4529961],[18.9180668,47.4531666],[18.9184637,47.4529997],[18.9190324,47.4516141],[18.9217253,47.4508015],[18.9224602,47.450689],[18.9241768,47.4502537],[18.9275564,47.4498946],[18.9297237,47.4495064],[18.9322127,47.4492199],[18.9334694,47.4493242],[18.9392093,47.4493532],[18.9422885,47.4490339],[18.945491,47.4488961],[18.9482617,47.4487002],[18.9500347,47.4482413],[18.954699,47.4472183],[18.9574899,47.4469162],[18.958025,47.4471475],[18.9584434,47.4470822],[18.9587666,47.4466623],[18.9614488,47.4393046],[18.9636804,47.4357995],[18.9659764,47.432882],[18.9689912,47.4296958],[18.9701003,47.4270366],[18.9700922,47.4267935],[18.9669541,47.424605],[18.9573531,47.4184193],[18.9567603,47.4184012],[18.9560576,47.418129],[18.9538513,47.4173936],[18.9514447,47.4166549],[18.9513133,47.4166426],[18.9326981,47.4170333],[18.9325733,47.4169625],[18.9320101,47.4167393],[18.9314857,47.4163972],[18.9311357,47.4161158],[18.9212291,47.4109106],[18.9195742,47.4098705],[18.9192684,47.4096109],[18.9173064,47.4085354]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true,"description":"5 cm resolution bald image"},{"id":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2007-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","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":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","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":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","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":"wms","template":"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","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":"https://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.7751199,47.3298327],[0.7742685,47.356166],[0.7705338,47.3561106],[0.7702424,47.3651192],[0.7739772,47.3651747],[0.7728024,47.4014836],[0.7903977,47.4014691],[0.7898827,47.4102988],[0.7911702,47.410473],[0.7910844,47.4194174],[0.7939168,47.4194174],[0.7931872,47.4373306],[0.7983371,47.4374177],[0.7980796,47.4554408],[0.8004399,47.4554118],[0.8013841,47.4642615],[0.8007403,47.4689904],[0.7939597,47.4733127],[0.7840463,47.4732257],[0.7838746,47.4787079],[0.776064,47.4785919],[0.7758494,47.4820434],[0.7706567,47.4821884],[0.7704421,47.4859006],[0.7609578,47.4909176],[0.7571813,47.4909176],[0.737526,47.5033563],[0.725896,47.5058785],[0.7111331,47.5057626],[0.7041808,47.5040811],[0.6910916,47.5003846],[0.6904479,47.4971808],[0.6775733,47.4968329],[0.6775733,47.4935273],[0.6642695,47.4930054],[0.6634971,47.4895256],[0.6508799,47.4895836],[0.6513306,47.4803177],[0.6473394,47.4803032],[0.6474682,47.4785194],[0.6447431,47.4784614],[0.644786,47.4757493],[0.6423827,47.4757783],[0.642254,47.4730226],[0.6383487,47.4729356],[0.6379195,47.4713111],[0.6051322,47.470789],[0.6051322,47.4663213],[0.5985232,47.4660312],[0.5987807,47.4615632],[0.5920001,47.4615632],[0.5922576,47.4597643],[0.5808421,47.4597062],[0.5800696,47.4614471],[0.5723449,47.4613891],[0.5722161,47.4651173],[0.5587407,47.4648852],[0.5465957,47.4605187],[0.5326911,47.4535546],[0.5267688,47.4531483],[0.5267688,47.4515233],[0.5223056,47.4512331],[0.5225631,47.4480407],[0.5197736,47.447765],[0.520074,47.4424682],[0.4975005,47.4415975],[0.4971572,47.4404945],[0.4935523,47.4401462],[0.4935523,47.435734],[0.4794331,47.4357485],[0.4617091,47.428186],[0.4564305,47.4208838],[0.4548856,47.4122882],[0.4550572,47.4021807],[0.4614945,47.4019338],[0.4616662,47.3964145],[0.4687901,47.3960224],[0.4701634,47.3517307],[0.4567738,47.3514981],[0.4572888,47.3425422],[0.430853,47.3419606],[0.431958,47.3060196],[0.4715367,47.3067035],[0.4725667,47.2800414],[0.4852696,47.2800414],[0.4857846,47.2708404],[0.4993459,47.2710734],[0.4991742,47.2624533],[0.5527326,47.2630358],[0.5522176,47.2720052],[0.5656072,47.2722381],[0.5652638,47.2815553],[0.5911847,47.2815553],[0.5906697,47.2909873],[0.669119,47.2916859],[0.6831952,47.2956444],[0.6831952,47.3007668],[0.6965848,47.3012324],[0.6964131,47.3023965],[0.7100602,47.3024547],[0.7229348,47.3058887],[0.722849,47.3104281],[0.7416459,47.3108355],[0.754263,47.3139197],[0.7625028,47.318153],[0.7620736,47.3201313],[0.7661935,47.3200877],[0.7695623,47.3220659],[0.7723304,47.3250768],[0.7733603,47.3266985],[0.7751199,47.3298327]]],"terms_url":"https://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":"https://mapproxy.osm.ch/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":"uniao_dos_palmares","name":"União dos Palmares AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-35.97724708197,-9.20751562713],[-35.97719915169,-9.19398393291],[-35.97694352353,-9.19052995603],[-35.97678375594,-9.18606654789],[-35.97702340733,-9.18207624495],[-35.97703938409,-9.17967888719],[-35.97681570946,-9.17734460222],[-35.9766399651,-9.17516802537],[-35.97700743057,-9.17518379771],[-35.97695950029,-9.17070442381],[-35.97673582566,-9.17065710618],[-35.97660801158,-9.16644581169],[-35.97617663907,-9.16221869434],[-35.97609675527,-9.1602628469],[-35.97660801158,-9.1602628469],[-35.9767198489,-9.14608263113],[-35.97654410454,-9.1412243182],[-35.97665594186,-9.13319533758],[-35.97652812778,-9.12183772804],[-35.9764801975,-9.11748388185],[-35.98617809061,-9.11754698145],[-35.9894693031,-9.1173261328],[-36.00560583036,-9.1173261328],[-36.01859493596,-9.11735768262],[-36.04601105553,-9.11721570843],[-36.06734002967,-9.11697908465],[-36.0675637043,-9.16133540973],[-36.06770749514,-9.16404834833],[-36.06745186698,-9.164079894],[-36.0675637043,-9.16657199353],[-36.06777140218,-9.16654044807],[-36.06797910005,-9.20701095785],[-36.04979754756,-9.2071055834],[-36.04671403295,-9.206979416],[-36.02941120224,-9.20708981247],[-36.0135462799,-9.207184438],[-35.99317591134,-9.20732637623],[-35.97724708197,-9.20751562713]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"id":"UrbISOrtho2016","name":"UrbIS-Ortho 2016","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows/?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","endDate":"2017-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbISOrtho2017","name":"UrbIS-Ortho 2017","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Urbis:Ortho2017/https://geoservices-urbis.irisnet.be/geoserver/ows","endDate":"2018-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbisAdmFR","name":"UrbisAdm FR","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"UrbisAdmNL","name":"UrbisAdm NL","type":"wms","template":"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"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":"USSR-Latvia","name":"USSR - Latvia","type":"wms","template":"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[26.630859375,57.56888774130087],[25.169677734375,58.048818457936505],[22.543945312499996,57.76865857271793],[21.544189453124996,57.53351974347291],[21.016845703125,56.81892067431724],[21.016845703125,56.03522578369872],[22.03857421875,56.389583525613055],[24.719238281249996,56.33481154165235],[26.751708984375,55.665193184436035],[28.19091796875,56.139428693863266],[27.784423828125,57.40946113558119],[26.630859375,57.56888774130087]]]},{"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":"https://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"id":"Vercors-Orthophotos-1999","name":"Vercors (Réserve naturelle des Hauts-Plateaux du Vercors) - Orthophoto - 1999 - 1 m","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}","endDate":"1999-01-01T00:00:00.000Z","startDate":"1999-01-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[5.4356493,44.9991755],[5.4319266,44.9229046],[5.4362415,44.9228447],[5.4347186,44.8900063],[5.4330265,44.8899463],[5.4306544,44.8502562],[5.4338694,44.8501362],[5.4328541,44.8263781],[5.435477,44.8262581],[5.4349693,44.8138952],[5.4410611,44.8137151],[5.4371691,44.7409842],[5.4545983,44.7404433],[5.4528215,44.7042536],[5.5210998,44.7024496],[5.5232996,44.7385803],[5.5890397,44.7368374],[5.5929812,44.8126305],[5.5879047,44.8129906],[5.5897661,44.8494722],[5.588228,44.8493765],[5.5897237,44.8735055],[5.5386318,44.8750318],[5.5394694,44.886859],[5.5283416,44.8873253],[5.5300168,44.9201234],[5.5331876,44.9201234],[5.5376148,44.996241],[5.4356493,44.9991755]]],"terms_text":"Parc Naturel du Vercors"},{"id":"vicosa_al","name":"Viçosa AL","type":"wms","template":"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[-36.19799506289,-9.42067411388],[-36.19777392167,-9.41788790418],[-36.19779919496,-9.41528243495],[-36.19801401785,-9.41074463302],[-36.19789396976,-9.4085692096],[-36.19792556136,-9.40636883904],[-36.1979697896,-9.40560836777],[-36.19793187968,-9.40405001978],[-36.19798874457,-9.40311500762],[-36.19827306898,-9.40027878861],[-36.19829202394,-9.39495536094],[-36.19788765144,-9.39168895497],[-36.19844366363,-9.38932016801],[-36.19836784379,-9.3862033184],[-36.197938198,-9.38166513525],[-36.19801401785,-9.37972018144],[-36.1983425705,-9.37867289409],[-36.19831729722,-9.37697727931],[-36.19816565754,-9.37585517674],[-36.19851948347,-9.37139166614],[-36.1982162041,-9.36238966295],[-36.1986205766,-9.35318792839],[-36.19849421019,-9.35096850339],[-36.19857003004,-9.34852462578],[-36.19879748957,-9.34667923744],[-36.19859530332,-9.34348719127],[-36.19877221629,-9.34084375588],[-36.19894912926,-9.33301308429],[-36.19877221629,-9.33039450836],[-36.28957911612,-9.33114267492],[-36.28937692987,-9.33318765532],[-36.28950329627,-9.33538225508],[-36.28925056346,-9.34124276628],[-36.28945274971,-9.34291361737],[-36.28927583674,-9.34520790729],[-36.28897255737,-9.37311224406],[-36.28914947033,-9.37480787773],[-36.2889220108,-9.37707702159],[-36.28889673752,-9.38540540039],[-36.28871982455,-9.38632799292],[-36.28871982455,-9.39343436657],[-36.28887146424,-9.39557871736],[-36.28877037111,-9.40128860991],[-36.28861873143,-9.40652467311],[-36.28871982455,-9.40714800869],[-36.28877037111,-9.4213348225],[-36.19799506289,-9.42067411388]]],"terms_url":"http://www.seplande.al.gov.br/","terms_text":"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{"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"},{"id":"vogis.cnv.at-DGM","name":"VoGIS: DGM (Terrain model)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[9.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-DOM","name":"VoGIS: DOM (Surface model)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","polygon":[[[9.9680512,47.5463081],[9.9680895,47.5462689],[9.9712464,47.544249],[9.9648355,47.538031],[9.9683952,47.5280172],[9.965262,47.5208928],[9.9956949,47.5027787],[9.9873585,47.4984652],[10.0007641,47.4821056],[10.023014,47.4841071],[10.0374328,47.4891775],[10.0447745,47.4876222],[10.0541256,47.4758854],[10.0534684,47.4668571],[10.064681,47.4636357],[10.0699906,47.4559503],[10.0805676,47.4553604],[10.0885672,47.4602924],[10.091638,47.4589276],[10.0938486,47.4404644],[10.1055856,47.4287167],[10.0937374,47.4168811],[10.07418,47.4147226],[10.0691405,47.410176],[10.0862396,47.3995221],[10.0828437,47.3938062],[10.0998387,47.3547604],[10.1193354,47.375613],[10.1416871,47.36718],[10.1658749,47.3688749],[10.1695804,47.3712997],[10.1693975,47.3858299],[10.1813043,47.3872516],[10.181849,47.3924258],[10.1950843,47.3893456],[10.1998763,47.3833352],[10.2125912,47.3803897],[10.227051,47.388895],[10.2361856,47.3819213],[10.2316784,47.3789694],[10.2371623,47.3735651],[10.2169885,47.3543552],[10.2171047,47.3498849],[10.2042369,47.3367531],[10.2074173,47.3323161],[10.1995092,47.3264601],[10.2111311,47.3189838],[10.2159718,47.311064],[10.2123593,47.3112242],[10.1991314,47.2975423],[10.1896365,47.2939449],[10.1796106,47.2960256],[10.172077,47.2790762],[10.1740416,47.2702482],[10.1783421,47.2701114],[10.174493,47.263697],[10.218842,47.255327],[10.223433,47.249833],[10.210873,47.247805],[10.1977606,47.236662],[10.207913,47.232802],[10.214282,47.216842],[10.21269,47.204315],[10.1996265,47.195388],[10.1995066,47.1852535],[10.2115119,47.1712368],[10.2091987,47.1653713],[10.20851,47.159483],[10.213206,47.1576984],[10.222203,47.15323],[10.2216565,47.1492513],[10.214808,47.143515],[10.203327,47.142152],[10.208868,47.131643],[10.186295,47.12886],[10.186525,47.119455],[10.172877,47.120333],[10.162993,47.113607],[10.157657,47.114262],[10.154415,47.105778],[10.132428,47.081218],[10.1345877,47.0639183],[10.1508456,47.0618412],[10.156932,47.048827],[10.1441816,47.0335527],[10.1232555,47.0220943],[10.1328399,47.0120428],[10.1544702,47.0054497],[10.159614,46.9988153],[10.1544222,46.9929855],[10.1600074,46.9839969],[10.1446293,46.9830135],[10.1349173,46.9658398],[10.1350134,46.9548285],[10.1268364,46.9434986],[10.0977188,46.9267603],[10.0995372,46.9171215],[10.1092134,46.908337],[10.1090833,46.8943061],[10.1249668,46.8801373],[10.1414741,46.8746789],[10.1396666,46.8621658],[10.1450621,46.8510986],[10.1394105,46.8473781],[10.1230851,46.8484838],[10.1191237,46.8441698],[10.1051833,46.8408981],[10.0919546,46.851426],[10.0926536,46.8581775],[10.087123,46.861277],[10.0548814,46.8617049],[10.0508964,46.8644202],[10.0519245,46.8740502],[10.0389144,46.8861128],[10.0322055,46.8880172],[10.0178184,46.9016148],[10.0049435,46.8988926],[9.9824336,46.9061986],[9.9779314,46.9160343],[9.9665663,46.9122226],[9.9590704,46.9160246],[9.946121,46.9123495],[9.9375809,46.9132426],[9.9215303,46.918824],[9.9123097,46.9260554],[9.9063207,46.9253006],[9.8944853,46.9316447],[9.8761296,46.9346278],[9.8807063,46.9401115],[9.8765706,46.9407057],[9.8748781,46.9503903],[9.8787197,46.9570665],[9.8707312,46.9632091],[9.8848165,46.9854648],[9.8923039,46.9903589],[9.8887771,47.0007231],[9.870696,47.0096514],[9.8711507,47.0130577],[9.8803497,47.0172237],[9.8777935,47.0205525],[9.8597449,47.0232098],[9.8527287,47.0164129],[9.8361195,47.012531],[9.8235302,47.0198587],[9.8075641,47.0235627],[9.7849142,47.0384853],[9.7480774,47.0369227],[9.7418488,47.042675],[9.718211,47.0433745],[9.7070102,47.0480458],[9.7075964,47.0538077],[9.69756,47.0523884],[9.6839177,47.0576471],[9.6818398,47.0620979],[9.6774319,47.061409],[9.6582148,47.0581823],[9.6450573,47.059775],[9.6415752,47.0559826],[9.6365412,47.051703],[9.6263272,47.0513274],[9.6070544,47.0607725],[9.6133977,47.0694958],[9.6115341,47.0794024],[9.6186894,47.0781689],[9.6233873,47.0825788],[9.6334608,47.0834395],[9.6356428,47.0955277],[9.6285845,47.1075584],[9.6208286,47.1103155],[9.6350298,47.1281316],[9.6246665,47.1326485],[9.6225823,47.1413535],[9.6258673,47.1458981],[9.6205943,47.1516392],[9.6089021,47.1477494],[9.5967871,47.1629415],[9.5794635,47.1711566],[9.5645583,47.1702904],[9.5730168,47.1755955],[9.5725939,47.1907921],[9.5803175,47.1957775],[9.5847667,47.2053225],[9.5687023,47.2196758],[9.5585129,47.2241649],[9.5517611,47.2237671],[9.5667871,47.2428808],[9.5307265,47.2705781],[9.5461876,47.2800507],[9.556344,47.2982863],[9.588051,47.3173029],[9.5996599,47.3454983],[9.6107327,47.355706],[9.6244598,47.3661451],[9.6587582,47.369461],[9.6725468,47.3802057],[9.673111,47.3919406],[9.6516178,47.404626],[9.6455139,47.4311951],[9.6451212,47.4378008],[9.6579866,47.4477909],[9.6589756,47.4522045],[9.6223413,47.457472],[9.609044,47.4705422],[9.6029186,47.4619769],[9.5951426,47.4633095],[9.5821741,47.4827585],[9.562202,47.4959175],[9.550566,47.5371757],[9.5827036,47.5359236],[9.6046496,47.5295205],[9.7347836,47.5339558],[9.7351711,47.5466141],[9.7416436,47.5549858],[9.7471037,47.5556923],[9.7433711,47.5586655],[9.7520662,47.5674668],[9.7480649,47.5705239],[9.7563218,47.5726206],[9.7563266,47.5796315],[9.7619689,47.5809636],[9.7655314,47.5891166],[9.7693306,47.5873852],[9.7769663,47.5954393],[9.7915143,47.5935211],[9.7999911,47.5961057],[9.81414,47.5880685],[9.8238141,47.5871045],[9.8272819,47.579972],[9.8207906,47.5707624],[9.8256191,47.5592156],[9.8171007,47.5533268],[9.8157872,47.5476661],[9.8502301,47.5416393],[9.8583884,47.5338767],[9.8745052,47.5285372],[9.8780368,47.5387569],[9.8751486,47.543427],[9.8812471,47.5481426],[9.8891039,47.5439867],[9.8993513,47.54475],[9.9066603,47.5421716],[9.913579,47.532546],[9.9218947,47.5296364],[9.9335226,47.5326499],[9.9410791,47.5382227],[9.9636997,47.5347198],[9.9588294,47.5431278],[9.9631795,47.54229],[9.9680512,47.5463081]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-ef2012_12cm","name":"VoGIS: Echtfarbenbild 2012 (12cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2012-01-01T00:00:00.000Z","startDate":"2012-01-01T00:00:00.000Z","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-ef2015_10cm","name":"VoGIS: Echtfarbenbild 2015 (10cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[9.5436683,47.4847893],[9.6145139,47.4505807],[9.6135938,47.3827196],[9.4424603,47.2479843],[9.4461405,47.0959963],[9.4286592,47.0891059],[9.4249789,47.0151345],[9.8528128,47.0019594],[9.8574132,46.898956],[9.9669019,46.889525],[10.0451081,46.849897],[10.1582771,46.833534],[10.1591972,46.8920401],[10.1471804,46.8924787],[10.1511549,46.9433055],[10.1631717,46.9428673],[10.1646986,46.9623816],[10.1785187,46.9668098],[10.1757585,47.1035121],[10.2291227,47.1022595],[10.2208421,47.2436121],[10.2613253,47.4126142],[10.1242344,47.4057648],[10.093872,47.4779493],[10.0046249,47.5071683],[9.9862234,47.5612116],[9.8436121,47.5624533],[9.8408519,47.6071356],[9.539988,47.6065153],[9.5436683,47.4847893]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="},{"id":"vogis.cnv.at-wi2015_20cm","name":"VoGIS: Echtfarbenbild Winter 2015 (20cm)","type":"wms","template":"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}","projection":"EPSG:3857","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","polygon":[[[10.1703925,46.8297883],[10.1710791,46.93644],[10.1841254,46.9411282],[10.1854987,47.1015707],[10.239057,47.104375],[10.2428336,47.1561117],[10.2569098,47.1870362],[10.2455802,47.2759749],[10.2531333,47.323472],[10.2689261,47.3262646],[10.2644629,47.41102],[10.1319403,47.4086966],[10.1343436,47.4610652],[10.1175208,47.4615294],[10.1188941,47.4733659],[10.0873084,47.4742942],[10.0849051,47.5072362],[10.0684256,47.5070043],[10.0673956,47.521497],[10.0234503,47.5242791],[10.000791,47.5794276],[9.8490424,47.5775748],[9.8504157,47.6146181],[9.7275061,47.6127666],[9.7202963,47.5908903],[9.7034735,47.5891536],[9.7031302,47.5449087],[9.6821875,47.5449087],[9.6804709,47.5534826],[9.5639128,47.5493117],[9.5620246,47.5395782],[9.5517249,47.5395782],[9.5517249,47.5340154],[9.5216841,47.5347108],[9.5270056,47.3049672],[9.505033,47.3026391],[9.5009131,47.2336806],[9.5235724,47.2322819],[9.5242591,47.165566],[9.5448584,47.1640488],[9.5438284,47.1544774],[9.5723242,47.1540105],[9.5702643,47.128089],[9.590177,47.128673],[9.5918936,47.1002853],[9.5723242,47.1001685],[9.5771308,47.0286063],[9.7240729,47.0304785],[9.7230429,47.0174892],[9.7745413,47.0156166],[9.776258,47.0055504],[9.7927374,47.0039115],[9.7947974,46.9912671],[9.8387427,46.9931405],[9.840116,46.9034933],[9.8902411,46.9072462],[9.8854346,46.887071],[9.959249,46.8914116],[9.9619956,46.8767458],[10.0001044,46.8786233],[9.9966712,46.857146],[10.0186438,46.8565591],[10.0234503,46.8307278],[10.1703925,46.8297883]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAD1BMVEUAAACEAgT8AgQEAgSEgoTQjzHEAAAAAXRSTlMAQObYZgAAAHJJREFUeF6ljVEKgzAQRCftBUQv0KwXML7cwPvfqQwJtIVqi76fHR7DrKSUJY1DD84xKEVuwcT40C1HC18bqQDTBKWosUZn+VvQ4UTjkoCYWd/Eco9ZLwEWggsNC9CPL3C0UauFz44wFh941Bw0tm1PPAGCUydahBcw6wAAAABJRU5ErkJggg=="}];
23646 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"},"circular":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"circular"},"name":"Traffic Circle","searchable":false},"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":["direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station","searchable":false},"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/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/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 / Terminal","searchable":false},"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/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Station / Terminal","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/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard","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","cattery","dog","horse","kennel","kitten","pet","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","brewery"],"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","payment_multi"],"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","brewery"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator","payment_multi"],"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/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_pooling":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_pooling"},"name":"Car Pooling"},"amenity/car_rental":{"icon":"car","fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","payment_multi","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","payment_multi"],"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","payment_multi"],"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/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","fuel_multi","opening_hours","payment_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","ref/isil"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/love_hotel":{"icon":"heart","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"love_hotel"},"name":"Love Hotel"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building","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/music_school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["school of music"],"tags":{"amenity":"music_school"},"name":"Music School"},"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":["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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":["kovil","devasthana","mandir","kshetram","alayam","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","opening_hours"],"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","brewery"],"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":"recycling","fields":["name","operator","address","building","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"reference":{"key":"recycling_type","value":"*"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"addTags":{"amenity":"recycling","recycling_type":"container"},"removeTags":{"amenity":"recycling","recycling_type":"container"},"reference":{"key":"amenity","value":"recycling"},"name":"Recycling Container"},"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","religion","denomination"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"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":"poi-shower","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/smoking_area":{"fields":["name","shelter","bin","bench","opening_hours"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"smoking_area"},"name":"Smoking Area"},"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","fields":["operator","phone","fee","payment_multi","covered","indoor"],"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/kerb":{"icon":"wheelchair","fields":["kerb","tactile_paving"],"geometry":["vertex","line"],"tags":{"barrier":"kerb"},"name":"Kerb"},"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/boathouse":{"icon":"harbor","fields":["name","levels","address"],"geometry":["area"],"tags":{"building":"boathouse"},"matchScore":0.5,"terms":[],"name":"Boathouse"},"building/bungalow":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bungalow"},"terms":["home","detached"],"matchScore":0.5,"name":"Bungalow"},"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/civic":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"civic"},"matchScore":0.5,"name":"Civic 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":"suitcase","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/farm_auxiliary":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm_auxiliary"},"matchScore":0.5,"name":"Farm Building"},"building/farm":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm"},"matchScore":0.5,"name":"Farm House"},"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/mosque":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"mosque"},"matchScore":0.5,"name":"Mosque 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/ruins":{"icon":"poi-ruins","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"ruins"},"matchScore":0.5,"name":"Building Ruins"},"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/service":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"service"},"matchScore":0.5,"name":"Service Building"},"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/stadium":{"icon":"stadium","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"stadium"},"matchScore":0.5,"name":"Stadium Building"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/temple":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"temple"},"matchScore":0.5,"name":"Temple Building"},"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/transportation":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"transportation"},"matchScore":0.5,"name":"Transportation Building"},"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"},"matchScore":0.4,"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/chimney_sweeper":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"chimney_sweeper"},"name":"Chimney Sweeper"},"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/sculptor":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculptor"},"name":"Sculptor"},"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/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"},"emergency/water_tank":{"icon":"water","fields":["name","operator","ref"],"geometry":["point","vertex"],"terms":["water tank","cistern","reservoir"],"tags":{"emergency":"water_tank"},"name":"Emergency Water Tank"},"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":"footway","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/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"name":"Bus Stop / Platform","searchable":false},"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_guideway":{"icon":"highway-bus_guideway","fields":["name","operator","oneway"],"geometry":["line"],"tags":{"highway":"bus_guideway"},"addTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"removeTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"terms":[],"name":"Bus Guideway"},"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":"highway","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":["direction_vertex"],"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":["direction_clock"],"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","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_area":{"icon":"poi-foot","fields":["name","surface","lit","width","structure","access"],"geometry":["area"],"tags":{"highway":"pedestrian","area":"yes"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Area"},"highway/pedestrian_line":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line"],"tags":{"highway":"pedestrian"},"terms":["center","centre","plaza","quad","square","walkway"],"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":["direction","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","direction_vertex"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-bulb","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","direction","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"],"fields":["direction"],"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","traffic_signals/direction"],"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","religion","denomination","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/brownfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"brownfield"},"terms":[],"matchScore":0.9,"name":"Brownfield"},"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":"suitcase","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"matchScore":0.9,"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":"Garage Landuse"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/greenfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"greenfield"},"terms":[],"matchScore":0.9,"name":"Greenfield"},"landuse/greenhouse_horticulture":{"icon":"garden","fields":["name","operator"],"geometry":["area"],"terms":["flower","greenhouse","horticulture","grow","vivero"],"tags":{"landuse":"greenhouse_horticulture"},"matchScore":0.9,"name":"Greenhouse Horticulture"},"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/industrial/scrap_yard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"scrap_yard"},"addTags":{"landuse":"industrial","industrial":"scrap_yard"},"removeTags":{"landuse":"industrial","industrial":"scrap_yard"},"reference":{"key":"industrial","value":"scrap_yard"},"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"name":"Scrap Yard"},"landuse/industrial/slaughterhouse":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"slaughterhouse"},"addTags":{"landuse":"industrial","industrial":"slaughterhouse"},"removeTags":{"landuse":"industrial","industrial":"slaughterhouse"},"reference":{"key":"industrial","value":"slaughterhouse"},"terms":["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],"name":"Slaughterhouse"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"icon":"garden","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/religious":{"geometry":["area"],"fields":["name","religion","denomination"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"matchScore":0.9,"name":"Residential Area"},"landuse/retail":{"icon":"commercial","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"matchScore":0.9,"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/amusement_arcade":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pay-to-play games","video games","driving simulators","pinball machines"],"tags":{"leisure":"amusement_arcade"},"name":"Amusement Arcade"},"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/dancing_school":{"icon":"music","fields":["name","operator","address","opening_hours","dance/style"],"geometry":["point","area"],"terms":["jive","swing","tango","waltz","dance teaching"],"tags":{"leisure":"dance","dance:teaching":"yes"},"reference":{"key":"leisure","value":"dance"},"name":"Dance School"},"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":["fitness_station","ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"addTags":{"leisure":"fitness_station","sport":"fitness"},"removeTags":{"leisure":"fitness_station","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"balance_beam"},"addTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["balance","exercise","fitness","gym","trim trail"],"name":"Exercise Balance Beam"},"leisure/fitness_station/box":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"box"},"addTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["box","exercise","fitness","gym","jump","trim trail"],"name":"Exercise Box"},"leisure/fitness_station/horizontal_bar":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_bar"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],"name":"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],"name":"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"hyperextension"},"addTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["back","exercise","extension","fitness","gym","roman chair","trim trail"],"name":"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"parallel_bars"},"addTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","dip","exercise","fitness","gym","trim trail"],"name":"Parallel Bars"},"leisure/fitness_station/push-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"push-up"},"addTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","exercise","fitness","gym","pushup","push up","trim trail"],"name":"Push-Up Station"},"leisure/fitness_station/rings":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"rings"},"addTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],"name":"Exercise Rings"},"leisure/fitness_station/sign":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sign"},"addTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sit-up"},"addTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["crunch","exercise","fitness","gym","situp","sit up","trim trail"],"name":"Sit-Up Station"},"leisure/fitness_station/stairs":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"stairs"},"addTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","steps","trim trail"],"name":"Exercise Stairs"},"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":["name","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/boules":{"icon":"pitch","fields":["boules","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"boules"},"reference":{"key":"sport","value":"boules"},"terms":["bocce","lyonnaise","pétanque"],"name":"Boules/Bocce 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/sauna":{"fields":["name","operator","address","opening_hours","access_simple","fee"],"geometry":["point","area"],"tags":{"leisure":"sauna"},"name":"Sauna"},"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","building","address","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","direction"],"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/monitoring_station":{"icon":"poi-mast","geometry":["point","area"],"fields":["monitoring_multi","operator"],"terms":["weather","earthquake","seismology","air","gps"],"tags":{"man_made":"monitoring_station"},"name":"Monitoring Station"},"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","substance"],"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","direction"],"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","direction"],"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":"suitcase","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/administrative":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"searchable":false,"name":"Administrative Office"},"office/physician":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/adoption_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"advertising_agency"},"terms":["ad","ad agency","advert agency","advertising","marketing"],"name":"Advertising Agency"},"office/architect":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"association"},"terms":["association","non-profit","nonprofit","organization","society"],"name":"Nonprofit Organization Office"},"office/charity":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Corporate Office"},"office/coworking":{"icon":"suitcase","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":"school","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"energy_supplier"},"terms":["electricity","energy company","energy utility","gas utility"],"name":"Energy Supplier Office"},"office/estate_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"town-hall","fields":["name","government","address","building_area","opening_hours"],"geometry":["point","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/government/tax":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["fiscal authorities","revenue office","tax office"],"tags":{"office":"government","government":"tax"},"reference":{"key":"government","value":"tax"},"name":"Tax and Revenue Office"},"office/guide":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"guide"},"terms":["dive guide","mountain guide","tour guide"],"name":"Tour Guide Office"},"office/insurance":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"it"},"terms":["computer","information","software","technology"],"name":"Information Technology Office"},"office/lawyer":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"searchable":false,"name":"Notary Office"},"office/moving_company":{"icon":"warehouse","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"library","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"ngo"},"terms":["ngo","non government","non-government","organization","organisation"],"name":"NGO Office"},"office/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"notary"},"terms":["clerk","deeds","estate","signature","wills"],"name":"Notary Office"},"office/political_party":{"icon":"town-hall","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"private_investigator"},"terms":["PI","private eye","private detective"],"name":"Private Investigator Office"},"office/quango":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"quango"},"terms":["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],"name":"Quasi-NGO Office"},"office/research":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"tax_advisor"},"terms":["tax","tax consultant"],"name":"Tax Advisor Office"},"office/telecommunication":{"icon":"telephone","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"telecommunication"},"terms":["communication","internet","phone","voice"],"name":"Telecom Office"},"office/therapist":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"office":"water_utility"},"terms":["water board","utility"],"name":"Water Utility Office"},"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/islet":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"islet"},"name":"Islet"},"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/plot":{"icon":"triangle-stroked","fields":["name"],"geometry":["point","area"],"tags":{"place":"plot"},"terms":["tract","land","lot","parcel"],"name":"Plot"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"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":"Play 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":"Play 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":{"icon":"poi-power","fields":["substation","operator","building","ref"],"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","ref"],"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","ref"],"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","ref"],"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","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"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":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/switch":{"icon":"poi-power","fields":["switch","operator","location","cables","voltage","ref"],"geometry":["point","vertex","area"],"tags":{"power":"switch"},"name":"Power Switch"},"power/tower":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","fields":["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],"geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/linear_platform_aerialway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","subway":"yes"},"addTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/linear_platform_train":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/linear_platform_tram":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/linear_platform":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/platform_aerialway":{"icon":"aerialway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/platform_bus":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/platform_ferry":{"icon":"ferry","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/platform_light_rail":{"icon":"poi-light-rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/platform_monorail":{"icon":"poi-monorail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/platform_subway":{"icon":"poi-subway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","subway":"yes"},"addTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","subway":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/platform_train":{"icon":"rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/platform_tram":{"icon":"poi-tram","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/platform_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/station_aerialway":{"icon":"aerialway","fields":["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","aerialway":"yes"},"reference":{"key":"aerialway","value":"station"},"terms":["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],"name":"Aerialway Station"},"public_transport/station_bus":{"icon":"bus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","bus":"yes"},"addTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","public transit","public transportation","station","terminal","transit","transportation"],"name":"Bus Station / Terminal"},"public_transport/station_ferry":{"icon":"ferry","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","ferry":"yes"},"addTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"removeTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"reference":{"key":"amenity","value":"ferry_terminal"},"terms":["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],"name":"Ferry Station / Terminal"},"public_transport/station_light_rail":{"icon":"poi-light-rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","light_rail":"yes"},"addTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"removeTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"reference":{"key":"station","value":"light_rail"},"terms":["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],"name":"Light Rail Station"},"public_transport/station_monorail":{"icon":"poi-monorail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","monorail":"yes"},"addTags":{"public_transport":"station","monorail":"yes","railway":"station"},"removeTags":{"public_transport":"station","monorail":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],"name":"Monorail Station"},"public_transport/station_subway":{"icon":"poi-subway","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","subway":"yes"},"addTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"removeTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"reference":{"key":"station","value":"subway"},"terms":["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],"name":"Subway Station"},"public_transport/station_train_halt":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes","railway":"halt"},"reference":{"key":"railway","value":"halt"},"terms":["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],"name":"Train Station (Halt / Request)"},"public_transport/station_train":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes"},"addTags":{"public_transport":"station","train":"yes","railway":"station"},"removeTags":{"public_transport":"station","train":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],"name":"Train Station"},"public_transport/station_tram":{"icon":"poi-tram","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","tram":"yes"},"reference":{"key":"public_transport","value":"station"},"terms":["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],"name":"Tram Station"},"public_transport/station_trolleybus":{"icon":"poi-trolleybus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","trolleybus":"yes"},"addTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Station / Terminal"},"public_transport/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station"},"terms":["public transit","public transportation","station","terminal","transit","transportation"],"name":"Transit Station","matchScore":0.2},"public_transport/stop_area":{"icon":"bus","fields":["name","ref","network","operator"],"geometry":["relation"],"tags":{"type":"public_transport","public_transport":"stop_area"},"addTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"removeTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"reference":{"key":"public_transport","value":"stop_area"},"name":"Transit Stop Area"},"public_transport/stop_position_aerialway":{"icon":"aerialway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","aerialway":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["aerialway","cable car","public transit","public transportation","transit","transportation"],"name":"Aerialway Stopping Location"},"public_transport/stop_position_bus":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","bus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","public transit","public transportation","transit","transportation"],"name":"Bus Stopping Location"},"public_transport/stop_position_ferry":{"icon":"ferry","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","ferry":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],"name":"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{"icon":"poi-light-rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","light_rail":"yes"},"addTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{"icon":"poi-monorail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","monorail":"yes"},"addTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["monorail","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stopping Location"},"public_transport/stop_position_subway":{"icon":"poi-subway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","subway":"yes"},"addTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stopping Location"},"public_transport/stop_position_train":{"icon":"rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","train":"yes"},"addTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stopping Location"},"public_transport/stop_position_tram":{"icon":"poi-tram","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","tram":"yes"},"addTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"removeTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","trolleybus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stopping Location"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"terms":["public transit","public transportation","transit","transportation"],"name":"Transit Stopping Location","matchScore":0.2},"railway/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"terms":["break","interrupt","rest","wait","interruption"],"name":"Train Station (Halt / Request)","searchable":false},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Train Stop / Platform","searchable":false},"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":"Train Station","searchable":false},"railway/tram_stop":{"icon":"poi-tram","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stopping Position","searchable":false},"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/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/light_rail":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"light_rail"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","trolley"],"name":"Light Rail"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["railway/position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/miniature":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"miniature"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["rideable miniature railway","narrow gauge railway","minimum gauge railway"],"name":"Miniature Railway"},"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/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"],"fields":["railway/position","railway/signal/direction","ref"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"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":{"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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/agrarian":{"icon":"shop","fields":["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],"tags":{"shop":"agrarian"},"name":"Farm Supply Shop"},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","beauty","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"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","second_hand","service/vehicle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/health_food":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["wholefood","vitamins","vegetarian","vegan"],"tags":{"shop":"health_food "},"name":"Health Food Shop"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/wholesale":{"icon":"warehouse","fields":["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["warehouse club","cash and carry"],"tags":{"shop":"wholesale"},"name":"Wholesale Store"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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"],"terms":["climbing hut"],"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":"star","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"],"terms":["holiday","holiday cottage","holiday home","vacation","vacation home"],"tags":{"tourism":"chalet"},"name":"Holiday Cottage"},"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","direction"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["name","elevation","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","direction"],"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"],"fields":["direction"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/wilderness_hut":{"icon":"lodging","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["wilderness hut","backcountry hut","bothy"],"tags":{"tourism":"wilderness_hut"},"name":"Wilderness Hut"},"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","direction_vertex"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"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":["direction_vertex"],"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/light_rail":{"icon":"route-light-rail","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"light_rail"},"name":"Light Rail Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/piste":{"icon":"route-piste","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"piste"},"name":"Piste/Ski 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/subway":{"icon":"route-subway","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"subway"},"name":"Subway 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-ditch","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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"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","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"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 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","payment_multi"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"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","payment_multi"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"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","payment_multi"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"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/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","payment_multi"],"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/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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_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/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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","ref/isil"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"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","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"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","brewery"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"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/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/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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"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","religion","denomination"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"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/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},"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","building","address","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","building","address","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","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","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","building","address","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","building","address","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","building","address","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","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","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","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","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","building","address","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","building","address","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","building","address","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","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi","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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","beauty","opening_hours","payment_multi"],"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","beauty","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"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","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"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","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"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","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"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","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"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","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","second_hand","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/supermarket/Costco Gasoline":{"tags":{"name":"Costco Gasoline","shop":"supermarket"},"name":"Costco Gasoline","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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","payment_multi"],"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":"star","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":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"star","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/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 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/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}};
23648 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","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23650 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/retail","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","landuse/religious"]},"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_line"]},"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/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","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"]}};
23652 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"},"agrarian":{"key":"agrarian","type":"semiCombo","label":"Products"},"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"},"boules":{"key":"boules","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"brewery":{"key":"brewery","type":"semiCombo","label":"Draft Beers"},"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"},"cables":{"key":"cables","type":"number","label":"Cables","placeholder":"1, 2, 3..."},"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..."},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"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"}}}},"dance/style":{"key":"dance:style","type":"semiCombo","label":"Dance Styles"},"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},"devices":{"key":"devices","type":"number","label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"direction_cardinal":{"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"}}},"direction_clock":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"direction_vertex":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"direction":{"key":"direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"dispensing":{"key":"dispensing","type":"check","label":"Dispenses Prescriptions","default":"yes"},"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"}}},"fitness_station":{"key":"fitness_station","type":"typeCombo","label":"Equipment Type"},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"frequency":{"key":"frequency","type":"combo","label":"Operating Frequency"},"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"},"government":{"key":"government","type":"typeCombo","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"},"monitoring_multi":{"key":"monitoring:","type":"multiCombo","label":"Monitoring"},"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","reversible":"Reversible","alternating":"Alternating"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}}},"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..."},"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","universal":true},"phases":{"key":"phases","type":"number","label":"Phases","placeholder":"1, 2, 3..."},"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":"min_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"},"railway/position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"railway/signal/direction":{"key":"railway:signal:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"rating":{"key":"rating","type":"combo","label":"Power Rating","snake_case":false},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"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"},"ref/isil":{"key":"ref:isil","type":"text","label":"ISIL 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","snake_case":false,"caseSensitive":true,"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"},"substance":{"key":"substance","type":"combo","label":"Substance"},"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"},"switch":{"key":"switch","type":"combo","label":"Type","strings":{"options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}}},"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"},"traffic_signals/direction":{"key":"traffic_signals:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"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"}}},"transformer":{"key":"transformer","type":"combo","label":"Type","strings":{"options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}}},"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"}}},"voltage":{"key":"voltage","type":"combo","label":"Voltage"},"voltage/primary":{"key":"voltage:primary","type":"combo","label":"Primary Voltage"},"voltage/secondary":{"key":"voltage:secondary","type":"combo","label":"Secondary Voltage"},"voltage/tertiary":{"key":"voltage:tertiary","type":"combo","label":"Tertiary Voltage"},"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"},"wholesale":{"key":"wholesale","type":"typeCombo","label":"Wholesale"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"},"windings":{"key":"windings","type":"number","label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"key":"windings:configuration","type":"combo","label":"Windings Configuration","strings":{"options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}}};
23654 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"];
23659 var all$2 = Object.freeze({
23664 var Airport = ["airfield","airport","heliport","rocket"];
23665 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23666 var Education = ["college","school"];
23667 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"];
23668 var Health = ["dentist","doctor","hospital","pharmacy"];
23669 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23670 var Transit = ["bus","ferry"];
23674 Education: Education,
23677 Outdoors: Outdoors,
23679 "Mountain peak": ["mountain","volcano"],
23680 "Rail station": ["entrance","rail","rail-light","rail-metro"]
23683 var streets$1 = Object.freeze({
23686 Education: Education,
23689 Outdoors: Outdoors,
23694 var require$$0$1 = ( all$2 && all$1 ) || all$2;
23696 var require$$1$1 = ( streets$1 && streets ) || streets$1;
23701 streets: require$$1$1
23705 var dataFeatureIcons = maki.layouts.all.all;
23708 imagery: dataImagery,
23711 defaults: defaults,
23712 categories: categories,
23717 function osmEntity$$1(attrs) {
23718 // For prototypal inheritance.
23719 if (this instanceof osmEntity$$1) return;
23721 // Create the appropriate subtype.
23722 if (attrs && attrs.type) {
23723 return osmEntity$$1[attrs.type].apply(this, arguments);
23724 } else if (attrs && attrs.id) {
23725 return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23728 // Initialize a generic Entity (used only in tests).
23729 return (new osmEntity$$1()).initialize(arguments);
23733 osmEntity$$1.id = function(type) {
23734 return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23738 osmEntity$$1.id.next = {
23739 changeset: -1, node: -1, way: -1, relation: -1
23743 osmEntity$$1.id.fromOSM = function(type, id) {
23744 return type[0] + id;
23748 osmEntity$$1.id.toOSM = function(id) {
23749 return id.slice(1);
23753 osmEntity$$1.id.type = function(id) {
23754 return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23758 // A function suitable for use as the second argument to d3.selection#data().
23759 osmEntity$$1.key = function(entity) {
23760 return entity.id + 'v' + (entity.v || 0);
23764 osmEntity$$1.prototype = {
23769 initialize: function(sources) {
23770 for (var i = 0; i < sources.length; ++i) {
23771 var source = sources[i];
23772 for (var prop in source) {
23773 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23774 if (source[prop] === undefined) {
23777 this[prop] = source[prop];
23783 if (!this.id && this.type) {
23784 this.id = osmEntity$$1.id(this.type);
23786 if (!this.hasOwnProperty('visible')) {
23787 this.visible = true;
23791 Object.freeze(this);
23792 Object.freeze(this.tags);
23794 if (this.loc) Object.freeze(this.loc);
23795 if (this.nodes) Object.freeze(this.nodes);
23796 if (this.members) Object.freeze(this.members);
23803 copy: function(resolver, copies) {
23804 if (copies[this.id])
23805 return copies[this.id];
23807 var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23808 copies[this.id] = copy;
23814 osmId: function() {
23815 return osmEntity$$1.id.toOSM(this.id);
23819 isNew: function() {
23820 return this.osmId() < 0;
23824 update: function(attrs) {
23825 return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23829 mergeTags: function(tags) {
23830 var merged = clone(this.tags), changed = false;
23831 for (var k in tags) {
23832 var t1 = merged[k],
23837 } else if (t1 !== t2) {
23839 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23842 return changed ? this.update({tags: merged}) : this;
23846 intersects: function(extent, resolver) {
23847 return this.extent(resolver).intersects(extent);
23851 isUsed: function(resolver) {
23852 return without(Object.keys(this.tags), 'area').length > 0 ||
23853 resolver.parentRelations(this).length > 0;
23857 hasInterestingTags: function() {
23858 return keys$1(this.tags).some(osmIsInterestingTag);
23862 isHighwayIntersection: function() {
23866 isDegenerate: function() {
23870 deprecatedTags: function() {
23871 var tags = toPairs(this.tags);
23872 var deprecated = {};
23874 dataDeprecated.forEach(function(d) {
23875 var match = toPairs(d.old)[0];
23876 tags.forEach(function(t) {
23877 if (t[0] === match[0] &&
23878 (t[1] === match[1] || match[1] === '*')) {
23879 deprecated[t[0]] = t[1];
23888 function geoExtent$$1(min, max) {
23889 if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23890 if (min instanceof geoExtent$$1) {
23892 } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23896 this[0] = min || [ Infinity, Infinity];
23897 this[1] = max || min || [-Infinity, -Infinity];
23901 geoExtent$$1.prototype = new Array(2);
23903 assignIn(geoExtent$$1.prototype, {
23905 equals: function (obj) {
23906 return this[0][0] === obj[0][0] &&
23907 this[0][1] === obj[0][1] &&
23908 this[1][0] === obj[1][0] &&
23909 this[1][1] === obj[1][1];
23913 extend: function(obj) {
23914 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23915 return geoExtent$$1(
23916 [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23917 [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23922 _extend: function(extent) {
23923 this[0][0] = Math.min(extent[0][0], this[0][0]);
23924 this[0][1] = Math.min(extent[0][1], this[0][1]);
23925 this[1][0] = Math.max(extent[1][0], this[1][0]);
23926 this[1][1] = Math.max(extent[1][1], this[1][1]);
23931 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23935 center: function() {
23936 return [(this[0][0] + this[1][0]) / 2,
23937 (this[0][1] + this[1][1]) / 2];
23941 rectangle: function() {
23942 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23947 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23951 polygon: function() {
23953 [this[0][0], this[0][1]],
23954 [this[0][0], this[1][1]],
23955 [this[1][0], this[1][1]],
23956 [this[1][0], this[0][1]],
23957 [this[0][0], this[0][1]]
23962 contains: function(obj) {
23963 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23964 return obj[0][0] >= this[0][0] &&
23965 obj[0][1] >= this[0][1] &&
23966 obj[1][0] <= this[1][0] &&
23967 obj[1][1] <= this[1][1];
23971 intersects: function(obj) {
23972 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23973 return obj[0][0] <= this[1][0] &&
23974 obj[0][1] <= this[1][1] &&
23975 obj[1][0] >= this[0][0] &&
23976 obj[1][1] >= this[0][1];
23980 intersection: function(obj) {
23981 if (!this.intersects(obj)) return new geoExtent$$1();
23982 return new geoExtent$$1(
23983 [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23984 [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23989 percentContainedIn: function(obj) {
23990 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23991 var a1 = this.intersection(obj).area(),
23994 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24002 padByMeters: function(meters) {
24003 var dLat = geoMetersToLat(meters),
24004 dLon = geoMetersToLon(meters, this.center()[1]);
24005 return geoExtent$$1(
24006 [this[0][0] - dLon, this[0][1] - dLat],
24007 [this[1][0] + dLon, this[1][1] + dLat]
24012 toParam: function() {
24013 return this.rectangle().join(',');
24019 var TAU = 2 * Math.PI;
24020 var EQUATORIAL_RADIUS = 6356752.314245179;
24021 var POLAR_RADIUS = 6378137.0;
24024 function geoLatToMeters(dLat) {
24025 return dLat * (TAU * POLAR_RADIUS / 360);
24029 function geoLonToMeters(dLon, atLat) {
24030 return Math.abs(atLat) >= 90 ? 0 :
24031 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24035 function geoMetersToLat(m) {
24036 return m / (TAU * POLAR_RADIUS / 360);
24040 function geoMetersToLon(m, atLat) {
24041 return Math.abs(atLat) >= 90 ? 0 :
24042 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24046 function geoMetersToOffset(meters, tileSize) {
24047 tileSize = tileSize || 256;
24049 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24050 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24055 function geoOffsetToMeters(offset, tileSize) {
24056 tileSize = tileSize || 256;
24058 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24059 -offset[1] * TAU * POLAR_RADIUS / tileSize
24064 // Equirectangular approximation of spherical distances on Earth
24065 function geoSphericalDistance(a, b) {
24066 var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24067 var y = geoLatToMeters(a[1] - b[1]);
24068 return Math.sqrt((x * x) + (y * y));
24073 function geoScaleToZoom(k, tileSize) {
24074 tileSize = tileSize || 256;
24075 var log2ts = Math.log(tileSize) * Math.LOG2E;
24076 return Math.log(k * TAU) / Math.LN2 - log2ts;
24081 function geoZoomToScale(z, tileSize) {
24082 tileSize = tileSize || 256;
24083 return tileSize * Math.pow(2, z) / TAU;
24087 * A specialized version of `_.every` for arrays without support for
24088 * iteratee shorthands.
24091 * @param {Array} [array] The array to iterate over.
24092 * @param {Function} predicate The function invoked per iteration.
24093 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24096 function arrayEvery(array, predicate) {
24098 length = array == null ? 0 : array.length;
24100 while (++index < length) {
24101 if (!predicate(array[index], index, array)) {
24109 * The base implementation of `_.every` without support for iteratee shorthands.
24112 * @param {Array|Object} collection The collection to iterate over.
24113 * @param {Function} predicate The function invoked per iteration.
24114 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24117 function baseEvery(collection, predicate) {
24119 baseEach(collection, function(value, index, collection) {
24120 result = !!predicate(value, index, collection);
24127 * Checks if `predicate` returns truthy for **all** elements of `collection`.
24128 * Iteration is stopped once `predicate` returns falsey. The predicate is
24129 * invoked with three arguments: (value, index|key, collection).
24131 * **Note:** This method returns `true` for
24132 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24133 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24134 * elements of empty collections.
24139 * @category Collection
24140 * @param {Array|Object} collection The collection to iterate over.
24141 * @param {Function} [predicate=_.identity] The function invoked per iteration.
24142 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24143 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24147 * _.every([true, 1, null, 'yes'], Boolean);
24151 * { 'user': 'barney', 'age': 36, 'active': false },
24152 * { 'user': 'fred', 'age': 40, 'active': false }
24155 * // The `_.matches` iteratee shorthand.
24156 * _.every(users, { 'user': 'barney', 'active': false });
24159 * // The `_.matchesProperty` iteratee shorthand.
24160 * _.every(users, ['active', false]);
24163 * // The `_.property` iteratee shorthand.
24164 * _.every(users, 'active');
24167 function every(collection, predicate, guard) {
24168 var func = isArray(collection) ? arrayEvery : baseEvery;
24169 if (guard && isIterateeCall(collection, predicate, guard)) {
24170 predicate = undefined;
24172 return func(collection, baseIteratee(predicate, 3));
24176 * The base implementation of `_.some` without support for iteratee shorthands.
24179 * @param {Array|Object} collection The collection to iterate over.
24180 * @param {Function} predicate The function invoked per iteration.
24181 * @returns {boolean} Returns `true` if any element passes the predicate check,
24184 function baseSome(collection, predicate) {
24187 baseEach(collection, function(value, index, collection) {
24188 result = predicate(value, index, collection);
24195 * Checks if `predicate` returns truthy for **any** element of `collection`.
24196 * Iteration is stopped once `predicate` returns truthy. The predicate is
24197 * invoked with three arguments: (value, index|key, collection).
24202 * @category Collection
24203 * @param {Array|Object} collection The collection to iterate over.
24204 * @param {Function} [predicate=_.identity] The function invoked per iteration.
24205 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24206 * @returns {boolean} Returns `true` if any element passes the predicate check,
24210 * _.some([null, 0, 'yes', false], Boolean);
24214 * { 'user': 'barney', 'active': true },
24215 * { 'user': 'fred', 'active': false }
24218 * // The `_.matches` iteratee shorthand.
24219 * _.some(users, { 'user': 'barney', 'active': false });
24222 * // The `_.matchesProperty` iteratee shorthand.
24223 * _.some(users, ['active', false]);
24226 * // The `_.property` iteratee shorthand.
24227 * _.some(users, 'active');
24230 function some(collection, predicate, guard) {
24231 var func = isArray(collection) ? arraySome : baseSome;
24232 if (guard && isIterateeCall(collection, predicate, guard)) {
24233 predicate = undefined;
24235 return func(collection, baseIteratee(predicate, 3));
24239 function geoVecEqual(a, b, epsilon) {
24241 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
24243 return (a[0] === b[0]) && (a[1] === b[1]);
24248 function geoVecAdd(a, b) {
24249 return [ a[0] + b[0], a[1] + b[1] ];
24252 // vector subtraction
24253 function geoVecSubtract(a, b) {
24254 return [ a[0] - b[0], a[1] - b[1] ];
24258 function geoVecScale(a, mag) {
24259 return [ a[0] * mag, a[1] * mag ];
24262 // vector rounding (was: geoRoundCoordinates)
24263 function geoVecFloor(a) {
24264 return [ Math.floor(a[0]), Math.floor(a[1]) ];
24267 // linear interpolation
24268 function geoVecInterp(a, b, t) {
24270 a[0] + (b[0] - a[0]) * t,
24271 a[1] + (b[1] - a[1]) * t
24275 // http://jsperf.com/id-dist-optimization
24276 function geoVecLength(a, b) {
24277 var x = a[0] - b[0];
24278 var y = a[1] - b[1];
24279 return Math.sqrt((x * x) + (y * y));
24282 // Return the counterclockwise angle in the range (-pi, pi)
24283 // between the positive X axis and the line intersecting a and b.
24284 function geoVecAngle(a, b) {
24285 return Math.atan2(b[1] - a[1], b[0] - a[0]);
24289 function geoVecDot(a, b, origin) {
24290 origin = origin || [0, 0];
24291 return (a[0] - origin[0]) * (b[0] - origin[0]) +
24292 (a[1] - origin[1]) * (b[1] - origin[1]);
24295 // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24296 // Returns a positive value, if OAB makes a counter-clockwise turn,
24297 // negative for clockwise turn, and zero if the points are collinear.
24298 function geoVecCross(a, b, origin) {
24299 origin = origin || [0, 0];
24300 return (a[0] - origin[0]) * (b[1] - origin[1]) -
24301 (a[1] - origin[1]) * (b[0] - origin[0]);
24304 // Return the counterclockwise angle in the range (-pi, pi)
24305 // between the positive X axis and the line intersecting a and b.
24306 function geoAngle(a, b, projection) {
24307 return geoVecAngle(projection(a.loc), projection(b.loc));
24310 function geoEdgeEqual(a, b) {
24311 return (a[0] === b[0] && a[1] === b[1]) ||
24312 (a[0] === b[1] && a[1] === b[0]);
24315 // Rotate all points counterclockwise around a pivot point by given angle
24316 function geoRotate(points, angle, around) {
24317 return points.map(function(point) {
24318 var radial = geoVecSubtract(point, around);
24320 radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24321 radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24327 // Choose the edge with the minimal distance from `point` to its orthogonal
24328 // projection onto that edge, if such a projection exists, or the distance to
24329 // the closest vertex on that edge. Returns an object with the `index` of the
24330 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24331 function geoChooseEdge(nodes, point, projection, activeID) {
24332 var dist = geoVecLength;
24333 var points = nodes.map(function(n) { return projection(n.loc); });
24334 var ids = nodes.map(function(n) { return n.id; });
24335 var min = Infinity;
24339 for (var i = 0; i < points.length - 1; i++) {
24340 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24343 var s = geoVecSubtract(points[i + 1], o);
24344 var v = geoVecSubtract(point, o);
24345 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24350 } else if (proj > 1) {
24353 p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24356 var d = dist(p, point);
24360 loc = projection.invert(p);
24364 if (idx !== undefined) {
24365 return { index: idx, distance: min, loc: loc };
24372 // Test active (dragged or drawing) segments against inactive segments
24373 // This is used to test e.g. multipolygon rings that cross
24374 // `activeNodes` is the ring containing the activeID being dragged.
24375 // `inactiveNodes` is the other ring to test against
24376 function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24378 var inactives = [];
24379 var j, k, n1, n2, segment;
24381 // gather active segments (only segments in activeNodes that contain the activeID)
24382 for (j = 0; j < activeNodes.length - 1; j++) {
24383 n1 = activeNodes[j];
24384 n2 = activeNodes[j+1];
24385 segment = [n1.loc, n2.loc];
24386 if (n1.id === activeID || n2.id === activeID) {
24387 actives.push(segment);
24391 // gather inactive segments
24392 for (j = 0; j < inactiveNodes.length - 1; j++) {
24393 n1 = inactiveNodes[j];
24394 n2 = inactiveNodes[j+1];
24395 segment = [n1.loc, n2.loc];
24396 inactives.push(segment);
24400 for (j = 0; j < actives.length; j++) {
24401 for (k = 0; k < inactives.length; k++) {
24402 var p = actives[j];
24403 var q = inactives[k];
24404 var hit = geoLineIntersection(p, q);
24415 // Test active (dragged or drawing) segments against inactive segments
24416 // This is used to test whether a way intersects with itself.
24417 function geoHasSelfIntersections(nodes, activeID) {
24419 var inactives = [];
24422 // group active and passive segments along the nodes
24423 for (j = 0; j < nodes.length - 1; j++) {
24425 var n2 = nodes[j+1];
24426 var segment = [n1.loc, n2.loc];
24427 if (n1.id === activeID || n2.id === activeID) {
24428 actives.push(segment);
24430 inactives.push(segment);
24435 for (j = 0; j < actives.length; j++) {
24436 for (k = 0; k < inactives.length; k++) {
24437 var p = actives[j];
24438 var q = inactives[k];
24439 // skip if segments share an endpoint
24440 if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24441 geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24445 var hit = geoLineIntersection(p, q);
24447 var epsilon = 1e-8;
24448 // skip if the hit is at the segment's endpoint
24449 if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24450 geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24463 // Return the intersection point of 2 line segments.
24464 // From https://github.com/pgkelley4/line-segments-intersect
24465 // This uses the vector cross product approach described below:
24466 // http://stackoverflow.com/a/565282/786339
24467 function geoLineIntersection(a, b) {
24468 var p = [a[0][0], a[0][1]];
24469 var p2 = [a[1][0], a[1][1]];
24470 var q = [b[0][0], b[0][1]];
24471 var q2 = [b[1][0], b[1][1]];
24472 var r = geoVecSubtract(p2, p);
24473 var s = geoVecSubtract(q2, q);
24474 var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24475 var denominator = geoVecCross(r, s);
24477 if (uNumerator && denominator) {
24478 var u = uNumerator / denominator;
24479 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24481 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24482 return geoVecInterp(p, p2, t);
24490 function geoPathIntersections(path1, path2) {
24491 var intersections = [];
24492 for (var i = 0; i < path1.length - 1; i++) {
24493 for (var j = 0; j < path2.length - 1; j++) {
24494 var a = [ path1[i], path1[i+1] ];
24495 var b = [ path2[j], path2[j+1] ];
24496 var hit = geoLineIntersection(a, b);
24498 intersections.push(hit);
24502 return intersections;
24505 function geoPathHasIntersections(path1, path2) {
24506 for (var i = 0; i < path1.length - 1; i++) {
24507 for (var j = 0; j < path2.length - 1; j++) {
24508 var a = [ path1[i], path1[i+1] ];
24509 var b = [ path2[j], path2[j+1] ];
24510 var hit = geoLineIntersection(a, b);
24520 // Return whether point is contained in polygon.
24522 // `point` should be a 2-item array of coordinates.
24523 // `polygon` should be an array of 2-item arrays of coordinates.
24525 // From https://github.com/substack/point-in-polygon.
24526 // ray-casting algorithm based on
24527 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24529 function geoPointInPolygon(point, polygon) {
24532 var inside = false;
24534 for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24535 var xi = polygon[i][0];
24536 var yi = polygon[i][1];
24537 var xj = polygon[j][0];
24538 var yj = polygon[j][1];
24540 var intersect = ((yi > y) !== (yj > y)) &&
24541 (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24542 if (intersect) inside = !inside;
24549 function geoPolygonContainsPolygon(outer, inner) {
24550 return every(inner, function(point) {
24551 return geoPointInPolygon(point, outer);
24556 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24557 function testPoints(outer, inner) {
24558 return some(inner, function(point) {
24559 return geoPointInPolygon(point, outer);
24563 return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24567 function geoPathLength(path) {
24569 for (var i = 0; i < path.length - 1; i++) {
24570 length += geoVecLength(path[i], path[i + 1]);
24576 // If the given point is at the edge of the padded viewport,
24577 // return a vector that will nudge the viewport in that direction
24578 function geoViewportEdge(point, dimensions) {
24579 var pad = [80, 20, 50, 20]; // top, right, bottom, left
24583 if (point[0] > dimensions[0] - pad[1])
24585 if (point[0] < pad[3])
24587 if (point[1] > dimensions[1] - pad[2])
24589 if (point[1] < pad[0])
24600 Bypasses features of D3's default projection stream pipeline that are unnecessary:
24601 * Antimeridian clipping
24602 * Spherical rotation
24605 function geoRawMercator() {
24606 var project = mercatorRaw,
24607 k = 512 / Math.PI, // scale
24608 x = 0, y = 0, // translate
24609 clipExtent = [[0, 0], [0, 0]];
24612 function projection$$1(point) {
24613 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24614 return [point[0] * k + x, y - point[1] * k];
24618 projection$$1.invert = function(point) {
24619 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24620 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24624 projection$$1.scale = function(_) {
24625 if (!arguments.length) return k;
24627 return projection$$1;
24631 projection$$1.translate = function(_) {
24632 if (!arguments.length) return [x, y];
24635 return projection$$1;
24639 projection$$1.clipExtent = function(_) {
24640 if (!arguments.length) return clipExtent;
24642 return projection$$1;
24646 projection$$1.transform = function(_) {
24647 if (!arguments.length) return identity$7.translate(x, y).scale(k);
24651 return projection$$1;
24655 projection$$1.stream = d3_geoTransform({
24656 point: function(x, y) {
24657 x = projection$$1([x, y]);
24658 this.stream.point(x[0], x[1]);
24663 return projection$$1;
24666 function osmChangeset() {
24667 if (!(this instanceof osmChangeset)) {
24668 return (new osmChangeset()).initialize(arguments);
24669 } else if (arguments.length) {
24670 this.initialize(arguments);
24675 osmEntity$$1.changeset = osmChangeset;
24677 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24679 assignIn(osmChangeset.prototype, {
24684 extent: function() {
24685 return new geoExtent$$1();
24689 geometry: function() {
24690 return 'changeset';
24694 asJXON: function() {
24698 tag: map$3(this.tags, function(value, key) {
24699 return { '@k': key, '@v': value };
24709 // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24710 // XML. Returns a string.
24711 osmChangeJXON: function(changes) {
24712 var changeset_id = this.id;
24714 function nest(x, order) {
24716 for (var i = 0; i < x.length; i++) {
24717 var tagName = Object.keys(x[i])[0];
24718 if (!groups[tagName]) groups[tagName] = [];
24719 groups[tagName].push(x[i][tagName]);
24722 order.forEach(function(o) {
24723 if (groups[o]) ordered[o] = groups[o];
24729 // sort relations in a changeset by dependencies
24730 function sort(changes) {
24732 // find a referenced relation in the current changeset
24733 function resolve(item) {
24734 return find$1(relations, function(relation) {
24735 return item.keyAttributes.type === 'relation'
24736 && item.keyAttributes.ref === relation['@id'];
24740 // a new item is an item that has not been already processed
24741 function isNew(item) {
24742 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24743 return proc['@id'] === item['@id'];
24747 var processing = [],
24749 relations = changes.relation;
24751 if (!relations) return changes;
24753 for (var i = 0; i < relations.length; i++) {
24754 var relation = relations[i];
24756 // skip relation if already sorted
24757 if (!sorted[relation['@id']]) {
24758 processing.push(relation);
24761 while (processing.length > 0) {
24762 var next = processing[0],
24763 deps = filter(compact(next.member.map(resolve)), isNew);
24764 if (deps.length === 0) {
24765 sorted[next['@id']] = next;
24766 processing.shift();
24768 processing = deps.concat(processing);
24773 changes.relation = values$1(sorted);
24777 function rep(entity) {
24778 return entity.asJXON(changeset_id);
24784 '@generator': 'iD',
24785 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24786 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24787 'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24793 asGeoJSON: function() {
24800 * Creates a duplicate-free version of an array, using
24801 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
24802 * for equality comparisons, in which only the first occurrence of each element
24803 * is kept. The order of result values is determined by the order they occur
24810 * @param {Array} array The array to inspect.
24811 * @returns {Array} Returns the new duplicate free array.
24814 * _.uniq([2, 1, 2]);
24817 function uniq(array) {
24818 return (array && array.length) ? baseUniq(array) : [];
24821 function osmNode() {
24822 if (!(this instanceof osmNode)) {
24823 return (new osmNode()).initialize(arguments);
24824 } else if (arguments.length) {
24825 this.initialize(arguments);
24829 osmEntity$$1.node = osmNode;
24831 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24833 assignIn(osmNode.prototype, {
24838 extent: function() {
24839 return new geoExtent$$1(this.loc);
24843 geometry: function(graph) {
24844 return graph.transient(this, 'geometry', function() {
24845 return graph.isPoi(this) ? 'point' : 'vertex';
24850 move: function(loc) {
24851 return this.update({loc: loc});
24855 isDegenerate: function() {
24857 Array.isArray(this.loc) && this.loc.length === 2 &&
24858 this.loc[0] >= -180 && this.loc[0] <= 180 &&
24859 this.loc[1] >= -90 && this.loc[1] <= 90
24864 // Inspect tags and geometry to determine which direction(s) this node/vertex points
24865 directions: function(resolver, projection) {
24869 // which tag to use?
24870 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
24871 // all-way stop tag on a highway intersection
24874 // generic direction tag
24875 val = (this.tags.direction || '').toLowerCase();
24877 // better suffix-style direction tag
24878 var re = /:direction$/i;
24879 var keys = Object.keys(this.tags);
24880 for (i = 0; i < keys.length; i++) {
24881 if (re.test(keys[i])) {
24882 val = this.tags[keys[i]].toLowerCase();
24888 if (val === '') return [];
24892 northnortheast: 22, nne: 22,
24893 northeast: 45, ne: 45,
24894 eastnortheast: 67, ene: 67,
24896 eastsoutheast: 112, ese: 112,
24897 southeast: 135, se: 135,
24898 southsoutheast: 157, sse: 157,
24899 south: 180, s: 180,
24900 southsouthwest: 202, ssw: 202,
24901 southwest: 225, sw: 225,
24902 westsouthwest: 247, wsw: 247,
24904 westnorthwest: 292, wnw: 292,
24905 northwest: 315, nw: 315,
24906 northnorthwest: 337, nnw: 337
24910 var values = val.split(';');
24913 values.forEach(function(v) {
24914 // swap cardinal for numeric directions
24915 if (cardinal[v] !== undefined) {
24919 // numeric direction - just add to results
24920 if (v !== '' && !isNaN(+v)) {
24925 // string direction - inspect parent ways
24927 (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
24929 (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
24931 if (!lookForward && !lookBackward) return;
24934 resolver.parentWays(this).forEach(function(parent) {
24935 var nodes = parent.nodes;
24936 for (i = 0; i < nodes.length; i++) {
24937 if (nodes[i] === this.id) { // match current entity
24938 if (lookForward && i > 0) {
24939 nodeIds[nodes[i - 1]] = true; // look back to prev node
24941 if (lookBackward && i < nodes.length - 1) {
24942 nodeIds[nodes[i + 1]] = true; // look ahead to next node
24948 Object.keys(nodeIds).forEach(function(nodeId) {
24949 // +90 because geoAngle returns angle from X axis, not Y (north)
24951 (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
24957 return uniq(results);
24961 isEndpoint: function(resolver) {
24962 return resolver.transient(this, 'isEndpoint', function() {
24964 return resolver.parentWays(this).filter(function(parent) {
24965 return !parent.isClosed() && !!parent.affix(id);
24971 isConnected: function(resolver) {
24972 return resolver.transient(this, 'isConnected', function() {
24973 var parents = resolver.parentWays(this);
24975 function isLine(entity) {
24976 return entity.geometry(resolver) === 'line' &&
24977 entity.hasInterestingTags();
24980 // vertex is connected to multiple parent lines
24981 if (parents.length > 1 && some(parents, isLine)) {
24984 } else if (parents.length === 1) {
24985 var way = parents[0],
24986 nodes = way.nodes.slice();
24987 if (way.isClosed()) { nodes.pop(); } // ignore connecting node if closed
24989 // return true if vertex appears multiple times (way is self intersecting)
24990 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24998 isIntersection: function(resolver) {
24999 return resolver.transient(this, 'isIntersection', function() {
25000 return resolver.parentWays(this).filter(function(parent) {
25001 return (parent.tags.highway ||
25002 parent.tags.waterway ||
25003 parent.tags.railway ||
25004 parent.tags.aeroway) &&
25005 parent.geometry(resolver) === 'line';
25011 isHighwayIntersection: function(resolver) {
25012 return resolver.transient(this, 'isHighwayIntersection', function() {
25013 return resolver.parentWays(this).filter(function(parent) {
25014 return parent.tags.highway && parent.geometry(resolver) === 'line';
25020 isOnAddressLine: function(resolver) {
25021 return resolver.transient(this, 'isOnAddressLine', function() {
25022 return resolver.parentWays(this).filter(function(parent) {
25023 return parent.tags.hasOwnProperty('addr:interpolation') &&
25024 parent.geometry(resolver) === 'line';
25030 asJXON: function(changeset_id) {
25033 '@id': this.osmId(),
25034 '@lon': this.loc[0],
25035 '@lat': this.loc[1],
25036 '@version': (this.version || 0),
25037 tag: map$3(this.tags, function(v, k) {
25038 return { keyAttributes: { k: k, v: v } };
25042 if (changeset_id) r.node['@changeset'] = changeset_id;
25047 asGeoJSON: function() {
25050 coordinates: this.loc
25055 /** Error message constants. */
25056 var FUNC_ERROR_TEXT$1 = 'Expected a function';
25059 * Creates a function that negates the result of the predicate `func`. The
25060 * `func` predicate is invoked with the `this` binding and arguments of the
25061 * created function.
25066 * @category Function
25067 * @param {Function} predicate The predicate to negate.
25068 * @returns {Function} Returns the new negated function.
25071 * function isEven(n) {
25072 * return n % 2 == 0;
25075 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25078 function negate(predicate) {
25079 if (typeof predicate != 'function') {
25080 throw new TypeError(FUNC_ERROR_TEXT$1);
25082 return function() {
25083 var args = arguments;
25084 switch (args.length) {
25085 case 0: return !predicate.call(this);
25086 case 1: return !predicate.call(this, args[0]);
25087 case 2: return !predicate.call(this, args[0], args[1]);
25088 case 3: return !predicate.call(this, args[0], args[1], args[2]);
25090 return !predicate.apply(this, args);
25095 * The opposite of `_.filter`; this method returns the elements of `collection`
25096 * that `predicate` does **not** return truthy for.
25101 * @category Collection
25102 * @param {Array|Object} collection The collection to iterate over.
25103 * @param {Function} [predicate=_.identity] The function invoked per iteration.
25104 * @returns {Array} Returns the new filtered array.
25109 * { 'user': 'barney', 'age': 36, 'active': false },
25110 * { 'user': 'fred', 'age': 40, 'active': true }
25113 * _.reject(users, function(o) { return !o.active; });
25114 * // => objects for ['fred']
25116 * // The `_.matches` iteratee shorthand.
25117 * _.reject(users, { 'age': 40, 'active': true });
25118 * // => objects for ['barney']
25120 * // The `_.matchesProperty` iteratee shorthand.
25121 * _.reject(users, ['active', false]);
25122 * // => objects for ['fred']
25124 * // The `_.property` iteratee shorthand.
25125 * _.reject(users, 'active');
25126 * // => objects for ['barney']
25128 function reject(collection, predicate) {
25129 var func = isArray(collection) ? arrayFilter : baseFilter;
25130 return func(collection, negate(baseIteratee(predicate, 3)));
25134 * An alternative to `_.reduce`; this method transforms `object` to a new
25135 * `accumulator` object which is the result of running each of its own
25136 * enumerable string keyed properties thru `iteratee`, with each invocation
25137 * potentially mutating the `accumulator` object. If `accumulator` is not
25138 * provided, a new object with the same `[[Prototype]]` will be used. The
25139 * iteratee is invoked with four arguments: (accumulator, value, key, object).
25140 * Iteratee functions may exit iteration early by explicitly returning `false`.
25146 * @param {Object} object The object to iterate over.
25147 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25148 * @param {*} [accumulator] The custom accumulator value.
25149 * @returns {*} Returns the accumulated value.
25152 * _.transform([2, 3, 4], function(result, n) {
25153 * result.push(n *= n);
25154 * return n % 2 == 0;
25158 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
25159 * (result[value] || (result[value] = [])).push(key);
25161 * // => { '1': ['a', 'c'], '2': ['b'] }
25163 function transform$1(object, iteratee, accumulator) {
25164 var isArr = isArray(object),
25165 isArrLike = isArr || isBuffer(object) || isTypedArray(object);
25167 iteratee = baseIteratee(iteratee, 4);
25168 if (accumulator == null) {
25169 var Ctor = object && object.constructor;
25171 accumulator = isArr ? new Ctor : [];
25173 else if (isObject(object)) {
25174 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
25180 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
25181 return iteratee(accumulator, value, index, object);
25183 return accumulator;
25187 Order the nodes of a way in reverse order and reverse any direction dependent tags
25188 other than `oneway`. (We assume that correcting a backwards oneway is the primary
25189 reason for reversing a way.)
25191 The following transforms are performed:
25194 *:right=* ⟺ *:left=*
25195 *:forward=* ⟺ *:backward=*
25196 direction=up ⟺ direction=down
25197 incline=up ⟺ incline=down
25201 role=forward ⟺ role=backward
25202 role=north ⟺ role=south
25203 role=east ⟺ role=west
25205 In addition, numeric-valued `incline` tags are negated.
25207 The JOSM implementation was used as a guide, but transformations that were of unclear benefit
25208 or adjusted tags that don't seem to be used in practice were omitted.
25210 Also, each node on the way is examined for its own tags and the following transformations are performed
25211 in order to ensure associated nodes (eg a Stop Sign) is also reversed
25214 *direction=forward ⟺ *direction=backward
25215 *direction=left ⟺ *direction=right
25216 *:forward=* ⟺ *:backward=*
25217 *:left=* ⟺ *:right=*
25220 http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
25221 http://wiki.openstreetmap.org/wiki/Key:direction#Steps
25222 http://wiki.openstreetmap.org/wiki/Key:incline
25223 http://wiki.openstreetmap.org/wiki/Route#Members
25224 http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
25225 http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
25226 http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
25228 function actionReverse(wayId, options) {
25229 var replacements = [
25230 [/:right$/, ':left'], [/:left$/, ':right'],
25231 [/:forward$/, ':backward'], [/:backward$/, ':forward']
25233 numeric = /^([+\-]?)(?=[\d.])/,
25235 forward: 'backward',
25236 backward: 'forward',
25244 function reverseKey(key) {
25245 for (var i = 0; i < replacements.length; ++i) {
25246 var replacement = replacements[i];
25247 if (replacement[0].test(key)) {
25248 return key.replace(replacement[0], replacement[1]);
25255 function reverseValue(key, value) {
25256 if (key === 'incline' && numeric.test(value)) {
25257 return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
25258 } else if (key === 'incline' || key === 'direction') {
25259 return {up: 'down', down: 'up'}[value] || value;
25260 } else if (options && options.reverseOneway && key === 'oneway') {
25261 return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
25263 return {left: 'right', right: 'left'}[value] || value;
25268 function reverseDirectionTags(node) {
25269 // Update the direction based tags as appropriate then return an updated node
25270 return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
25271 // See if this is a direction tag and reverse (or use existing value if not recognised)
25272 var re = /direction$/;
25273 if (re.test(tagKey)) {
25274 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
25276 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
25277 // This will pass through other tags unchanged
25278 acc[reverseKey(tagKey)] = tagValue;
25285 function reverseTagsOnNodes(graph, nodeIds) {
25286 // Reverse the direction of appropriate tags attached to the nodes (#3076)
25288 // Get each node from the graph
25289 .map(function(nodeId) { return graph.entity(nodeId);})
25290 // Check tags on the node, if there aren't any, we can skip
25291 .filter(function(existingNode) { return existingNode.tags !== undefined;})
25292 // Get a new version of each node with the appropriate tags reversed
25293 .map(function(existingNode) { return reverseDirectionTags(existingNode);})
25294 // Chain together consecutive updates to the graph for each updated node and return
25295 .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
25299 return function(graph) {
25300 var way = graph.entity(wayId),
25301 nodes = way.nodes.slice().reverse(),
25302 tags = {}, key, role;
25304 for (key in way.tags) {
25305 tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
25308 graph.parentRelations(way).forEach(function(relation) {
25309 relation.members.forEach(function(member, index) {
25310 if (member.id === way.id && (role = roleReversals[member.role])) {
25311 relation = relation.updateMember({role: role}, index);
25312 graph = graph.replace(relation);
25317 // Reverse any associated directions on nodes on the way and then replace
25318 // the way itself with the reversed node ids and updated way tags
25319 return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
25323 /** `Object#toString` result references. */
25324 var numberTag$4 = '[object Number]';
25327 * Checks if `value` is classified as a `Number` primitive or object.
25329 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25330 * classified as numbers, use the `_.isFinite` method.
25336 * @param {*} value The value to check.
25337 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25343 * _.isNumber(Number.MIN_VALUE);
25346 * _.isNumber(Infinity);
25352 function isNumber(value) {
25353 return typeof value == 'number' ||
25354 (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25357 /** `Object#toString` result references. */
25358 var stringTag$4 = '[object String]';
25361 * Checks if `value` is classified as a `String` primitive or object.
25367 * @param {*} value The value to check.
25368 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25371 * _.isString('abc');
25377 function isString(value) {
25378 return typeof value == 'string' ||
25379 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25383 * Checks if `value` is `NaN`.
25385 * **Note:** This method is based on
25386 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25387 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25388 * `undefined` and other non-number values.
25394 * @param {*} value The value to check.
25395 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25401 * _.isNaN(new Number(NaN));
25404 * isNaN(undefined);
25407 * _.isNaN(undefined);
25410 function isNaN$1(value) {
25411 // An `NaN` primitive is the only value that is not equal to itself.
25412 // Perform the `toStringTag` check first to avoid errors with some
25413 // ActiveX objects in IE.
25414 return isNumber(value) && value != +value;
25417 function osmLanes(entity) {
25418 if (entity.type !== 'way') return null;
25419 if (!entity.tags.highway) return null;
25421 var tags = entity.tags;
25422 var isOneWay = entity.isOneWay();
25423 var laneCount = getLaneCount(tags, isOneWay);
25424 var maxspeed = parseMaxspeed(tags);
25426 var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25427 var forward = laneDirections.forward;
25428 var backward = laneDirections.backward;
25429 var bothways = laneDirections.bothways;
25431 // parse the piped string 'x|y|z' format
25432 var turnLanes = {};
25433 turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25434 turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25435 turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25437 var maxspeedLanes = {};
25438 maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25439 maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25440 maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25443 psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25444 psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25445 psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25448 busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25449 busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25450 busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25452 var taxiLanes = {};
25453 taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25454 taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25455 taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25458 hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25459 hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25460 hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25463 hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25464 hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25465 hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25467 var bicyclewayLanes = {};
25468 bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25469 bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25470 bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25478 // map forward/backward/unspecified of each lane type to lanesObj
25479 mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25480 mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25481 mapToLanesObj(lanesObj, psvLanes, 'psv');
25482 mapToLanesObj(lanesObj, busLanes, 'bus');
25483 mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25484 mapToLanesObj(lanesObj, hovLanes, 'hov');
25485 mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25486 mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25493 backward: backward,
25494 bothways: bothways,
25495 turnLanes: turnLanes,
25496 maxspeed: maxspeed,
25497 maxspeedLanes: maxspeedLanes,
25498 psvLanes: psvLanes,
25499 busLanes: busLanes,
25500 taxiLanes: taxiLanes,
25501 hovLanes: hovLanes,
25502 hgvLanes: hgvLanes,
25503 bicyclewayLanes: bicyclewayLanes
25510 function getLaneCount(tags, isOneWay) {
25513 count = parseInt(tags.lanes, 10);
25520 switch (tags.highway) {
25523 count = isOneWay ? 2 : 4;
25526 count = isOneWay ? 1 : 2;
25534 function parseMaxspeed(tags) {
25535 var maxspeed = tags.maxspeed;
25536 if (isNumber(maxspeed)) return maxspeed;
25537 if (isString(maxspeed)) {
25538 maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25539 if (!maxspeed) return;
25540 return parseInt(maxspeed, 10);
25545 function parseLaneDirections(tags, isOneWay, laneCount) {
25546 var forward = parseInt(tags['lanes:forward'], 10);
25547 var backward = parseInt(tags['lanes:backward'], 10);
25548 var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25550 if (parseInt(tags.oneway, 10) === -1) {
25553 backward = laneCount;
25555 else if (isOneWay) {
25556 forward = laneCount;
25560 else if (isNaN$1(forward) && isNaN$1(backward)) {
25561 backward = Math.floor((laneCount - bothways) / 2);
25562 forward = laneCount - bothways - backward;
25564 else if (isNaN$1(forward)) {
25565 if (backward > laneCount - bothways) {
25566 backward = laneCount - bothways;
25568 forward = laneCount - bothways - backward;
25570 else if (isNaN$1(backward)) {
25571 if (forward > laneCount - bothways) {
25572 forward = laneCount - bothways;
25574 backward = laneCount - bothways - forward;
25578 backward: backward,
25584 function parseTurnLanes(tag){
25587 var validValues = [
25588 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25589 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25592 return tag.split('|')
25593 .map(function (s) {
25594 if (s === '') s = 'none';
25595 return s.split(';')
25596 .map(function (d) {
25597 return validValues.indexOf(d) === -1 ? 'unknown': d;
25603 function parseMaxspeedLanes(tag, maxspeed) {
25606 return tag.split('|')
25607 .map(function (s) {
25608 if (s === 'none') return s;
25609 var m = parseInt(s, 10);
25610 if (s === '' || m === maxspeed) return null;
25611 return isNaN$1(m) ? 'unknown': m;
25616 function parseMiscLanes(tag) {
25619 var validValues = [
25620 'yes', 'no', 'designated'
25623 return tag.split('|')
25624 .map(function (s) {
25625 if (s === '') s = 'no';
25626 return validValues.indexOf(s) === -1 ? 'unknown': s;
25631 function parseBicycleWay(tag) {
25634 var validValues = [
25635 'yes', 'no', 'designated', 'lane'
25638 return tag.split('|')
25639 .map(function (s) {
25640 if (s === '') s = 'no';
25641 return validValues.indexOf(s) === -1 ? 'unknown': s;
25646 function mapToLanesObj(lanesObj, data, key) {
25647 if (data.forward) data.forward.forEach(function(l, i) {
25648 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25649 lanesObj.forward[i][key] = l;
25651 if (data.backward) data.backward.forEach(function(l, i) {
25652 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25653 lanesObj.backward[i][key] = l;
25655 if (data.unspecified) data.unspecified.forEach(function(l, i) {
25656 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25657 lanesObj.unspecified[i][key] = l;
25661 /** Used to compose bitmasks for cloning. */
25662 var CLONE_DEEP_FLAG$2 = 1,
25663 CLONE_SYMBOLS_FLAG$3 = 4;
25666 * This method is like `_.clone` except that it recursively clones `value`.
25672 * @param {*} value The value to recursively clone.
25673 * @returns {*} Returns the deep cloned value.
25677 * var objects = [{ 'a': 1 }, { 'b': 2 }];
25679 * var deep = _.cloneDeep(objects);
25680 * console.log(deep[0] === objects[0]);
25683 function cloneDeep(value) {
25684 return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
25688 * Gets the timestamp of the number of milliseconds that have elapsed since
25689 * the Unix epoch (1 January 1970 00:00:00 UTC).
25695 * @returns {number} Returns the timestamp.
25698 * _.defer(function(stamp) {
25699 * console.log(_.now() - stamp);
25701 * // => Logs the number of milliseconds it took for the deferred invocation.
25703 var now$1 = function() {
25704 return root$2.Date.now();
25707 /** Error message constants. */
25708 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25710 /* Built-in method references for those with the same name as other `lodash` methods. */
25711 var nativeMax$2 = Math.max,
25712 nativeMin = Math.min;
25715 * Creates a debounced function that delays invoking `func` until after `wait`
25716 * milliseconds have elapsed since the last time the debounced function was
25717 * invoked. The debounced function comes with a `cancel` method to cancel
25718 * delayed `func` invocations and a `flush` method to immediately invoke them.
25719 * Provide `options` to indicate whether `func` should be invoked on the
25720 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25721 * with the last arguments provided to the debounced function. Subsequent
25722 * calls to the debounced function return the result of the last `func`
25725 * **Note:** If `leading` and `trailing` options are `true`, `func` is
25726 * invoked on the trailing edge of the timeout only if the debounced function
25727 * is invoked more than once during the `wait` timeout.
25729 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25730 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25732 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25733 * for details over the differences between `_.debounce` and `_.throttle`.
25738 * @category Function
25739 * @param {Function} func The function to debounce.
25740 * @param {number} [wait=0] The number of milliseconds to delay.
25741 * @param {Object} [options={}] The options object.
25742 * @param {boolean} [options.leading=false]
25743 * Specify invoking on the leading edge of the timeout.
25744 * @param {number} [options.maxWait]
25745 * The maximum time `func` is allowed to be delayed before it's invoked.
25746 * @param {boolean} [options.trailing=true]
25747 * Specify invoking on the trailing edge of the timeout.
25748 * @returns {Function} Returns the new debounced function.
25751 * // Avoid costly calculations while the window size is in flux.
25752 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25754 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25755 * jQuery(element).on('click', _.debounce(sendMail, 300, {
25757 * 'trailing': false
25760 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25761 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25762 * var source = new EventSource('/stream');
25763 * jQuery(source).on('message', debounced);
25765 * // Cancel the trailing debounced invocation.
25766 * jQuery(window).on('popstate', debounced.cancel);
25768 function debounce(func, wait, options) {
25775 lastInvokeTime = 0,
25780 if (typeof func != 'function') {
25781 throw new TypeError(FUNC_ERROR_TEXT$2);
25783 wait = toNumber(wait) || 0;
25784 if (isObject(options)) {
25785 leading = !!options.leading;
25786 maxing = 'maxWait' in options;
25787 maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25788 trailing = 'trailing' in options ? !!options.trailing : trailing;
25791 function invokeFunc(time) {
25792 var args = lastArgs,
25793 thisArg = lastThis;
25795 lastArgs = lastThis = undefined;
25796 lastInvokeTime = time;
25797 result = func.apply(thisArg, args);
25801 function leadingEdge(time) {
25802 // Reset any `maxWait` timer.
25803 lastInvokeTime = time;
25804 // Start the timer for the trailing edge.
25805 timerId = setTimeout(timerExpired, wait);
25806 // Invoke the leading edge.
25807 return leading ? invokeFunc(time) : result;
25810 function remainingWait(time) {
25811 var timeSinceLastCall = time - lastCallTime,
25812 timeSinceLastInvoke = time - lastInvokeTime,
25813 timeWaiting = wait - timeSinceLastCall;
25816 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
25820 function shouldInvoke(time) {
25821 var timeSinceLastCall = time - lastCallTime,
25822 timeSinceLastInvoke = time - lastInvokeTime;
25824 // Either this is the first call, activity has stopped and we're at the
25825 // trailing edge, the system time has gone backwards and we're treating
25826 // it as the trailing edge, or we've hit the `maxWait` limit.
25827 return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25828 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25831 function timerExpired() {
25832 var time = now$1();
25833 if (shouldInvoke(time)) {
25834 return trailingEdge(time);
25836 // Restart the timer.
25837 timerId = setTimeout(timerExpired, remainingWait(time));
25840 function trailingEdge(time) {
25841 timerId = undefined;
25843 // Only invoke if we have `lastArgs` which means `func` has been
25844 // debounced at least once.
25845 if (trailing && lastArgs) {
25846 return invokeFunc(time);
25848 lastArgs = lastThis = undefined;
25852 function cancel() {
25853 if (timerId !== undefined) {
25854 clearTimeout(timerId);
25856 lastInvokeTime = 0;
25857 lastArgs = lastCallTime = lastThis = timerId = undefined;
25861 return timerId === undefined ? result : trailingEdge(now$1());
25864 function debounced() {
25865 var time = now$1(),
25866 isInvoking = shouldInvoke(time);
25868 lastArgs = arguments;
25870 lastCallTime = time;
25873 if (timerId === undefined) {
25874 return leadingEdge(lastCallTime);
25877 // Handle invocations in a tight loop.
25878 timerId = setTimeout(timerExpired, wait);
25879 return invokeFunc(lastCallTime);
25882 if (timerId === undefined) {
25883 timerId = setTimeout(timerExpired, wait);
25887 debounced.cancel = cancel;
25888 debounced.flush = flush;
25893 * Casts `value` to `identity` if it's not a function.
25896 * @param {*} value The value to inspect.
25897 * @returns {Function} Returns cast function.
25899 function castFunction(value) {
25900 return typeof value == 'function' ? value : identity$8;
25904 * Iterates over elements of `collection` and invokes `iteratee` for each element.
25905 * The iteratee is invoked with three arguments: (value, index|key, collection).
25906 * Iteratee functions may exit iteration early by explicitly returning `false`.
25908 * **Note:** As with other "Collections" methods, objects with a "length"
25909 * property are iterated like arrays. To avoid this behavior use `_.forIn`
25910 * or `_.forOwn` for object iteration.
25916 * @category Collection
25917 * @param {Array|Object} collection The collection to iterate over.
25918 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25919 * @returns {Array|Object} Returns `collection`.
25920 * @see _.forEachRight
25923 * _.forEach([1, 2], function(value) {
25924 * console.log(value);
25926 * // => Logs `1` then `2`.
25928 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25929 * console.log(key);
25931 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25933 function forEach(collection, iteratee) {
25934 var func = isArray(collection) ? arrayEach : baseEach;
25935 return func(collection, castFunction(iteratee));
25939 * Iterates over own enumerable string keyed properties of an object and
25940 * invokes `iteratee` for each property. The iteratee is invoked with three
25941 * arguments: (value, key, object). Iteratee functions may exit iteration
25942 * early by explicitly returning `false`.
25948 * @param {Object} object The object to iterate over.
25949 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25950 * @returns {Object} Returns `object`.
25951 * @see _.forOwnRight
25959 * Foo.prototype.c = 3;
25961 * _.forOwn(new Foo, function(value, key) {
25962 * console.log(key);
25964 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25966 function forOwn(object, iteratee) {
25967 return object && baseForOwn(object, castFunction(iteratee));
25971 var translations = Object.create(null);
25973 var currentLocale = 'en';
25974 var textDirection = 'ltr';
25976 function setLocale(_ ) {
25977 if (translations[_] !== undefined) {
25979 } else if (translations[_.split('-')[0]]) {
25980 currentLocale = _.split('-')[0];
25984 function addTranslation(id , value ) {
25985 translations[id] = value;
25989 * Given a string identifier, try to find that string in the current
25990 * language, and return it.
25992 * @param {string} s string identifier
25993 * @returns {string?} locale string
25995 function t(s , o , loc ) {
25996 loc = loc || currentLocale;
26000 .map(function (s) {
26001 return s.replace('<TX_DOT>', '.');
26005 var rep = translations[loc];
26007 while (rep !== undefined && path.length) rep = rep[path.pop()];
26009 if (rep !== undefined) {
26011 for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
26015 if (loc !== 'en') {
26016 return t(s, o, 'en');
26019 if (o && 'default' in o) {
26023 var missing = 'Missing ' + loc + ' translation: ' + s;
26024 if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26030 * Given string 'ltr' or 'rtl', save that setting
26032 * @param {string} s ltr or rtl
26035 function setTextDirection(dir ) {
26036 textDirection = dir;
26039 /** Used to compose bitmasks for cloning. */
26040 var CLONE_DEEP_FLAG$3 = 1,
26041 CLONE_SYMBOLS_FLAG$4 = 4;
26044 * This method is like `_.cloneWith` except that it recursively clones `value`.
26050 * @param {*} value The value to recursively clone.
26051 * @param {Function} [customizer] The function to customize cloning.
26052 * @returns {*} Returns the deep cloned value.
26056 * function customizer(value) {
26057 * if (_.isElement(value)) {
26058 * return value.cloneNode(true);
26062 * var el = _.cloneDeepWith(document.body, customizer);
26064 * console.log(el === document.body);
26066 * console.log(el.nodeName);
26068 * console.log(el.childNodes.length);
26071 function cloneDeepWith(value, customizer) {
26072 customizer = typeof customizer == 'function' ? customizer : undefined;
26073 return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26077 * Creates an array of `array` values not included in the other given arrays
26078 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26079 * for equality comparisons. The order and references of result values are
26080 * determined by the first array.
26082 * **Note:** Unlike `_.pullAll`, this method returns a new array.
26088 * @param {Array} array The array to inspect.
26089 * @param {...Array} [values] The values to exclude.
26090 * @returns {Array} Returns the new array of filtered values.
26091 * @see _.without, _.xor
26094 * _.difference([2, 1], [2, 3]);
26097 var difference = baseRest(function(array, values) {
26098 return isArrayLikeObject(array)
26099 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26103 /** `Object#toString` result references. */
26104 var mapTag$7 = '[object Map]',
26105 setTag$7 = '[object Set]';
26107 /** Used for built-in method references. */
26108 var objectProto$17 = Object.prototype;
26110 /** Used to check objects for own properties. */
26111 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26114 * Checks if `value` is an empty object, collection, map, or set.
26116 * Objects are considered empty if they have no own enumerable string keyed
26119 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26120 * jQuery-like collections are considered empty if they have a `length` of `0`.
26121 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26127 * @param {*} value The value to check.
26128 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26140 * _.isEmpty([1, 2, 3]);
26143 * _.isEmpty({ 'a': 1 });
26146 function isEmpty(value) {
26147 if (value == null) {
26150 if (isArrayLike(value) &&
26151 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26152 isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26153 return !value.length;
26155 var tag = getTag$1(value);
26156 if (tag == mapTag$7 || tag == setTag$7) {
26157 return !value.size;
26159 if (isPrototype(value)) {
26160 return !baseKeys(value).length;
26162 for (var key in value) {
26163 if (hasOwnProperty$14.call(value, key)) {
26172 function utilDetect(force) {
26173 if (detected && !force) return detected;
26176 var ua = navigator.userAgent,
26179 m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
26181 detected.browser = m[1];
26182 detected.version = m[2];
26184 if (!detected.browser) {
26185 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
26187 detected.browser = 'msie';
26188 detected.version = m[1];
26191 if (!detected.browser) {
26192 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
26194 detected.browser = 'Opera';
26195 detected.version = m[2];
26198 if (!detected.browser) {
26199 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26201 detected.browser = m[1];
26202 detected.version = m[2];
26203 m = ua.match(/version\/([\.\d]+)/i);
26204 if (m !== null) detected.version = m[1];
26207 if (!detected.browser) {
26208 detected.browser = navigator.appName;
26209 detected.version = navigator.appVersion;
26212 // keep major.minor version only..
26213 detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26215 if (detected.browser.toLowerCase() === 'msie') {
26216 detected.ie = true;
26217 detected.browser = 'Internet Explorer';
26218 detected.support = parseFloat(detected.version) >= 11;
26220 detected.ie = false;
26221 detected.support = true;
26224 // Added due to incomplete svg style support. See #715
26225 detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26227 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26228 detected.language = detected.locale.split('-')[0];
26230 // Search `navigator.languages` for a better locale.. Prefer the first language,
26231 // unless the second language is a culture-specific version of the first one, see #3842
26232 if (navigator.languages && navigator.languages.length > 0) {
26233 var code0 = navigator.languages[0],
26234 parts0 = code0.split('-');
26236 detected.locale = code0;
26237 detected.language = parts0[0];
26239 if (navigator.languages.length > 1 && parts0.length === 1) {
26240 var code1 = navigator.languages[1],
26241 parts1 = code1.split('-');
26243 if (parts1[0] === parts0[0]) {
26244 detected.locale = code1;
26249 // Loaded locale is stored in currentLocale
26250 // return that instead (except in the situation where 'en' might override 'en-US')
26251 var loadedLocale = currentLocale || 'en';
26252 if (loadedLocale !== 'en') {
26253 detected.locale = loadedLocale;
26254 detected.language = detected.locale.split('-')[0];
26257 // detect text direction
26258 var q = utilStringQs(window.location.hash.substring(1));
26259 var lang = dataLocales[detected.locale];
26260 if ((lang && lang.rtl) || (q.rtl === 'true')) {
26261 detected.textDirection = 'rtl';
26263 detected.textDirection = 'ltr';
26265 setTextDirection(detected.textDirection);
26268 var loc = window.top.location;
26269 var origin = loc.origin;
26270 if (!origin) { // for unpatched IE11
26271 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26274 detected.host = origin + loc.pathname;
26276 detected.filedrop = (window.FileReader && 'ondrop' in window);
26278 detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26280 detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26283 return navigator.userAgent.indexOf(x) !== -1;
26287 detected.os = 'win';
26288 detected.platform = 'Windows';
26290 else if (nav('Mac')) {
26291 detected.os = 'mac';
26292 detected.platform = 'Macintosh';
26294 else if (nav('X11') || nav('Linux')) {
26295 detected.os = 'linux';
26296 detected.platform = 'Linux';
26299 detected.os = 'win';
26300 detected.platform = 'Unknown';
26306 var remove$1 = removeDiacritics;
26308 var replacementList = [
26317 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",
26323 chars: "\u00C6\u01FC\u01E2",
26332 chars: "\uA738\uA73A",
26338 chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26341 chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26344 chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26350 chars: "\u01F1\u01C4",
26353 chars: "\u01F2\u01C5",
26356 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",
26359 chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26362 chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26365 chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26368 chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26371 chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26374 chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26377 chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26386 chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26389 chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26398 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",
26413 chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26416 chars: "\u24C6\uFF31\uA756\uA758\u024A",
26419 chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26422 chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26425 chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26434 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",
26437 chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26443 chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26446 chars: "\u24CD\uFF38\u1E8A\u1E8C",
26449 chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26452 chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26455 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",
26461 chars: "\u00E6\u01FD\u01E3",
26470 chars: "\uA739\uA73B",
26476 chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26479 chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26482 chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26488 chars: "\u01F3\u01C6",
26491 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",
26494 chars: "\u24D5\uFF46\u1E1F\u0192",
26512 chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26515 chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26521 chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26524 chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26527 chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26530 chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26536 chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26539 chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26545 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",
26560 chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26563 chars: "\u24E0\uFF51\u024B\uA757\uA759",
26566 chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26569 chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26575 chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26584 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",
26587 chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26593 chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26596 chars: "\u24E7\uFF58\u1E8B\u1E8D",
26599 chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26602 chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26606 var diacriticsMap = {};
26607 for (var i = 0; i < replacementList.length; i += 1) {
26608 var chars = replacementList[i].chars;
26609 for (var j = 0; j < chars.length; j += 1) {
26610 diacriticsMap[chars[j]] = replacementList[i].base;
26614 function removeDiacritics(str) {
26615 return str.replace(/[^\u0000-\u007e]/g, function(c) {
26616 return diacriticsMap[c] || c;
26620 // see https://github.com/openstreetmap/iD/pull/3707
26621 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26624 // madda above alef
26625 1570: { initial: 'آ', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26627 // hamza above and below alef
26628 1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26630 1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26632 1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26633 1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26636 1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26638 1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26639 1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26640 1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26641 1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26642 1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26643 1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26644 1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26645 1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26646 1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26647 1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26648 1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26649 1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26650 1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26651 1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26652 1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26653 1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26654 1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26655 1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26657 // 1595 ػ - may be very rare
26659 1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26660 1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26661 1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26662 1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26663 1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26664 1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26665 1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26668 1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26670 1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26672 // short vowel sounds / tashkil markings
26674 1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26676 1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26677 1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26678 1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26679 1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26680 1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26681 5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26684 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26686 function fixRTLTextForSvg(inputText) {
26687 var context = true;
26689 var rtlBuffer = [];
26690 var arabicRegex = /[\u0600-\u06FF]/g;
26691 var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26692 var thaanaVowel = /[\u07A6-\u07B0]/;
26693 var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26695 if (!arabicRegex.test(inputText)) {
26696 // Hebrew or Thaana RTL script
26697 for (var n = 0; n < inputText.length; n++) {
26698 var c = inputText[n];
26699 if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26700 rtlBuffer[rtlBuffer.length - 1] += c;
26701 } else if (rtlRegex.test(c)) {
26703 } else if (c === ' ' && rtlBuffer.length) {
26704 // whitespace within RTL text
26705 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26707 // non-RTL character
26708 ret += rtlBuffer.reverse().join('') + c;
26713 for (var i = 0, l = inputText.length; i < l; i++) {
26714 var code = inputText[i].charCodeAt(0);
26715 var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26717 if (!chars$1[code]) {
26718 if (code === 32 && rtlBuffer.length) {
26720 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26721 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26723 rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26725 // non-RTL character
26726 ret += rtlBuffer.reverse().join('') + inputText[i];
26732 if (i === l - 1 || nextCode === 32) {
26733 rtlBuffer.push(chars$1[code].isolated);
26735 // special case for لا
26736 if (code === 1604 && nextCode === 1575) {
26737 rtlBuffer.push(chars$1[5000].initial);
26742 rtlBuffer.push(chars$1[code].initial);
26745 if (i === l - 1 || nextCode === 32){
26746 rtlBuffer.push(chars$1[code].final);
26748 // special case for ﻼ
26749 if (code === 1604 && nextCode === 1575){
26750 rtlBuffer.push(chars$1[5000].final);
26755 if (chars$1[code].medial === ''){
26756 rtlBuffer.push(chars$1[code].final);
26758 rtlBuffer.push(chars$1[code].medial);
26762 context = (chars$1[code].medial === '') || nextCode === 32;
26765 ret += rtlBuffer.reverse().join('');
26769 function utilTagText(entity) {
26770 return map$3(entity.tags, function(v, k) {
26771 return k + '=' + v;
26776 function utilEntitySelector(ids) {
26777 return ids.length ? '.' + ids.join(',.') : 'nothing';
26781 function utilEntityOrMemberSelector(ids, graph) {
26782 var s = utilEntitySelector(ids);
26784 ids.forEach(function(id) {
26785 var entity = graph.hasEntity(id);
26786 if (entity && entity.type === 'relation') {
26787 entity.members.forEach(function(member) {
26788 s += ',.' + member.id;
26797 function utilGetAllNodes(ids, graph) {
26800 ids.forEach(getNodes);
26803 function getNodes(id) {
26804 if (seen[id]) return;
26807 var entity = graph.hasEntity(id);
26808 if (!entity) return;
26810 if (entity.type === 'node') {
26811 nodes.push(entity);
26812 } else if (entity.type === 'way') {
26813 entity.nodes.forEach(getNodes);
26815 entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26821 function utilDisplayName(entity) {
26822 var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26823 name = entity.tags[localizedNameKey] || entity.tags.name || '',
26824 network = entity.tags.cycle_network || entity.tags.network;
26826 if (!name && entity.tags.ref) {
26827 name = entity.tags.ref;
26829 name = network + ' ' + name;
26837 function utilDisplayNameForPath(entity) {
26838 var name = utilDisplayName(entity);
26839 var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26841 if (!isFirefox && name && rtlRegex.test(name)) {
26842 name = fixRTLTextForSvg(name);
26849 function utilDisplayType(id) {
26851 n: t('inspector.node'),
26852 w: t('inspector.way'),
26853 r: t('inspector.relation')
26858 function utilStringQs(str) {
26859 return str.split('&').reduce(function(obj, pair){
26860 var parts = pair.split('=');
26861 if (parts.length === 2) {
26862 obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26869 function utilQsString(obj, noencode) {
26870 function softEncode(s) {
26871 // encode everything except special characters used in certain hash parameters:
26872 // "/" in map states, ":", ",", {" and "}" in background
26873 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26875 return Object.keys(obj).sort().map(function(key) {
26876 return encodeURIComponent(key) + '=' + (
26877 noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26882 function utilPrefixDOMProperty(property) {
26883 var prefixes = ['webkit', 'ms', 'moz', 'o'],
26885 n = prefixes.length,
26891 property = property.substr(0, 1).toUpperCase() + property.substr(1);
26894 if (prefixes[i] + property in s)
26895 return prefixes[i] + property;
26901 function utilPrefixCSSProperty(property) {
26902 var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26904 n = prefixes.length,
26905 s = document.body.style;
26907 if (property.toLowerCase() in s)
26908 return property.toLowerCase();
26911 if (prefixes[i] + property in s)
26912 return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26918 var transformProperty;
26919 function utilSetTransform(el, x, y, scale) {
26920 var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26921 translate = utilDetect().opera ?
26922 'translate(' + x + 'px,' + y + 'px)' :
26923 'translate3d(' + x + 'px,' + y + 'px,0)';
26924 return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26928 // Calculates Levenshtein distance between two strings
26929 // see: https://en.wikipedia.org/wiki/Levenshtein_distance
26930 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26931 function utilEditDistance(a, b) {
26932 a = remove$1(a.toLowerCase());
26933 b = remove$1(b.toLowerCase());
26934 if (a.length === 0) return b.length;
26935 if (b.length === 0) return a.length;
26937 for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26938 for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26939 for (i = 1; i <= b.length; i++) {
26940 for (j = 1; j <= a.length; j++) {
26941 if (b.charAt(i-1) === a.charAt(j-1)) {
26942 matrix[i][j] = matrix[i-1][j-1];
26944 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26945 Math.min(matrix[i][j-1] + 1, // insertion
26946 matrix[i-1][j] + 1)); // deletion
26950 return matrix[b.length][a.length];
26954 // a d3.mouse-alike which
26955 // 1. Only works on HTML elements, not SVG
26956 // 2. Does not cause style recalculation
26957 function utilFastMouse(container) {
26958 var rect = container.getBoundingClientRect(),
26959 rectLeft = rect.left,
26960 rectTop = rect.top,
26961 clientLeft = +container.clientLeft,
26962 clientTop = +container.clientTop;
26963 if (textDirection === 'rtl') {
26966 return function(e) {
26968 e.clientX - rectLeft - clientLeft,
26969 e.clientY - rectTop - clientTop];
26974 /* eslint-disable no-proto */
26975 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
26976 /* eslint-enable no-proto */
26979 function utilAsyncMap(inputs, func, callback) {
26980 var remaining = inputs.length,
26984 inputs.forEach(function(d, i) {
26985 func(d, function done(err, data) {
26989 if (!remaining) callback(errors, results);
26995 // wraps an index to an interval [0..length-1]
26996 function utilWrap(index, length) {
26998 index += Math.ceil(-index/length)*length;
26999 return index % length;
27004 * a replacement for functor
27006 * @param {*} value any value
27007 * @returns {Function} a function that returns that value or the value if it's a function
27009 function utilFunctor(value) {
27010 if (typeof value === 'function') return value;
27011 return function() {
27017 function utilNoAuto(selection) {
27018 var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27021 .attr('autocomplete', 'off')
27022 .attr('autocorrect', 'off')
27023 .attr('autocapitalize', 'off')
27024 .attr('spellcheck', isText ? 'true' : 'false');
27027 // note the function should be of low priority
27028 // and should not be returning a value.
27029 function utilCallWhenIdle(func, timeout) {
27030 return function() {
27031 var args = arguments;
27033 window.requestIdleCallback(function() {
27034 func.apply(that, args);
27035 }, {timeout: timeout});
27039 // Like selection.property('value', ...), but avoids no-op value sets,
27040 // which can result in layout/repaint thrashing in some situations.
27041 function utilGetSetValue(selection, value) {
27042 function d3_selection_value(value) {
27043 function valueNull() {
27047 function valueConstant() {
27048 if (this.value !== value) {
27049 this.value = value;
27053 function valueFunction() {
27054 var x = value.apply(this, arguments);
27057 } else if (this.value !== x) {
27062 return value == null
27063 ? valueNull : (typeof value === 'function'
27064 ? valueFunction : valueConstant);
27067 if (arguments.length === 1) {
27068 return selection.property('value');
27071 return selection.each(d3_selection_value(value));
27074 function utilIdleWorker(tasks, processor, callback) {
27075 var results = [], result;
27076 for (var i = 0; i < tasks.length; i++) {
27077 result = processor(tasks[i]);
27078 if (result) results.push(result);
27082 // var processed = [];
27083 // var currentPos = 0;
27084 // var totalTasks = tasks.length;
27086 // function worker(deadline) {
27087 // while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27088 // var result = processor(tasks[currentPos]);
27090 // // if falsy dont add to the processed list
27091 // if (result) processed.push(result);
27095 // // more tasks are left, we might need more idleCallbacks
27096 // if (currentPos < totalTasks) {
27097 // return window.requestIdleCallback(function(deadline) {worker(deadline);});
27100 // // tasks are completed
27101 // return callback(processed);
27104 // window.requestIdleCallback(function(deadline) {worker(deadline);});
27108 window.requestIdleCallback =
27109 window.requestIdleCallback ||
27111 var start = Date.now();
27112 return setTimeout(function() {
27115 timeRemaining: function() {
27116 return Math.max(0, 50 - (Date.now() - start));
27122 window.cancelIdleCallback =
27123 window.cancelIdleCallback ||
27128 // Copies a variable number of methods from source to target.
27129 function utilRebind(target, source) {
27130 var i = 1, n = arguments.length, method;
27132 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27137 // Method is assumed to be a standard D3 getter-setter:
27138 // If passed with no arguments, gets the value.
27139 // If passed with arguments, sets the value and returns the target.
27140 function d3_rebind(target, source, method) {
27141 return function() {
27142 var value = method.apply(source, arguments);
27143 return value === source ? target : value;
27148 // A per-domain session mutex backed by a cookie and dead man's
27149 // switch. If the session crashes, the mutex will auto-release
27150 // after 5 seconds.
27152 // This is a type alias (https://flow.org/en/docs/types/aliases/) which allows flow to understand the object returned by utilSessionMutex in other files.
27159 // This accepts a string and returns an object that complies with utilSessionMutexType
27160 function utilSessionMutex(name ) {
27162 var intervalID ; // This indicates a Maybe type - intervalId can be null so we need to use "?IntervalID", not "IntervalID"
27165 var expires = new Date();
27166 expires.setSeconds(expires.getSeconds() + 5);
27167 document.cookie = name + '=1; expires=' + expires.toUTCString();
27170 mutex.lock = function () {
27171 if (intervalID) return true;
27172 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27173 if (cookie) return false;
27175 intervalID = window.setInterval(renew, 4000);
27179 mutex.unlock = function () {
27180 if (!intervalID) return;
27181 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27182 clearInterval(intervalID);
27186 mutex.locked = function () {
27187 return !!intervalID;
27193 function utilSuggestNames(preset, suggestions) {
27194 preset = preset.id.split('/', 2);
27198 return function(value, callback) {
27200 if (value && value.length > 2) {
27201 if (suggestions[k] && suggestions[k][v]) {
27202 for (var sugg in suggestions[k][v]) {
27203 var dist = utilEditDistance(value, sugg.substring(0, value.length));
27213 result.sort(function(a, b) {
27214 return a.dist - b.dist;
27217 result = result.slice(0,3);
27222 function utilTriggerEvent(target, type) {
27223 target.each(function() {
27224 var evt = document.createEvent('HTMLEvents');
27225 evt.initEvent(type, true, true);
27226 this.dispatchEvent(evt);
27230 function validationDeprecatedTag() {
27232 var validation = function(changes) {
27234 for (var i = 0; i < changes.created.length; i++) {
27235 var change = changes.created[i],
27236 deprecatedTags = change.deprecatedTags();
27238 if (!isEmpty(deprecatedTags)) {
27239 var tags = utilTagText({ tags: deprecatedTags });
27241 id: 'deprecated_tags',
27242 message: t('validations.deprecated_tags', { tags: tags }),
27255 function validationDisconnectedHighway() {
27257 function isDisconnectedHighway(entity, graph) {
27258 if (!entity.tags.highway) return false;
27259 if (entity.geometry(graph) !== 'line') return false;
27261 return graph.childNodes(entity)
27262 .every(function(vertex) {
27263 var parents = graph.parentWays(vertex);
27264 if (parents.length === 1) { // standalone vertex
27266 } else { // shared vertex
27267 return !vertex.tags.entrance &&
27268 parents.filter(function(parent) {
27269 return parent.tags.highway && parent !== entity;
27276 var validation = function(changes, graph) {
27278 for (var i = 0; i < changes.created.length; i++) {
27279 var entity = changes.created[i];
27281 if (isDisconnectedHighway(entity, graph)) {
27283 id: 'disconnected_highway',
27284 message: t('validations.disconnected_highway'),
27285 tooltip: t('validations.disconnected_highway_tooltip'),
27298 function validationManyDeletions() {
27299 var threshold = 100;
27301 var validation = function(changes, graph) {
27303 var nodes=0, ways=0, areas=0, relations=0;
27305 changes.deleted.forEach(function(c) {
27306 if (c.type === 'node') {nodes++;}
27307 else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
27308 else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
27309 else if (c.type === 'relation') {relations++;}
27311 if (changes.deleted.length > threshold) {
27313 id: 'many_deletions',
27314 message: t('validations.many_deletions',
27315 { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
27326 function validationMissingTag() {
27328 // Slightly stricter check than Entity#isUsed (#3091)
27329 function hasTags(entity, graph) {
27330 return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27331 graph.parentRelations(entity).length > 0;
27334 var validation = function(changes, graph) {
27335 var types = ['point', 'line', 'area', 'relation'],
27338 for (var i = 0; i < changes.created.length; i++) {
27339 var change = changes.created[i],
27340 geometry = change.geometry(graph);
27342 if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27345 message: t('validations.untagged_' + geometry),
27346 tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27359 function validationOldMultipolygon() {
27361 return function validation(changes, graph) {
27363 for (var i = 0; i < changes.created.length; i++) {
27364 var entity = changes.created[i];
27365 var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27368 id: 'old_multipolygon',
27369 message: t('validations.old_multipolygon'),
27370 tooltip: t('validations.old_multipolygon_tooltip'),
27379 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27380 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27381 function validationTagSuggestsArea() {
27383 function tagSuggestsArea(tags) {
27384 if (isEmpty(tags)) return false;
27386 var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27387 for (var i = 0; i < presence.length; i++) {
27388 if (tags[presence[i]] !== undefined) {
27389 return presence[i] + '=' + tags[presence[i]];
27393 if (tags.building && tags.building === 'yes') return 'building=yes';
27397 var validation = function(changes, graph) {
27399 for (var i = 0; i < changes.created.length; i++) {
27400 var change = changes.created[i],
27401 geometry = change.geometry(graph),
27402 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27406 id: 'tag_suggests_area',
27407 message: t('validations.tag_suggests_area', { tag: suggestion }),
27422 var Validations = Object.freeze({
27423 validationDeprecatedTag: validationDeprecatedTag,
27424 validationDisconnectedHighway: validationDisconnectedHighway,
27425 validationManyDeletions: validationManyDeletions,
27426 validationMissingTag: validationMissingTag,
27427 validationOldMultipolygon: validationOldMultipolygon,
27428 validationTagSuggestsArea: validationTagSuggestsArea
27432 * Performs a deep comparison between two values to determine if they are
27435 * **Note:** This method supports comparing arrays, array buffers, booleans,
27436 * date objects, error objects, maps, numbers, `Object` objects, regexes,
27437 * sets, strings, symbols, and typed arrays. `Object` objects are compared
27438 * by their own, not inherited, enumerable properties. Functions and DOM
27439 * nodes are compared by strict equality, i.e. `===`.
27445 * @param {*} value The value to compare.
27446 * @param {*} other The other value to compare.
27447 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27450 * var object = { 'a': 1 };
27451 * var other = { 'a': 1 };
27453 * _.isEqual(object, other);
27456 * object === other;
27459 function isEqual(value, other) {
27460 return baseIsEqual(value, other);
27464 iD.Difference represents the difference between two graphs.
27465 It knows how to calculate the set of entities that were
27466 created, modified, or deleted, and also contains the logic
27467 for recursively extending a difference to the complete set
27468 of entities that will require a redraw, taking into account
27469 child and parent relationships.
27471 function coreDifference(base, head) {
27475 var i, k, h, b, keys;
27477 function changed(h, b) {
27478 if (h === b) return false;
27479 if (!h || !b) return true;
27481 if (h.loc || b.loc) {
27482 if (!h.loc && b.loc || h.loc && !b.loc ||
27483 h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
27485 if (h.nodes || b.nodes) {
27486 if (!isEqual(h.nodes, b.nodes)) return true;
27488 if (h.members || b.members) {
27489 if (!isEqual(h.members, b.members)) return true;
27491 return !isEqual(h.tags, b.tags);
27495 keys = Object.keys(head.entities);
27496 for (i = 0; i < keys.length; i++) {
27498 h = head.entities[k];
27499 b = base.entities[k];
27500 if (changed(h, b)) {
27501 _changes[k] = {base: b, head: h};
27506 keys = Object.keys(base.entities);
27507 for (i = 0; i < keys.length; i++) {
27509 h = head.entities[k];
27510 b = base.entities[k];
27511 if (!_changes[k] && changed(h, b)) {
27512 _changes[k] = {base: b, head: h};
27518 function addParents(parents, result) {
27519 for (var i = 0; i < parents.length; i++) {
27520 var parent = parents[i];
27522 if (parent.id in result)
27525 result[parent.id] = parent;
27526 addParents(head.parentRelations(parent), result);
27531 _diff.length = function length() {
27536 _diff.changes = function changes() {
27541 _diff.extantIDs = function extantIDs() {
27543 forEach(_changes, function(change, id) {
27544 if (change.head) result.push(id);
27550 _diff.modified = function modified() {
27552 forEach(_changes, function(change) {
27553 if (change.base && change.head) result.push(change.head);
27559 _diff.created = function created() {
27561 forEach(_changes, function(change) {
27562 if (!change.base && change.head) result.push(change.head);
27568 _diff.deleted = function deleted() {
27570 forEach(_changes, function(change) {
27571 if (change.base && !change.head) result.push(change.base);
27577 _diff.summary = function summary() {
27580 function addEntity(entity, graph, changeType) {
27581 relevant[entity.id] = {
27584 changeType: changeType
27588 function addParents(entity) {
27589 var parents = head.parentWays(entity);
27590 for (var j = parents.length - 1; j >= 0; j--) {
27591 var parent = parents[j];
27592 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27596 var keys = Object.keys(_changes);
27597 for (var i = 0; i < keys.length; i++) {
27598 var change = _changes[keys[i]];
27600 if (change.head && change.head.geometry(head) !== 'vertex') {
27601 addEntity(change.head, head, change.base ? 'modified' : 'created');
27603 } else if (change.base && change.base.geometry(base) !== 'vertex') {
27604 addEntity(change.base, base, 'deleted');
27606 } else if (change.base && change.head) { // modified vertex
27607 var moved = !isEqual(change.base.loc, change.head.loc);
27608 var retagged = !isEqual(change.base.tags, change.head.tags);
27611 addParents(change.head);
27614 if (retagged || (moved && change.head.hasInterestingTags())) {
27615 addEntity(change.head, head, 'modified');
27618 } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27619 addEntity(change.head, head, 'created');
27621 } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27622 addEntity(change.base, base, 'deleted');
27626 return values$1(relevant);
27630 _diff.complete = function complete(extent) {
27634 for (id in _changes) {
27635 change = _changes[id];
27637 var h = change.head;
27638 var b = change.base;
27639 var entity = h || b;
27642 (!h || !h.intersects(extent, head)) &&
27643 (!b || !b.intersects(extent, base)))
27648 if (entity.type === 'way') {
27649 var nh = h ? h.nodes : [];
27650 var nb = b ? b.nodes : [];
27653 diff = difference(nh, nb);
27654 for (i = 0; i < diff.length; i++) {
27655 result[diff[i]] = head.hasEntity(diff[i]);
27658 diff = difference(nb, nh);
27659 for (i = 0; i < diff.length; i++) {
27660 result[diff[i]] = head.hasEntity(diff[i]);
27664 addParents(head.parentWays(entity), result);
27665 addParents(head.parentRelations(entity), result);
27675 /** Used for built-in method references. */
27676 var objectProto$18 = Object.prototype;
27678 /** Used to check objects for own properties. */
27679 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27682 * Assigns own enumerable string keyed properties of source objects to the
27683 * destination object. Source objects are applied from left to right.
27684 * Subsequent sources overwrite property assignments of previous sources.
27686 * **Note:** This method mutates `object` and is loosely based on
27687 * [`Object.assign`](https://mdn.io/Object/assign).
27693 * @param {Object} object The destination object.
27694 * @param {...Object} [sources] The source objects.
27695 * @returns {Object} Returns `object`.
27707 * Foo.prototype.b = 2;
27708 * Bar.prototype.d = 4;
27710 * _.assign({ 'a': 0 }, new Foo, new Bar);
27711 * // => { 'a': 1, 'c': 3 }
27713 var assign = createAssigner(function(object, source) {
27714 if (isPrototype(source) || isArrayLike(source)) {
27715 copyObject(source, keys$1(source), object);
27718 for (var key in source) {
27719 if (hasOwnProperty$15.call(source, key)) {
27720 assignValue(object, key, source[key]);
27725 /* Built-in method references for those with the same name as other `lodash` methods. */
27726 var nativeMax$3 = Math.max;
27729 * Checks if `value` is in `collection`. If `collection` is a string, it's
27730 * checked for a substring of `value`, otherwise
27731 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27732 * is used for equality comparisons. If `fromIndex` is negative, it's used as
27733 * the offset from the end of `collection`.
27738 * @category Collection
27739 * @param {Array|Object|string} collection The collection to inspect.
27740 * @param {*} value The value to search for.
27741 * @param {number} [fromIndex=0] The index to search from.
27742 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27743 * @returns {boolean} Returns `true` if `value` is found, else `false`.
27746 * _.includes([1, 2, 3], 1);
27749 * _.includes([1, 2, 3], 1, 2);
27752 * _.includes({ 'a': 1, 'b': 2 }, 1);
27755 * _.includes('abcd', 'bc');
27758 function includes(collection, value, fromIndex, guard) {
27759 collection = isArrayLike(collection) ? collection : values$1(collection);
27760 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27762 var length = collection.length;
27763 if (fromIndex < 0) {
27764 fromIndex = nativeMax$3(length + fromIndex, 0);
27766 return isString(collection)
27767 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27768 : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27771 function coreGraph$$1(other, mutable) {
27772 if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27774 if (other instanceof coreGraph$$1) {
27775 var base = other.base();
27776 this.entities = assign(Object.create(base.entities), other.entities);
27777 this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27778 this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27781 this.entities = Object.create({});
27782 this._parentWays = Object.create({});
27783 this._parentRels = Object.create({});
27784 this.rebase(other || [], [this]);
27787 this.transients = {};
27788 this._childNodes = {};
27789 this.frozen = !mutable;
27793 coreGraph$$1.prototype = {
27795 hasEntity: function(id) {
27796 return this.entities[id];
27800 entity: function(id) {
27801 var entity = this.entities[id];
27803 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27805 entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
27809 throw new Error('entity ' + id + ' not found');
27815 transient: function(entity, key, fn) {
27816 var id = entity.id,
27817 transients = this.transients[id] ||
27818 (this.transients[id] = {});
27820 if (transients[key] !== undefined) {
27821 return transients[key];
27824 transients[key] = fn.call(entity);
27826 return transients[key];
27830 parentWays: function(entity) {
27831 var parents = this._parentWays[entity.id],
27835 for (var i = 0; i < parents.length; i++) {
27836 result.push(this.entity(parents[i]));
27843 isPoi: function(entity) {
27844 var parentWays = this._parentWays[entity.id];
27845 return !parentWays || parentWays.length === 0;
27849 isShared: function(entity) {
27850 var parentWays = this._parentWays[entity.id];
27851 return parentWays && parentWays.length > 1;
27855 parentRelations: function(entity) {
27856 var parents = this._parentRels[entity.id],
27860 for (var i = 0; i < parents.length; i++) {
27861 result.push(this.entity(parents[i]));
27868 childNodes: function(entity) {
27869 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27870 if (!entity.nodes) return [];
27873 for (var i = 0; i < entity.nodes.length; i++) {
27874 nodes[i] = this.entity(entity.nodes[i]);
27877 if (debug) Object.freeze(nodes);
27879 this._childNodes[entity.id] = nodes;
27880 return this._childNodes[entity.id];
27886 'entities': utilGetPrototypeOf(this.entities),
27887 'parentWays': utilGetPrototypeOf(this._parentWays),
27888 'parentRels': utilGetPrototypeOf(this._parentRels)
27893 // Unlike other graph methods, rebase mutates in place. This is because it
27894 // is used only during the history operation that merges newly downloaded
27895 // data into each state. To external consumers, it should appear as if the
27896 // graph always contained the newly downloaded data.
27897 rebase: function(entities, stack, force) {
27898 var base = this.base(),
27901 for (i = 0; i < entities.length; i++) {
27902 var entity = entities[i];
27904 if (!entity.visible || (!force && base.entities[entity.id]))
27907 // Merging data into the base graph
27908 base.entities[entity.id] = entity;
27909 this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27911 // Restore provisionally-deleted nodes that are discovered to have an extant parent
27912 if (entity.type === 'way') {
27913 for (j = 0; j < entity.nodes.length; j++) {
27914 id = entity.nodes[j];
27915 for (k = 1; k < stack.length; k++) {
27916 var ents = stack[k].entities;
27917 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27925 for (i = 0; i < stack.length; i++) {
27926 stack[i]._updateRebased();
27931 _updateRebased: function() {
27932 var base = this.base(),
27933 i, k, child, id, keys;
27935 keys = Object.keys(this._parentWays);
27936 for (i = 0; i < keys.length; i++) {
27938 if (base.parentWays[child]) {
27939 for (k = 0; k < base.parentWays[child].length; k++) {
27940 id = base.parentWays[child][k];
27941 if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27942 this._parentWays[child].push(id);
27948 keys = Object.keys(this._parentRels);
27949 for (i = 0; i < keys.length; i++) {
27951 if (base.parentRels[child]) {
27952 for (k = 0; k < base.parentRels[child].length; k++) {
27953 id = base.parentRels[child][k];
27954 if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27955 this._parentRels[child].push(id);
27961 this.transients = {};
27963 // this._childNodes is not updated, under the assumption that
27964 // ways are always downloaded with their child nodes.
27968 // Updates calculated properties (parentWays, parentRels) for the specified change
27969 _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27971 parentWays = parentWays || this._parentWays;
27972 parentRels = parentRels || this._parentRels;
27974 var type = entity && entity.type || oldentity && oldentity.type,
27975 removed, added, ways, rels, i;
27978 if (type === 'way') {
27980 // Update parentWays
27981 if (oldentity && entity) {
27982 removed = difference(oldentity.nodes, entity.nodes);
27983 added = difference(entity.nodes, oldentity.nodes);
27984 } else if (oldentity) {
27985 removed = oldentity.nodes;
27987 } else if (entity) {
27989 added = entity.nodes;
27991 for (i = 0; i < removed.length; i++) {
27992 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27994 for (i = 0; i < added.length; i++) {
27995 ways = without(parentWays[added[i]], entity.id);
27996 ways.push(entity.id);
27997 parentWays[added[i]] = ways;
28000 } else if (type === 'relation') {
28002 // Update parentRels
28003 if (oldentity && entity) {
28004 removed = difference(oldentity.members, entity.members);
28005 added = difference(entity.members, oldentity);
28006 } else if (oldentity) {
28007 removed = oldentity.members;
28009 } else if (entity) {
28011 added = entity.members;
28013 for (i = 0; i < removed.length; i++) {
28014 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28016 for (i = 0; i < added.length; i++) {
28017 rels = without(parentRels[added[i].id], entity.id);
28018 rels.push(entity.id);
28019 parentRels[added[i].id] = rels;
28025 replace: function(entity) {
28026 if (this.entities[entity.id] === entity)
28029 return this.update(function() {
28030 this._updateCalculated(this.entities[entity.id], entity);
28031 this.entities[entity.id] = entity;
28036 remove: function(entity) {
28037 return this.update(function() {
28038 this._updateCalculated(entity, undefined);
28039 this.entities[entity.id] = undefined;
28044 revert: function(id) {
28045 var baseEntity = this.base().entities[id],
28046 headEntity = this.entities[id];
28048 if (headEntity === baseEntity)
28051 return this.update(function() {
28052 this._updateCalculated(headEntity, baseEntity);
28053 delete this.entities[id];
28058 update: function() {
28059 var graph = this.frozen ? coreGraph$$1(this, true) : this;
28061 for (var i = 0; i < arguments.length; i++) {
28062 arguments[i].call(graph, graph);
28065 if (this.frozen) graph.frozen = true;
28071 // Obliterates any existing entities
28072 load: function(entities) {
28073 var base = this.base();
28074 this.entities = Object.create(base.entities);
28076 for (var i in entities) {
28077 this.entities[i] = entities[i];
28078 this._updateCalculated(base.entities[i], this.entities[i]);
28085 var quickselect_1 = quickselect;
28086 var default_1 = quickselect;
28088 function quickselect(arr, k, left, right, compare) {
28089 quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
28091 function quickselectStep(arr, k, left, right, compare) {
28093 while (right > left) {
28094 if (right - left > 600) {
28095 var n = right - left + 1;
28096 var m = k - left + 1;
28097 var z = Math.log(n);
28098 var s = 0.5 * Math.exp(2 * z / 3);
28099 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28100 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28101 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28102 quickselectStep(arr, k, newLeft, newRight, compare);
28109 swap(arr, left, k);
28110 if (compare(arr[right], t) > 0) swap(arr, left, right);
28116 while (compare(arr[i], t) < 0) i++;
28117 while (compare(arr[j], t) > 0) j--;
28120 if (compare(arr[left], t) === 0) swap(arr, left, j);
28123 swap(arr, j, right);
28126 if (j <= k) left = j + 1;
28127 if (k <= j) right = j - 1;
28131 function swap(arr, i, j) {
28137 function defaultCompare(a, b) {
28138 return a < b ? -1 : a > b ? 1 : 0;
28140 quickselect_1.default = default_1;
28142 var rbush_1 = rbush;
28143 var default_1$1 = rbush;
28147 function rbush(maxEntries, format) {
28148 if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28150 // max entries in a node is 9 by default; min node fill is 40% for best performance
28151 this._maxEntries = Math.max(4, maxEntries || 9);
28152 this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28155 this._initFormat(format);
28161 rbush.prototype = {
28164 return this._all(this.data, []);
28167 search: function (bbox) {
28169 var node = this.data,
28171 toBBox = this.toBBox;
28173 if (!intersects$1(bbox, node)) return result;
28175 var nodesToSearch = [],
28176 i, len, child, childBBox;
28179 for (i = 0, len = node.children.length; i < len; i++) {
28181 child = node.children[i];
28182 childBBox = node.leaf ? toBBox(child) : child;
28184 if (intersects$1(bbox, childBBox)) {
28185 if (node.leaf) result.push(child);
28186 else if (contains$2(bbox, childBBox)) this._all(child, result);
28187 else nodesToSearch.push(child);
28190 node = nodesToSearch.pop();
28196 collides: function (bbox) {
28198 var node = this.data,
28199 toBBox = this.toBBox;
28201 if (!intersects$1(bbox, node)) return false;
28203 var nodesToSearch = [],
28204 i, len, child, childBBox;
28207 for (i = 0, len = node.children.length; i < len; i++) {
28209 child = node.children[i];
28210 childBBox = node.leaf ? toBBox(child) : child;
28212 if (intersects$1(bbox, childBBox)) {
28213 if (node.leaf || contains$2(bbox, childBBox)) return true;
28214 nodesToSearch.push(child);
28217 node = nodesToSearch.pop();
28223 load: function (data) {
28224 if (!(data && data.length)) return this;
28226 if (data.length < this._minEntries) {
28227 for (var i = 0, len = data.length; i < len; i++) {
28228 this.insert(data[i]);
28233 // recursively build the tree with the given data from scratch using OMT algorithm
28234 var node = this._build(data.slice(), 0, data.length - 1, 0);
28236 if (!this.data.children.length) {
28237 // save as is if tree is empty
28240 } else if (this.data.height === node.height) {
28241 // split root if trees have the same height
28242 this._splitRoot(this.data, node);
28245 if (this.data.height < node.height) {
28246 // swap trees if inserted one is bigger
28247 var tmpNode = this.data;
28252 // insert the small tree into the large tree at appropriate level
28253 this._insert(node, this.data.height - node.height - 1, true);
28259 insert: function (item) {
28260 if (item) this._insert(item, this.data.height - 1);
28264 clear: function () {
28265 this.data = createNode([]);
28269 remove: function (item, equalsFn) {
28270 if (!item) return this;
28272 var node = this.data,
28273 bbox = this.toBBox(item),
28276 i, parent, index, goingUp;
28278 // depth-first iterative tree traversal
28279 while (node || path.length) {
28281 if (!node) { // go up
28283 parent = path[path.length - 1];
28288 if (node.leaf) { // check current node
28289 index = findItem(item, node.children, equalsFn);
28291 if (index !== -1) {
28292 // item found, remove the item and condense tree upwards
28293 node.children.splice(index, 1);
28295 this._condense(path);
28300 if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28305 node = node.children[0];
28307 } else if (parent) { // go right
28309 node = parent.children[i];
28312 } else node = null; // nothing found
28318 toBBox: function (item) { return item; },
28320 compareMinX: compareNodeMinX,
28321 compareMinY: compareNodeMinY,
28323 toJSON: function () { return this.data; },
28325 fromJSON: function (data) {
28330 _all: function (node, result) {
28331 var nodesToSearch = [];
28333 if (node.leaf) result.push.apply(result, node.children);
28334 else nodesToSearch.push.apply(nodesToSearch, node.children);
28336 node = nodesToSearch.pop();
28341 _build: function (items, left, right, height) {
28343 var N = right - left + 1,
28344 M = this._maxEntries,
28348 // reached leaf level; return leaf
28349 node = createNode(items.slice(left, right + 1));
28350 calcBBox(node, this.toBBox);
28355 // target height of the bulk-loaded tree
28356 height = Math.ceil(Math.log(N) / Math.log(M));
28358 // target number of root entries to maximize storage utilization
28359 M = Math.ceil(N / Math.pow(M, height - 1));
28362 node = createNode([]);
28364 node.height = height;
28366 // split the items into M mostly square tiles
28368 var N2 = Math.ceil(N / M),
28369 N1 = N2 * Math.ceil(Math.sqrt(M)),
28370 i, j, right2, right3;
28372 multiSelect(items, left, right, N1, this.compareMinX);
28374 for (i = left; i <= right; i += N1) {
28376 right2 = Math.min(i + N1 - 1, right);
28378 multiSelect(items, i, right2, N2, this.compareMinY);
28380 for (j = i; j <= right2; j += N2) {
28382 right3 = Math.min(j + N2 - 1, right2);
28384 // pack each entry recursively
28385 node.children.push(this._build(items, j, right3, height - 1));
28389 calcBBox(node, this.toBBox);
28394 _chooseSubtree: function (bbox, node, level, path) {
28396 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28401 if (node.leaf || path.length - 1 === level) break;
28403 minArea = minEnlargement = Infinity;
28405 for (i = 0, len = node.children.length; i < len; i++) {
28406 child = node.children[i];
28407 area = bboxArea(child);
28408 enlargement = enlargedArea(bbox, child) - area;
28410 // choose entry with the least area enlargement
28411 if (enlargement < minEnlargement) {
28412 minEnlargement = enlargement;
28413 minArea = area < minArea ? area : minArea;
28414 targetNode = child;
28416 } else if (enlargement === minEnlargement) {
28417 // otherwise choose one with the smallest area
28418 if (area < minArea) {
28420 targetNode = child;
28425 node = targetNode || node.children[0];
28431 _insert: function (item, level, isNode) {
28433 var toBBox = this.toBBox,
28434 bbox = isNode ? item : toBBox(item),
28437 // find the best node for accommodating the item, saving all nodes along the path too
28438 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28440 // put the item into the node
28441 node.children.push(item);
28442 extend$1(node, bbox);
28444 // split on node overflow; propagate upwards if necessary
28445 while (level >= 0) {
28446 if (insertPath[level].children.length > this._maxEntries) {
28447 this._split(insertPath, level);
28452 // adjust bboxes along the insertion path
28453 this._adjustParentBBoxes(bbox, insertPath, level);
28456 // split overflowed node into two
28457 _split: function (insertPath, level) {
28459 var node = insertPath[level],
28460 M = node.children.length,
28461 m = this._minEntries;
28463 this._chooseSplitAxis(node, m, M);
28465 var splitIndex = this._chooseSplitIndex(node, m, M);
28467 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28468 newNode.height = node.height;
28469 newNode.leaf = node.leaf;
28471 calcBBox(node, this.toBBox);
28472 calcBBox(newNode, this.toBBox);
28474 if (level) insertPath[level - 1].children.push(newNode);
28475 else this._splitRoot(node, newNode);
28478 _splitRoot: function (node, newNode) {
28480 this.data = createNode([node, newNode]);
28481 this.data.height = node.height + 1;
28482 this.data.leaf = false;
28483 calcBBox(this.data, this.toBBox);
28486 _chooseSplitIndex: function (node, m, M) {
28488 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28490 minOverlap = minArea = Infinity;
28492 for (i = m; i <= M - m; i++) {
28493 bbox1 = distBBox(node, 0, i, this.toBBox);
28494 bbox2 = distBBox(node, i, M, this.toBBox);
28496 overlap = intersectionArea(bbox1, bbox2);
28497 area = bboxArea(bbox1) + bboxArea(bbox2);
28499 // choose distribution with minimum overlap
28500 if (overlap < minOverlap) {
28501 minOverlap = overlap;
28504 minArea = area < minArea ? area : minArea;
28506 } else if (overlap === minOverlap) {
28507 // otherwise choose distribution with minimum area
28508 if (area < minArea) {
28518 // sorts node children by the best axis for split
28519 _chooseSplitAxis: function (node, m, M) {
28521 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28522 compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28523 xMargin = this._allDistMargin(node, m, M, compareMinX),
28524 yMargin = this._allDistMargin(node, m, M, compareMinY);
28526 // if total distributions margin value is minimal for x, sort by minX,
28527 // otherwise it's already sorted by minY
28528 if (xMargin < yMargin) node.children.sort(compareMinX);
28531 // total margin of all possible split distributions where each node is at least m full
28532 _allDistMargin: function (node, m, M, compare) {
28534 node.children.sort(compare);
28536 var toBBox = this.toBBox,
28537 leftBBox = distBBox(node, 0, m, toBBox),
28538 rightBBox = distBBox(node, M - m, M, toBBox),
28539 margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28542 for (i = m; i < M - m; i++) {
28543 child = node.children[i];
28544 extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28545 margin += bboxMargin(leftBBox);
28548 for (i = M - m - 1; i >= m; i--) {
28549 child = node.children[i];
28550 extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28551 margin += bboxMargin(rightBBox);
28557 _adjustParentBBoxes: function (bbox, path, level) {
28558 // adjust bboxes along the given tree path
28559 for (var i = level; i >= 0; i--) {
28560 extend$1(path[i], bbox);
28564 _condense: function (path) {
28565 // go through the path, removing empty nodes and updating bboxes
28566 for (var i = path.length - 1, siblings; i >= 0; i--) {
28567 if (path[i].children.length === 0) {
28569 siblings = path[i - 1].children;
28570 siblings.splice(siblings.indexOf(path[i]), 1);
28572 } else this.clear();
28574 } else calcBBox(path[i], this.toBBox);
28578 _initFormat: function (format) {
28579 // data format (minX, minY, maxX, maxY accessors)
28581 // uses eval-type function compilation instead of just accepting a toBBox function
28582 // because the algorithms are very sensitive to sorting functions performance,
28583 // so they should be dead simple and without inner calls
28585 var compareArr = ['return a', ' - b', ';'];
28587 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28588 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28590 this.toBBox = new Function('a',
28591 'return {minX: a' + format[0] +
28592 ', minY: a' + format[1] +
28593 ', maxX: a' + format[2] +
28594 ', maxY: a' + format[3] + '};');
28598 function findItem(item, items, equalsFn) {
28599 if (!equalsFn) return items.indexOf(item);
28601 for (var i = 0; i < items.length; i++) {
28602 if (equalsFn(item, items[i])) return i;
28607 // calculate node's bbox from bboxes of its children
28608 function calcBBox(node, toBBox) {
28609 distBBox(node, 0, node.children.length, toBBox, node);
28612 // min bounding rectangle of node children from k to p-1
28613 function distBBox(node, k, p, toBBox, destNode) {
28614 if (!destNode) destNode = createNode(null);
28615 destNode.minX = Infinity;
28616 destNode.minY = Infinity;
28617 destNode.maxX = -Infinity;
28618 destNode.maxY = -Infinity;
28620 for (var i = k, child; i < p; i++) {
28621 child = node.children[i];
28622 extend$1(destNode, node.leaf ? toBBox(child) : child);
28628 function extend$1(a, b) {
28629 a.minX = Math.min(a.minX, b.minX);
28630 a.minY = Math.min(a.minY, b.minY);
28631 a.maxX = Math.max(a.maxX, b.maxX);
28632 a.maxY = Math.max(a.maxY, b.maxY);
28636 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28637 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28639 function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28640 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28642 function enlargedArea(a, b) {
28643 return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28644 (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28647 function intersectionArea(a, b) {
28648 var minX = Math.max(a.minX, b.minX),
28649 minY = Math.max(a.minY, b.minY),
28650 maxX = Math.min(a.maxX, b.maxX),
28651 maxY = Math.min(a.maxY, b.maxY);
28653 return Math.max(0, maxX - minX) *
28654 Math.max(0, maxY - minY);
28657 function contains$2(a, b) {
28658 return a.minX <= b.minX &&
28659 a.minY <= b.minY &&
28660 b.maxX <= a.maxX &&
28664 function intersects$1(a, b) {
28665 return b.minX <= a.maxX &&
28666 b.minY <= a.maxY &&
28667 b.maxX >= a.minX &&
28671 function createNode(children) {
28673 children: children,
28683 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28684 // combines selection algorithm with binary divide & conquer approach
28686 function multiSelect(arr, left, right, n, compare) {
28687 var stack = [left, right],
28690 while (stack.length) {
28691 right = stack.pop();
28692 left = stack.pop();
28694 if (right - left <= n) continue;
28696 mid = left + Math.ceil((right - left) / n / 2) * n;
28697 quickselect_1(arr, mid, left, right, compare);
28699 stack.push(left, mid, mid, right);
28702 rbush_1.default = default_1$1;
28704 function coreTree(head) {
28705 var rtree = rbush_1(),
28710 function entityBBox(entity) {
28711 var bbox = entity.extent(head).bbox();
28712 bbox.id = entity.id;
28713 bboxes[entity.id] = bbox;
28718 function updateParents(entity, insertions, memo) {
28719 head.parentWays(entity).forEach(function(way) {
28720 if (bboxes[way.id]) {
28721 rtree.remove(bboxes[way.id]);
28722 insertions[way.id] = way;
28724 updateParents(way, insertions, memo);
28727 head.parentRelations(entity).forEach(function(relation) {
28728 if (memo[entity.id]) return;
28729 memo[entity.id] = true;
28730 if (bboxes[relation.id]) {
28731 rtree.remove(bboxes[relation.id]);
28732 insertions[relation.id] = relation;
28734 updateParents(relation, insertions, memo);
28739 tree.rebase = function(entities, force) {
28740 var insertions = {};
28742 for (var i = 0; i < entities.length; i++) {
28743 var entity = entities[i];
28745 if (!entity.visible)
28748 if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28751 } else if (bboxes[entity.id]) {
28752 rtree.remove(bboxes[entity.id]);
28756 insertions[entity.id] = entity;
28757 updateParents(entity, insertions, {});
28760 rtree.load(map$3(insertions, entityBBox));
28766 tree.intersects = function(extent, graph) {
28767 if (graph !== head) {
28768 var diff = coreDifference(head, graph),
28773 diff.deleted().forEach(function(entity) {
28774 rtree.remove(bboxes[entity.id]);
28775 delete bboxes[entity.id];
28778 diff.modified().forEach(function(entity) {
28779 rtree.remove(bboxes[entity.id]);
28780 insertions[entity.id] = entity;
28781 updateParents(entity, insertions, {});
28784 diff.created().forEach(function(entity) {
28785 insertions[entity.id] = entity;
28788 rtree.load(map$3(insertions, entityBBox));
28791 return rtree.search(extent.bbox()).map(function(bbox) {
28792 return head.entity(bbox.id);
28801 * This code is licensed under the MIT license.
28803 * Copyright © 2013, iD authors.
28805 * Portions copyright © 2011, Keith Cirkel
28806 * See https://github.com/keithamus/jwerty
28809 function d3keybinding(namespace$$1) {
28813 function testBindings(isCapturing) {
28814 var didMatch = false,
28817 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28818 // so we don't strictly match on the shift key, but we prioritize
28819 // shifted bindings first, and fallback to unshifted only if no match.
28820 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28822 // priority match shifted bindings first
28823 for (i = 0; i < bindings.length; i++) {
28824 binding = bindings[i];
28825 if (!binding.event.modifiers.shiftKey) continue; // no shift
28826 if (!!binding.capture !== isCapturing) continue;
28827 if (matches(binding, true)) {
28828 binding.callback();
28833 // then unshifted bindings
28834 if (didMatch) return;
28835 for (i = 0; i < bindings.length; i++) {
28836 binding = bindings[i];
28837 if (binding.event.modifiers.shiftKey) continue; // shift
28838 if (!!binding.capture !== isCapturing) continue;
28839 if (matches(binding, false)) {
28840 binding.callback();
28845 function matches(binding, testShift) {
28846 var event$$1 = event;
28847 var isMatch = false;
28848 var tryKeyCode = true;
28850 // Prefer a match on `KeyboardEvent.key`
28851 if (event$$1.key !== undefined) {
28852 tryKeyCode = (event$$1.key.charCodeAt(0) > 255); // outside ISO-Latin-1
28855 if (binding.event.key === undefined) {
28857 } else if (Array.isArray(binding.event.key)) {
28858 if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28861 if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28866 // Fallback match on `KeyboardEvent.keyCode`, can happen if:
28867 // - browser doesn't support `KeyboardEvent.key`
28868 // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
28869 if (!isMatch && tryKeyCode) {
28870 isMatch = (event$$1.keyCode === binding.event.keyCode);
28873 if (!isMatch) return false;
28875 // test modifier keys
28876 if (!(event$$1.ctrlKey && event$$1.altKey)) { // if both are set, assume AltGr and skip it - #4096
28877 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28878 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28880 if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28881 if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28888 function capture() {
28889 testBindings(true);
28893 function bubble() {
28894 var tagName = d3_select(event.target).node().tagName;
28895 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28898 testBindings(false);
28902 function keybinding(selection$$1) {
28903 selection$$1 = selection$$1 || d3_select(document);
28904 selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28905 selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28910 keybinding.off = function(selection$$1) {
28912 selection$$1 = selection$$1 || d3_select(document);
28913 selection$$1.on('keydown.capture' + namespace$$1, null);
28914 selection$$1.on('keydown.bubble' + namespace$$1, null);
28919 keybinding.on = function(codes, callback, capture) {
28920 var arr = [].concat(codes);
28921 for (var i = 0; i < arr.length; i++) {
28925 key: undefined, // preferred
28926 keyCode: 0, // fallback
28938 code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28940 for (var j = 0; j < code.length; j++) {
28941 // Normalise matching errors
28942 if (code[j] === '++') code[j] = '+';
28944 if (code[j] in d3keybinding.modifierCodes) {
28945 binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28947 binding.event.key = d3keybinding.keys[code[j]] || code[j];
28948 if (code[j] in d3keybinding.keyCodes) {
28949 binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28954 bindings.push(binding);
28964 d3keybinding.modifierCodes = {
28966 '⇧': 16, shift: 16,
28967 // CTRL key, on Mac: ⌃
28969 // ALT key, on Mac: ⌥ (Alt)
28970 '⌥': 18, alt: 18, option: 18,
28971 // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28972 '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28975 d3keybinding.modifierProperties = {
28982 d3keybinding.keys = {
28983 // Backspace key, on Mac: ⌫ (Backspace)
28984 '⌫': 'Backspace', backspace: 'Backspace',
28985 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28986 '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28988 '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28990 'pause': 'Pause', 'pause-break': 'Pause',
28991 // Caps Lock key, ⇪
28992 '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28993 // Escape key, on Mac: ⎋, on Windows: Esc
28994 '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28996 space: [' ', 'Spacebar'],
28997 // Page-Up key, or pgup, on Mac: ↖
28998 '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28999 // Page-Down key, or pgdown, on Mac: ↘
29000 '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29001 // END key, on Mac: ⇟
29002 '⇟': 'End', end: 'End',
29003 // HOME key, on Mac: ⇞
29004 '⇞': 'Home', home: 'Home',
29005 // Insert key, or ins
29006 ins: 'Insert', insert: 'Insert',
29007 // Delete key, on Mac: ⌦ (Delete)
29008 '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29009 // Left Arrow Key, or ←
29010 '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29011 // Up Arrow Key, or ↑
29012 '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29013 // Right Arrow Key, or →
29014 '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29015 // Up Arrow Key, or ↓
29016 '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29017 // odities, stuff for backward compatibility (browsers and code):
29018 // Num-Multiply, or *
29019 '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29021 '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29022 // Num-Subtract, or -
29023 '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29030 // Period, or ., or full-stop
29031 period: '.', 'full-stop': '.',
29032 // Slash, or /, or forward-slash
29033 slash: '/', 'forward-slash': '/',
29034 // Tick, or `, or back-quote
29035 tick: '`', 'back-quote': '`',
29036 // Open bracket, or [
29037 'open-bracket': '[',
29038 // Back slash, or \
29039 'back-slash': '\\',
29040 // Close backet, or ]
29041 'close-bracket': ']',
29042 // Apostrophe, or Quote, or '
29043 quote: '\'', apostrophe: '\'',
29083 d3keybinding.keyCodes = {
29084 // Backspace key, on Mac: ⌫ (Backspace)
29085 '⌫': 8, backspace: 8,
29086 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29087 '⇥': 9, '⇆': 9, tab: 9,
29089 '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29091 'pause': 19, 'pause-break': 19,
29092 // Caps Lock key, ⇪
29093 '⇪': 20, caps: 20, 'caps-lock': 20,
29094 // Escape key, on Mac: ⎋, on Windows: Esc
29095 '⎋': 27, escape: 27, esc: 27,
29098 // Page-Up key, or pgup, on Mac: ↖
29099 '↖': 33, pgup: 33, 'page-up': 33,
29100 // Page-Down key, or pgdown, on Mac: ↘
29101 '↘': 34, pgdown: 34, 'page-down': 34,
29102 // END key, on Mac: ⇟
29104 // HOME key, on Mac: ⇞
29106 // Insert key, or ins
29107 ins: 45, insert: 45,
29108 // Delete key, on Mac: ⌦ (Delete)
29109 '⌦': 46, del: 46, 'delete': 46,
29110 // Left Arrow Key, or ←
29111 '←': 37, left: 37, 'arrow-left': 37,
29112 // Up Arrow Key, or ↑
29113 '↑': 38, up: 38, 'arrow-up': 38,
29114 // Right Arrow Key, or →
29115 '→': 39, right: 39, 'arrow-right': 39,
29116 // Up Arrow Key, or ↓
29117 '↓': 40, down: 40, 'arrow-down': 40,
29118 // odities, printing characters that come out wrong:
29121 // Num-Multiply, or *
29122 '*': 106, star: 106, asterisk: 106, multiply: 106,
29124 '+': 107, 'plus': 107,
29125 // Num-Subtract, or -
29126 '-': 109, subtract: 109,
29132 ';': 186, semicolon: 186,
29134 '=': 187, 'equals': 187,
29136 ',': 188, comma: 188,
29137 // Dash / Underscore key
29139 // Period, or ., or full-stop
29140 '.': 190, period: 190, 'full-stop': 190,
29141 // Slash, or /, or forward-slash
29142 '/': 191, slash: 191, 'forward-slash': 191,
29143 // Tick, or `, or back-quote
29144 '`': 192, tick: 192, 'back-quote': 192,
29145 // Open bracket, or [
29146 '[': 219, 'open-bracket': 219,
29147 // Back slash, or \
29148 '\\': 220, 'back-slash': 220,
29149 // Close backet, or ]
29150 ']': 221, 'close-bracket': 221,
29151 // Apostrophe, or Quote, or '
29152 '\'': 222, quote: 222, apostrophe: 222
29156 var i$1 = 95, n = 0;
29157 while (++i$1 < 106) {
29158 d3keybinding.keyCodes['num-' + n] = i$1;
29164 while (++i$1 < 58) {
29165 d3keybinding.keyCodes[n] = i$1;
29171 while (++i$1 < 136) {
29172 d3keybinding.keyCodes['f' + n] = i$1;
29178 while (++i$1 < 91) {
29179 d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29182 function tooltip() {
29183 var tooltip = function(selection$$1) {
29184 selection$$1.each(setup);
29186 animation = utilFunctor(false),
29187 html = utilFunctor(false),
29188 title = function() {
29189 var title = this.getAttribute('data-original-title');
29193 title = this.getAttribute('title');
29194 this.removeAttribute('title');
29195 this.setAttribute('data-original-title', title);
29199 over = 'mouseenter.tooltip',
29200 out = 'mouseleave.tooltip',
29201 placement = utilFunctor('top');
29204 tooltip.title = function(_) {
29205 if (arguments.length) {
29206 title = utilFunctor(_);
29214 tooltip.html = function(_) {
29215 if (arguments.length) {
29216 html = utilFunctor(_);
29224 tooltip.placement = function(_) {
29225 if (arguments.length) {
29226 placement = utilFunctor(_);
29234 tooltip.show = function(selection$$1) {
29235 selection$$1.each(show);
29239 tooltip.hide = function(selection$$1) {
29240 selection$$1.each(hide);
29244 tooltip.toggle = function(selection$$1) {
29245 selection$$1.each(toggle);
29249 tooltip.destroy = function(selection$$1) {
29253 .attr('title', function() {
29254 return this.getAttribute('data-original-title') || this.getAttribute('title');
29256 .attr('data-original-title', null)
29257 .selectAll('.tooltip')
29263 var root = d3_select(this),
29264 animate = animation.apply(this, arguments),
29265 tip = root.selectAll('.tooltip').data([0]);
29267 var enter = tip.enter()
29269 .attr('class', 'tooltip');
29273 .attr('class', 'tooltip-arrow');
29277 .attr('class', 'tooltip-inner');
29283 tip.classed('fade', true);
29286 var place = placement.apply(this, arguments);
29287 tip.classed(place, true);
29289 root.on(over, show);
29290 root.on(out, hide);
29295 var root = d3_select(this),
29296 content = title.apply(this, arguments),
29297 tip = root.selectAll('.tooltip')
29298 .classed('in', true),
29299 markup = html.apply(this, arguments);
29301 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29302 var place = placement.apply(this, arguments),
29303 outer = getPosition(root.node()),
29304 inner = getPosition(tip.node()),
29309 pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29312 pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29315 pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29318 pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29323 tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29325 tip.style('left', null).style('top', null);
29328 this.tooltipVisible = true;
29333 d3_select(this).selectAll('.tooltip')
29334 .classed('in', false);
29336 this.tooltipVisible = false;
29340 function toggle() {
29341 if (this.tooltipVisible) {
29342 hide.apply(this, arguments);
29344 show.apply(this, arguments);
29352 function getPosition(node) {
29353 var mode = d3_select(node).style('position');
29354 if (mode === 'absolute' || mode === 'static') {
29356 x: node.offsetLeft,
29358 w: node.offsetWidth,
29359 h: node.offsetHeight
29365 w: node.offsetWidth,
29366 h: node.offsetHeight
29371 function behaviorEdit(context) {
29375 .minzoom(context.minEditableZoom());
29379 edit.off = function() {
29389 The hover behavior adds the `.hover` class on mouseover to all elements to which
29390 the identical datum is bound, and removes it on mouseout.
29392 The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29393 representation may consist of several elements scattered throughout the DOM hierarchy.
29394 Only one of these elements can have the :hover pseudo-class, but all of them will
29395 have the .hover class.
29397 function behaviorHover(context) {
29398 var dispatch$$1 = dispatch('hover');
29399 var _selection = d3_select(null);
29406 function keydown() {
29407 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29408 _selection.selectAll('.hover')
29409 .classed('hover-suppressed', true)
29410 .classed('hover', false);
29413 .classed('hover-disabled', true);
29415 dispatch$$1.call('hover', this, null);
29421 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29422 _selection.selectAll('.hover-suppressed')
29423 .classed('hover-suppressed', false)
29424 .classed('hover', true);
29427 .classed('hover-disabled', false);
29429 dispatch$$1.call('hover', this, _target ? _target.id : null);
29434 var hover = function(selection$$1) {
29435 _selection = selection$$1;
29439 .on('mouseover.hover', mouseover)
29440 .on('mouseout.hover', mouseout)
29441 .on('mousedown.hover', mousedown);
29444 .on('keydown.hover', keydown)
29445 .on('keyup.hover', keyup);
29448 function mouseover() {
29449 if (_buttonDown) return;
29450 var target = event.target;
29451 enter(target ? target.__data__ : null);
29455 function mouseout() {
29456 if (_buttonDown) return;
29457 var target = event.relatedTarget;
29458 enter(target ? target.__data__ : null);
29462 function mousedown() {
29463 _buttonDown = true;
29465 .on('mouseup.hover', mouseup, true);
29469 function mouseup() {
29470 _buttonDown = false;
29472 .on('mouseup.hover', null, true);
29476 function enter(datum) {
29477 if (datum === _target) return;
29480 _selection.selectAll('.hover')
29481 .classed('hover', false);
29482 _selection.selectAll('.hover-suppressed')
29483 .classed('hover-suppressed', false);
29486 if (datum instanceof osmEntity$$1) {
29489 entity = datum && datum.properties && datum.properties.entity;
29492 if (entity && entity.id !== _newId) {
29493 // If drawing a way, don't hover on a node that was just placed. #3974
29494 var mode = context.mode() && context.mode().id;
29495 if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29496 _newId = entity.id;
29500 var selector$$1 = '.' + entity.id;
29502 if (entity.type === 'relation') {
29503 entity.members.forEach(function(member) {
29504 selector$$1 += ', .' + member.id;
29508 var suppressed = _altDisables && event && event.altKey;
29510 _selection.selectAll(selector$$1)
29511 .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29513 dispatch$$1.call('hover', this, !suppressed && entity.id);
29516 dispatch$$1.call('hover', this, null);
29523 hover.off = function(selection$$1) {
29524 selection$$1.selectAll('.hover')
29525 .classed('hover', false);
29526 selection$$1.selectAll('.hover-suppressed')
29527 .classed('hover-suppressed', false);
29529 .classed('hover-disabled', false);
29532 .on('mouseover.hover', null)
29533 .on('mouseout.hover', null)
29534 .on('mousedown.hover', null);
29537 .on('keydown.hover', null)
29538 .on('keyup.hover', null);
29542 hover.altDisables = function(_) {
29543 if (!arguments.length) return _altDisables;
29549 return utilRebind(hover, dispatch$$1, 'on');
29552 function refresh(selection, node) {
29553 var cr = node.getBoundingClientRect();
29554 var prop = [cr.width, cr.height];
29555 selection.property('__dimensions__', prop);
29559 function utilGetDimensions(selection, force) {
29560 if (!selection || selection.empty()) {
29563 var node = selection.node(),
29564 cached = selection.property('__dimensions__');
29565 return (!cached || force) ? refresh(selection, node) : cached;
29569 function utilSetDimensions(selection, dimensions) {
29570 if (!selection || selection.empty()) {
29573 var node = selection.node();
29574 if (dimensions === null) {
29575 refresh(selection, node);
29579 .property('__dimensions__', [dimensions[0], dimensions[1]])
29580 .attr('width', dimensions[0])
29581 .attr('height', dimensions[1]);
29584 function behaviorTail() {
29588 tooltipSize = [0, 0],
29589 selectionSize = [0, 0];
29592 function tail(selection$$1) {
29596 .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29598 container = d3_select(document.body)
29600 .style('display', 'none')
29601 .attr('class', 'tail tooltip-inner');
29603 container.append('div')
29607 .on('mousemove.tail', mousemove)
29608 .on('mouseenter.tail', mouseenter)
29609 .on('mouseleave.tail', mouseleave);
29612 .on('mousemove.tail', mousemove);
29614 tooltipSize = utilGetDimensions(container);
29615 selectionSize = utilGetDimensions(selection$$1);
29619 container.style('display', 'block');
29620 tooltipSize = utilGetDimensions(container);
29624 function mousemove() {
29625 if (container.style('display') === 'none') show();
29626 var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29627 -tooltipSize[0] - xmargin : xmargin;
29628 container.classed('left', xoffset > 0);
29629 utilSetTransform(container, event.clientX + xoffset, event.clientY);
29633 function mouseleave() {
29634 if (event.relatedTarget !== container.node()) {
29635 container.style('display', 'none');
29640 function mouseenter() {
29641 if (event.relatedTarget !== container.node()) {
29648 tail.off = function(selection$$1) {
29652 .on('mousemove.tail', null)
29656 .on('mousemove.tail', null)
29657 .on('mouseenter.tail', null)
29658 .on('mouseleave.tail', null);
29661 .on('resize.tail', null);
29665 tail.text = function(_) {
29666 if (!arguments.length) return text;
29675 var _usedTails = {};
29676 var _disableSpace = false;
29677 var _lastSpace = null;
29680 function behaviorDraw(context) {
29681 var dispatch$$1 = dispatch(
29682 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29685 var keybinding = d3keybinding('draw');
29687 var hover = behaviorHover(context).altDisables(true)
29688 .on('hover', context.ui().sidebar.hover);
29689 var tail = behaviorTail();
29690 var edit = behaviorEdit(context);
29692 var closeTolerance = 4;
29693 var tolerance = 12;
29694 var _mouseLeave = false;
29695 var _lastMouse = null;
29699 // - `mode/drag_node.js` `datum()`
29701 if (event.altKey) return {};
29704 if (event.type === 'keydown') {
29705 element = _lastMouse && _lastMouse.target;
29707 element = event.target;
29710 // When drawing, snap only to touch targets..
29711 // (this excludes area fills and active drawing elements)
29712 var d = element.__data__;
29713 return (d && d.properties && d.properties.target) ? d : {};
29717 function mousedown() {
29719 function point$$1() {
29720 var p = context.container().node();
29721 return touchId !== null ? d3_touches(p).filter(function(p) {
29722 return p.identifier === touchId;
29723 })[0] : d3_mouse(p);
29726 var element = d3_select(this);
29727 var touchId = event.touches ? event.changedTouches[0].identifier : null;
29728 var t1 = +new Date();
29729 var p1 = point$$1();
29731 element.on('mousemove.draw', null);
29733 d3_select(window).on('mouseup.draw', function() {
29734 var t2 = +new Date();
29735 var p2 = point$$1();
29736 var dist = geoVecLength(p1, p2);
29738 element.on('mousemove.draw', mousemove);
29739 d3_select(window).on('mouseup.draw', null);
29741 if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
29742 // Prevent a quick second click
29743 d3_select(window).on('click.draw-block', function() {
29744 event.stopPropagation();
29747 context.map().dblclickEnable(false);
29749 window.setTimeout(function() {
29750 context.map().dblclickEnable(true);
29751 d3_select(window).on('click.draw-block', null);
29760 function mousemove() {
29761 _lastMouse = event;
29762 dispatch$$1.call('move', this, datum());
29766 function mouseenter() {
29767 _mouseLeave = false;
29771 function mouseleave() {
29772 _mouseLeave = true;
29777 // - `mode/drag_node.js` `doMode()`
29778 // - `behavior/draw.js` `click()`
29779 // - `behavior/draw_way.js` `move()`
29782 var target = d && d.properties && d.properties.entity;
29784 if (target && target.type === 'node') { // Snap to a node
29785 dispatch$$1.call('clickNode', this, target, d);
29788 } else if (target && target.type === 'way') { // Snap to a way
29789 var choice = geoChooseEdge(
29790 context.childNodes(target), context.mouse(), context.projection, context.activeID()
29793 var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
29794 dispatch$$1.call('clickWay', this, choice.loc, edge, d);
29799 dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
29804 event.preventDefault();
29805 event.stopPropagation();
29807 var currSpace = context.mouse();
29808 if (_disableSpace && _lastSpace) {
29809 var dist = geoVecLength(_lastSpace, currSpace);
29810 if (dist > tolerance) {
29811 _disableSpace = false;
29815 if (_disableSpace || _mouseLeave || !_lastMouse) return;
29817 // user must move mouse or release space bar to allow another click
29818 _lastSpace = currSpace;
29819 _disableSpace = true;
29821 d3_select(window).on('keyup.space-block', function() {
29822 event.preventDefault();
29823 event.stopPropagation();
29824 _disableSpace = false;
29825 d3_select(window).on('keyup.space-block', null);
29832 function backspace() {
29833 event.preventDefault();
29834 dispatch$$1.call('undo');
29839 event.preventDefault();
29840 dispatch$$1.call('cancel');
29845 event.preventDefault();
29846 dispatch$$1.call('finish');
29850 function draw(selection$$1) {
29851 context.install(hover);
29852 context.install(edit);
29854 if (!context.inIntro() && !_usedTails[tail.text()]) {
29855 context.install(tail);
29859 .on('⌫', backspace)
29863 .on('space', space)
29864 .on('⌥space', space);
29867 .on('mouseenter.draw', mouseenter)
29868 .on('mouseleave.draw', mouseleave)
29869 .on('mousedown.draw', mousedown)
29870 .on('mousemove.draw', mousemove);
29872 d3_select(document)
29879 draw.off = function(selection$$1) {
29880 context.ui().sidebar.hover.cancel();
29881 context.uninstall(hover);
29882 context.uninstall(edit);
29884 if (!context.inIntro() && !_usedTails[tail.text()]) {
29885 context.uninstall(tail);
29886 _usedTails[tail.text()] = true;
29890 .on('mouseenter.draw', null)
29891 .on('mouseleave.draw', null)
29892 .on('mousedown.draw', null)
29893 .on('mousemove.draw', null);
29896 .on('mouseup.draw', null);
29897 // note: keyup.space-block, click.draw-block should remain
29899 d3_select(document)
29900 .call(keybinding.off);
29904 draw.tail = function(_) {
29910 return utilRebind(draw, dispatch$$1, 'on');
29913 function modeAddArea$$1(context) {
29917 title: t('modes.add_area.title'),
29918 description: t('modes.add_area.description'),
29922 var behavior = behaviorAddWay(context)
29923 .tail(t('modes.add_area.tail'))
29924 .on('start', start)
29925 .on('startFromWay', startFromWay)
29926 .on('startFromNode', startFromNode),
29927 defaultTags = { area: 'yes' };
29930 function actionClose(wayId) {
29931 return function (graph) {
29932 return graph.replace(graph.entity(wayId).close());
29937 function start(loc) {
29938 var startGraph = context.graph(),
29939 node = osmNode({ loc: loc }),
29940 way = osmWay({ tags: defaultTags });
29943 actionAddEntity(node),
29944 actionAddEntity(way),
29945 actionAddVertex(way.id, node.id),
29946 actionClose(way.id)
29949 context.enter(modeDrawArea(context, way.id, startGraph));
29953 function startFromWay(loc, edge) {
29954 var startGraph = context.graph(),
29955 node = osmNode({ loc: loc }),
29956 way = osmWay({ tags: defaultTags });
29959 actionAddEntity(node),
29960 actionAddEntity(way),
29961 actionAddVertex(way.id, node.id),
29962 actionClose(way.id),
29963 actionAddMidpoint({ loc: loc, edge: edge }, node)
29966 context.enter(modeDrawArea(context, way.id, startGraph));
29970 function startFromNode(node) {
29971 var startGraph = context.graph(),
29972 way = osmWay({ tags: defaultTags });
29975 actionAddEntity(way),
29976 actionAddVertex(way.id, node.id),
29977 actionClose(way.id)
29980 context.enter(modeDrawArea(context, way.id, startGraph));
29984 mode.enter = function() {
29985 context.install(behavior);
29989 mode.exit = function() {
29990 context.uninstall(behavior);
29997 function modeAddLine$$1(context) {
30001 title: t('modes.add_line.title'),
30002 description: t('modes.add_line.description'),
30006 var behavior = behaviorAddWay(context)
30007 .tail(t('modes.add_line.tail'))
30008 .on('start', start)
30009 .on('startFromWay', startFromWay)
30010 .on('startFromNode', startFromNode);
30013 function start(loc) {
30014 var startGraph = context.graph(),
30015 node = osmNode({ loc: loc }),
30019 actionAddEntity(node),
30020 actionAddEntity(way),
30021 actionAddVertex(way.id, node.id)
30024 context.enter(modeDrawLine(context, way.id, startGraph));
30028 function startFromWay(loc, edge) {
30029 var startGraph = context.graph(),
30030 node = osmNode({ loc: loc }),
30034 actionAddEntity(node),
30035 actionAddEntity(way),
30036 actionAddVertex(way.id, node.id),
30037 actionAddMidpoint({ loc: loc, edge: edge }, node)
30040 context.enter(modeDrawLine(context, way.id, startGraph));
30044 function startFromNode(node) {
30045 var startGraph = context.graph(),
30049 actionAddEntity(way),
30050 actionAddVertex(way.id, node.id)
30053 context.enter(modeDrawLine(context, way.id, startGraph));
30057 mode.enter = function() {
30058 context.install(behavior);
30062 mode.exit = function() {
30063 context.uninstall(behavior);
30069 function modeAddPoint$$1(context) {
30073 title: t('modes.add_point.title'),
30074 description: t('modes.add_point.description'),
30078 var behavior = behaviorDraw(context)
30079 .tail(t('modes.add_point.tail'))
30081 .on('clickWay', addWay)
30082 .on('clickNode', addNode)
30083 .on('cancel', cancel)
30084 .on('finish', cancel);
30087 function add(loc) {
30088 var node = osmNode({ loc: loc });
30091 actionAddEntity(node),
30092 t('operations.add.annotation.point')
30096 modeSelect(context, [node.id]).newFeature(true)
30101 function addWay(loc) {
30106 function addNode(node) {
30111 function cancel() {
30112 context.enter(modeBrowse(context));
30116 mode.enter = function() {
30117 context.install(behavior);
30121 mode.exit = function() {
30122 context.uninstall(behavior);
30129 function modeDragNode$$1(context) {
30134 var hover = behaviorHover(context).altDisables(true)
30135 .on('hover', context.ui().sidebar.hover);
30136 var edit = behaviorEdit(context);
30138 var _nudgeInterval;
30139 var _restoreSelectedIDs = [];
30140 var _wasMidpoint = false;
30141 var _isCancelled = false;
30147 function startNudge(entity, nudge) {
30148 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30149 _nudgeInterval = window.setInterval(function() {
30150 context.pan(nudge);
30151 doMove(entity, nudge);
30156 function stopNudge() {
30157 if (_nudgeInterval) {
30158 window.clearInterval(_nudgeInterval);
30159 _nudgeInterval = null;
30164 function moveAnnotation(entity) {
30165 return t('operations.move.annotation.' + entity.geometry(context.graph()));
30169 function connectAnnotation(entity) {
30170 return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30174 function origin(entity) {
30175 return context.projection(entity.loc);
30179 function keydown() {
30180 if (event.keyCode === d3keybinding.modifierCodes.alt) {
30181 if (context.surface().classed('nope')) {
30183 .classed('nope-suppressed', true);
30186 .classed('nope', false)
30187 .classed('nope-disabled', true);
30193 if (event.keyCode === d3keybinding.modifierCodes.alt) {
30194 if (context.surface().classed('nope-suppressed')) {
30196 .classed('nope', true);
30199 .classed('nope-suppressed', false)
30200 .classed('nope-disabled', false);
30205 function start(entity) {
30206 _wasMidpoint = entity.type === 'midpoint';
30207 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30208 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30211 if (_isCancelled) {
30213 uiFlash().text(t('modes.drag_node.connected_to_hidden'))();
30215 return drag.cancel();
30218 if (_wasMidpoint) {
30219 var midpoint = entity;
30220 entity = osmNode();
30221 context.perform(actionAddMidpoint(midpoint, entity));
30222 entity = context.entity(entity.id); // get post-action entity
30224 var vertex = context.surface().selectAll('.' + entity.id);
30225 drag.target(vertex.node(), entity);
30228 context.perform(actionNoop());
30231 _activeEntity = entity;
30232 _startLoc = entity.loc;
30234 context.surface().selectAll('.' + _activeEntity.id)
30235 .classed('active', true);
30237 context.enter(mode);
30242 // - `behavior/draw.js` `datum()`
30244 var event$$1 = event && event.sourceEvent;
30245 if (!event$$1 || event$$1.altKey) {
30248 // When dragging, snap only to touch targets..
30249 // (this excludes area fills and active drawing elements)
30250 var d = event$$1.target.__data__;
30251 return (d && d.properties && d.properties.target) ? d : {};
30256 function doMove(entity, nudge) {
30257 nudge = nudge || [0, 0];
30259 var currPoint = (event && event.point) || context.projection(_lastLoc);
30260 var currMouse = geoVecSubtract(currPoint, nudge);
30261 var loc = context.projection.invert(currMouse);
30263 if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap..
30265 // - `mode/drag_node.js` `doMode()`
30266 // - `behavior/draw.js` `click()`
30267 // - `behavior/draw_way.js` `move()`
30269 var targetLoc = d && d.properties && d.properties.entity && d.properties.entity.loc;
30270 var targetNodes = d && d.properties && d.properties.nodes;
30272 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
30275 } else if (targetNodes) { // snap to way - a line target with `.nodes`
30276 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30284 actionMoveNode(entity.id, loc),
30285 moveAnnotation(entity)
30289 // check if this movement causes the geometry to break
30290 var nopeDisabled = context.surface().classed('nope-disabled');
30291 var isInvalid = isInvalidGeometry(entity, context.graph());
30292 if (nopeDisabled) {
30294 .classed('nope', false)
30295 .classed('nope-suppressed', isInvalid);
30298 .classed('nope', isInvalid)
30299 .classed('nope-suppressed', false);
30306 function isInvalidGeometry(entity, graph) {
30307 var parents = graph.parentWays(entity);
30310 for (i = 0; i < parents.length; i++) {
30311 var parent = parents[i];
30313 var activeIndex = null; // which multipolygon ring contains node being dragged
30315 // test any parent multipolygons for valid geometry
30316 var relations = graph.parentRelations(parent);
30317 for (j = 0; j < relations.length; j++) {
30318 if (!relations[j].isMultipolygon()) continue;
30320 var rings = osmJoinWays(relations[j].members, graph);
30322 // find active ring and test it for self intersections
30323 for (k = 0; k < rings.length; k++) {
30324 nodes = rings[k].nodes;
30325 if (find$1(nodes, function(n) { return n.id === entity.id; })) {
30327 if (geoHasSelfIntersections(nodes, entity.id)) {
30331 rings[k].coords = nodes.map(function(n) { return n.loc; });
30334 // test active ring for intersections with other rings in the multipolygon
30335 for (k = 0; k < rings.length; k++) {
30336 if (k === activeIndex) continue;
30338 // make sure active ring doesnt cross passive rings
30339 if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30346 // If we still haven't tested this node's parent way for self-intersections.
30347 // (because it's not a member of a multipolygon), test it now.
30348 if (activeIndex === null) {
30349 nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
30350 if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
30361 function move(entity) {
30362 if (_isCancelled) return;
30363 event.sourceEvent.stopPropagation();
30365 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30367 _lastLoc = context.projection.invert(event.point);
30370 var nudge = geoViewportEdge(event.point, context.map().dimensions());
30372 startNudge(entity, nudge);
30379 function end(entity) {
30380 if (_isCancelled) return;
30383 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
30384 var target = d && d.properties && d.properties.entity; // entity to snap to
30386 if (nope) { // bounce back
30388 _actionBounceBack(entity.id, _startLoc)
30391 } else if (target && target.type === 'way') {
30392 var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30394 actionAddMidpoint({
30396 edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30398 connectAnnotation(target)
30401 } else if (target && target.type === 'node') {
30403 actionConnect([target.id, entity.id]),
30404 connectAnnotation(target)
30407 } else if (_wasMidpoint) {
30410 t('operations.add.annotation.vertex')
30416 moveAnnotation(entity)
30420 var reselection = _restoreSelectedIDs.filter(function(id) {
30421 return context.graph().hasEntity(id);
30424 if (reselection.length) {
30425 context.enter(modeSelect(context, reselection));
30427 context.enter(modeBrowse(context));
30432 function _actionBounceBack(nodeID, toLoc) {
30433 var moveNode = actionMoveNode(nodeID, toLoc);
30434 var action = function(graph, t$$1) {
30435 // last time through, pop off the bounceback perform.
30436 // it will then overwrite the initial perform with a moveNode that does nothing
30437 if (t$$1 === 1) context.pop();
30438 return moveNode(graph, t$$1);
30440 action.transitionable = true;
30445 function cancel() {
30447 context.enter(modeBrowse(context));
30451 var drag = behaviorDrag()
30452 .selector('.layer-points-targets .target')
30453 .surface(d3_select('#map').node())
30455 .on('start', start)
30460 mode.enter = function() {
30461 context.install(hover);
30462 context.install(edit);
30465 .on('keydown.drawWay', keydown)
30466 .on('keyup.drawWay', keyup);
30469 .on('undone.drag-node', cancel);
30473 mode.exit = function() {
30474 context.ui().sidebar.hover.cancel();
30475 context.uninstall(hover);
30476 context.uninstall(edit);
30479 .on('keydown.hover', null)
30480 .on('keyup.hover', null);
30483 .on('undone.drag-node', null);
30486 .on('drawn.drag-node', null);
30488 _activeEntity = null;
30491 .classed('nope', false)
30492 .classed('nope-suppressed', false)
30493 .classed('nope-disabled', false)
30494 .selectAll('.active')
30495 .classed('active', false);
30501 mode.selectedIDs = function() {
30502 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30508 mode.activeID = function() {
30509 if (!arguments.length) return _activeEntity && _activeEntity.id;
30515 mode.restoreSelectedIDs = function(_) {
30516 if (!arguments.length) return _restoreSelectedIDs;
30517 _restoreSelectedIDs = _;
30522 mode.behavior = drag;
30528 function modeBrowse(context) {
30532 title: t('modes.browse.title'),
30533 description: t('modes.browse.description')
30537 behaviorPaste(context),
30538 behaviorHover(context).on('hover', context.ui().sidebar.hover),
30539 behaviorSelect(context),
30540 behaviorLasso(context),
30541 modeDragNode$$1(context).behavior
30545 mode.enter = function() {
30546 behaviors.forEach(function(behavior) {
30547 context.install(behavior);
30550 // Get focus on the body.
30551 if (document.activeElement && document.activeElement.blur) {
30552 document.activeElement.blur();
30556 context.ui().sidebar.show(sidebar);
30558 context.ui().sidebar.select(null);
30563 mode.exit = function() {
30564 context.ui().sidebar.hover.cancel();
30565 behaviors.forEach(function(behavior) {
30566 context.uninstall(behavior);
30570 context.ui().sidebar.hide();
30575 mode.sidebar = function(_) {
30576 if (!arguments.length) return sidebar;
30585 function modeDrawArea(context, wayId, startGraph) {
30594 mode.enter = function() {
30595 var way = context.entity(wayId);
30597 behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30598 .tail(t('modes.draw_area.tail'));
30600 var addNode = behavior.addNode;
30602 behavior.addNode = function(node, d) {
30603 var length = way.nodes.length;
30604 var penultimate = length > 2 ? way.nodes[length - 2] : null;
30606 if (node.id === way.first() || node.id === penultimate) {
30613 context.install(behavior);
30617 mode.exit = function() {
30618 context.uninstall(behavior);
30622 mode.selectedIDs = function() {
30627 mode.activeID = function() {
30628 return (behavior && behavior.activeID()) || [];
30635 function modeDrawLine(context, wayId, startGraph, affix) {
30644 mode.enter = function() {
30645 var way = context.entity(wayId);
30646 var index = (affix === 'prefix') ? 0 : undefined;
30647 var headId = (affix === 'prefix') ? way.first() : way.last();
30649 behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30650 .tail(t('modes.draw_line.tail'));
30652 var addNode = behavior.addNode;
30653 behavior.addNode = function(node, d) {
30654 if (node.id === headId) {
30661 context.install(behavior);
30665 mode.exit = function() {
30666 context.uninstall(behavior);
30670 mode.selectedIDs = function() {
30675 mode.activeID = function() {
30676 return (behavior && behavior.activeID()) || [];
30682 function operationCircularize(selectedIDs, context) {
30683 var entityId = selectedIDs[0],
30684 entity = context.entity(entityId),
30685 extent = entity.extent(context.graph()),
30686 geometry = context.geometry(entityId),
30687 action = actionCircularize(entityId, context.projection);
30690 var operation = function() {
30691 context.perform(action, operation.annotation());
30695 operation.available = function() {
30696 return selectedIDs.length === 1 &&
30697 entity.type === 'way' &&
30698 uniq(entity.nodes).length > 1;
30702 operation.disabled = function() {
30704 if (extent.percentContainedIn(context.extent()) < 0.8) {
30705 reason = 'too_large';
30706 } else if (context.hasHiddenConnections(entityId)) {
30707 reason = 'connected_to_hidden';
30709 return action.disabled(context.graph()) || reason;
30713 operation.tooltip = function() {
30714 var disable = operation.disabled();
30716 t('operations.circularize.' + disable) :
30717 t('operations.circularize.description.' + geometry);
30721 operation.annotation = function() {
30722 return t('operations.circularize.annotation.' + geometry);
30726 operation.id = 'circularize';
30727 operation.keys = [t('operations.circularize.key')];
30728 operation.title = t('operations.circularize.title');
30729 operation.behavior = behaviorOperation(context).which(operation);
30734 function operationContinue(selectedIDs, context) {
30735 var graph = context.graph(),
30736 entities = selectedIDs.map(function(id) { return graph.entity(id); }),
30737 geometries = assignIn({ line: [], vertex: [] },
30738 groupBy(entities, function(entity) { return entity.geometry(graph); })),
30739 vertex = geometries.vertex[0];
30742 function candidateWays() {
30743 return graph.parentWays(vertex).filter(function(parent) {
30744 return parent.geometry(graph) === 'line' &&
30745 !parent.isClosed() &&
30746 parent.affix(vertex.id) &&
30747 (geometries.line.length === 0 || geometries.line[0] === parent);
30752 var operation = function() {
30753 var candidate = candidateWays()[0];
30755 modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
30760 operation.available = function() {
30761 return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
30762 !context.features().hasHiddenConnections(vertex, context.graph());
30766 operation.disabled = function() {
30767 var candidates = candidateWays();
30768 if (candidates.length === 0)
30769 return 'not_eligible';
30770 if (candidates.length > 1)
30775 operation.tooltip = function() {
30776 var disable = operation.disabled();
30778 t('operations.continue.' + disable) :
30779 t('operations.continue.description');
30783 operation.annotation = function() {
30784 return t('operations.continue.annotation.line');
30788 operation.id = 'continue';
30789 operation.keys = [t('operations.continue.key')];
30790 operation.title = t('operations.continue.title');
30791 operation.behavior = behaviorOperation(context).which(operation);
30796 function operationDelete(selectedIDs, context) {
30797 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
30798 action = actionDeleteMultiple(selectedIDs),
30799 extent = selectedIDs.reduce(function(extent, id) {
30800 return extent.extend(context.entity(id).extent(context.graph()));
30801 }, geoExtent$$1());
30804 var operation = function() {
30805 var nextSelectedID;
30806 var nextSelectedLoc;
30808 if (selectedIDs.length === 1) {
30809 var id = selectedIDs[0],
30810 entity = context.entity(id),
30811 geometry = context.geometry(id),
30812 parents = context.graph().parentWays(entity),
30813 parent = parents[0];
30815 // Select the next closest node in the way.
30816 if (geometry === 'vertex') {
30817 var nodes = parent.nodes,
30818 i = nodes.indexOf(id);
30822 } else if (i === nodes.length - 1) {
30825 var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
30826 b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
30827 i = a < b ? i - 1 : i + 1;
30830 nextSelectedID = nodes[i];
30831 nextSelectedLoc = context.entity(nextSelectedID).loc;
30835 context.perform(action, operation.annotation());
30837 if (nextSelectedID && nextSelectedLoc) {
30838 if (context.hasEntity(nextSelectedID)) {
30839 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
30841 context.map().centerEase(nextSelectedLoc);
30842 context.enter(modeBrowse(context));
30845 context.enter(modeBrowse(context));
30851 operation.available = function() {
30856 operation.disabled = function() {
30858 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
30859 reason = 'too_large';
30860 } else if (some(selectedIDs, context.hasHiddenConnections)) {
30861 reason = 'connected_to_hidden';
30862 } else if (some(selectedIDs, protectedMember)) {
30863 reason = 'part_of_relation';
30864 } else if (some(selectedIDs, incompleteRelation)) {
30865 reason = 'incomplete_relation';
30869 function incompleteRelation(id) {
30870 var entity = context.entity(id);
30871 return entity.type === 'relation' && !entity.isComplete(context.graph());
30874 function protectedMember(id) {
30875 var entity = context.entity(id);
30876 if (entity.type !== 'way') return false;
30878 var parents = context.graph().parentRelations(entity);
30879 for (var i = 0; i < parents.length; i++) {
30880 var parent = parents[i],
30881 type = parent.tags.type,
30882 role = parent.memberById(id).role || 'outer';
30883 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
30893 operation.tooltip = function() {
30894 var disable = operation.disabled();
30896 t('operations.delete.' + disable + '.' + multi) :
30897 t('operations.delete.description' + '.' + multi);
30901 operation.annotation = function() {
30902 return selectedIDs.length === 1 ?
30903 t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
30904 t('operations.delete.annotation.multiple', { n: selectedIDs.length });
30908 operation.id = 'delete';
30909 operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
30910 operation.title = t('operations.delete.title');
30911 operation.behavior = behaviorOperation(context).which(operation);
30916 function operationDisconnect(selectedIDs, context) {
30917 var vertices = filter(selectedIDs, function(entityId) {
30918 return context.geometry(entityId) === 'vertex';
30921 var entityId = vertices[0],
30922 action = actionDisconnect(entityId);
30924 if (selectedIDs.length > 1) {
30925 action.limitWays(without(selectedIDs, entityId));
30929 var operation = function() {
30930 context.perform(action, operation.annotation());
30934 operation.available = function() {
30935 return vertices.length === 1;
30939 operation.disabled = function() {
30941 if (some(selectedIDs, context.hasHiddenConnections)) {
30942 reason = 'connected_to_hidden';
30944 return action.disabled(context.graph()) || reason;
30948 operation.tooltip = function() {
30949 var disable = operation.disabled();
30951 t('operations.disconnect.' + disable) :
30952 t('operations.disconnect.description');
30956 operation.annotation = function() {
30957 return t('operations.disconnect.annotation');
30961 operation.id = 'disconnect';
30962 operation.keys = [t('operations.disconnect.key')];
30963 operation.title = t('operations.disconnect.title');
30964 operation.behavior = behaviorOperation(context).which(operation);
30969 function operationMerge(selectedIDs, context) {
30971 function updatePresetTags(newGraph, ids) {
30973 newEntity = newGraph.hasEntity(id);
30975 if (!newEntity) return;
30977 var newPreset = context.presets().match(newEntity, newGraph);
30979 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
30983 var join = actionJoin(selectedIDs),
30984 merge = actionMerge(selectedIDs),
30985 mergePolygon = actionMergePolygon(selectedIDs);
30988 var operation = function() {
30989 var origGraph = context.graph(),
30992 if (!join.disabled(origGraph)) {
30994 } else if (!merge.disabled(origGraph)) {
30997 action = mergePolygon;
31000 context.perform(action, operation.annotation());
31002 var ids = selectedIDs.filter(function(id) {
31003 var entity = context.hasEntity(id);
31004 return entity && entity.type !== 'node';
31007 // if we merged tags, rematch preset to update tags if necessary (#3851)
31008 if (action === merge) {
31009 updatePresetTags(context.graph(), ids);
31012 context.enter(modeSelect(context, ids));
31016 operation.available = function() {
31017 return selectedIDs.length >= 2;
31021 operation.disabled = function() {
31022 return join.disabled(context.graph()) &&
31023 merge.disabled(context.graph()) &&
31024 mergePolygon.disabled(context.graph());
31028 operation.tooltip = function() {
31029 var j = join.disabled(context.graph()),
31030 m = merge.disabled(context.graph()),
31031 p = mergePolygon.disabled(context.graph());
31033 if (j === 'restriction' && m && p) {
31034 return t('operations.merge.restriction',
31035 { relation: context.presets().item('type/restriction').name() });
31038 if (p === 'incomplete_relation' && j && m) {
31039 return t('operations.merge.incomplete_relation');
31043 return t('operations.merge.' + j);
31046 return t('operations.merge.description');
31050 operation.annotation = function() {
31051 return t('operations.merge.annotation', { n: selectedIDs.length });
31055 operation.id = 'merge';
31056 operation.keys = [t('operations.merge.key')];
31057 operation.title = t('operations.merge.title');
31058 operation.behavior = behaviorOperation(context).which(operation);
31063 function operationMove(selectedIDs, context) {
31064 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
31065 var extent = selectedIDs.reduce(function(extent, id) {
31066 return extent.extend(context.entity(id).extent(context.graph()));
31067 }, geoExtent$$1());
31070 var operation = function() {
31071 context.enter(modeMove$$1(context, selectedIDs));
31075 operation.available = function() {
31076 return selectedIDs.length > 1 ||
31077 context.entity(selectedIDs[0]).type !== 'node';
31081 operation.disabled = function() {
31083 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31084 reason = 'too_large';
31085 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31086 reason = 'connected_to_hidden';
31087 } else if (some(selectedIDs, incompleteRelation)) {
31088 reason = 'incomplete_relation';
31092 function incompleteRelation(id) {
31093 var entity = context.entity(id);
31094 return entity.type === 'relation' && !entity.isComplete(context.graph());
31099 operation.tooltip = function() {
31100 var disable = operation.disabled();
31102 t('operations.move.' + disable + '.' + multi) :
31103 t('operations.move.description.' + multi);
31107 operation.annotation = function() {
31108 return selectedIDs.length === 1 ?
31109 t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31110 t('operations.move.annotation.multiple');
31114 operation.id = 'move';
31115 operation.keys = [t('operations.move.key')];
31116 operation.title = t('operations.move.title');
31117 operation.behavior = behaviorOperation(context).which(operation);
31122 function operationOrthogonalize(selectedIDs, context) {
31123 var entityId = selectedIDs[0],
31124 entity = context.entity(entityId),
31125 extent = entity.extent(context.graph()),
31126 geometry = context.geometry(entityId),
31127 action = actionOrthogonalize(entityId, context.projection);
31130 var operation = function() {
31131 context.perform(action, operation.annotation());
31135 operation.available = function() {
31136 return selectedIDs.length === 1 &&
31137 entity.type === 'way' &&
31138 entity.isClosed() &&
31139 uniq(entity.nodes).length > 2;
31143 operation.disabled = function() {
31145 if (extent.percentContainedIn(context.extent()) < 0.8) {
31146 reason = 'too_large';
31147 } else if (context.hasHiddenConnections(entityId)) {
31148 reason = 'connected_to_hidden';
31150 return action.disabled(context.graph()) || reason;
31154 operation.tooltip = function() {
31155 var disable = operation.disabled();
31157 t('operations.orthogonalize.' + disable) :
31158 t('operations.orthogonalize.description.' + geometry);
31162 operation.annotation = function() {
31163 return t('operations.orthogonalize.annotation.' + geometry);
31167 operation.id = 'orthogonalize';
31168 operation.keys = [t('operations.orthogonalize.key')];
31169 operation.title = t('operations.orthogonalize.title');
31170 operation.behavior = behaviorOperation(context).which(operation);
31176 * This method is like `_.uniq` except that it accepts `iteratee` which is
31177 * invoked for each element in `array` to generate the criterion by which
31178 * uniqueness is computed. The order of result values is determined by the
31179 * order they occur in the array. The iteratee is invoked with one argument:
31186 * @param {Array} array The array to inspect.
31187 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31188 * @returns {Array} Returns the new duplicate free array.
31191 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31194 * // The `_.property` iteratee shorthand.
31195 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31196 * // => [{ 'x': 1 }, { 'x': 2 }]
31198 function uniqBy(array, iteratee) {
31199 return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31202 function operationReflectShort(selectedIDs, context) {
31203 return operationReflect(selectedIDs, context, 'short');
31207 function operationReflectLong(selectedIDs, context) {
31208 return operationReflect(selectedIDs, context, 'long');
31212 function operationReflect(selectedIDs, context, axis) {
31213 axis = axis || 'long';
31214 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31215 extent = selectedIDs.reduce(function(extent, id) {
31216 return extent.extend(context.entity(id).extent(context.graph()));
31217 }, geoExtent$$1());
31220 var operation = function() {
31221 var action = actionReflect(selectedIDs, context.projection)
31222 .useLongAxis(Boolean(axis === 'long'));
31223 context.perform(action, operation.annotation());
31227 operation.available = function() {
31228 var nodes = utilGetAllNodes(selectedIDs, context.graph());
31229 return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31233 operation.disabled = function() {
31235 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31236 reason = 'too_large';
31237 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31238 reason = 'connected_to_hidden';
31239 } else if (some(selectedIDs, incompleteRelation)) {
31240 reason = 'incomplete_relation';
31244 function incompleteRelation(id) {
31245 var entity = context.entity(id);
31246 return entity.type === 'relation' && !entity.isComplete(context.graph());
31251 operation.tooltip = function() {
31252 var disable = operation.disabled();
31254 t('operations.reflect.' + disable + '.' + multi) :
31255 t('operations.reflect.description.' + axis + '.' + multi);
31259 operation.annotation = function() {
31260 return t('operations.reflect.annotation.' + axis + '.' + multi);
31264 operation.id = 'reflect-' + axis;
31265 operation.keys = [t('operations.reflect.key.' + axis)];
31266 operation.title = t('operations.reflect.title.' + axis);
31267 operation.behavior = behaviorOperation(context).which(operation);
31272 function operationReverse(selectedIDs, context) {
31273 var entityId = selectedIDs[0];
31275 var operation = function() {
31276 context.perform(actionReverse(entityId), operation.annotation());
31280 operation.available = function() {
31281 return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31285 operation.disabled = function() {
31290 operation.tooltip = function() {
31291 return t('operations.reverse.description');
31295 operation.annotation = function() {
31296 return t('operations.reverse.annotation');
31300 operation.id = 'reverse';
31301 operation.keys = [t('operations.reverse.key')];
31302 operation.title = t('operations.reverse.title');
31303 operation.behavior = behaviorOperation(context).which(operation);
31308 function operationRotate(selectedIDs, context) {
31309 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31310 extent = selectedIDs.reduce(function(extent, id) {
31311 return extent.extend(context.entity(id).extent(context.graph()));
31312 }, geoExtent$$1());
31315 var operation = function() {
31316 context.enter(modeRotate$$1(context, selectedIDs));
31320 operation.available = function() {
31321 var nodes = utilGetAllNodes(selectedIDs, context.graph());
31322 return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31326 operation.disabled = function() {
31328 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31329 reason = 'too_large';
31330 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31331 reason = 'connected_to_hidden';
31332 } else if (some(selectedIDs, incompleteRelation)) {
31333 reason = 'incomplete_relation';
31337 function incompleteRelation(id) {
31338 var entity = context.entity(id);
31339 return entity.type === 'relation' && !entity.isComplete(context.graph());
31344 operation.tooltip = function() {
31345 var disable = operation.disabled();
31347 t('operations.rotate.' + disable + '.' + multi) :
31348 t('operations.rotate.description.' + multi);
31352 operation.annotation = function() {
31353 return selectedIDs.length === 1 ?
31354 t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31355 t('operations.rotate.annotation.multiple');
31359 operation.id = 'rotate';
31360 operation.keys = [t('operations.rotate.key')];
31361 operation.title = t('operations.rotate.title');
31362 operation.behavior = behaviorOperation(context).which(operation);
31367 function operationSplit(selectedIDs, context) {
31368 var vertices = filter(selectedIDs, function(entityId) {
31369 return context.geometry(entityId) === 'vertex';
31372 var entityId = vertices[0],
31373 action = actionSplit(entityId),
31376 if (vertices.length === 1) {
31377 if (selectedIDs.length > 1) {
31378 action.limitWays(without(selectedIDs, entityId));
31380 ways = action.ways(context.graph());
31384 var operation = function() {
31385 var difference = context.perform(action, operation.annotation());
31386 context.enter(modeSelect(context, difference.extantIDs()));
31390 operation.available = function() {
31391 return vertices.length === 1;
31395 operation.disabled = function() {
31397 if (some(selectedIDs, context.hasHiddenConnections)) {
31398 reason = 'connected_to_hidden';
31400 return action.disabled(context.graph()) || reason;
31404 operation.tooltip = function() {
31405 var disable = operation.disabled();
31407 return t('operations.split.' + disable);
31409 if (ways.length === 1) {
31410 return t('operations.split.description.' + context.geometry(ways[0].id));
31412 return t('operations.split.description.multiple');
31417 operation.annotation = function() {
31418 return ways.length === 1 ?
31419 t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31420 t('operations.split.annotation.multiple', { n: ways.length });
31424 operation.id = 'split';
31425 operation.keys = [t('operations.split.key')];
31426 operation.title = t('operations.split.title');
31427 operation.behavior = behaviorOperation(context).which(operation);
31432 function operationStraighten(selectedIDs, context) {
31433 var entityId = selectedIDs[0],
31434 action = actionStraighten(entityId, context.projection);
31437 function operation() {
31438 context.perform(action, operation.annotation());
31442 operation.available = function() {
31443 var entity = context.entity(entityId);
31444 return selectedIDs.length === 1 &&
31445 entity.type === 'way' &&
31446 !entity.isClosed() &&
31447 uniq(entity.nodes).length > 2;
31451 operation.disabled = function() {
31453 if (context.hasHiddenConnections(entityId)) {
31454 reason = 'connected_to_hidden';
31456 return action.disabled(context.graph()) || reason;
31460 operation.tooltip = function() {
31461 var disable = operation.disabled();
31463 t('operations.straighten.' + disable) :
31464 t('operations.straighten.description');
31468 operation.annotation = function() {
31469 return t('operations.straighten.annotation');
31473 operation.id = 'straighten';
31474 operation.keys = [t('operations.straighten.key')];
31475 operation.title = t('operations.straighten.title');
31476 operation.behavior = behaviorOperation(context).which(operation);
31483 var Operations = Object.freeze({
31484 operationCircularize: operationCircularize,
31485 operationContinue: operationContinue,
31486 operationDelete: operationDelete,
31487 operationDisconnect: operationDisconnect,
31488 operationMerge: operationMerge,
31489 operationMove: operationMove,
31490 operationOrthogonalize: operationOrthogonalize,
31491 operationReflectShort: operationReflectShort,
31492 operationReflectLong: operationReflectLong,
31493 operationReverse: operationReverse,
31494 operationRotate: operationRotate,
31495 operationSplit: operationSplit,
31496 operationStraighten: operationStraighten
31499 function modeMove$$1(context, entityIDs, baseGraph) {
31505 var keybinding = d3keybinding('move');
31507 behaviorEdit(context),
31508 operationCircularize(entityIDs, context).behavior,
31509 operationDelete(entityIDs, context).behavior,
31510 operationOrthogonalize(entityIDs, context).behavior,
31511 operationReflectLong(entityIDs, context).behavior,
31512 operationReflectShort(entityIDs, context).behavior,
31513 operationRotate(entityIDs, context).behavior
31515 var annotation = entityIDs.length === 1 ?
31516 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31517 t('operations.move.annotation.multiple');
31522 var _nudgeInterval;
31525 function doMove(nudge) {
31526 nudge = nudge || [0, 0];
31529 if (_prevGraph !== context.graph()) {
31531 _origin = context.map().mouseCoordinates();
31532 fn = context.perform;
31534 fn = context.overwrite;
31537 var currMouse = context.mouse();
31538 var origMouse = context.projection(_origin);
31539 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31541 fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31542 _prevGraph = context.graph();
31546 function startNudge(nudge) {
31547 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31548 _nudgeInterval = window.setInterval(function() {
31549 context.pan(nudge);
31555 function stopNudge() {
31556 if (_nudgeInterval) {
31557 window.clearInterval(_nudgeInterval);
31558 _nudgeInterval = null;
31565 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31574 function finish() {
31575 event.stopPropagation();
31576 context.enter(modeSelect(context, entityIDs));
31581 function cancel() {
31583 while (context.graph() !== baseGraph) context.pop();
31584 context.enter(modeBrowse(context));
31587 context.enter(modeSelect(context, entityIDs));
31593 function undone() {
31594 context.enter(modeBrowse(context));
31598 mode.enter = function() {
31599 _origin = context.map().mouseCoordinates();
31603 behaviors.forEach(function(behavior) {
31604 context.install(behavior);
31608 .on('mousemove.move', move)
31609 .on('click.move', finish);
31612 .on('undone.move', undone);
31618 d3_select(document)
31623 mode.exit = function() {
31626 behaviors.forEach(function(behavior) {
31627 context.uninstall(behavior);
31631 .on('mousemove.move', null)
31632 .on('click.move', null);
31635 .on('undone.move', null);
31641 mode.selectedIDs = function() {
31642 if (!arguments.length) return entityIDs;
31651 function modeRotate$$1(context, entityIDs) {
31657 var keybinding = d3keybinding('rotate');
31659 behaviorEdit(context),
31660 operationCircularize(entityIDs, context).behavior,
31661 operationDelete(entityIDs, context).behavior,
31662 operationMove(entityIDs, context).behavior,
31663 operationOrthogonalize(entityIDs, context).behavior,
31664 operationReflectLong(entityIDs, context).behavior,
31665 operationReflectShort(entityIDs, context).behavior
31667 var annotation = entityIDs.length === 1 ?
31668 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31669 t('operations.rotate.annotation.multiple');
31673 var _prevTransform;
31677 function doRotate() {
31679 if (context.graph() !== _prevGraph) {
31680 fn = context.perform;
31682 fn = context.replace;
31685 // projection changed, recalculate _pivot
31686 var projection = context.projection;
31687 var currTransform = projection.transform();
31688 if (!_prevTransform ||
31689 currTransform.k !== _prevTransform.k ||
31690 currTransform.x !== _prevTransform.x ||
31691 currTransform.y !== _prevTransform.y) {
31693 var nodes = utilGetAllNodes(entityIDs, context.graph());
31694 var points = nodes.map(function(n) { return projection(n.loc); });
31696 if (points.length === 1) { // degenerate case
31697 _pivot = points[0];
31698 } else if (points.length === 2) {
31699 _pivot = geoVecInterp(points[0], points[1], 0.5);
31701 _pivot = d3_polygonCentroid(d3_polygonHull(points));
31703 _prevAngle = undefined;
31707 var currMouse = context.mouse();
31708 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
31710 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
31711 var delta = currAngle - _prevAngle;
31713 fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
31715 _prevTransform = currTransform;
31716 _prevAngle = currAngle;
31717 _prevGraph = context.graph();
31721 function finish() {
31722 event.stopPropagation();
31723 context.enter(modeSelect(context, entityIDs));
31727 function cancel() {
31729 context.enter(modeSelect(context, entityIDs));
31733 function undone() {
31734 context.enter(modeBrowse(context));
31738 mode.enter = function() {
31739 behaviors.forEach(function(behavior) {
31740 context.install(behavior);
31744 .on('mousemove.rotate', doRotate)
31745 .on('click.rotate', finish);
31748 .on('undone.rotate', undone);
31754 d3_select(document)
31759 mode.exit = function() {
31760 behaviors.forEach(function(behavior) {
31761 context.uninstall(behavior);
31765 .on('mousemove.rotate', null)
31766 .on('click.rotate', null);
31769 .on('undone.rotate', null);
31775 mode.selectedIDs = function() {
31776 if (!arguments.length) return entityIDs;
31786 * A specialized version of `_.reduce` for arrays without support for
31787 * iteratee shorthands.
31790 * @param {Array} [array] The array to iterate over.
31791 * @param {Function} iteratee The function invoked per iteration.
31792 * @param {*} [accumulator] The initial value.
31793 * @param {boolean} [initAccum] Specify using the first element of `array` as
31794 * the initial value.
31795 * @returns {*} Returns the accumulated value.
31797 function arrayReduce(array, iteratee, accumulator, initAccum) {
31799 length = array == null ? 0 : array.length;
31801 if (initAccum && length) {
31802 accumulator = array[++index];
31804 while (++index < length) {
31805 accumulator = iteratee(accumulator, array[index], index, array);
31807 return accumulator;
31811 * The base implementation of `_.reduce` and `_.reduceRight`, without support
31812 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
31815 * @param {Array|Object} collection The collection to iterate over.
31816 * @param {Function} iteratee The function invoked per iteration.
31817 * @param {*} accumulator The initial value.
31818 * @param {boolean} initAccum Specify using the first or last element of
31819 * `collection` as the initial value.
31820 * @param {Function} eachFunc The function to iterate over `collection`.
31821 * @returns {*} Returns the accumulated value.
31823 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
31824 eachFunc(collection, function(value, index, collection) {
31825 accumulator = initAccum
31826 ? (initAccum = false, value)
31827 : iteratee(accumulator, value, index, collection);
31829 return accumulator;
31833 * Reduces `collection` to a value which is the accumulated result of running
31834 * each element in `collection` thru `iteratee`, where each successive
31835 * invocation is supplied the return value of the previous. If `accumulator`
31836 * is not given, the first element of `collection` is used as the initial
31837 * value. The iteratee is invoked with four arguments:
31838 * (accumulator, value, index|key, collection).
31840 * Many lodash methods are guarded to work as iteratees for methods like
31841 * `_.reduce`, `_.reduceRight`, and `_.transform`.
31843 * The guarded methods are:
31844 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
31850 * @category Collection
31851 * @param {Array|Object} collection The collection to iterate over.
31852 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
31853 * @param {*} [accumulator] The initial value.
31854 * @returns {*} Returns the accumulated value.
31855 * @see _.reduceRight
31858 * _.reduce([1, 2], function(sum, n) {
31863 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
31864 * (result[value] || (result[value] = [])).push(key);
31867 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
31869 function reduce(collection, iteratee, accumulator) {
31870 var func = isArray(collection) ? arrayReduce : baseReduce,
31871 initAccum = arguments.length < 3;
31873 return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
31876 var _isSaving = false;
31879 function modeSave$$1(context) {
31880 var mode = { id: 'save' };
31881 var keybinding = d3keybinding('modeSave');
31883 var loading = uiLoading(context)
31884 .message(t('save.uploading'))
31887 var commit = uiCommit(context)
31888 .on('cancel', cancel)
31894 var _toLoadCount = 0;
31895 var _toLoadTotal = 0;
31897 var _conflicts = [];
31902 function cancel(selectedID) {
31904 context.enter(modeSelect(context, [selectedID]));
31906 context.enter(modeBrowse(context));
31911 function save(changeset, tryAgain, checkConflicts) {
31912 // Guard against accidentally entering save code twice - #4641
31913 if (_isSaving && !tryAgain) {
31917 var osm = context.connection();
31923 // If user somehow got logged out mid-save, try to reauthenticate..
31924 // This can happen if they were logged in from before, but the tokens are no longer valid.
31925 if (!osm.authenticated()) {
31926 osm.authenticate(function(err) {
31928 cancel(); // quit save mode..
31930 save(changeset, tryAgain, checkConflicts); // continue where we left off..
31938 context.container().call(loading); // block input
31942 var history = context.history();
31943 var localGraph = context.graph();
31944 var remoteGraph = coreGraph$$1(history.base(), true);
31949 // Store original changes, in case user wants to download them as an .osc file
31950 _origChanges = history.changes(actionDiscardTags(history.difference()));
31952 // First time, `history.perform` a no-op action.
31953 // Any conflict resolutions will be done as `history.replace`
31955 history.perform(actionNoop());
31958 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
31959 if (!checkConflicts) {
31962 // Do the full (slow) conflict check..
31964 var modified = filter(history.difference().summary(), { changeType: 'modified' });
31965 _toCheck = map$3(map$3(modified, 'entity'), 'id');
31966 _toLoad = withChildNodes(_toCheck, localGraph);
31969 _toLoadTotal = _toLoad.length;
31971 if (_toCheck.length) {
31972 showProgress(_toLoadCount, _toLoadTotal);
31973 _toLoad.forEach(function(id) { _loaded[id] = false; });
31974 osm.loadMultiple(_toLoad, loaded);
31983 function withChildNodes(ids, graph) {
31984 return uniq(reduce(ids, function(result, id) {
31985 var entity = graph.entity(id);
31986 if (entity.type === 'way') {
31988 var children = graph.childNodes(entity);
31989 result.push.apply(result, map$3(filter(children, 'version'), 'id'));
31991 /* eslint-disable no-console */
31992 if (typeof console !== 'undefined') console.error(err);
31993 /* eslint-enable no-console */
32001 // Reload modified entities into an alternate graph and check for conflicts..
32002 function loaded(err, result) {
32003 if (_errors.length) return;
32007 msg: err.message || err.responseText,
32008 details: [ t('save.status_code', { code: err.status }) ]
32015 result.data.forEach(function(entity) {
32016 remoteGraph.replace(entity);
32017 _loaded[entity.id] = true;
32018 _toLoad = without(_toLoad, entity.id);
32020 if (!entity.visible) return;
32022 // Because loadMultiple doesn't download /full like loadEntity,
32023 // need to also load children that aren't already being checked..
32025 if (entity.type === 'way') {
32026 for (i = 0; i < entity.nodes.length; i++) {
32027 id = entity.nodes[i];
32028 if (_loaded[id] === undefined) {
32029 _loaded[id] = false;
32033 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
32034 for (i = 0; i < entity.members.length; i++) {
32035 id = entity.members[i].id;
32036 if (_loaded[id] === undefined) {
32037 _loaded[id] = false;
32044 _toLoadCount += result.data.length;
32045 _toLoadTotal += loadMore.length;
32046 showProgress(_toLoadCount, _toLoadTotal);
32048 if (loadMore.length) {
32049 _toLoad.push.apply(_toLoad, loadMore);
32050 osm.loadMultiple(loadMore, loaded);
32053 if (!_toLoad.length) {
32060 function detectConflicts() {
32061 function choice(id, text, action) {
32062 return { id: id, text: text, action: function() { history.replace(action); } };
32064 function formatUser(d) {
32065 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
32067 function entityName(entity) {
32068 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
32071 function sameVersions(local$$1, remote) {
32072 if (local$$1.version !== remote.version) return false;
32074 if (local$$1.type === 'way') {
32075 var children = union(local$$1.nodes, remote.nodes);
32076 for (var i = 0; i < children.length; i++) {
32077 var a = localGraph.hasEntity(children[i]);
32078 var b = remoteGraph.hasEntity(children[i]);
32079 if (a && b && a.version !== b.version) return false;
32086 _toCheck.forEach(function(id) {
32087 var local$$1 = localGraph.entity(id);
32088 var remote = remoteGraph.entity(id);
32090 if (sameVersions(local$$1, remote)) return;
32092 var action = actionMergeRemoteChanges;
32093 var merge = action(id, localGraph, remoteGraph, formatUser);
32095 history.replace(merge);
32097 var mergeConflicts = merge.conflicts();
32098 if (!mergeConflicts.length) return; // merged safely
32100 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
32101 var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
32102 var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
32103 var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
32107 name: entityName(local$$1),
32108 details: mergeConflicts,
32111 choice(id, keepMine, forceLocal),
32112 choice(id, keepTheirs, forceRemote)
32122 function upload(changeset) {
32123 var osm = context.connection();
32125 _errors.push({ msg: 'No OSM Service' });
32128 if (_conflicts.length) {
32129 _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
32130 showConflicts(changeset);
32132 } else if (_errors.length) {
32136 var history = context.history();
32137 var changes = history.changes(actionDiscardTags(history.difference()));
32138 if (changes.modified.length || changes.created.length || changes.deleted.length) {
32139 osm.putChangeset(changeset, changes, uploadCallback);
32140 } else { // changes were insignificant or reverted by user
32141 d3_select('.inspector-wrap *').remove();
32151 function uploadCallback(err, changeset) {
32153 if (err.status === 409) { // 409 Conflict
32154 save(changeset, true, true); // tryAgain = true, checkConflicts = true
32157 msg: err.message || err.responseText,
32158 details: [ t('save.status_code', { code: err.status }) ]
32164 context.history().clearSaved();
32165 success(changeset);
32166 // Add delay to allow for postgres replication #1646 #2678
32167 window.setTimeout(function() {
32168 d3_select('.inspector-wrap *').remove();
32177 function showProgress(num, total) {
32178 var modal = context.container().select('.loading-modal .modal-section');
32179 var progress = modal.selectAll('.progress')
32185 .attr('class', 'progress')
32187 .text(t('save.conflict_progress', { num: num, total: total }));
32191 function showConflicts(changeset) {
32192 var history = context.history();
32193 var selection$$1 = context.container()
32194 .select('#sidebar')
32196 .attr('class','sidebar-component');
32201 var ui = uiConflicts(context)
32202 .conflictList(_conflicts)
32203 .origChanges(_origChanges)
32204 .on('cancel', function() {
32206 selection$$1.remove();
32209 .on('save', function() {
32210 for (var i = 0; i < _conflicts.length; i++) {
32211 if (_conflicts[i].chosen === 1) { // user chose "keep theirs"
32212 var entity = context.hasEntity(_conflicts[i].id);
32213 if (entity && entity.type === 'way') {
32214 var children = uniq(entity.nodes);
32215 for (var j = 0; j < children.length; j++) {
32216 history.replace(actionRevert(children[j]));
32219 history.replace(actionRevert(_conflicts[i].id));
32223 selection$$1.remove();
32224 save(changeset, true, false); // tryAgain = true, checkConflicts = false
32227 selection$$1.call(ui);
32231 function showErrors() {
32233 context.history().pop();
32237 var selection$$1 = uiConfirm(context.container());
32239 .select('.modal-section.header')
32241 .text(t('save.error'));
32243 addErrors(selection$$1, _errors);
32244 selection$$1.okButton();
32248 function addErrors(selection$$1, data) {
32249 var message = selection$$1
32250 .select('.modal-section.message-text');
32252 var items = message
32253 .selectAll('.error-container')
32256 var enter = items.enter()
32258 .attr('class', 'error-container');
32262 .attr('class', 'error-description')
32264 .classed('hide-toggle', true)
32265 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
32266 .on('click', function() {
32267 event.preventDefault();
32269 var error = d3_select(this);
32270 var detail = d3_select(this.nextElementSibling);
32271 var exp = error.classed('expanded');
32273 detail.style('display', exp ? 'none' : 'block');
32274 error.classed('expanded', !exp);
32277 var details = enter
32279 .attr('class', 'error-detail-container')
32280 .style('display', 'none');
32284 .attr('class', 'error-detail-list')
32286 .data(function(d) { return d.details || []; })
32289 .attr('class', 'error-detail-item')
32290 .text(function(d) { return d; });
32297 function success(changeset) {
32300 var ui = uiSuccess(context)
32301 .changeset(changeset)
32302 .on('cancel', function() { context.ui().sidebar.hide(); });
32304 context.enter(modeBrowse(context).sidebar(ui));
32308 function keybindingOn() {
32309 d3_select(document)
32310 .call(keybinding.on('⎋', cancel, true));
32314 function keybindingOff() {
32315 d3_select(document)
32316 .call(keybinding.off);
32320 mode.enter = function() {
32322 context.ui().sidebar.show(commit);
32327 context.container().selectAll('#content')
32328 .attr('class', 'inactive');
32330 var osm = context.connection();
32336 if (osm.authenticated()) {
32339 osm.authenticate(function(err) {
32350 mode.exit = function() {
32355 context.container().selectAll('#content')
32356 .attr('class', 'active');
32358 context.ui().sidebar.hide();
32364 /* Built-in method references for those with the same name as other `lodash` methods. */
32365 var nativeMin$1 = Math.min;
32368 * The base implementation of methods like `_.intersection`, without support
32369 * for iteratee shorthands, that accepts an array of arrays to inspect.
32372 * @param {Array} arrays The arrays to inspect.
32373 * @param {Function} [iteratee] The iteratee invoked per element.
32374 * @param {Function} [comparator] The comparator invoked per element.
32375 * @returns {Array} Returns the new array of shared values.
32377 function baseIntersection(arrays, iteratee, comparator) {
32378 var includes = comparator ? arrayIncludesWith : arrayIncludes,
32379 length = arrays[0].length,
32380 othLength = arrays.length,
32381 othIndex = othLength,
32382 caches = Array(othLength),
32383 maxLength = Infinity,
32386 while (othIndex--) {
32387 var array = arrays[othIndex];
32388 if (othIndex && iteratee) {
32389 array = arrayMap(array, baseUnary(iteratee));
32391 maxLength = nativeMin$1(array.length, maxLength);
32392 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
32393 ? new SetCache(othIndex && array)
32402 while (++index < length && result.length < maxLength) {
32403 var value = array[index],
32404 computed = iteratee ? iteratee(value) : value;
32406 value = (comparator || value !== 0) ? value : 0;
32408 ? cacheHas(seen, computed)
32409 : includes(result, computed, comparator)
32411 othIndex = othLength;
32412 while (--othIndex) {
32413 var cache = caches[othIndex];
32415 ? cacheHas(cache, computed)
32416 : includes(arrays[othIndex], computed, comparator))
32422 seen.push(computed);
32424 result.push(value);
32431 * Casts `value` to an empty array if it's not an array like object.
32434 * @param {*} value The value to inspect.
32435 * @returns {Array|Object} Returns the cast array-like object.
32437 function castArrayLikeObject(value) {
32438 return isArrayLikeObject(value) ? value : [];
32442 * Creates an array of unique values that are included in all given arrays
32443 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
32444 * for equality comparisons. The order and references of result values are
32445 * determined by the first array.
32451 * @param {...Array} [arrays] The arrays to inspect.
32452 * @returns {Array} Returns the new array of intersecting values.
32455 * _.intersection([2, 1], [2, 3]);
32458 var intersection = baseRest(function(arrays) {
32459 var mapped = arrayMap(arrays, castArrayLikeObject);
32460 return (mapped.length && mapped[0] === arrays[0])
32461 ? baseIntersection(mapped)
32465 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
32466 // For example, ⌘Z -> Ctrl+Z
32467 var uiCmd = function (code) {
32468 var detected = utilDetect();
32470 if (detected.os === 'mac') {
32474 if (detected.os === 'win') {
32475 if (code === '⌘⇧Z') return 'Ctrl+Y';
32487 for (var i = 0; i < code.length; i++) {
32488 if (code[i] in replacements) {
32489 result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
32499 // return a display-focused string for a given keyboard code
32500 uiCmd.display = function(code) {
32501 if (code.length !== 1) return code;
32503 var detected = utilDetect();
32504 var mac = (detected.os === 'mac');
32505 var replacements = {
32506 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd') : t('shortcuts.key.ctrl'),
32507 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift') : t('shortcuts.key.shift'),
32508 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
32509 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl') : t('shortcuts.key.ctrl'),
32510 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
32511 '⌦': mac ? '⌦ ' + t('shortcuts.key.del') : t('shortcuts.key.del'),
32512 '↖': mac ? '↖ ' + t('shortcuts.key.pgup') : t('shortcuts.key.pgup'),
32513 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn') : t('shortcuts.key.pgdn'),
32514 '⇞': mac ? '⇞ ' + t('shortcuts.key.home') : t('shortcuts.key.home'),
32515 '⇟': mac ? '⇟ ' + t('shortcuts.key.end') : t('shortcuts.key.end'),
32516 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
32517 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc') : t('shortcuts.key.esc'),
32520 return replacements[code] || code;
32526 function modeSelect(context, selectedIDs) {
32532 var keybinding = d3keybinding('select');
32533 var timeout = null;
32535 behaviorCopy(context),
32536 behaviorPaste(context),
32537 behaviorBreathe(context),
32538 behaviorHover(context),
32539 behaviorSelect(context),
32540 behaviorLasso(context),
32541 modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior
32545 var newFeature = false;
32546 var suppressMenu = true;
32547 var follow = false;
32550 var wrap = context.container()
32551 .select('.inspector-wrap');
32554 function singular() {
32555 if (selectedIDs.length === 1) {
32556 return context.hasEntity(selectedIDs[0]);
32561 function checkSelectedIDs() {
32563 if (Array.isArray(selectedIDs)) {
32564 ids = selectedIDs.filter(function(id) {
32565 return context.hasEntity(id);
32572 context.enter(modeBrowse(context));
32574 return !!ids.length;
32578 // find the common parent ways for nextVertex, previousVertex
32579 function commonParents() {
32580 var graph = context.graph();
32581 var commonParents = [];
32583 for (var i = 0; i < selectedIDs.length; i++) {
32584 var entity = context.hasEntity(selectedIDs[i]);
32585 if (!entity || entity.geometry(graph) !== 'vertex') {
32586 return []; // selection includes some not vertexes
32589 var currParents = map$3(graph.parentWays(entity), 'id');
32590 if (!commonParents.length) {
32591 commonParents = currParents;
32595 commonParents = intersection(commonParents, currParents);
32596 if (!commonParents.length) {
32601 return commonParents;
32605 function singularParent() {
32606 var parents = commonParents();
32607 if (!parents || parents.length === 0) {
32608 relatedParent = null;
32612 // relatedParent is used when we visit a vertex with multiple
32613 // parents, and we want to remember which parent line we started on.
32615 if (parents.length === 1) {
32616 relatedParent = parents[0]; // remember this parent for later
32617 return relatedParent;
32620 if (parents.indexOf(relatedParent) !== -1) {
32621 return relatedParent; // prefer the previously seen parent
32628 function closeMenu() {
32630 context.surface().call(editMenu.close);
32635 function positionMenu() {
32636 if (!editMenu) { return; }
32638 var entity = singular();
32639 if (entity && context.geometry(entity.id) === 'relation') {
32640 suppressMenu = true;
32642 var point$$1 = context.mouse();
32643 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
32645 if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
32646 editMenu.center(point$$1);
32648 suppressMenu = true;
32654 function showMenu() {
32657 context.surface().call(editMenu);
32662 function toggleMenu() {
32663 // deprecation warning - Radial Menu to be removed in iD v3
32664 if (d3_select('.edit-menu, .radial-menu').empty()) {
32673 mode.selectedIDs = function() {
32674 return selectedIDs;
32678 mode.reselect = function() {
32679 if (!checkSelectedIDs()) return;
32681 var surfaceNode = context.surface().node();
32682 if (surfaceNode.focus) { // FF doesn't support it
32683 surfaceNode.focus();
32687 if (!suppressMenu) {
32693 mode.newFeature = function(_) {
32694 if (!arguments.length) return newFeature;
32700 mode.suppressMenu = function(_) {
32701 if (!arguments.length) return suppressMenu;
32707 mode.follow = function(_) {
32708 if (!arguments.length) return follow;
32714 mode.enter = function() {
32716 function update() {
32718 checkSelectedIDs();
32722 function dblclick() {
32723 var target = d3_select(event.target);
32725 var datum = target.datum();
32726 var entity = datum && datum.properties && datum.properties.entity;
32727 if (!entity) return;
32729 if (entity instanceof osmWay && target.classed('target')) {
32730 var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
32731 var prev = entity.nodes[choice.index - 1];
32732 var next = entity.nodes[choice.index];
32735 actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
32736 t('operations.add.annotation.vertex')
32739 event.preventDefault();
32740 event.stopPropagation();
32742 } else if (entity.type === 'midpoint') {
32744 actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
32745 t('operations.add.annotation.vertex'));
32747 event.preventDefault();
32748 event.stopPropagation();
32753 function selectElements(drawn) {
32754 if (!checkSelectedIDs()) return;
32756 var surface = context.surface();
32757 var entity = singular();
32759 if (entity && context.geometry(entity.id) === 'relation') {
32760 suppressMenu = true;
32764 surface.selectAll('.related')
32765 .classed('related', false);
32768 if (relatedParent) {
32769 surface.selectAll(utilEntitySelector([relatedParent]))
32770 .classed('related', true);
32773 var selection$$1 = context.surface()
32774 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
32776 if (selection$$1.empty()) {
32777 // Return to browse mode if selected DOM elements have
32778 // disappeared because the user moved them out of view..
32779 var source = event && event.type === 'zoom' && event.sourceEvent;
32780 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
32781 context.enter(modeBrowse(context));
32785 .classed('selected', true);
32791 context.enter(modeBrowse(context));
32795 function firstVertex() {
32796 event.preventDefault();
32797 var entity = singular();
32798 var parent = singularParent();
32801 if (entity && entity.type === 'way') {
32803 } else if (parent) {
32804 way = context.entity(parent);
32809 modeSelect(context, [way.first()]).follow(true)
32815 function lastVertex() {
32816 event.preventDefault();
32817 var entity = singular();
32818 var parent = singularParent();
32821 if (entity && entity.type === 'way') {
32823 } else if (parent) {
32824 way = context.entity(parent);
32829 modeSelect(context, [way.last()]).follow(true)
32835 function previousVertex() {
32836 event.preventDefault();
32837 var parent = singularParent();
32838 if (!parent) return;
32840 var way = context.entity(parent);
32841 var length = way.nodes.length;
32842 var curr = way.nodes.indexOf(selectedIDs[0]);
32847 } else if (way.isClosed()) {
32848 index = length - 2;
32851 if (index !== -1) {
32853 modeSelect(context, [way.nodes[index]]).follow(true)
32859 function nextVertex() {
32860 event.preventDefault();
32861 var parent = singularParent();
32862 if (!parent) return;
32864 var way = context.entity(parent);
32865 var length = way.nodes.length;
32866 var curr = way.nodes.indexOf(selectedIDs[0]);
32869 if (curr < length - 1) {
32871 } else if (way.isClosed()) {
32875 if (index !== -1) {
32877 modeSelect(context, [way.nodes[index]]).follow(true)
32883 function nextParent() {
32884 event.preventDefault();
32885 var parents = uniq(commonParents());
32886 if (!parents || parents.length < 2) return;
32888 var index = parents.indexOf(relatedParent);
32889 if (index < 0 || index > parents.length - 2) {
32890 relatedParent = parents[0];
32892 relatedParent = parents[index + 1];
32895 var surface = context.surface();
32896 surface.selectAll('.related')
32897 .classed('related', false);
32899 if (relatedParent) {
32900 surface.selectAll(utilEntitySelector([relatedParent]))
32901 .classed('related', true);
32906 if (!checkSelectedIDs()) return;
32908 var operations = without(values$1(Operations), operationDelete)
32909 .map(function(o) { return o(selectedIDs, context); })
32910 .filter(function(o) { return o.available(); });
32912 // deprecation warning - Radial Menu to be removed in iD v3
32913 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
32914 if (isRadialMenu) {
32915 operations = operations.slice(0,7);
32916 operations.unshift(operationDelete(selectedIDs, context));
32918 operations.push(operationDelete(selectedIDs, context));
32921 operations.forEach(function(operation) {
32922 if (operation.behavior) {
32923 behaviors.push(operation.behavior);
32927 behaviors.forEach(function(behavior) {
32928 context.install(behavior);
32932 .on(['[', 'pgup'], previousVertex)
32933 .on([']', 'pgdown'], nextVertex)
32934 .on(['{', uiCmd('⌘['), 'home'], firstVertex)
32935 .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
32936 .on(['\\', 'pause'], nextParent)
32937 .on('⎋', esc, true)
32938 .on('space', toggleMenu);
32940 d3_select(document)
32944 // deprecation warning - Radial Menu to be removed in iD v3
32945 editMenu = isRadialMenu
32946 ? uiRadialMenu(context, operations)
32947 : uiEditMenu(context, operations);
32949 context.ui().sidebar
32950 .select(singular() ? singular().id : null, newFeature);
32953 .on('undone.select', update)
32954 .on('redone.select', update);
32957 .on('move.select', closeMenu)
32958 .on('drawn.select', selectElements);
32961 .on('dblclick.select', dblclick);
32966 if (selectedIDs.length > 1) {
32967 var entities = uiSelectionList(context, selectedIDs);
32968 context.ui().sidebar.show(entities);
32972 var extent = geoExtent$$1();
32973 var graph = context.graph();
32974 selectedIDs.forEach(function(id) {
32975 var entity = context.entity(id);
32976 extent._extend(entity.extent(graph));
32979 var loc = extent.center();
32980 context.map().centerEase(loc);
32981 } else if (singular() && singular().type === 'way') {
32982 context.map().pan([0,0]); // full redraw, to adjust z-sorting #2914
32985 timeout = window.setTimeout(function() {
32987 if (!suppressMenu) {
32990 }, 270); /* after any centerEase completes */
32995 mode.exit = function() {
32996 if (timeout) window.clearTimeout(timeout);
32997 if (inspector) wrap.call(inspector.close);
32999 behaviors.forEach(function(behavior) {
33000 context.uninstall(behavior);
33005 editMenu = undefined;
33008 .on('undone.select', null)
33009 .on('redone.select', null);
33011 var surface = context.surface();
33014 .on('dblclick.select', null);
33017 .selectAll('.selected')
33018 .classed('selected', false);
33021 .selectAll('.related')
33022 .classed('related', false);
33024 context.map().on('drawn.select', null);
33025 context.ui().sidebar.hide();
33032 function behaviorAddWay(context) {
33033 var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
33034 draw = behaviorDraw(context);
33036 var addWay = function(surface) {
33037 draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
33038 .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
33039 .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
33040 .on('cancel', addWay.cancel)
33041 .on('finish', addWay.cancel);
33044 .dblclickEnable(false);
33046 surface.call(draw);
33050 addWay.off = function(surface) {
33051 surface.call(draw.off);
33055 addWay.cancel = function() {
33056 window.setTimeout(function() {
33057 context.map().dblclickEnable(true);
33060 context.enter(modeBrowse(context));
33064 addWay.tail = function(text) {
33070 return utilRebind(addWay, dispatch$$1, 'on');
33073 function behaviorBreathe() {
33074 var duration = 800,
33076 selector$$1 = '.selected.shadow, .selected .shadow',
33077 selected = d3_select(null),
33084 function ratchetyInterpolator(a, b, steps, units) {
33087 var sample = quantize()
33089 .range(d3_quantize(d3_interpolateNumber(a, b), steps));
33091 return function(t) {
33092 return String(sample(t)) + (units || '');
33097 function reset(selection$$1) {
33099 .style('stroke-opacity', null)
33100 .style('stroke-width', null)
33101 .style('fill-opacity', null)
33106 function setAnimationParams(transition, fromTo) {
33107 var toFrom = (fromTo === 'from' ? 'to' : 'from');
33110 .styleTween('stroke-opacity', function(d) {
33111 return ratchetyInterpolator(
33112 params[d.id][toFrom].opacity,
33113 params[d.id][fromTo].opacity,
33117 .styleTween('stroke-width', function(d) {
33118 return ratchetyInterpolator(
33119 params[d.id][toFrom].width,
33120 params[d.id][fromTo].width,
33125 .styleTween('fill-opacity', function(d) {
33126 return ratchetyInterpolator(
33127 params[d.id][toFrom].opacity,
33128 params[d.id][fromTo].opacity,
33132 .styleTween('r', function(d) {
33133 return ratchetyInterpolator(
33134 params[d.id][toFrom].width,
33135 params[d.id][fromTo].width,
33143 function calcAnimationParams(selection$$1) {
33146 .each(function(d) {
33147 var s = d3_select(this),
33148 tag = s.node().tagName,
33149 p = {'from': {}, 'to': {}},
33152 // determine base opacity and width
33153 if (tag === 'circle') {
33154 opacity = parseFloat(s.style('fill-opacity') || 0.5);
33155 width = parseFloat(s.style('r') || 15.5);
33157 opacity = parseFloat(s.style('stroke-opacity') || 0.7);
33158 width = parseFloat(s.style('stroke-width') || 10);
33161 // calculate from/to interpolation params..
33163 p.from.opacity = opacity * 0.6;
33164 p.to.opacity = opacity * 1.25;
33165 p.from.width = width * 0.7;
33166 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
33172 function run(surface, fromTo) {
33173 var toFrom = (fromTo === 'from' ? 'to' : 'from'),
33174 currSelected = surface.selectAll(selector$$1),
33175 currClassed = surface.attr('class');
33177 if (done || currSelected.empty()) {
33178 selected.call(reset);
33182 if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
33183 selected.call(reset);
33184 classed = currClassed;
33185 selected = currSelected.call(calcAnimationParams);
33190 .duration(duration)
33191 .call(setAnimationParams, fromTo)
33192 .on('end', function() {
33193 surface.call(run, toFrom);
33198 var breathe = function(surface) {
33200 timer$$1 = timer(function() {
33201 // wait for elements to actually become selected
33202 if (surface.selectAll(selector$$1).empty()) {
33206 surface.call(run, 'from');
33213 breathe.off = function() {
33227 function behaviorCopy(context) {
33228 var keybinding = d3keybinding('copy');
33231 function groupEntities(ids, graph) {
33232 var entities = ids.map(function (id) { return graph.entity(id); });
33233 return assignIn({relation: [], way: [], node: []},
33234 groupBy(entities, function(entity) { return entity.type; }));
33238 function getDescendants(id, graph, descendants) {
33239 var entity = graph.entity(id),
33242 descendants = descendants || {};
33244 if (entity.type === 'relation') {
33245 children = map$3(entity.members, 'id');
33246 } else if (entity.type === 'way') {
33247 children = entity.nodes;
33252 for (i = 0; i < children.length; i++) {
33253 if (!descendants[children[i]]) {
33254 descendants[children[i]] = true;
33255 descendants = getDescendants(children[i], graph, descendants);
33259 return descendants;
33263 function doCopy() {
33264 if (!getSelectionText()) event.preventDefault();
33266 var graph = context.graph(),
33267 selected = groupEntities(context.selectedIDs(), graph),
33272 for (i = 0; i < selected.relation.length; i++) {
33273 entity = selected.relation[i];
33274 if (!skip[entity.id] && entity.isComplete(graph)) {
33275 canCopy.push(entity.id);
33276 skip = getDescendants(entity.id, graph, skip);
33279 for (i = 0; i < selected.way.length; i++) {
33280 entity = selected.way[i];
33281 if (!skip[entity.id]) {
33282 canCopy.push(entity.id);
33283 skip = getDescendants(entity.id, graph, skip);
33286 for (i = 0; i < selected.node.length; i++) {
33287 entity = selected.node[i];
33288 if (!skip[entity.id]) {
33289 canCopy.push(entity.id);
33293 context.copyIDs(canCopy);
33298 keybinding.on(uiCmd('⌘C'), doCopy);
33299 d3_select(document).call(keybinding);
33303 function getSelectionText() {
33304 return window.getSelection().toString();
33307 copy.off = function() {
33308 d3_select(document).call(keybinding.off);
33316 `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
33318 * The `origin` function is expected to return an [x, y] tuple rather than an
33320 * The events are `start`, `move`, and `end`.
33321 (https://github.com/mbostock/d3/issues/563)
33322 * The `start` event is not dispatched until the first cursor movement occurs.
33323 (https://github.com/mbostock/d3/pull/368)
33324 * The `move` event has a `point` and `delta` [x, y] tuple properties rather
33325 than `x`, `y`, `dx`, and `dy` properties.
33326 * The `end` event is not dispatched if no movement occurs.
33327 * An `off` function is available that unbinds the drag's internal event handlers.
33330 function behaviorDrag() {
33331 var dispatch$$1 = dispatch('start', 'move', 'end');
33332 var _origin = null;
33333 var _selector = '';
33339 var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
33340 var d3_event_userSelectSuppress = function() {
33341 var selection$$1 = selection();
33342 var select$$1 = selection$$1.style(d3_event_userSelectProperty);
33343 selection$$1.style(d3_event_userSelectProperty, 'none');
33344 return function() {
33345 selection$$1.style(d3_event_userSelectProperty, select$$1);
33350 function d3_eventCancel() {
33351 event.stopPropagation();
33352 event.preventDefault();
33356 function eventOf(thiz, argumentz) {
33357 return function(e1) {
33359 customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
33364 function dragstart() {
33366 _event = eventOf(_target, arguments);
33368 var eventTarget = event.target;
33369 var touchId = event.touches ? event.changedTouches[0].identifier : null;
33371 var startOrigin = point$$1();
33372 var started = false;
33373 var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
33376 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
33377 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
33380 offset = _origin.apply(_target, arguments);
33381 offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
33386 if (touchId === null) {
33387 event.stopPropagation();
33391 function point$$1() {
33392 var p = _surface || _target.parentNode;
33393 return touchId !== null ? d3_touches(p).filter(function(p) {
33394 return p.identifier === touchId;
33395 })[0] : d3_mouse(p);
33399 function dragmove() {
33400 var p = point$$1();
33401 var dx = p[0] - startOrigin[0];
33402 var dy = p[1] - startOrigin[1];
33404 if (dx === 0 && dy === 0)
33412 _event({ type: 'start' });
33416 point: [p[0] + offset[0], p[1] + offset[1]],
33423 function dragend() {
33425 _event({ type: 'end' });
33428 if (event.target === eventTarget) {
33430 .on('click.drag', click, true);
33435 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
33436 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
33445 .on('click.drag', null);
33450 function drag(selection$$1) {
33451 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
33452 var delegate = dragstart;
33455 delegate = function() {
33457 var target = event.target;
33458 for (; target && target !== root; target = target.parentNode) {
33459 var datum = target.__data__;
33460 var entity = datum && datum.properties && datum.properties.entity;
33461 if (entity && target[matchesSelector](_selector)) {
33462 return dragstart.call(target, entity);
33469 .on('mousedown.drag' + _selector, delegate)
33470 .on('touchstart.drag' + _selector, delegate);
33474 drag.off = function(selection$$1) {
33476 .on('mousedown.drag' + _selector, null)
33477 .on('touchstart.drag' + _selector, null);
33481 drag.selector = function(_) {
33482 if (!arguments.length) return _selector;
33488 drag.origin = function (_) {
33489 if (!arguments.length) return _origin;
33495 drag.cancel = function() {
33497 .on('mousemove.drag', null)
33498 .on('mouseup.drag', null);
33503 drag.target = function() {
33504 if (!arguments.length) return _target;
33505 _target = arguments[0];
33506 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
33511 drag.surface = function() {
33512 if (!arguments.length) return _surface;
33513 _surface = arguments[0];
33518 return utilRebind(drag, dispatch$$1, 'on');
33521 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
33522 var origWay = context.entity(wayId);
33523 var annotation = t((origWay.isDegenerate() ?
33524 'operations.start.annotation.' :
33525 'operations.continue.annotation.') + context.geometry(wayId)
33527 var behavior = behaviorDraw(context);
33528 var _tempEdits = 0;
33530 var end = osmNode({ loc: context.map().mouseCoordinates() });
33532 // Push an annotated state for undo to return back to.
33533 // We must make sure to remove this edit later.
33534 context.perform(actionNoop(), annotation);
33537 // Add the drawing node to the graph.
33538 // We must make sure to remove this edit later.
33539 context.perform(_actionAddDrawNode());
33544 function keydown() {
33545 if (event.keyCode === d3keybinding.modifierCodes.alt) {
33546 if (context.surface().classed('nope')) {
33548 .classed('nope-suppressed', true);
33551 .classed('nope', false)
33552 .classed('nope-disabled', true);
33558 if (event.keyCode === d3keybinding.modifierCodes.alt) {
33559 if (context.surface().classed('nope-suppressed')) {
33561 .classed('nope', true);
33564 .classed('nope-suppressed', false)
33565 .classed('nope-disabled', false);
33571 // - `mode/drag_node.js` `doMode()`
33572 // - `behavior/draw.js` `click()`
33573 // - `behavior/draw_way.js` `move()`
33574 function move(datum) {
33575 context.surface().classed('nope-disabled', event.altKey);
33577 var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
33578 var targetNodes = datum && datum.properties && datum.properties.nodes;
33579 var loc = context.map().mouseCoordinates();
33581 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
33584 } else if (targetNodes) { // snap to way - a line target with `.nodes`
33585 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
33591 context.replace(actionMoveNode(end.id, loc));
33592 end = context.entity(end.id);
33593 checkGeometry(false);
33597 // Check whether this edit causes the geometry to break.
33598 // If so, class the surface with a nope cursor.
33599 // `finishDraw` - Only checks the relevant line segments if finishing drawing
33600 function checkGeometry(finishDraw) {
33601 var nopeDisabled = context.surface().classed('nope-disabled');
33602 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
33604 if (nopeDisabled) {
33606 .classed('nope', false)
33607 .classed('nope-suppressed', isInvalid);
33610 .classed('nope', isInvalid)
33611 .classed('nope-suppressed', false);
33616 function isInvalidGeometry(entity, graph, finishDraw) {
33617 var parents = graph.parentWays(entity);
33619 for (var i = 0; i < parents.length; i++) {
33620 var parent = parents[i];
33621 var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
33623 if (origWay.isClosed()) { // Check if Area
33625 nodes.splice(-2, 1);
33626 entity = nodes[nodes.length-2];
33636 if (geoHasSelfIntersections(nodes, entity.id)) {
33645 function undone() {
33646 // Undo popped the history back to the initial annotated no-op edit.
33647 // Remove initial no-op edit and whatever edit happened immediately before it.
33651 if (context.hasEntity(wayId)) {
33652 context.enter(mode);
33654 context.enter(modeBrowse(context));
33659 function setActiveElements() {
33660 context.surface().selectAll('.' + end.id)
33661 .classed('active', true);
33665 var drawWay = function(surface) {
33668 .on('click', drawWay.add)
33669 .on('clickWay', drawWay.addWay)
33670 .on('clickNode', drawWay.addNode)
33671 .on('undo', context.undo)
33672 .on('cancel', drawWay.cancel)
33673 .on('finish', drawWay.finish);
33676 .on('keydown.drawWay', keydown)
33677 .on('keyup.drawWay', keyup);
33680 .dblclickEnable(false)
33681 .on('drawn.draw', setActiveElements);
33683 setActiveElements();
33685 surface.call(behavior);
33688 .on('undone.draw', undone);
33692 drawWay.off = function(surface) {
33693 // Drawing was interrupted unexpectedly.
33694 // This can happen if the user changes modes,
33695 // clicks geolocate button, a hashchange event occurs, etc.
33697 context.pop(_tempEdits);
33698 while (context.graph() !== startGraph) {
33704 .on('drawn.draw', null);
33706 surface.call(behavior.off)
33707 .selectAll('.active')
33708 .classed('active', false);
33711 .classed('nope', false)
33712 .classed('nope-suppressed', false)
33713 .classed('nope-disabled', false);
33716 .on('keydown.hover', null)
33717 .on('keyup.hover', null);
33720 .on('undone.draw', null);
33724 function _actionAddDrawNode() {
33725 return function(graph) {
33728 .replace(origWay.addNode(end.id, index));
33733 function _actionReplaceDrawNode(newNode) {
33734 return function(graph) {
33736 .replace(origWay.addNode(newNode.id, index))
33742 // Accept the current position of the drawing node and continue drawing.
33743 drawWay.add = function(loc, d) {
33744 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33745 return; // can't click here
33748 context.pop(_tempEdits);
33752 _actionAddDrawNode(),
33756 checkGeometry(false); // finishDraw = false
33757 context.enter(mode);
33761 // Connect the way to an existing way.
33762 drawWay.addWay = function(loc, edge, d) {
33763 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33764 return; // can't click here
33767 context.pop(_tempEdits);
33771 _actionAddDrawNode(),
33772 actionAddMidpoint({ loc: loc, edge: edge }, end),
33776 checkGeometry(false); // finishDraw = false
33777 context.enter(mode);
33781 // Connect the way to an existing node and continue drawing.
33782 drawWay.addNode = function(node, d) {
33783 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
33784 return; // can't click here
33787 context.pop(_tempEdits);
33791 _actionReplaceDrawNode(node),
33795 checkGeometry(false); // finishDraw = false
33796 context.enter(mode);
33800 // Finish the draw operation, removing the temporary edits.
33801 // If the way has enough nodes to be valid, it's selected.
33802 // Otherwise, delete everything and return to browse mode.
33803 drawWay.finish = function() {
33804 checkGeometry(true); // finishDraw = true
33805 if (context.surface().classed('nope')) {
33806 return; // can't click here
33809 context.pop(_tempEdits);
33812 var way = context.hasEntity(wayId);
33813 if (!way || way.isDegenerate()) {
33818 window.setTimeout(function() {
33819 context.map().dblclickEnable(true);
33822 context.enter(modeSelect(context, [wayId]).newFeature(true));
33826 // Cancel the draw operation, delete everything, and return to browse mode.
33827 drawWay.cancel = function() {
33828 context.pop(_tempEdits);
33831 while (context.graph() !== startGraph) {
33835 window.setTimeout(function() {
33836 context.map().dblclickEnable(true);
33840 .classed('nope', false)
33841 .classed('nope-disabled', false)
33842 .classed('nope-suppressed', false);
33844 context.enter(modeBrowse(context));
33848 drawWay.activeID = function() {
33849 if (!arguments.length) return end.id;
33855 drawWay.tail = function(text) {
33856 behavior.tail(text);
33864 /** Error message constants. */
33865 var FUNC_ERROR_TEXT$3 = 'Expected a function';
33868 * Creates a throttled function that only invokes `func` at most once per
33869 * every `wait` milliseconds. The throttled function comes with a `cancel`
33870 * method to cancel delayed `func` invocations and a `flush` method to
33871 * immediately invoke them. Provide `options` to indicate whether `func`
33872 * should be invoked on the leading and/or trailing edge of the `wait`
33873 * timeout. The `func` is invoked with the last arguments provided to the
33874 * throttled function. Subsequent calls to the throttled function return the
33875 * result of the last `func` invocation.
33877 * **Note:** If `leading` and `trailing` options are `true`, `func` is
33878 * invoked on the trailing edge of the timeout only if the throttled function
33879 * is invoked more than once during the `wait` timeout.
33881 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33882 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33884 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33885 * for details over the differences between `_.throttle` and `_.debounce`.
33890 * @category Function
33891 * @param {Function} func The function to throttle.
33892 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33893 * @param {Object} [options={}] The options object.
33894 * @param {boolean} [options.leading=true]
33895 * Specify invoking on the leading edge of the timeout.
33896 * @param {boolean} [options.trailing=true]
33897 * Specify invoking on the trailing edge of the timeout.
33898 * @returns {Function} Returns the new throttled function.
33901 * // Avoid excessively updating the position while scrolling.
33902 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33904 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33905 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33906 * jQuery(element).on('click', throttled);
33908 * // Cancel the trailing throttled invocation.
33909 * jQuery(window).on('popstate', throttled.cancel);
33911 function throttle(func, wait, options) {
33912 var leading = true,
33915 if (typeof func != 'function') {
33916 throw new TypeError(FUNC_ERROR_TEXT$3);
33918 if (isObject(options)) {
33919 leading = 'leading' in options ? !!options.leading : leading;
33920 trailing = 'trailing' in options ? !!options.trailing : trailing;
33922 return debounce(func, wait, {
33923 'leading': leading,
33925 'trailing': trailing
33929 function behaviorHash(context) {
33930 var s0 = null, // cached window.location.hash
33931 lat = 90 - 1e-8; // allowable latitude range
33934 var parser = function(map, s) {
33935 var q = utilStringQs(s);
33936 var args = (q.map || '').split('/').map(Number);
33938 if (args.length < 3 || args.some(isNaN)) {
33939 return true; // replace bogus hash
33941 } else if (s !== formatter(map).slice(1)) { // hash has changed
33942 var mode = context.mode(),
33943 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
33946 // Don't allow the hash location to change too much while drawing
33947 // This can happen if the user accidently hit the back button. #3996
33948 if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
33949 context.enter(modeBrowse(context));
33952 map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
33957 var formatter = function(map) {
33958 var center = map.center(),
33960 precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
33961 q = omit(utilStringQs(window.location.hash.substring(1)),
33962 ['comment', 'hashtags', 'walkthrough']
33967 var selected = context.selectedIDs().filter(function(id) {
33968 return !context.entity(id).isNew();
33970 if (selected.length) {
33971 newParams.id = selected.join(',');
33974 newParams.map = zoom.toFixed(2) +
33975 '/' + center[1].toFixed(precision) +
33976 '/' + center[0].toFixed(precision);
33978 return '#' + utilQsString(assign(q, newParams), true);
33982 function update() {
33983 if (context.inIntro()) return;
33984 var s1 = formatter(context.map());
33986 window.location.replace(s0 = s1); // don't recenter the map!
33991 var throttledUpdate = throttle(update, 500);
33994 function hashchange() {
33995 if (window.location.hash === s0) return; // ignore spurious hashchange events
33996 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
33997 update(); // replace bogus hash
34004 .on('move.hash', throttledUpdate);
34007 .on('enter.hash', throttledUpdate);
34010 .on('hashchange.hash', hashchange);
34012 if (window.location.hash) {
34014 var q = utilStringQs(window.location.hash.substring(1));
34017 context.zoomToEntity(q.id.split(',')[0], !q.map);
34021 context.storage('comment', q.comment);
34022 context.storage('commentDate', Date.now());
34026 context.storage('hashtags', q.hashtags);
34029 if (q.walkthrough === 'true') {
34030 hash.startWalkthrough = true;
34036 hash.hadHash = true;
34042 hash.off = function() {
34043 throttledUpdate.cancel();
34046 .on('move.hash', null);
34049 .on('enter.hash', null);
34052 .on('hashchange.hash', null);
34054 window.location.hash = '';
34061 function behaviorLasso(context) {
34063 var behavior = function(selection$$1) {
34067 function mousedown() {
34068 var button = 0; // left
34069 if (event.button === button && event.shiftKey === true) {
34073 .on('mousemove.lasso', mousemove)
34074 .on('mouseup.lasso', mouseup);
34076 event.stopPropagation();
34081 function mousemove() {
34083 lasso = uiLasso(context);
34084 context.surface().call(lasso);
34087 lasso.p(context.mouse());
34091 function normalize(a, b) {
34093 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
34094 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
34098 function lassoed() {
34099 if (!lasso) return [];
34101 var graph = context.graph(),
34102 bounds = lasso.extent().map(context.projection.invert),
34103 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
34105 return map$3(context.intersects(extent).filter(function(entity) {
34106 return entity.type === 'node' &&
34107 geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
34108 !context.features().isHidden(entity, graph, entity.geometry(graph));
34113 function mouseup() {
34115 .on('mousemove.lasso', null)
34116 .on('mouseup.lasso', null);
34118 if (!lasso) return;
34120 var ids = lassoed();
34124 context.enter(modeSelect(context, ids));
34129 .on('mousedown.lasso', mousedown);
34133 behavior.off = function(selection$$1) {
34134 selection$$1.on('mousedown.lasso', null);
34141 /* Creates a keybinding behavior for an operation */
34142 function behaviorOperation() {
34143 var _operation, keybinding;
34145 var behavior = function () {
34146 if (_operation && _operation.available()) {
34147 keybinding = d3keybinding('behavior.key.' + _operation.id);
34148 keybinding.on(_operation.keys, function() {
34149 event.preventDefault();
34150 var disabled = _operation.disabled();
34156 .iconName('#operation-' + _operation.id)
34157 .iconClass('operation disabled')
34158 .text(_operation.tooltip);
34165 .iconName('#operation-' + _operation.id)
34166 .iconClass('operation')
34167 .text(_operation.annotation() || _operation.title);
34174 d3_select(document).call(keybinding);
34181 behavior.off = function() {
34183 d3_select(document).call(keybinding.off);
34188 behavior.which = function (_) {
34189 if (!arguments.length) return _operation;
34199 * The base implementation of `_.invert` and `_.invertBy` which inverts
34200 * `object` with values transformed by `iteratee` and set by `setter`.
34203 * @param {Object} object The object to iterate over.
34204 * @param {Function} setter The function to set `accumulator` values.
34205 * @param {Function} iteratee The iteratee to transform values.
34206 * @param {Object} accumulator The initial inverted object.
34207 * @returns {Function} Returns `accumulator`.
34209 function baseInverter(object, setter, iteratee, accumulator) {
34210 baseForOwn(object, function(value, key, object) {
34211 setter(accumulator, iteratee(value), key, object);
34213 return accumulator;
34217 * Creates a function like `_.invertBy`.
34220 * @param {Function} setter The function to set accumulator values.
34221 * @param {Function} toIteratee The function to resolve iteratees.
34222 * @returns {Function} Returns the new inverter function.
34224 function createInverter(setter, toIteratee) {
34225 return function(object, iteratee) {
34226 return baseInverter(object, setter, toIteratee(iteratee), {});
34230 /** Used for built-in method references. */
34231 var objectProto$19 = Object.prototype;
34234 * Used to resolve the
34235 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
34238 var nativeObjectToString$2 = objectProto$19.toString;
34241 * Creates an object composed of the inverted keys and values of `object`.
34242 * If `object` contains duplicate values, subsequent values overwrite
34243 * property assignments of previous values.
34249 * @param {Object} object The object to invert.
34250 * @returns {Object} Returns the new inverted object.
34253 * var object = { 'a': 1, 'b': 2, 'c': 1 };
34255 * _.invert(object);
34256 * // => { '1': 'c', '2': 'b' }
34258 var invert = createInverter(function(result, value, key) {
34259 if (value != null &&
34260 typeof value.toString != 'function') {
34261 value = nativeObjectToString$2.call(value);
34264 result[value] = key;
34265 }, constant$13(identity$8));
34268 * Creates an object with the same keys as `object` and values generated
34269 * by running each own enumerable string keyed property of `object` thru
34270 * `iteratee`. The iteratee is invoked with three arguments:
34271 * (value, key, object).
34277 * @param {Object} object The object to iterate over.
34278 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
34279 * @returns {Object} Returns the new mapped object.
34284 * 'fred': { 'user': 'fred', 'age': 40 },
34285 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
34288 * _.mapValues(users, function(o) { return o.age; });
34289 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34291 * // The `_.property` iteratee shorthand.
34292 * _.mapValues(users, 'age');
34293 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
34295 function mapValues(object, iteratee) {
34297 iteratee = baseIteratee(iteratee, 3);
34299 baseForOwn(object, function(value, key, object) {
34300 baseAssignValue(result, key, iteratee(value, key, object));
34305 function behaviorPaste(context) {
34306 var keybinding = d3keybinding('paste');
34309 function doPaste() {
34310 event.preventDefault();
34312 var baseGraph = context.graph(),
34313 mouse = context.mouse(),
34314 projection = context.projection,
34315 viewport = geoExtent$$1(projection.clipExtent()).polygon();
34317 if (!geoPointInPolygon(mouse, viewport)) return;
34319 var extent = geoExtent$$1(),
34320 oldIDs = context.copyIDs(),
34321 oldGraph = context.copyGraph(),
34324 if (!oldIDs.length) return;
34326 var action = actionCopyEntities(oldIDs, oldGraph);
34327 context.perform(action);
34329 var copies = action.copies();
34330 var originals = invert(mapValues(copies, 'id'));
34331 for (var id in copies) {
34332 var oldEntity = oldGraph.entity(id),
34333 newEntity = copies[id];
34335 extent._extend(oldEntity.extent(oldGraph));
34337 // Exclude child nodes from newIDs if their parent way was also copied.
34338 var parents = context.graph().parentWays(newEntity),
34339 parentCopied = false;
34340 for (var i = 0; i < parents.length; i++) {
34341 if (originals[parents[i].id]) {
34342 parentCopied = true;
34347 if (!parentCopied) {
34348 newIDs.push(newEntity.id);
34352 // Put pasted objects where mouse pointer is..
34353 var center = projection(extent.center()),
34354 delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
34356 context.perform(actionMove(newIDs, delta, projection));
34357 context.enter(modeMove$$1(context, newIDs, baseGraph));
34362 keybinding.on(uiCmd('⌘V'), doPaste);
34363 d3_select(document).call(keybinding);
34368 paste.off = function() {
34369 d3_select(document).call(keybinding.off);
34376 function behaviorSelect(context) {
34377 var lastMouse = null;
34378 var suppressMenu = true;
34383 function point$$1() {
34384 return d3_mouse(context.container().node());
34388 function keydown() {
34390 if (e && e.shiftKey) {
34392 .classed('behavior-multiselect', true);
34395 if (e && e.keyCode === 93) { // context menu
34396 e.preventDefault();
34397 e.stopPropagation();
34404 if (!e || !e.shiftKey) {
34406 .classed('behavior-multiselect', false);
34410 if (e && e.keyCode === 93) { // context menu
34411 e.preventDefault();
34412 e.stopPropagation();
34418 function mousedown() {
34419 if (!p1) p1 = point$$1();
34421 .on('mouseup.select', mouseup, true);
34423 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34424 suppressMenu = !isShowAlways;
34428 function mousemove() {
34429 if (event) lastMouse = event;
34433 function mouseup() {
34438 function contextmenu() {
34440 e.preventDefault();
34441 e.stopPropagation();
34443 if (!+e.clientX && !+e.clientY) {
34445 e.sourceEvent = lastMouse;
34451 if (!p1) p1 = point$$1();
34452 suppressMenu = false;
34459 .on('mouseup.select', null, true);
34462 var p2 = point$$1();
34463 var dist = geoVecLength(p1, p2);
34466 if (dist > tolerance) {
34470 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
34471 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
34472 var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
34473 var mode = context.mode();
34475 var entity = datum && datum.properties && datum.properties.entity;
34476 if (entity) datum = entity;
34478 if (datum && datum.type === 'midpoint') {
34479 datum = datum.parents[0];
34482 if (!(datum instanceof osmEntity$$1)) {
34483 // clicked nothing..
34484 if (!isMultiselect && mode.id !== 'browse') {
34485 context.enter(modeBrowse(context));
34489 // clicked an entity..
34490 var selectedIDs = context.selectedIDs();
34492 if (!isMultiselect) {
34493 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
34494 // multiple things already selected, just show the menu...
34495 mode.suppressMenu(false).reselect();
34497 // select a single thing..
34498 context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
34502 if (selectedIDs.indexOf(datum.id) !== -1) {
34503 // clicked entity is already in the selectedIDs list..
34504 if (!suppressMenu && !isShowAlways) {
34505 // don't deselect clicked entity, just show the menu.
34506 mode.suppressMenu(false).reselect();
34508 // deselect clicked entity, then reenter select mode or return to browse mode..
34509 selectedIDs = without(selectedIDs, datum.id);
34510 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
34513 // clicked entity is not in the selected list, add it..
34514 selectedIDs = selectedIDs.concat([datum.id]);
34515 context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
34520 // reset for next time..
34521 suppressMenu = true;
34525 var behavior = function(selection$$1) {
34527 suppressMenu = true;
34531 .on('keydown.select', keydown)
34532 .on('keyup.select', keyup)
34533 .on('contextmenu.select-window', function() {
34534 // Edge and IE really like to show the contextmenu on the
34535 // menubar when user presses a keyboard menu button
34536 // even after we've already preventdefaulted the key event.
34538 if (+e.clientX === 0 && +e.clientY === 0) {
34539 event.preventDefault();
34540 event.stopPropagation();
34545 .on('mousedown.select', mousedown)
34546 .on('mousemove.select', mousemove)
34547 .on('contextmenu.select', contextmenu);
34549 if (event && event.shiftKey) {
34551 .classed('behavior-multiselect', true);
34556 behavior.off = function(selection$$1) {
34558 .on('keydown.select', null)
34559 .on('keyup.select', null)
34560 .on('contextmenu.select-window', null)
34561 .on('mouseup.select', null, true);
34564 .on('mousedown.select', null)
34565 .on('mousemove.select', null)
34566 .on('contextmenu.select', null);
34569 .classed('behavior-multiselect', false);
34576 function d3geoTile() {
34577 var size = [960, 500],
34579 scaleExtent = [0, 20],
34580 translate = [size[0] / 2, size[1] / 2],
34583 function bound(_) {
34584 return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
34588 var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
34589 z0 = bound(Math.round(z + zoomDelta)),
34590 k = Math.pow(2, z - z0 + 8),
34591 origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
34593 cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
34594 rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
34596 rows.forEach(function(y) {
34597 cols.forEach(function(x) {
34598 tiles.push([x, y, z0]);
34602 tiles.translate = origin;
34608 tile.scaleExtent = function(_) {
34609 if (!arguments.length) return scaleExtent;
34614 tile.size = function(_) {
34615 if (!arguments.length) return size;
34620 tile.scale = function(_) {
34621 if (!arguments.length) return scale;
34626 tile.translate = function(_) {
34627 if (!arguments.length) return translate;
34632 tile.zoomDelta = function(_) {
34633 if (!arguments.length) return zoomDelta;
34641 /* global Mapillary:false */
34644 var apibase = 'https://a.mapillary.com/v3/',
34645 viewercss = 'mapillary-js/mapillary.min.css',
34646 viewerjs = 'mapillary-js/mapillary.min.js',
34647 clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
34650 dispatch$1 = dispatch('loadedImages', 'loadedSigns'),
34651 _mlyFallback = false,
34660 function abortRequest(i) {
34665 function nearNullIsland(x, y, z) {
34667 var center = Math.pow(2, z - 1),
34668 width = Math.pow(2, z - 6),
34669 min$$1 = center - (width / 2),
34670 max$$1 = center + (width / 2) - 1;
34671 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
34677 function maxPageAtZoom(z) {
34678 if (z < 15) return 2;
34679 if (z === 15) return 5;
34680 if (z === 16) return 10;
34681 if (z === 17) return 20;
34682 if (z === 18) return 40;
34683 if (z > 18) return 80;
34687 function localeTimestamp(s) {
34688 if (!s) return null;
34689 var detected = utilDetect();
34691 day: 'numeric', month: 'short', year: 'numeric',
34692 hour: 'numeric', minute: 'numeric', second: 'numeric',
34695 var d = new Date(s);
34696 if (isNaN(d.getTime())) return null;
34697 return d.toLocaleString(detected.locale, options);
34701 function getTiles(projection) {
34702 var s = projection.scale() * 2 * Math.PI,
34703 z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
34704 ts = 256 * Math.pow(2, z - tileZoom),
34706 s / 2 - projection.translate()[0],
34707 s / 2 - projection.translate()[1]];
34710 .scaleExtent([tileZoom, tileZoom])
34712 .size(projection.clipExtent()[1])
34713 .translate(projection.translate())()
34714 .map(function(tile) {
34715 var x = tile[0] * ts - origin[0],
34716 y = tile[1] * ts - origin[1];
34719 id: tile.toString(),
34721 extent: geoExtent$$1(
34722 projection.invert([x, y + ts]),
34723 projection.invert([x + ts, y])
34730 function loadTiles(which, url, projection) {
34731 var s = projection.scale() * 2 * Math.PI,
34732 currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
34734 var tiles = getTiles(projection).filter(function(t) {
34735 return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
34738 filter(which.inflight, function(v, k) {
34739 var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
34740 if (!wanted) delete which.inflight[k];
34742 }).map(abortRequest);
34744 tiles.forEach(function(tile) {
34745 loadNextTilePage(which, currZoom, url, tile);
34750 function loadNextTilePage(which, currZoom, url, tile) {
34751 var cache = _mlyCache[which],
34752 rect = tile.extent.rectangle(),
34753 maxPages = maxPageAtZoom(currZoom),
34754 nextPage = cache.nextPage[tile.id] || 0,
34755 nextURL = cache.nextURL[tile.id] || url +
34757 per_page: maxResults,
34759 client_id: clientId,
34760 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
34763 if (nextPage > maxPages) return;
34765 var id = tile.id + ',' + String(nextPage);
34766 if (cache.loaded[id] || cache.inflight[id]) return;
34767 cache.inflight[id] = d3_request(nextURL)
34768 .mimeType('application/json')
34769 .response(function(xhr) {
34770 var linkHeader = xhr.getResponseHeader('Link');
34772 var pagination = parsePagination(xhr.getResponseHeader('Link'));
34773 if (pagination.next) {
34774 cache.nextURL[tile.id] = pagination.next;
34777 return JSON.parse(xhr.responseText);
34779 .get(function(err, data) {
34780 cache.loaded[id] = true;
34781 delete cache.inflight[id];
34782 if (err || !data.features || !data.features.length) return;
34784 var features = data.features.map(function(feature) {
34785 var loc = feature.geometry.coordinates,
34788 if (which === 'images') {
34791 key: feature.properties.key,
34792 ca: feature.properties.ca,
34793 captured_at: feature.properties.captured_at,
34794 captured_by: feature.properties.username,
34795 pano: feature.properties.pano
34797 cache.forImageKey[d.key] = d; // cache imageKey -> image
34799 } else if (which === 'sequences') {
34800 var sequenceKey = feature.properties.key;
34801 cache.lineString[sequenceKey] = feature; // cache sequenceKey -> lineString
34802 feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
34803 cache.forImageKey[imageKey] = sequenceKey; // cache imageKey -> sequenceKey
34805 return false; // because no `d` data worth loading into an rbush
34807 } else if (which === 'objects') {
34810 key: feature.properties.key,
34811 value: feature.properties.value,
34812 package: feature.properties.package,
34813 detections: feature.properties.detections
34816 // cache imageKey -> detectionKey
34817 feature.properties.detections.forEach(function(detection) {
34818 var imageKey = detection.image_key;
34819 var detectionKey = detection.detection_key;
34820 if (!_mlyCache.detections[imageKey]) {
34821 _mlyCache.detections[imageKey] = {};
34823 if (!_mlyCache.detections[imageKey][detectionKey]) {
34824 _mlyCache.detections[imageKey][detectionKey] = {};
34830 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
34833 }).filter(Boolean);
34835 cache.rtree.load(features);
34837 if (which === 'images' || which === 'sequences') {
34838 dispatch$1.call('loadedImages');
34839 } else if (which === 'objects') {
34840 dispatch$1.call('loadedSigns');
34843 if (data.features.length === maxResults) { // more pages to load
34844 cache.nextPage[tile.id] = nextPage + 1;
34845 loadNextTilePage(which, currZoom, url, tile);
34847 cache.nextPage[tile.id] = Infinity; // no more pages to load
34852 // extract links to pages of API results
34853 function parsePagination(links) {
34854 return links.split(',').map(function(rel) {
34855 var elements = rel.split(';');
34856 if (elements.length === 2) {
34858 /<(.+)>/.exec(elements[0])[1],
34859 /rel="(.+)"/.exec(elements[1])[1]
34864 }).reduce(function(pagination, val) {
34865 pagination[val[1]] = val[0];
34871 // partition viewport into `psize` x `psize` regions
34872 function partitionViewport(psize, projection) {
34873 var dimensions = projection.clipExtent()[1];
34874 psize = psize || 16;
34875 var cols = d3_range(0, dimensions[0], psize),
34876 rows = d3_range(0, dimensions[1], psize),
34879 rows.forEach(function(y) {
34880 cols.forEach(function(x) {
34881 var min$$1 = [x, y + psize],
34882 max$$1 = [x + psize, y];
34884 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
34892 // no more than `limit` results per partition.
34893 function searchLimited(psize, limit, projection, rtree) {
34894 limit = limit || 3;
34896 var partitions = partitionViewport(psize, projection);
34899 // console.time('previous');
34900 results = flatten(map$3(partitions, function(extent$$1) {
34901 return rtree.search(extent$$1.bbox())
34903 .map(function(d) { return d.data; });
34905 // console.timeEnd('previous');
34907 // console.time('new');
34908 // results = partitions.reduce(function(result, extent) {
34909 // var found = rtree.search(extent.bbox())
34910 // .map(function(d) { return d.data; })
34911 // .sort(function(a, b) {
34912 // return a.loc[1] - b.loc[1];
34913 // // return a.key.localeCompare(b.key);
34915 // .slice(0, limit);
34917 // return (found.length ? result.concat(found) : result);
34919 // console.timeEnd('new');
34926 var serviceMapillary = {
34933 this.event = utilRebind(this, dispatch$1, 'on');
34936 reset: function() {
34937 var cache = _mlyCache;
34940 if (cache.images && cache.images.inflight) {
34941 forEach(cache.images.inflight, abortRequest);
34943 if (cache.objects && cache.objects.inflight) {
34944 forEach(cache.objects.inflight, abortRequest);
34946 if (cache.sequences && cache.sequences.inflight) {
34947 forEach(cache.sequences.inflight, abortRequest);
34952 images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
34953 objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
34954 sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
34958 _mlySelectedImage = null;
34963 images: function(projection) {
34964 var psize = 16, limit = 3;
34965 return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
34969 signs: function(projection) {
34970 var psize = 32, limit = 3;
34971 return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
34975 sequences: function(projection) {
34976 var viewport = projection.clipExtent();
34977 var min$$1 = [viewport[0][0], viewport[1][1]];
34978 var max$$1 = [viewport[1][0], viewport[0][1]];
34979 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
34980 var sequenceKeys = {};
34982 // all sequences for images in viewport
34983 _mlyCache.images.rtree.search(bbox)
34984 .forEach(function(d) {
34985 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
34987 sequenceKeys[sequenceKey] = true;
34991 // Return lineStrings for the sequences
34992 return Object.keys(sequenceKeys).map(function(sequenceKey) {
34993 return _mlyCache.sequences.lineString[sequenceKey];
34998 signsSupported: function() {
34999 var detected = utilDetect();
35000 if (detected.ie) return false;
35001 if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
35006 signHTML: function(d) {
35007 if (!_mlySignDefs || !_mlySignSprite) return;
35008 var position = _mlySignDefs[d.value];
35009 if (!position) return '<div></div>';
35011 'background-image:url(' + _mlySignSprite + ')',
35012 'background-repeat:no-repeat',
35013 'height:' + position.height + 'px',
35014 'width:' + position.width + 'px',
35015 'background-position-x:-' + position.x + 'px',
35016 'background-position-y:-' + position.y + 'px',
35019 return '<div style="' + iconStyle.join(';') +'"></div>';
35023 loadImages: function(projection) {
35024 loadTiles('images', apibase + 'images?', projection);
35025 loadTiles('sequences', apibase + 'sequences?', projection);
35029 loadSigns: function(context, projection) {
35030 // if we are looking at signs, we'll actually need to fetch images too
35031 loadTiles('images', apibase + 'images?', projection);
35032 loadTiles('objects', apibase + 'objects?', projection);
35034 // load traffic sign defs
35035 if (!_mlySignDefs) {
35036 _mlySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
35038 d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
35040 _mlySignDefs = data;
35046 loadViewer: function(context) {
35048 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
35051 var wrapEnter = wrap.enter()
35054 .attr('class', 'photo-wrapper mly-wrapper')
35055 .classed('hide', true);
35059 .attr('class', 'photo-attribution fillD');
35062 // load mapillary-viewercss
35063 d3_select('head').selectAll('#mapillary-viewercss')
35067 .attr('id', 'mapillary-viewercss')
35068 .attr('rel', 'stylesheet')
35069 .attr('href', context.asset(viewercss));
35071 // load mapillary-viewerjs
35072 d3_select('head').selectAll('#mapillary-viewerjs')
35076 .attr('id', 'mapillary-viewerjs')
35077 .attr('src', context.asset(viewerjs));
35081 showViewer: function() {
35082 var wrap = d3_select('#photoviewer')
35083 .classed('hide', false);
35085 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
35089 .selectAll('.photo-wrapper:not(.mly-wrapper)')
35090 .classed('hide', true);
35093 .selectAll('.photo-wrapper.mly-wrapper')
35094 .classed('hide', false);
35096 _mlyViewer.resize();
35103 hideViewer: function() {
35104 _mlySelectedImage = null;
35106 if (!_mlyFallback && _mlyViewer) {
35107 _mlyViewer.getComponent('sequence').stop();
35110 var viewer = d3_select('#photoviewer');
35111 if (!viewer.empty()) viewer.datum(null);
35114 .classed('hide', true)
35115 .selectAll('.photo-wrapper')
35116 .classed('hide', true);
35118 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35119 .classed('selected', false);
35121 return this.setStyles(null, true);
35125 parsePagination: parsePagination,
35128 updateViewer: function(imageKey, context) {
35129 if (!imageKey) return this;
35132 this.initViewer(imageKey, context);
35134 _mlyViewer.moveToKey(imageKey)
35135 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
35142 initViewer: function(imageKey, context) {
35144 if (Mapillary && imageKey) {
35146 baseImageSize: 320,
35154 // Disable components requiring WebGL support
35155 if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
35156 _mlyFallback = true;
35165 image: true, // fallback
35166 navigation: true // fallback
35170 _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
35171 _mlyViewer.on('nodechanged', nodeChanged);
35172 _mlyViewer.moveToKey(imageKey)
35173 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
35176 // nodeChanged: called after the viewer has changed images and is ready.
35178 // There is some logic here to batch up clicks into a _mlyClicks array
35179 // because the user might click on a lot of markers quickly and nodechanged
35180 // may be called out of order asychronously.
35182 // Clicks are added to the array in `selectedImage` and removed here.
35184 function nodeChanged(node) {
35185 if (!_mlyFallback) {
35186 _mlyViewer.getComponent('tag').removeAll(); // remove previous detections
35189 var clicks = _mlyClicks;
35190 var index = clicks.indexOf(node.key);
35191 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35193 if (index > -1) { // `nodechanged` initiated from clicking on a marker..
35194 clicks.splice(index, 1); // remove the click
35195 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
35196 // one more time to update the detections and attribution..
35197 if (node.key === selectedKey) {
35198 that.selectImage(_mlySelectedImage, node.key, true);
35200 } else { // `nodechanged` initiated from the Mapillary viewer controls..
35201 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
35202 context.map().centerEase(loc);
35203 that.selectImage(undefined, node.key, true);
35209 // Pass the image datum itself in `d` or the `imageKey` string.
35210 // This allows images to be selected from places that dont have access
35211 // to the full image datum (like the street signs layer or the js viewer)
35212 selectImage: function(d, imageKey, fromViewer) {
35213 if (!d && imageKey) {
35214 // If the user clicked on something that's not an image marker, we
35215 // might get in here.. Cache lookup can fail, e.g. if the user
35216 // clicked a streetsign, but images are loading slowly asynchronously.
35217 // We'll try to carry on anyway if there is no datum. There just
35218 // might be a delay before user sees detections, captured_at, etc.
35219 d = _mlyCache.images.forImageKey[imageKey];
35222 _mlySelectedImage = d;
35223 var viewer = d3_select('#photoviewer');
35224 if (!viewer.empty()) viewer.datum(d);
35226 imageKey = (d && d.key) || imageKey;
35227 if (!fromViewer && imageKey) {
35228 _mlyClicks.push(imageKey);
35231 this.setStyles(null, true);
35233 d3_selectAll('.layer-mapillary-signs .icon-sign')
35234 .classed('selected', function(d) {
35235 return some(d.detections, function(detection) {
35236 return detection.image_key === imageKey;
35240 var wrap = d3_select('#photoviewer .mly-wrapper');
35241 var attribution = wrap.selectAll('.photo-attribution').html('');
35244 if (d.captured_by) {
35247 .attr('class', 'captured_by')
35248 .attr('target', '_blank')
35249 .attr('href', 'https://www.mapillary.com/app/user/' + encodeURIComponent(d.captured_by))
35250 .text('@' + d.captured_by);
35257 if (d.captured_at) {
35260 .attr('class', 'captured_at')
35261 .text(localeTimestamp(d.captured_at));
35270 .attr('class', 'image_link')
35271 .attr('target', '_blank')
35272 .attr('href', 'https://www.mapillary.com/app/?pKey=' + encodeURIComponent(d.key) +
35273 '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
35274 .text('mapillary.com');
35276 this.updateDetections(d);
35283 getSelectedImage: function() {
35284 return _mlySelectedImage;
35288 getSequenceKeyForImage: function(d) {
35289 var imageKey = d && d.key;
35290 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
35294 setStyles: function(hovered, reset) {
35295 if (reset) { // reset all layers
35296 d3_selectAll('.viewfield-group')
35297 .classed('highlighted', false)
35298 .classed('hovered', false)
35299 .classed('selected', false);
35301 d3_selectAll('.sequence')
35302 .classed('highlighted', false)
35303 .classed('selected', false);
35306 var hoveredImageKey = hovered && hovered.key;
35307 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
35308 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
35309 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
35311 var viewer = d3_select('#photoviewer');
35312 var selected = viewer.empty() ? undefined : viewer.datum();
35313 var selectedImageKey = selected && selected.key;
35314 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
35315 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
35316 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
35318 // highlight sibling viewfields on either the selected or the hovered sequences
35319 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
35321 d3_selectAll('.layer-mapillary-images .viewfield-group')
35322 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
35323 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
35324 .classed('selected', function(d) { return d.key === selectedImageKey; });
35326 d3_selectAll('.layer-mapillary-images .sequence')
35327 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
35328 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
35334 updateDetections: function(d) {
35335 if (!_mlyViewer || _mlyFallback) return;
35337 var imageKey = d && d.key;
35338 var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
35340 forEach(detections, function(data, k) {
35341 if (isEmpty(data)) {
35344 var tag = makeTag(data);
35346 var tagComponent = _mlyViewer.getComponent('tag');
35347 tagComponent.add([tag]);
35353 function loadDetection(detectionKey) {
35354 var url = apibase + 'detections/'+
35355 detectionKey + '?' + utilQsString({
35356 client_id: clientId,
35360 .mimeType('application/json')
35361 .response(function(xhr) {
35362 return JSON.parse(xhr.responseText);
35364 .get(function(err, data) {
35365 if (!data || !data.properties) return;
35367 var imageKey = data.properties.image_key;
35368 _mlyCache.detections[imageKey][detectionKey] = data;
35370 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
35371 if (imageKey === selectedKey) {
35372 var tag = makeTag(data);
35374 var tagComponent = _mlyViewer.getComponent('tag');
35375 tagComponent.add([tag]);
35382 function makeTag(data) {
35383 var valueParts = data.properties.value.split('--');
35384 if (valueParts.length !== 3) return;
35386 var text = valueParts[1].replace(/-/g, ' ');
35389 // Currently only two shapes <Polygon|Point>
35390 if (data.properties.shape.type === 'Polygon') {
35391 var polygonGeometry = new Mapillary
35393 .PolygonGeometry(data.properties.shape.coordinates[0]);
35395 tag = new Mapillary.TagComponent.OutlineTag(
35396 data.properties.key,
35400 textColor: 0xffff00,
35401 lineColor: 0xffff00,
35403 fillColor: 0xffff00,
35408 } else if (data.properties.shape.type === 'Point') {
35409 var pointGeometry = new Mapillary
35411 .PointGeometry(data.properties.shape.coordinates[0]);
35413 tag = new Mapillary.TagComponent.SpotTag(
35414 data.properties.key,
35419 textColor: 0xffff00
35429 cache: function() {
35434 signDefs: function(_) {
35435 if (!arguments.length) return _mlySignDefs;
35442 var apibase$1 = 'https://nominatim.openstreetmap.org/',
35447 var serviceNominatim = {
35451 nominatimCache = rbush_1();
35454 reset: function() {
35455 forEach(inflight, function(req) { req.abort(); });
35457 nominatimCache = rbush_1();
35461 countryCode: function (location, callback) {
35462 this.reverse(location, function(err, result) {
35464 return callback(err);
35465 } else if (result.address) {
35466 return callback(null, result.address.country_code);
35468 return callback('Unable to geocode', null);
35474 reverse: function (location, callback) {
35475 var cached = nominatimCache.search(
35476 { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
35479 if (cached.length > 0) {
35480 return callback(null, cached[0].data);
35483 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
35484 var url = apibase$1 + 'reverse?' + utilQsString(params);
35485 if (inflight[url]) return;
35487 inflight[url] = d3_json(url, function(err, result) {
35488 delete inflight[url];
35491 return callback(err);
35492 } else if (result && result.error) {
35493 return callback(result.error);
35496 var extent = geoExtent$$1(location).padByMeters(200);
35497 nominatimCache.insert(assign(extent.bbox(), {data: result}));
35499 callback(null, result);
35504 search: function (val, callback) {
35505 var searchVal = encodeURIComponent(val);
35506 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
35507 if (inflight[url]) return;
35509 inflight[url] = d3_json(url, function(err, result) {
35510 delete inflight[url];
35511 callback(err, result);
35517 var apibase$2 = 'https://openstreetcam.org',
35518 maxResults$1 = 1000,
35520 dispatch$2 = dispatch('loadedImages'),
35521 imgZoom = d3_zoom()
35522 .extent([[0, 0], [320, 240]])
35523 .translateExtent([[0, 0], [320, 240]])
35524 .scaleExtent([1, 15])
35525 .on('zoom', zoomPan),
35530 function abortRequest$1(i) {
35535 function nearNullIsland$1(x, y, z) {
35537 var center = Math.pow(2, z - 1),
35538 width = Math.pow(2, z - 6),
35539 min$$1 = center - (width / 2),
35540 max$$1 = center + (width / 2) - 1;
35541 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
35547 function maxPageAtZoom$1(z) {
35548 if (z < 15) return 2;
35549 if (z === 15) return 5;
35550 if (z === 16) return 10;
35551 if (z === 17) return 20;
35552 if (z === 18) return 40;
35553 if (z > 18) return 80;
35557 function getTiles$1(projection) {
35558 var s = projection.scale() * 2 * Math.PI,
35559 z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
35560 ts = 256 * Math.pow(2, z - tileZoom$1),
35562 s / 2 - projection.translate()[0],
35563 s / 2 - projection.translate()[1]];
35566 .scaleExtent([tileZoom$1, tileZoom$1])
35568 .size(projection.clipExtent()[1])
35569 .translate(projection.translate())()
35570 .map(function(tile) {
35571 var x = tile[0] * ts - origin[0],
35572 y = tile[1] * ts - origin[1];
35575 id: tile.toString(),
35577 extent: geoExtent$$1(
35578 projection.invert([x, y + ts]),
35579 projection.invert([x + ts, y])
35586 function loadTiles$1(which, url, projection) {
35587 var s = projection.scale() * 2 * Math.PI,
35588 currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
35590 var tiles = getTiles$1(projection).filter(function(t) {
35591 return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
35594 filter(which.inflight, function(v, k) {
35595 var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
35596 if (!wanted) delete which.inflight[k];
35598 }).map(abortRequest$1);
35600 tiles.forEach(function(tile) {
35601 loadNextTilePage$1(which, currZoom, url, tile);
35606 function loadNextTilePage$1(which, currZoom, url, tile) {
35607 var cache = _oscCache[which];
35608 var bbox = tile.extent.bbox();
35609 var maxPages = maxPageAtZoom$1(currZoom);
35610 var nextPage = cache.nextPage[tile.id] || 1;
35611 var params = utilQsString({
35614 // client_id: clientId,
35615 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
35616 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
35619 if (nextPage > maxPages) return;
35621 var id = tile.id + ',' + String(nextPage);
35622 if (cache.loaded[id] || cache.inflight[id]) return;
35624 cache.inflight[id] = d3_request(url)
35625 .mimeType('application/json')
35626 .header('Content-type', 'application/x-www-form-urlencoded')
35627 .response(function(xhr) { return JSON.parse(xhr.responseText); })
35628 .post(params, function(err, data) {
35629 cache.loaded[id] = true;
35630 delete cache.inflight[id];
35631 if (err || !data.currentPageItems || !data.currentPageItems.length) return;
35633 function localeDateString(s) {
35634 if (!s) return null;
35635 var detected = utilDetect();
35636 var options = { day: 'numeric', month: 'short', year: 'numeric' };
35637 var d = new Date(s);
35638 if (isNaN(d.getTime())) return null;
35639 return d.toLocaleDateString(detected.locale, options);
35642 var features = data.currentPageItems.map(function(item) {
35643 var loc = [+item.lng, +item.lat],
35646 if (which === 'images') {
35651 captured_at: localeDateString(item.shot_date || item.date_added),
35652 captured_by: item.username,
35653 imagePath: item.lth_name,
35654 sequence_id: item.sequence_id,
35655 sequence_index: +item.sequence_index
35658 // cache sequence info
35659 var seq = _oscCache.sequences[d.sequence_id];
35661 seq = { rotation: 0, images: [] };
35662 _oscCache.sequences[d.sequence_id] = seq;
35664 seq.images[d.sequence_index] = d;
35668 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
35672 cache.rtree.load(features);
35674 if (which === 'images') {
35675 dispatch$2.call('loadedImages');
35678 if (data.currentPageItems.length === maxResults$1) { // more pages to load
35679 cache.nextPage[tile.id] = nextPage + 1;
35680 loadNextTilePage$1(which, currZoom, url, tile);
35682 cache.nextPage[tile.id] = Infinity; // no more pages to load
35688 // partition viewport into `psize` x `psize` regions
35689 function partitionViewport$1(psize, projection) {
35690 var dimensions = projection.clipExtent()[1];
35691 psize = psize || 16;
35692 var cols = d3_range(0, dimensions[0], psize),
35693 rows = d3_range(0, dimensions[1], psize),
35696 rows.forEach(function(y) {
35697 cols.forEach(function(x) {
35698 var min$$1 = [x, y + psize],
35699 max$$1 = [x + psize, y];
35701 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
35709 // no more than `limit` results per partition.
35710 function searchLimited$1(psize, limit, projection, rtree) {
35711 limit = limit || 3;
35713 var partitions = partitionViewport$1(psize, projection);
35716 results = flatten(map$3(partitions, function(extent$$1) {
35717 return rtree.search(extent$$1.bbox())
35719 .map(function(d) { return d.data; });
35725 function zoomPan() {
35726 var t = event.transform;
35727 d3_select('#photoviewer .osc-image-wrap')
35728 .call(utilSetTransform, t.x, t.y, t.k);
35732 var serviceOpenstreetcam = {
35739 this.event = utilRebind(this, dispatch$2, 'on');
35742 reset: function() {
35743 var cache = _oscCache;
35746 if (cache.images && cache.images.inflight) {
35747 forEach(cache.images.inflight, abortRequest$1);
35752 images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
35756 _oscSelectedImage = null;
35760 images: function(projection) {
35761 var psize = 16, limit = 3;
35762 return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
35766 sequences: function(projection) {
35767 var viewport = projection.clipExtent();
35768 var min$$1 = [viewport[0][0], viewport[1][1]];
35769 var max$$1 = [viewport[1][0], viewport[0][1]];
35770 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
35771 var sequenceKeys = {};
35773 // all sequences for images in viewport
35774 _oscCache.images.rtree.search(bbox)
35775 .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
35777 // make linestrings from those sequences
35778 var lineStrings = [];
35779 Object.keys(sequenceKeys)
35780 .forEach(function(sequenceKey) {
35781 var seq = _oscCache.sequences[sequenceKey];
35782 var images = seq && seq.images;
35785 type: 'LineString',
35786 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
35787 properties: { key: sequenceKey }
35791 return lineStrings;
35795 loadImages: function(projection) {
35796 var url = apibase$2 + '/1.0/list/nearby-photos/';
35797 loadTiles$1('images', url, projection);
35801 loadViewer: function(context) {
35805 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
35808 var wrapEnter = wrap.enter()
35810 .attr('class', 'photo-wrapper osc-wrapper')
35811 .classed('hide', true)
35813 .on('dblclick.zoom', null);
35817 .attr('class', 'photo-attribution fillD');
35819 var controlsEnter = wrapEnter
35821 .attr('class', 'osc-controls-wrap')
35823 .attr('class', 'osc-controls');
35827 .on('click.back', step(-1))
35832 .on('click.rotate-ccw', rotate(-90))
35837 .on('click.rotate-cw', rotate(90))
35842 .on('click.forward', step(1))
35847 .attr('class', 'osc-image-wrap');
35850 function rotate(deg) {
35851 return function() {
35852 if (!_oscSelectedImage) return;
35853 var sequenceKey = _oscSelectedImage.sequence_id;
35854 var sequence = _oscCache.sequences[sequenceKey];
35855 if (!sequence) return;
35857 var r = sequence.rotation || 0;
35860 if (r > 180) r -= 360;
35861 if (r < -180) r += 360;
35862 sequence.rotation = r;
35864 var wrap = d3_select('#photoviewer .osc-wrapper');
35869 .call(imgZoom.transform, identity$7);
35871 wrap.selectAll('.osc-image')
35874 .style('transform', 'rotate(' + r + 'deg)');
35878 function step(stepBy) {
35879 return function() {
35880 if (!_oscSelectedImage) return;
35881 var sequenceKey = _oscSelectedImage.sequence_id;
35882 var sequence = _oscCache.sequences[sequenceKey];
35883 if (!sequence) return;
35885 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
35886 var nextImage = sequence.images[nextIndex];
35887 if (!nextImage) return;
35889 context.map().centerEase(nextImage.loc);
35892 .selectImage(nextImage)
35893 .updateViewer(nextImage);
35899 showViewer: function() {
35900 var viewer = d3_select('#photoviewer')
35901 .classed('hide', false);
35903 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
35907 .selectAll('.photo-wrapper:not(.osc-wrapper)')
35908 .classed('hide', true);
35911 .selectAll('.photo-wrapper.osc-wrapper')
35912 .classed('hide', false);
35919 hideViewer: function() {
35920 _oscSelectedImage = null;
35922 var viewer = d3_select('#photoviewer');
35923 if (!viewer.empty()) viewer.datum(null);
35926 .classed('hide', true)
35927 .selectAll('.photo-wrapper')
35928 .classed('hide', true);
35930 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
35931 .classed('selected', false);
35933 return this.setStyles(null, true);
35937 updateViewer: function(d) {
35938 var wrap = d3_select('#photoviewer .osc-wrapper');
35939 var imageWrap = wrap.selectAll('.osc-image-wrap');
35940 var attribution = wrap.selectAll('.photo-attribution').html('');
35945 .call(imgZoom.transform, identity$7);
35948 .selectAll('.osc-image')
35952 var sequence = _oscCache.sequences[d.sequence_id];
35953 var r = (sequence && sequence.rotation) || 0;
35957 .attr('class', 'osc-image')
35958 .attr('src', apibase$2 + '/' + d.imagePath)
35959 .style('transform', 'rotate(' + r + 'deg)');
35961 if (d.captured_by) {
35964 .attr('class', 'captured_by')
35965 .attr('target', '_blank')
35966 .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
35967 .text('@' + d.captured_by);
35974 if (d.captured_at) {
35977 .attr('class', 'captured_at')
35978 .text(d.captured_at);
35987 .attr('class', 'image_link')
35988 .attr('target', '_blank')
35989 .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
35990 .text('openstreetcam.org');
35996 selectImage: function(d) {
35997 _oscSelectedImage = d;
35998 var viewer = d3_select('#photoviewer');
35999 if (!viewer.empty()) viewer.datum(d);
36001 this.setStyles(null, true);
36003 d3_selectAll('.icon-sign')
36004 .classed('selected', false);
36010 getSelectedImage: function() {
36011 return _oscSelectedImage;
36015 getSequenceKeyForImage: function(d) {
36016 return d && d.sequence_id;
36020 setStyles: function(hovered, reset) {
36021 if (reset) { // reset all layers
36022 d3_selectAll('.viewfield-group')
36023 .classed('highlighted', false)
36024 .classed('hovered', false)
36025 .classed('selected', false);
36027 d3_selectAll('.sequence')
36028 .classed('highlighted', false)
36029 .classed('selected', false);
36032 var hoveredImageKey = hovered && hovered.key;
36033 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
36034 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
36035 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
36037 var viewer = d3_select('#photoviewer');
36038 var selected = viewer.empty() ? undefined : viewer.datum();
36039 var selectedImageKey = selected && selected.key;
36040 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
36041 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
36042 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
36044 // highlight sibling viewfields on either the selected or the hovered sequences
36045 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
36047 d3_selectAll('.layer-openstreetcam-images .viewfield-group')
36048 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
36049 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
36050 .classed('selected', function(d) { return d.key === selectedImageKey; });
36052 d3_selectAll('.layer-openstreetcam-images .sequence')
36053 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
36054 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
36060 cache: function() {
36066 /* Built-in method references for those with the same name as other `lodash` methods. */
36067 var nativeCeil = Math.ceil,
36068 nativeMax$4 = Math.max;
36071 * Creates an array of elements split into groups the length of `size`.
36072 * If `array` can't be split evenly, the final chunk will be the remaining
36079 * @param {Array} array The array to process.
36080 * @param {number} [size=1] The length of each chunk
36081 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
36082 * @returns {Array} Returns the new array of chunks.
36085 * _.chunk(['a', 'b', 'c', 'd'], 2);
36086 * // => [['a', 'b'], ['c', 'd']]
36088 * _.chunk(['a', 'b', 'c', 'd'], 3);
36089 * // => [['a', 'b', 'c'], ['d']]
36091 function chunk(array, size, guard) {
36092 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
36095 size = nativeMax$4(toInteger(size), 0);
36097 var length = array == null ? 0 : array.length;
36098 if (!length || size < 1) {
36103 result = Array(nativeCeil(length / size));
36105 while (index < length) {
36106 result[resIndex++] = baseSlice(array, index, (index += size));
36111 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
36113 function createCommonjsModule(fn, module) {
36114 return module = { exports: {} }, fn(module, module.exports), module.exports;
36117 var hashes = createCommonjsModule(function (module, exports) {
36119 * jshashes - https://github.com/h2non/jshashes
36120 * Released under the "New BSD" license
36122 * Algorithms specification:
36124 * MD5 - http://www.ietf.org/rfc/rfc1321.txt
36125 * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
36126 * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36127 * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36128 * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
36129 * HMAC - http://www.ietf.org/rfc/rfc2104.txt
36134 function utf8Encode(str) {
36135 var x, y, output = '',
36139 if (str && str.length) {
36141 while ((i += 1) < l) {
36142 /* Decode utf-16 surrogate pairs */
36143 x = str.charCodeAt(i);
36144 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
36145 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
36146 x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
36149 /* Encode output as utf-8 */
36151 output += String.fromCharCode(x);
36152 } else if (x <= 0x7FF) {
36153 output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
36154 0x80 | (x & 0x3F));
36155 } else if (x <= 0xFFFF) {
36156 output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
36157 0x80 | ((x >>> 6) & 0x3F),
36158 0x80 | (x & 0x3F));
36159 } else if (x <= 0x1FFFFF) {
36160 output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
36161 0x80 | ((x >>> 12) & 0x3F),
36162 0x80 | ((x >>> 6) & 0x3F),
36163 0x80 | (x & 0x3F));
36170 function utf8Decode(str) {
36171 var i, ac, c1, c2, c3, arr = [],
36173 i = ac = c1 = c2 = c3 = 0;
36175 if (str && str.length) {
36180 c1 = str.charCodeAt(i);
36183 arr[ac] = String.fromCharCode(c1);
36185 } else if (c1 > 191 && c1 < 224) {
36186 c2 = str.charCodeAt(i + 1);
36187 arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
36190 c2 = str.charCodeAt(i + 1);
36191 c3 = str.charCodeAt(i + 2);
36192 arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
36197 return arr.join('');
36201 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
36202 * to work around bugs in some JS interpreters.
36205 function safe_add(x, y) {
36206 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
36207 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
36208 return (msw << 16) | (lsw & 0xFFFF);
36212 * Bitwise rotate a 32-bit number to the left.
36215 function bit_rol(num, cnt) {
36216 return (num << cnt) | (num >>> (32 - cnt));
36220 * Convert a raw string to a hex string
36223 function rstr2hex(input, hexcase) {
36224 var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
36228 for (; i < l; i += 1) {
36229 x = input.charCodeAt(i);
36230 output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
36236 * Convert an array of big-endian words to a string
36239 function binb2rstr(input) {
36240 var i, l = input.length * 32,
36242 for (i = 0; i < l; i += 8) {
36243 output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
36249 * Convert an array of little-endian words to a string
36252 function binl2rstr(input) {
36253 var i, l = input.length * 32,
36255 for (i = 0; i < l; i += 8) {
36256 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
36262 * Convert a raw string to an array of little-endian words
36263 * Characters >255 have their high-byte silently ignored.
36266 function rstr2binl(input) {
36267 var i, l = input.length * 8,
36268 output = Array(input.length >> 2),
36269 lo = output.length;
36270 for (i = 0; i < lo; i += 1) {
36273 for (i = 0; i < l; i += 8) {
36274 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
36280 * Convert a raw string to an array of big-endian words
36281 * Characters >255 have their high-byte silently ignored.
36284 function rstr2binb(input) {
36285 var i, l = input.length * 8,
36286 output = Array(input.length >> 2),
36287 lo = output.length;
36288 for (i = 0; i < lo; i += 1) {
36291 for (i = 0; i < l; i += 8) {
36292 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
36298 * Convert a raw string to an arbitrary string encoding
36301 function rstr2any(input, encoding) {
36302 var divisor = encoding.length,
36303 remainders = Array(),
36304 i, q, x, ld, quotient, dividend, output, full_length;
36306 /* Convert to an array of 16-bit big-endian values, forming the dividend */
36307 dividend = Array(Math.ceil(input.length / 2));
36308 ld = dividend.length;
36309 for (i = 0; i < ld; i += 1) {
36310 dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
36314 * Repeatedly perform a long division. The binary array forms the dividend,
36315 * the length of the encoding is the divisor. Once computed, the quotient
36316 * forms the dividend for the next step. We stop when the dividend is zerHashes.
36317 * All remainders are stored for later use.
36319 while (dividend.length > 0) {
36320 quotient = Array();
36322 for (i = 0; i < dividend.length; i += 1) {
36323 x = (x << 16) + dividend[i];
36324 q = Math.floor(x / divisor);
36326 if (quotient.length > 0 || q > 0) {
36327 quotient[quotient.length] = q;
36330 remainders[remainders.length] = x;
36331 dividend = quotient;
36334 /* Convert the remainders to the output string */
36336 for (i = remainders.length - 1; i >= 0; i--) {
36337 output += encoding.charAt(remainders[i]);
36340 /* Append leading zero equivalents */
36341 full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
36342 for (i = output.length; i < full_length; i += 1) {
36343 output = encoding[0] + output;
36349 * Convert a raw string to a base-64 string
36352 function rstr2b64(input, b64pad) {
36353 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36355 len = input.length,
36357 b64pad = b64pad || '=';
36358 for (i = 0; i < len; i += 3) {
36359 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36360 for (j = 0; j < 4; j += 1) {
36361 if (i * 8 + j * 6 > input.length * 8) {
36364 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36373 * @property {String} version
36382 Base64: function() {
36383 // private properties
36384 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
36385 pad = '=', // default pad according with the RFC standard
36386 utf8 = true; // by default enable UTF-8 support encoding
36388 // public method for encoding
36389 this.encode = function(input) {
36392 len = input.length;
36395 input = (utf8) ? utf8Encode(input) : input;
36397 for (i = 0; i < len; i += 3) {
36398 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
36399 for (j = 0; j < 4; j += 1) {
36400 if (i * 8 + j * 6 > len * 8) {
36403 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
36410 // public method for decoding
36411 this.decode = function(input) {
36412 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
36413 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
36421 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
36424 do { // unpack four hexets into three octets using index points in b64
36425 h1 = tab.indexOf(input.charAt(i += 1));
36426 h2 = tab.indexOf(input.charAt(i += 1));
36427 h3 = tab.indexOf(input.charAt(i += 1));
36428 h4 = tab.indexOf(input.charAt(i += 1));
36430 bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
36432 o1 = bits >> 16 & 0xff;
36433 o2 = bits >> 8 & 0xff;
36438 arr[ac] = String.fromCharCode(o1);
36439 } else if (h4 === 64) {
36440 arr[ac] = String.fromCharCode(o1, o2);
36442 arr[ac] = String.fromCharCode(o1, o2, o3);
36444 } while (i < input.length);
36446 dec = arr.join('');
36447 dec = (utf8) ? utf8Decode(dec) : dec;
36452 // set custom pad string
36453 this.setPad = function(str) {
36457 // set custom tab string characters
36458 this.setTab = function(str) {
36462 this.setUTF8 = function(bool) {
36463 if (typeof bool === 'boolean') {
36471 * CRC-32 calculation
36475 * @param {String} str Input String
36478 CRC32: function(str) {
36483 str = utf8Encode(str);
36486 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
36487 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
36488 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
36489 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
36490 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
36491 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
36492 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
36493 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
36494 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
36495 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
36496 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
36497 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
36498 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
36499 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
36500 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
36501 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
36502 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
36503 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
36504 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
36505 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
36506 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
36507 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
36508 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
36509 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
36510 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
36511 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
36515 for (i = 0, iTop = str.length; i < iTop; i += 1) {
36516 y = (crc ^ str.charCodeAt(i)) & 0xFF;
36517 x = '0x' + table.substr(y * 9, 8);
36518 crc = (crc >>> 8) ^ x;
36520 // always return a positive number (that's what >>> 0 does)
36521 return (crc ^ (-1)) >>> 0;
36527 * @param {Object} [config]
36529 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
36530 * Digest Algorithm, as defined in RFC 1321.
36531 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
36532 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36533 * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
36535 MD5: function(options) {
36537 * Private config properties. You may need to tweak these to be compatible with
36538 * the server-side, but the defaults work in most cases.
36539 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36541 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36542 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36543 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36545 // privileged (public) methods
36546 this.hex = function(s) {
36547 return rstr2hex(rstr(s, utf8), hexcase);
36549 this.b64 = function(s) {
36550 return rstr2b64(rstr(s), b64pad);
36552 this.any = function(s, e) {
36553 return rstr2any(rstr(s, utf8), e);
36555 this.raw = function(s) {
36556 return rstr(s, utf8);
36558 this.hex_hmac = function(k, d) {
36559 return rstr2hex(rstr_hmac(k, d), hexcase);
36561 this.b64_hmac = function(k, d) {
36562 return rstr2b64(rstr_hmac(k, d), b64pad);
36564 this.any_hmac = function(k, d, e) {
36565 return rstr2any(rstr_hmac(k, d), e);
36568 * Perform a simple self-test to see if the VM is working
36569 * @return {String} Hexadecimal hash sample
36571 this.vm_test = function() {
36572 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36575 * Enable/disable uppercase hexadecimal returned string
36577 * @return {Object} this
36579 this.setUpperCase = function(a) {
36580 if (typeof a === 'boolean') {
36586 * Defines a base64 pad string
36587 * @param {String} Pad
36588 * @return {Object} this
36590 this.setPad = function(a) {
36591 b64pad = a || b64pad;
36595 * Defines a base64 pad string
36597 * @return {Object} [this]
36599 this.setUTF8 = function(a) {
36600 if (typeof a === 'boolean') {
36609 * Calculate the MD5 of a raw string
36613 s = (utf8) ? utf8Encode(s) : s;
36614 return binl2rstr(binl(rstr2binl(s), s.length * 8));
36618 * Calculate the HMAC-MD5, of a key and some data (raw strings)
36621 function rstr_hmac(key, data) {
36622 var bkey, ipad, opad, hash, i;
36624 key = (utf8) ? utf8Encode(key) : key;
36625 data = (utf8) ? utf8Encode(data) : data;
36626 bkey = rstr2binl(key);
36627 if (bkey.length > 16) {
36628 bkey = binl(bkey, key.length * 8);
36631 ipad = Array(16), opad = Array(16);
36632 for (i = 0; i < 16; i += 1) {
36633 ipad[i] = bkey[i] ^ 0x36363636;
36634 opad[i] = bkey[i] ^ 0x5C5C5C5C;
36636 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
36637 return binl2rstr(binl(opad.concat(hash), 512 + 128));
36641 * Calculate the MD5 of an array of little-endian words, and a bit length.
36644 function binl(x, len) {
36645 var i, olda, oldb, oldc, oldd,
36651 /* append padding */
36652 x[len >> 5] |= 0x80 << ((len) % 32);
36653 x[(((len + 64) >>> 9) << 4) + 14] = len;
36655 for (i = 0; i < x.length; i += 16) {
36661 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
36662 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
36663 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
36664 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
36665 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
36666 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
36667 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
36668 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
36669 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
36670 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
36671 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
36672 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
36673 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
36674 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
36675 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
36676 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
36678 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
36679 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
36680 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
36681 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
36682 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
36683 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
36684 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
36685 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
36686 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
36687 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
36688 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
36689 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
36690 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
36691 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
36692 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
36693 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
36695 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
36696 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
36697 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
36698 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
36699 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
36700 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
36701 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
36702 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
36703 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
36704 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
36705 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
36706 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
36707 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
36708 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
36709 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
36710 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
36712 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
36713 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
36714 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
36715 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
36716 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
36717 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
36718 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
36719 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
36720 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
36721 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
36722 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
36723 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
36724 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
36725 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
36726 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
36727 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
36729 a = safe_add(a, olda);
36730 b = safe_add(b, oldb);
36731 c = safe_add(c, oldc);
36732 d = safe_add(d, oldd);
36734 return Array(a, b, c, d);
36738 * These functions implement the four basic operations the algorithm uses.
36741 function md5_cmn(q, a, b, x, s, t) {
36742 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
36745 function md5_ff(a, b, c, d, x, s, t) {
36746 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
36749 function md5_gg(a, b, c, d, x, s, t) {
36750 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
36753 function md5_hh(a, b, c, d, x, s, t) {
36754 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
36757 function md5_ii(a, b, c, d, x, s, t) {
36758 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
36763 * @class Hashes.SHA1
36764 * @param {Object} [config]
36767 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
36768 * Version 2.2 Copyright Paul Johnston 2000 - 2009.
36769 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36770 * See http://pajhome.org.uk/crypt/md5 for details.
36772 SHA1: function(options) {
36774 * Private config properties. You may need to tweak these to be compatible with
36775 * the server-side, but the defaults work in most cases.
36776 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
36778 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
36779 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
36780 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
36783 this.hex = function(s) {
36784 return rstr2hex(rstr(s, utf8), hexcase);
36786 this.b64 = function(s) {
36787 return rstr2b64(rstr(s, utf8), b64pad);
36789 this.any = function(s, e) {
36790 return rstr2any(rstr(s, utf8), e);
36792 this.raw = function(s) {
36793 return rstr(s, utf8);
36795 this.hex_hmac = function(k, d) {
36796 return rstr2hex(rstr_hmac(k, d));
36798 this.b64_hmac = function(k, d) {
36799 return rstr2b64(rstr_hmac(k, d), b64pad);
36801 this.any_hmac = function(k, d, e) {
36802 return rstr2any(rstr_hmac(k, d), e);
36805 * Perform a simple self-test to see if the VM is working
36806 * @return {String} Hexadecimal hash sample
36809 this.vm_test = function() {
36810 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
36813 * @description Enable/disable uppercase hexadecimal returned string
36815 * @return {Object} this
36818 this.setUpperCase = function(a) {
36819 if (typeof a === 'boolean') {
36825 * @description Defines a base64 pad string
36826 * @param {string} Pad
36827 * @return {Object} this
36830 this.setPad = function(a) {
36831 b64pad = a || b64pad;
36835 * @description Defines a base64 pad string
36837 * @return {Object} this
36840 this.setUTF8 = function(a) {
36841 if (typeof a === 'boolean') {
36850 * Calculate the SHA-512 of a raw string
36854 s = (utf8) ? utf8Encode(s) : s;
36855 return binb2rstr(binb(rstr2binb(s), s.length * 8));
36859 * Calculate the HMAC-SHA1 of a key and some data (raw strings)
36862 function rstr_hmac(key, data) {
36863 var bkey, ipad, opad, i, hash;
36864 key = (utf8) ? utf8Encode(key) : key;
36865 data = (utf8) ? utf8Encode(data) : data;
36866 bkey = rstr2binb(key);
36868 if (bkey.length > 16) {
36869 bkey = binb(bkey, key.length * 8);
36871 ipad = Array(16), opad = Array(16);
36872 for (i = 0; i < 16; i += 1) {
36873 ipad[i] = bkey[i] ^ 0x36363636;
36874 opad[i] = bkey[i] ^ 0x5C5C5C5C;
36876 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
36877 return binb2rstr(binb(opad.concat(hash), 512 + 160));
36881 * Calculate the SHA-1 of an array of big-endian words, and a bit length
36884 function binb(x, len) {
36885 var i, j, t, olda, oldb, oldc, oldd, olde,
36893 /* append padding */
36894 x[len >> 5] |= 0x80 << (24 - len % 32);
36895 x[((len + 64 >> 9) << 4) + 15] = len;
36897 for (i = 0; i < x.length; i += 16) {
36904 for (j = 0; j < 80; j += 1) {
36908 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
36910 t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
36911 safe_add(safe_add(e, w[j]), sha1_kt(j)));
36914 c = bit_rol(b, 30);
36919 a = safe_add(a, olda);
36920 b = safe_add(b, oldb);
36921 c = safe_add(c, oldc);
36922 d = safe_add(d, oldd);
36923 e = safe_add(e, olde);
36925 return Array(a, b, c, d, e);
36929 * Perform the appropriate triplet combination function for the current
36933 function sha1_ft(t, b, c, d) {
36935 return (b & c) | ((~b) & d);
36941 return (b & c) | (b & d) | (c & d);
36947 * Determine the appropriate additive constant for the current iteration
36950 function sha1_kt(t) {
36951 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
36952 (t < 60) ? -1894007588 : -899497514;
36956 * @class Hashes.SHA256
36959 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
36960 * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
36961 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
36962 * See http://pajhome.org.uk/crypt/md5 for details.
36963 * Also http://anmar.eu.org/projects/jssha2/
36965 SHA256: function(options) {
36967 * Private properties configuration variables. You may need to tweak these to be compatible with
36968 * the server-side, but the defaults work in most cases.
36969 * @see this.setUpperCase() method
36970 * @see this.setPad() method
36972 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */
36973 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
36974 /* base-64 pad character. Default '=' for strict RFC compliance */
36975 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
36976 /* enable/disable utf8 encoding */
36979 /* privileged (public) methods */
36980 this.hex = function(s) {
36981 return rstr2hex(rstr(s, utf8));
36983 this.b64 = function(s) {
36984 return rstr2b64(rstr(s, utf8), b64pad);
36986 this.any = function(s, e) {
36987 return rstr2any(rstr(s, utf8), e);
36989 this.raw = function(s) {
36990 return rstr(s, utf8);
36992 this.hex_hmac = function(k, d) {
36993 return rstr2hex(rstr_hmac(k, d));
36995 this.b64_hmac = function(k, d) {
36996 return rstr2b64(rstr_hmac(k, d), b64pad);
36998 this.any_hmac = function(k, d, e) {
36999 return rstr2any(rstr_hmac(k, d), e);
37002 * Perform a simple self-test to see if the VM is working
37003 * @return {String} Hexadecimal hash sample
37006 this.vm_test = function() {
37007 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37010 * Enable/disable uppercase hexadecimal returned string
37012 * @return {Object} this
37015 this.setUpperCase = function(a) {
37016 if (typeof a === 'boolean') {
37022 * @description Defines a base64 pad string
37023 * @param {string} Pad
37024 * @return {Object} this
37027 this.setPad = function(a) {
37028 b64pad = a || b64pad;
37032 * Defines a base64 pad string
37034 * @return {Object} this
37037 this.setUTF8 = function(a) {
37038 if (typeof a === 'boolean') {
37047 * Calculate the SHA-512 of a raw string
37050 function rstr(s, utf8) {
37051 s = (utf8) ? utf8Encode(s) : s;
37052 return binb2rstr(binb(rstr2binb(s), s.length * 8));
37056 * Calculate the HMAC-sha256 of a key and some data (raw strings)
37059 function rstr_hmac(key, data) {
37060 key = (utf8) ? utf8Encode(key) : key;
37061 data = (utf8) ? utf8Encode(data) : data;
37063 bkey = rstr2binb(key),
37067 if (bkey.length > 16) {
37068 bkey = binb(bkey, key.length * 8);
37071 for (; i < 16; i += 1) {
37072 ipad[i] = bkey[i] ^ 0x36363636;
37073 opad[i] = bkey[i] ^ 0x5C5C5C5C;
37076 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
37077 return binb2rstr(binb(opad.concat(hash), 512 + 256));
37081 * Main sha256 function, with its support functions
37084 function sha256_S(X, n) {
37085 return (X >>> n) | (X << (32 - n));
37088 function sha256_R(X, n) {
37092 function sha256_Ch(x, y, z) {
37093 return ((x & y) ^ ((~x) & z));
37096 function sha256_Maj(x, y, z) {
37097 return ((x & y) ^ (x & z) ^ (y & z));
37100 function sha256_Sigma0256(x) {
37101 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
37104 function sha256_Sigma1256(x) {
37105 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
37108 function sha256_Gamma0256(x) {
37109 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
37112 function sha256_Gamma1256(x) {
37113 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
37117 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
37118 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
37119 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
37120 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
37121 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
37122 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
37123 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
37126 function binb(m, l) {
37127 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
37128 1359893119, -1694144372, 528734635, 1541459225
37130 var W = new Array(64);
37131 var a, b, c, d, e, f, g, h;
37134 /* append padding */
37135 m[l >> 5] |= 0x80 << (24 - l % 32);
37136 m[((l + 64 >> 9) << 4) + 15] = l;
37138 for (i = 0; i < m.length; i += 16) {
37148 for (j = 0; j < 64; j += 1) {
37152 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
37153 sha256_Gamma0256(W[j - 15])), W[j - 16]);
37156 T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
37157 sha256_K[j]), W[j]);
37158 T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
37162 e = safe_add(d, T1);
37166 a = safe_add(T1, T2);
37169 HASH[0] = safe_add(a, HASH[0]);
37170 HASH[1] = safe_add(b, HASH[1]);
37171 HASH[2] = safe_add(c, HASH[2]);
37172 HASH[3] = safe_add(d, HASH[3]);
37173 HASH[4] = safe_add(e, HASH[4]);
37174 HASH[5] = safe_add(f, HASH[5]);
37175 HASH[6] = safe_add(g, HASH[6]);
37176 HASH[7] = safe_add(h, HASH[7]);
37184 * @class Hashes.SHA512
37187 * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
37188 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
37189 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37190 * See http://pajhome.org.uk/crypt/md5 for details.
37192 SHA512: function(options) {
37194 * Private properties configuration variables. You may need to tweak these to be compatible with
37195 * the server-side, but the defaults work in most cases.
37196 * @see this.setUpperCase() method
37197 * @see this.setPad() method
37199 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37200 /* hexadecimal output case format. false - lowercase; true - uppercase */
37201 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
37202 /* base-64 pad character. Default '=' for strict RFC compliance */
37203 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37204 /* enable/disable utf8 encoding */
37207 /* privileged (public) methods */
37208 this.hex = function(s) {
37209 return rstr2hex(rstr(s));
37211 this.b64 = function(s) {
37212 return rstr2b64(rstr(s), b64pad);
37214 this.any = function(s, e) {
37215 return rstr2any(rstr(s), e);
37217 this.raw = function(s) {
37218 return rstr(s, utf8);
37220 this.hex_hmac = function(k, d) {
37221 return rstr2hex(rstr_hmac(k, d));
37223 this.b64_hmac = function(k, d) {
37224 return rstr2b64(rstr_hmac(k, d), b64pad);
37226 this.any_hmac = function(k, d, e) {
37227 return rstr2any(rstr_hmac(k, d), e);
37230 * Perform a simple self-test to see if the VM is working
37231 * @return {String} Hexadecimal hash sample
37234 this.vm_test = function() {
37235 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37238 * @description Enable/disable uppercase hexadecimal returned string
37240 * @return {Object} this
37243 this.setUpperCase = function(a) {
37244 if (typeof a === 'boolean') {
37250 * @description Defines a base64 pad string
37251 * @param {string} Pad
37252 * @return {Object} this
37255 this.setPad = function(a) {
37256 b64pad = a || b64pad;
37260 * @description Defines a base64 pad string
37262 * @return {Object} this
37265 this.setUTF8 = function(a) {
37266 if (typeof a === 'boolean') {
37272 /* private methods */
37275 * Calculate the SHA-512 of a raw string
37279 s = (utf8) ? utf8Encode(s) : s;
37280 return binb2rstr(binb(rstr2binb(s), s.length * 8));
37283 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
37286 function rstr_hmac(key, data) {
37287 key = (utf8) ? utf8Encode(key) : key;
37288 data = (utf8) ? utf8Encode(data) : data;
37291 bkey = rstr2binb(key),
37295 if (bkey.length > 32) {
37296 bkey = binb(bkey, key.length * 8);
37299 for (; i < 32; i += 1) {
37300 ipad[i] = bkey[i] ^ 0x36363636;
37301 opad[i] = bkey[i] ^ 0x5C5C5C5C;
37304 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
37305 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
37309 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
37312 function binb(x, len) {
37315 hash = new Array(16),
37316 //Initial hash values
37318 new int64(0x6a09e667, -205731576),
37319 new int64(-1150833019, -2067093701),
37320 new int64(0x3c6ef372, -23791573),
37321 new int64(-1521486534, 0x5f1d36f1),
37322 new int64(0x510e527f, -1377402159),
37323 new int64(-1694144372, 0x2b3e6c1f),
37324 new int64(0x1f83d9ab, -79577749),
37325 new int64(0x5be0cd19, 0x137e2179)
37327 T1 = new int64(0, 0),
37328 T2 = new int64(0, 0),
37329 a = new int64(0, 0),
37330 b = new int64(0, 0),
37331 c = new int64(0, 0),
37332 d = new int64(0, 0),
37333 e = new int64(0, 0),
37334 f = new int64(0, 0),
37335 g = new int64(0, 0),
37336 h = new int64(0, 0),
37337 //Temporary variables not specified by the document
37338 s0 = new int64(0, 0),
37339 s1 = new int64(0, 0),
37340 Ch = new int64(0, 0),
37341 Maj = new int64(0, 0),
37342 r1 = new int64(0, 0),
37343 r2 = new int64(0, 0),
37344 r3 = new int64(0, 0);
37346 if (sha512_k === undefined) {
37349 new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
37350 new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
37351 new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
37352 new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
37353 new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
37354 new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
37355 new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
37356 new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
37357 new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
37358 new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
37359 new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
37360 new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
37361 new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
37362 new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
37363 new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
37364 new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
37365 new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
37366 new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
37367 new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
37368 new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
37369 new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
37370 new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
37371 new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
37372 new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
37373 new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
37374 new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
37375 new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
37376 new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
37377 new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
37378 new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
37379 new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
37380 new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
37381 new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
37382 new int64(-354779690, -840897762), new int64(-176337025, -294727304),
37383 new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
37384 new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
37385 new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
37386 new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
37387 new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
37388 new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
37392 for (i = 0; i < 80; i += 1) {
37393 W[i] = new int64(0, 0);
37396 // append padding to the source string. The format is described in the FIPS.
37397 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
37398 x[((len + 128 >> 10) << 5) + 31] = len;
37400 for (i = 0; i < l; i += 32) { //32 dwords is the block size
37401 int64copy(a, H[0]);
37402 int64copy(b, H[1]);
37403 int64copy(c, H[2]);
37404 int64copy(d, H[3]);
37405 int64copy(e, H[4]);
37406 int64copy(f, H[5]);
37407 int64copy(g, H[6]);
37408 int64copy(h, H[7]);
37410 for (j = 0; j < 16; j += 1) {
37411 W[j].h = x[i + 2 * j];
37412 W[j].l = x[i + 2 * j + 1];
37415 for (j = 16; j < 80; j += 1) {
37417 int64rrot(r1, W[j - 2], 19);
37418 int64revrrot(r2, W[j - 2], 29);
37419 int64shr(r3, W[j - 2], 6);
37420 s1.l = r1.l ^ r2.l ^ r3.l;
37421 s1.h = r1.h ^ r2.h ^ r3.h;
37423 int64rrot(r1, W[j - 15], 1);
37424 int64rrot(r2, W[j - 15], 8);
37425 int64shr(r3, W[j - 15], 7);
37426 s0.l = r1.l ^ r2.l ^ r3.l;
37427 s0.h = r1.h ^ r2.h ^ r3.h;
37429 int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
37432 for (j = 0; j < 80; j += 1) {
37434 Ch.l = (e.l & f.l) ^ (~e.l & g.l);
37435 Ch.h = (e.h & f.h) ^ (~e.h & g.h);
37438 int64rrot(r1, e, 14);
37439 int64rrot(r2, e, 18);
37440 int64revrrot(r3, e, 9);
37441 s1.l = r1.l ^ r2.l ^ r3.l;
37442 s1.h = r1.h ^ r2.h ^ r3.h;
37445 int64rrot(r1, a, 28);
37446 int64revrrot(r2, a, 2);
37447 int64revrrot(r3, a, 7);
37448 s0.l = r1.l ^ r2.l ^ r3.l;
37449 s0.h = r1.h ^ r2.h ^ r3.h;
37452 Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
37453 Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
37455 int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
37456 int64add(T2, s0, Maj);
37461 int64add(e, d, T1);
37465 int64add(a, T1, T2);
37467 int64add(H[0], H[0], a);
37468 int64add(H[1], H[1], b);
37469 int64add(H[2], H[2], c);
37470 int64add(H[3], H[3], d);
37471 int64add(H[4], H[4], e);
37472 int64add(H[5], H[5], f);
37473 int64add(H[6], H[6], g);
37474 int64add(H[7], H[7], h);
37477 //represent the hash as an array of 32-bit dwords
37478 for (i = 0; i < 8; i += 1) {
37479 hash[2 * i] = H[i].h;
37480 hash[2 * i + 1] = H[i].l;
37485 //A constructor for 64-bit numbers
37487 function int64(h, l) {
37490 //this.toString = int64toString;
37493 //Copies src into dst, assuming both are 64-bit numbers
37495 function int64copy(dst, src) {
37500 //Right-rotates a 64-bit number by shift
37501 //Won't handle cases of shift>=32
37502 //The function revrrot() is for that
37504 function int64rrot(dst, x, shift) {
37505 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37506 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
37509 //Reverses the dwords of the source and then rotates right by shift.
37510 //This is equivalent to rotation by 32+shift
37512 function int64revrrot(dst, x, shift) {
37513 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
37514 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
37517 //Bitwise-shifts right a 64-bit number by shift
37518 //Won't handle shift>=32, but it's never needed in SHA512
37520 function int64shr(dst, x, shift) {
37521 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
37522 dst.h = (x.h >>> shift);
37525 //Adds two 64-bit numbers
37526 //Like the original implementation, does not rely on 32-bit operations
37528 function int64add(dst, x, y) {
37529 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
37530 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
37531 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
37532 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
37533 dst.l = (w0 & 0xffff) | (w1 << 16);
37534 dst.h = (w2 & 0xffff) | (w3 << 16);
37537 //Same, except with 4 addends. Works faster than adding them one by one.
37539 function int64add4(dst, a, b, c, d) {
37540 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
37541 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
37542 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
37543 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
37544 dst.l = (w0 & 0xffff) | (w1 << 16);
37545 dst.h = (w2 & 0xffff) | (w3 << 16);
37548 //Same, except with 5 addends
37550 function int64add5(dst, a, b, c, d, e) {
37551 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
37552 w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
37553 w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
37554 w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
37555 dst.l = (w0 & 0xffff) | (w1 << 16);
37556 dst.h = (w2 & 0xffff) | (w3 << 16);
37560 * @class Hashes.RMD160
37562 * @param {Object} [config]
37564 * A JavaScript implementation of the RIPEMD-160 Algorithm
37565 * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
37566 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
37567 * See http://pajhome.org.uk/crypt/md5 for details.
37568 * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
37570 RMD160: function(options) {
37572 * Private properties configuration variables. You may need to tweak these to be compatible with
37573 * the server-side, but the defaults work in most cases.
37574 * @see this.setUpperCase() method
37575 * @see this.setPad() method
37577 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
37578 /* hexadecimal output case format. false - lowercase; true - uppercase */
37579 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
37580 /* base-64 pad character. Default '=' for strict RFC compliance */
37581 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
37582 /* enable/disable utf8 encoding */
37584 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
37585 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
37586 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
37587 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
37588 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
37591 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
37592 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
37593 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
37594 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
37595 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
37598 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
37599 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
37600 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
37601 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
37602 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
37605 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
37606 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
37607 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
37608 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
37609 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
37612 /* privileged (public) methods */
37613 this.hex = function(s) {
37614 return rstr2hex(rstr(s, utf8));
37616 this.b64 = function(s) {
37617 return rstr2b64(rstr(s, utf8), b64pad);
37619 this.any = function(s, e) {
37620 return rstr2any(rstr(s, utf8), e);
37622 this.raw = function(s) {
37623 return rstr(s, utf8);
37625 this.hex_hmac = function(k, d) {
37626 return rstr2hex(rstr_hmac(k, d));
37628 this.b64_hmac = function(k, d) {
37629 return rstr2b64(rstr_hmac(k, d), b64pad);
37631 this.any_hmac = function(k, d, e) {
37632 return rstr2any(rstr_hmac(k, d), e);
37635 * Perform a simple self-test to see if the VM is working
37636 * @return {String} Hexadecimal hash sample
37639 this.vm_test = function() {
37640 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
37643 * @description Enable/disable uppercase hexadecimal returned string
37645 * @return {Object} this
37648 this.setUpperCase = function(a) {
37649 if (typeof a === 'boolean') {
37655 * @description Defines a base64 pad string
37656 * @param {string} Pad
37657 * @return {Object} this
37660 this.setPad = function(a) {
37661 if (typeof a !== 'undefined') {
37667 * @description Defines a base64 pad string
37669 * @return {Object} this
37672 this.setUTF8 = function(a) {
37673 if (typeof a === 'boolean') {
37679 /* private methods */
37682 * Calculate the rmd160 of a raw string
37686 s = (utf8) ? utf8Encode(s) : s;
37687 return binl2rstr(binl(rstr2binl(s), s.length * 8));
37691 * Calculate the HMAC-rmd160 of a key and some data (raw strings)
37694 function rstr_hmac(key, data) {
37695 key = (utf8) ? utf8Encode(key) : key;
37696 data = (utf8) ? utf8Encode(data) : data;
37698 bkey = rstr2binl(key),
37702 if (bkey.length > 16) {
37703 bkey = binl(bkey, key.length * 8);
37706 for (i = 0; i < 16; i += 1) {
37707 ipad[i] = bkey[i] ^ 0x36363636;
37708 opad[i] = bkey[i] ^ 0x5C5C5C5C;
37710 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
37711 return binl2rstr(binl(opad.concat(hash), 512 + 160));
37715 * Convert an array of little-endian words to a string
37718 function binl2rstr(input) {
37719 var i, output = '',
37720 l = input.length * 32;
37721 for (i = 0; i < l; i += 8) {
37722 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
37728 * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
37731 function binl(x, len) {
37738 A1, B1, C1, D1, E1,
37739 A2, B2, C2, D2, E2;
37741 /* append padding */
37742 x[len >> 5] |= 0x80 << (len % 32);
37743 x[(((len + 64) >>> 9) << 4) + 14] = len;
37746 for (i = 0; i < l; i += 16) {
37752 for (j = 0; j <= 79; j += 1) {
37753 T = safe_add(A1, rmd160_f(j, B1, C1, D1));
37754 T = safe_add(T, x[i + rmd160_r1[j]]);
37755 T = safe_add(T, rmd160_K1(j));
37756 T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
37759 D1 = bit_rol(C1, 10);
37762 T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
37763 T = safe_add(T, x[i + rmd160_r2[j]]);
37764 T = safe_add(T, rmd160_K2(j));
37765 T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
37768 D2 = bit_rol(C2, 10);
37773 T = safe_add(h1, safe_add(C1, D2));
37774 h1 = safe_add(h2, safe_add(D1, E2));
37775 h2 = safe_add(h3, safe_add(E1, A2));
37776 h3 = safe_add(h4, safe_add(A1, B2));
37777 h4 = safe_add(h0, safe_add(B1, C2));
37780 return [h0, h1, h2, h3, h4];
37783 // specific algorithm methods
37785 function rmd160_f(j, x, y, z) {
37786 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
37787 (16 <= j && j <= 31) ? (x & y) | (~x & z) :
37788 (32 <= j && j <= 47) ? (x | ~y) ^ z :
37789 (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
37790 (64 <= j && j <= 79) ? x ^ (y | ~z) :
37791 'rmd160_f: j out of range';
37794 function rmd160_K1(j) {
37795 return (0 <= j && j <= 15) ? 0x00000000 :
37796 (16 <= j && j <= 31) ? 0x5a827999 :
37797 (32 <= j && j <= 47) ? 0x6ed9eba1 :
37798 (48 <= j && j <= 63) ? 0x8f1bbcdc :
37799 (64 <= j && j <= 79) ? 0xa953fd4e :
37800 'rmd160_K1: j out of range';
37803 function rmd160_K2(j) {
37804 return (0 <= j && j <= 15) ? 0x50a28be6 :
37805 (16 <= j && j <= 31) ? 0x5c4dd124 :
37806 (32 <= j && j <= 47) ? 0x6d703ef3 :
37807 (48 <= j && j <= 63) ? 0x7a6d76e9 :
37808 (64 <= j && j <= 79) ? 0x00000000 :
37809 'rmd160_K2: j out of range';
37815 (function(window, undefined) {
37816 var freeExports = false;
37818 freeExports = exports;
37819 if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
37820 window = commonjsGlobal;
37824 if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
37825 // define as an anonymous module, so, through path mapping, it can be aliased
37826 undefined(function() {
37829 } else if (freeExports) {
37830 // in Node.js or RingoJS v0.8.0+
37831 if ('object' === 'object' && module && module.exports === freeExports) {
37832 module.exports = Hashes;
37834 // in Narwhal or RingoJS v0.7.0-
37836 freeExports.Hashes = Hashes;
37839 // in a browser or Rhino
37840 window.Hashes = Hashes;
37846 var immutable = extend$2;
37848 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
37850 function extend$2() {
37853 for (var i = 0; i < arguments.length; i++) {
37854 var source = arguments[i];
37856 for (var key in source) {
37857 if (hasOwnProperty$16.call(source, key)) {
37858 target[key] = source[key];
37866 var sha1 = new hashes.SHA1();
37870 ohauth.qsString = function(obj) {
37871 return Object.keys(obj).sort().map(function(key) {
37872 return ohauth.percentEncode(key) + '=' +
37873 ohauth.percentEncode(obj[key]);
37877 ohauth.stringQs = function(str) {
37878 return str.split('&').filter(function (pair) {
37879 return pair !== '';
37880 }).reduce(function(obj, pair){
37881 var parts = pair.split('=');
37882 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
37883 '' : decodeURIComponent(parts[1]);
37888 ohauth.rawxhr = function(method, url, data, headers, callback) {
37889 var xhr = new XMLHttpRequest(),
37890 twoHundred = /^20\d$/;
37891 xhr.onreadystatechange = function() {
37892 if (4 === xhr.readyState && 0 !== xhr.status) {
37893 if (twoHundred.test(xhr.status)) callback(null, xhr);
37894 else return callback(xhr, null);
37897 xhr.onerror = function(e) { return callback(e, null); };
37898 xhr.open(method, url, true);
37899 for (var h in headers) xhr.setRequestHeader(h, headers[h]);
37904 ohauth.xhr = function(method, url, auth, data, options, callback) {
37905 var headers = (options && options.header) || {
37906 'Content-Type': 'application/x-www-form-urlencoded'
37908 headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
37909 return ohauth.rawxhr(method, url, data, headers, callback);
37912 ohauth.nonce = function() {
37913 for (var o = ''; o.length < 6;) {
37914 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
37919 ohauth.authHeader = function(obj) {
37920 return Object.keys(obj).sort().map(function(key) {
37921 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
37925 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
37927 ohauth.percentEncode = function(s) {
37928 return encodeURIComponent(s)
37929 .replace(/\!/g, '%21').replace(/\'/g, '%27')
37930 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
37933 ohauth.baseString = function(method, url, params) {
37934 if (params.oauth_signature) delete params.oauth_signature;
37937 ohauth.percentEncode(url),
37938 ohauth.percentEncode(ohauth.qsString(params))].join('&');
37941 ohauth.signature = function(oauth_secret, token_secret, baseString) {
37942 return sha1.b64_hmac(
37943 ohauth.percentEncode(oauth_secret) + '&' +
37944 ohauth.percentEncode(token_secret),
37949 * Takes an options object for configuration (consumer_key,
37950 * consumer_secret, version, signature_method, token, token_secret)
37951 * and returns a function that generates the Authorization header
37954 * The returned function takes these parameters:
37955 * - method: GET/POST/...
37956 * - uri: full URI with protocol, port, path and query string
37957 * - extra_params: any extra parameters (that are passed in the POST data),
37958 * can be an object or a from-urlencoded string.
37960 * Returned function returns full OAuth header with "OAuth" string in it.
37963 ohauth.headerGenerator = function(options) {
37964 options = options || {};
37965 var consumer_key = options.consumer_key || '',
37966 consumer_secret = options.consumer_secret || '',
37967 signature_method = options.signature_method || 'HMAC-SHA1',
37968 version = options.version || '1.0',
37969 token = options.token || '',
37970 token_secret = options.token_secret || '';
37972 return function(method, uri, extra_params) {
37973 method = method.toUpperCase();
37974 if (typeof extra_params === 'string' && extra_params.length > 0) {
37975 extra_params = ohauth.stringQs(extra_params);
37978 var uri_parts = uri.split('?', 2),
37979 base_uri = uri_parts[0];
37981 var query_params = uri_parts.length === 2 ?
37982 ohauth.stringQs(uri_parts[1]) : {};
37984 var oauth_params = {
37985 oauth_consumer_key: consumer_key,
37986 oauth_signature_method: signature_method,
37987 oauth_version: version,
37988 oauth_timestamp: ohauth.timestamp(),
37989 oauth_nonce: ohauth.nonce()
37992 if (token) oauth_params.oauth_token = token;
37994 var all_params = immutable({}, oauth_params, query_params, extra_params),
37995 base_str = ohauth.baseString(method, base_uri, all_params);
37997 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
37999 return 'OAuth ' + ohauth.authHeader(oauth_params);
38003 var ohauth_1 = ohauth;
38005 var resolveUrl = createCommonjsModule(function (module, exports) {
38006 // Copyright 2014 Simon Lydell
38007 // X11 (“MIT”) Licensed. (See LICENSE.)
38009 void (function(root, factory) {
38010 if (typeof undefined === "function" && undefined.amd) {
38011 undefined(factory);
38013 module.exports = factory();
38015 }(commonjsGlobal, function() {
38017 function resolveUrl(/* ...urls */) {
38018 var numUrls = arguments.length;
38020 if (numUrls === 0) {
38021 throw new Error("resolveUrl requires at least one argument; got none.")
38024 var base = document.createElement("base");
38025 base.href = arguments[0];
38027 if (numUrls === 1) {
38031 var head = document.getElementsByTagName("head")[0];
38032 head.insertBefore(base, head.firstChild);
38034 var a = document.createElement("a");
38037 for (var index = 1; index < numUrls; index++) {
38038 a.href = arguments[index];
38040 base.href = resolved;
38043 head.removeChild(base);
38053 var assign$1 = make_assign();
38054 var create$2 = make_create();
38055 var trim = make_trim();
38056 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
38068 isFunction: isFunction$1,
38069 isObject: isObject$1,
38073 function make_assign() {
38074 if (Object.assign) {
38075 return Object.assign
38077 return function shimAssign(obj, props1, props2, etc) {
38078 for (var i = 1; i < arguments.length; i++) {
38079 each(Object(arguments[i]), function(val, key) {
38088 function make_create() {
38089 if (Object.create) {
38090 return function create(obj, assignProps1, assignProps2, etc) {
38091 var assignArgsList = slice$7(arguments, 1);
38092 return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
38095 function F() {} // eslint-disable-line no-inner-declarations
38096 return function create(obj, assignProps1, assignProps2, etc) {
38097 var assignArgsList = slice$7(arguments, 1);
38099 return assign$1.apply(this, [new F()].concat(assignArgsList))
38104 function make_trim() {
38105 if (String.prototype.trim) {
38106 return function trim(str) {
38107 return String.prototype.trim.call(str)
38110 return function trim(str) {
38111 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
38116 function bind(obj, fn) {
38117 return function() {
38118 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
38122 function slice$7(arr, index) {
38123 return Array.prototype.slice.call(arr, index || 0)
38126 function each(obj, fn) {
38127 pluck(obj, function(val, key) {
38133 function map$4(obj, fn) {
38134 var res = (isList(obj) ? [] : {});
38135 pluck(obj, function(v, k) {
38142 function pluck(obj, fn) {
38144 for (var i=0; i<obj.length; i++) {
38145 if (fn(obj[i], i)) {
38150 for (var key in obj) {
38151 if (obj.hasOwnProperty(key)) {
38152 if (fn(obj[key], key)) {
38160 function isList(val) {
38161 return (val != null && typeof val != 'function' && typeof val.length == 'number')
38164 function isFunction$1(val) {
38165 return val && {}.toString.call(val) === '[object Function]'
38168 function isObject$1(val) {
38169 return val && {}.toString.call(val) === '[object Object]'
38172 var slice$8 = util.slice;
38173 var pluck$1 = util.pluck;
38174 var each$1 = util.each;
38175 var bind$1 = util.bind;
38176 var create$3 = util.create;
38177 var isList$1 = util.isList;
38178 var isFunction$2 = util.isFunction;
38179 var isObject$2 = util.isObject;
38181 var storeEngine = {
38182 createStore: createStore
38189 // get returns the value of the given key. If that value
38190 // is undefined, it returns optionalDefaultValue instead.
38191 get: function(key, optionalDefaultValue) {
38192 var data = this.storage.read(this._namespacePrefix + key);
38193 return this._deserialize(data, optionalDefaultValue)
38196 // set will store the given value at key and returns value.
38197 // Calling set with value === undefined is equivalent to calling remove.
38198 set: function(key, value) {
38199 if (value === undefined) {
38200 return this.remove(key)
38202 this.storage.write(this._namespacePrefix + key, this._serialize(value));
38206 // remove deletes the key and value stored at the given key.
38207 remove: function(key) {
38208 this.storage.remove(this._namespacePrefix + key);
38211 // each will call the given callback once for each key-value pair
38213 each: function(callback) {
38215 this.storage.each(function(val, namespacedKey) {
38216 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
38220 // clearAll will remove all the stored key-value pairs in this store.
38221 clearAll: function() {
38222 this.storage.clearAll();
38225 // additional functionality that can't live in plugins
38226 // ---------------------------------------------------
38228 // hasNamespace returns true if this store instance has the given namespace.
38229 hasNamespace: function(namespace) {
38230 return (this._namespacePrefix == '__storejs_'+namespace+'_')
38233 // createStore creates a store.js instance with the first
38234 // functioning storage in the list of storage candidates,
38235 // and applies the the given mixins to the instance.
38236 createStore: function() {
38237 return createStore.apply(this, arguments)
38240 addPlugin: function(plugin) {
38241 this._addPlugin(plugin);
38244 namespace: function(namespace) {
38245 return createStore(this.storage, this.plugins, namespace)
38250 var _console = (typeof console == 'undefined' ? null : console);
38251 if (!_console) { return }
38252 var fn = (_console.warn ? _console.warn : _console.log);
38253 fn.apply(_console, arguments);
38256 function createStore(storages, plugins, namespace) {
38260 if (storages && !isList$1(storages)) {
38261 storages = [storages];
38263 if (plugins && !isList$1(plugins)) {
38264 plugins = [plugins];
38267 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
38268 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
38269 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
38270 if (!legalNamespaces.test(namespace)) {
38271 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
38274 var _privateStoreProps = {
38275 _namespacePrefix: namespacePrefix,
38276 _namespaceRegexp: namespaceRegexp,
38278 _testStorage: function(storage) {
38280 var testStr = '__storejs__test__';
38281 storage.write(testStr, testStr);
38282 var ok = (storage.read(testStr) === testStr);
38283 storage.remove(testStr);
38290 _assignPluginFnProp: function(pluginFnProp, propName) {
38291 var oldFn = this[propName];
38292 this[propName] = function pluginFn() {
38293 var args = slice$8(arguments, 0);
38296 // super_fn calls the old function which was overwritten by
38298 function super_fn() {
38299 if (!oldFn) { return }
38300 each$1(arguments, function(arg, i) {
38303 return oldFn.apply(self, args)
38306 // Give mixing function access to super_fn by prefixing all mixin function
38307 // arguments with super_fn.
38308 var newFnArgs = [super_fn].concat(args);
38310 return pluginFnProp.apply(self, newFnArgs)
38314 _serialize: function(obj) {
38315 return JSON.stringify(obj)
38318 _deserialize: function(strVal, defaultVal) {
38319 if (!strVal) { return defaultVal }
38320 // It is possible that a raw string value has been previously stored
38321 // in a storage without using store.js, meaning it will be a raw
38322 // string value instead of a JSON serialized string. By defaulting
38323 // to the raw string value in case of a JSON parse error, we allow
38324 // for past stored values to be forwards-compatible with store.js
38326 try { val = JSON.parse(strVal); }
38327 catch(e) { val = strVal; }
38329 return (val !== undefined ? val : defaultVal)
38332 _addStorage: function(storage) {
38333 if (this.enabled) { return }
38334 if (this._testStorage(storage)) {
38335 this.storage = storage;
38336 this.enabled = true;
38340 _addPlugin: function(plugin) {
38343 // If the plugin is an array, then add all plugins in the array.
38344 // This allows for a plugin to depend on other plugins.
38345 if (isList$1(plugin)) {
38346 each$1(plugin, function(plugin) {
38347 self._addPlugin(plugin);
38352 // Keep track of all plugins we've seen so far, so that we
38353 // don't add any of them twice.
38354 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
38355 return (plugin === seenPlugin)
38360 this.plugins.push(plugin);
38362 // Check that the plugin is properly formed
38363 if (!isFunction$2(plugin)) {
38364 throw new Error('Plugins must be function values that return objects')
38367 var pluginProperties = plugin.call(this);
38368 if (!isObject$2(pluginProperties)) {
38369 throw new Error('Plugins must return an object of function properties')
38372 // Add the plugin function properties to this store instance.
38373 each$1(pluginProperties, function(pluginFnProp, propName) {
38374 if (!isFunction$2(pluginFnProp)) {
38375 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
38377 self._assignPluginFnProp(pluginFnProp, propName);
38381 // Put deprecated properties in the private API, so as to not expose it to accidential
38382 // discovery through inspection of the store object.
38384 // Deprecated: addStorage
38385 addStorage: function(storage) {
38386 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
38387 this._addStorage(storage);
38391 var store = create$3(_privateStoreProps, storeAPI, {
38395 each$1(store, function(prop, propName) {
38396 if (isFunction$2(prop)) {
38397 store.raw[propName] = bind$1(store, prop);
38400 each$1(storages, function(storage) {
38401 store._addStorage(storage);
38403 each$1(plugins, function(plugin) {
38404 store._addPlugin(plugin);
38409 var Global$1 = util.Global;
38411 var localStorage_1 = {
38412 name: 'localStorage',
38417 clearAll: clearAll,
38420 function localStorage$1() {
38421 return Global$1.localStorage
38424 function read(key) {
38425 return localStorage$1().getItem(key)
38428 function write(key, data) {
38429 return localStorage$1().setItem(key, data)
38432 function each$2(fn) {
38433 for (var i = localStorage$1().length - 1; i >= 0; i--) {
38434 var key = localStorage$1().key(i);
38435 fn(read(key), key);
38439 function remove$2(key) {
38440 return localStorage$1().removeItem(key)
38443 function clearAll() {
38444 return localStorage$1().clear()
38447 // oldFF-globalStorage provides storage for Firefox
38448 // versions 6 and 7, where no localStorage, etc
38452 var Global$2 = util.Global;
38454 var oldFFGlobalStorage = {
38455 name: 'oldFF-globalStorage',
38460 clearAll: clearAll$1,
38463 var globalStorage = Global$2.globalStorage;
38465 function read$1(key) {
38466 return globalStorage[key]
38469 function write$1(key, data) {
38470 globalStorage[key] = data;
38473 function each$3(fn) {
38474 for (var i = globalStorage.length - 1; i >= 0; i--) {
38475 var key = globalStorage.key(i);
38476 fn(globalStorage[key], key);
38480 function remove$3(key) {
38481 return globalStorage.removeItem(key)
38484 function clearAll$1() {
38485 each$3(function(key, _) {
38486 delete globalStorage[key];
38490 // oldIE-userDataStorage provides storage for Internet Explorer
38491 // versions 6 and 7, where no localStorage, sessionStorage, etc
38495 var Global$3 = util.Global;
38497 var oldIEUserDataStorage = {
38498 name: 'oldIE-userDataStorage',
38503 clearAll: clearAll$2,
38506 var storageName = 'storejs';
38507 var doc = Global$3.document;
38508 var _withStorageEl = _makeIEStorageElFunction();
38509 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
38511 function write$2(unfixedKey, data) {
38512 if (disable) { return }
38513 var fixedKey = fixKey(unfixedKey);
38514 _withStorageEl(function(storageEl) {
38515 storageEl.setAttribute(fixedKey, data);
38516 storageEl.save(storageName);
38520 function read$2(unfixedKey) {
38521 if (disable) { return }
38522 var fixedKey = fixKey(unfixedKey);
38524 _withStorageEl(function(storageEl) {
38525 res = storageEl.getAttribute(fixedKey);
38530 function each$4(callback) {
38531 _withStorageEl(function(storageEl) {
38532 var attributes = storageEl.XMLDocument.documentElement.attributes;
38533 for (var i=attributes.length-1; i>=0; i--) {
38534 var attr = attributes[i];
38535 callback(storageEl.getAttribute(attr.name), attr.name);
38540 function remove$4(unfixedKey) {
38541 var fixedKey = fixKey(unfixedKey);
38542 _withStorageEl(function(storageEl) {
38543 storageEl.removeAttribute(fixedKey);
38544 storageEl.save(storageName);
38548 function clearAll$2() {
38549 _withStorageEl(function(storageEl) {
38550 var attributes = storageEl.XMLDocument.documentElement.attributes;
38551 storageEl.load(storageName);
38552 for (var i=attributes.length-1; i>=0; i--) {
38553 storageEl.removeAttribute(attributes[i].name);
38555 storageEl.save(storageName);
38562 // In IE7, keys cannot start with a digit or contain certain chars.
38563 // See https://github.com/marcuswestin/store.js/issues/40
38564 // See https://github.com/marcuswestin/store.js/issues/83
38565 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
38566 function fixKey(key) {
38567 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
38570 function _makeIEStorageElFunction() {
38571 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
38574 var scriptTag = 'script',
38579 // Since #userData storage applies only to specific paths, we need to
38580 // somehow link our data to a specific path. We choose /favicon.ico
38581 // as a pretty safe option, since all browsers already make a request to
38582 // this URL anyway and being a 404 will not hurt us here. We wrap an
38583 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
38584 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
38585 // since the iframe access rules appear to allow direct access and
38586 // manipulation of the document element, even for a 404 page. This
38587 // document can be used instead of the current document (which would
38588 // have been limited to the current path) to perform #userData storage.
38590 /* global ActiveXObject */
38591 storageContainer = new ActiveXObject('htmlfile');
38592 storageContainer.open();
38593 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
38594 storageContainer.close();
38595 storageOwner = storageContainer.w.frames[0].document;
38596 storageEl = storageOwner.createElement('div');
38598 // somehow ActiveXObject instantiation failed (perhaps some special
38599 // security settings or otherwse), fall back to per-path storage
38600 storageEl = doc.createElement('div');
38601 storageOwner = doc.body;
38604 return function(storeFunction) {
38605 var args = [].slice.call(arguments, 0);
38606 args.unshift(storageEl);
38607 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
38608 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
38609 storageOwner.appendChild(storageEl);
38610 storageEl.addBehavior('#default#userData');
38611 storageEl.load(storageName);
38612 storeFunction.apply(this, args);
38613 storageOwner.removeChild(storageEl);
38618 // cookieStorage is useful Safari private browser mode, where localStorage
38619 // doesn't work but cookies do. This implementation is adopted from
38620 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
38623 var Global$4 = util.Global;
38624 var trim$1 = util.trim;
38626 var cookieStorage = {
38627 name: 'cookieStorage',
38632 clearAll: clearAll$3,
38635 var doc$1 = Global$4.document;
38637 function read$3(key) {
38638 if (!key || !_has(key)) { return null }
38639 var regexpStr = "(?:^|.*;\\s*)" +
38640 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
38641 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
38642 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
38645 function each$5(callback) {
38646 var cookies = doc$1.cookie.split(/; ?/g);
38647 for (var i = cookies.length - 1; i >= 0; i--) {
38648 if (!trim$1(cookies[i])) {
38651 var kvp = cookies[i].split('=');
38652 var key = unescape(kvp[0]);
38653 var val = unescape(kvp[1]);
38654 callback(val, key);
38658 function write$3(key, data) {
38659 if(!key) { return }
38660 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
38663 function remove$5(key) {
38664 if (!key || !_has(key)) {
38667 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
38670 function clearAll$3() {
38671 each$5(function(_, key) {
38676 function _has(key) {
38677 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
38680 var Global$5 = util.Global;
38682 var sessionStorage_1 = {
38683 name: 'sessionStorage',
38688 clearAll: clearAll$4
38691 function sessionStorage() {
38692 return Global$5.sessionStorage
38695 function read$4(key) {
38696 return sessionStorage().getItem(key)
38699 function write$4(key, data) {
38700 return sessionStorage().setItem(key, data)
38703 function each$6(fn) {
38704 for (var i = sessionStorage().length - 1; i >= 0; i--) {
38705 var key = sessionStorage().key(i);
38706 fn(read$4(key), key);
38710 function remove$6(key) {
38711 return sessionStorage().removeItem(key)
38714 function clearAll$4() {
38715 return sessionStorage().clear()
38718 // memoryStorage is a useful last fallback to ensure that the store
38719 // is functions (meaning store.get(), store.set(), etc will all function).
38720 // However, stored values will not persist when the browser navigates to
38721 // a new page or reloads the current page.
38723 var memoryStorage_1 = {
38724 name: 'memoryStorage',
38729 clearAll: clearAll$5,
38732 var memoryStorage = {};
38734 function read$5(key) {
38735 return memoryStorage[key]
38738 function write$5(key, data) {
38739 memoryStorage[key] = data;
38742 function each$7(callback) {
38743 for (var key in memoryStorage) {
38744 if (memoryStorage.hasOwnProperty(key)) {
38745 callback(memoryStorage[key], key);
38750 function remove$7(key) {
38751 delete memoryStorage[key];
38754 function clearAll$5(key) {
38755 memoryStorage = {};
38759 // Listed in order of usage preference
38761 oldFFGlobalStorage,
38762 oldIEUserDataStorage,
38768 /* eslint-disable */
38773 // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
38774 // See http://www.JSON.org/js.html
38775 // This code should be minified before deployment.
38776 // See http://javascript.crockford.com/jsmin.html
38778 // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
38781 // This file creates a global JSON object containing two methods: stringify
38782 // and parse. This file provides the ES5 JSON capability to ES3 systems.
38783 // If a project might run on IE8 or earlier, then this file should be included.
38784 // This file does nothing on ES5 systems.
38786 // JSON.stringify(value, replacer, space)
38787 // value any JavaScript value, usually an object or array.
38788 // replacer an optional parameter that determines how object
38789 // values are stringified for objects. It can be a
38790 // function or an array of strings.
38791 // space an optional parameter that specifies the indentation
38792 // of nested structures. If it is omitted, the text will
38793 // be packed without extra whitespace. If it is a number,
38794 // it will specify the number of spaces to indent at each
38795 // level. If it is a string (such as "\t" or " "),
38796 // it contains the characters used to indent at each level.
38797 // This method produces a JSON text from a JavaScript value.
38798 // When an object value is found, if the object contains a toJSON
38799 // method, its toJSON method will be called and the result will be
38800 // stringified. A toJSON method does not serialize: it returns the
38801 // value represented by the name/value pair that should be serialized,
38802 // or undefined if nothing should be serialized. The toJSON method
38803 // will be passed the key associated with the value, and this will be
38804 // bound to the value.
38806 // For example, this would serialize Dates as ISO strings.
38808 // Date.prototype.toJSON = function (key) {
38810 // // Format integers to have at least two digits.
38815 // return this.getUTCFullYear() + "-" +
38816 // f(this.getUTCMonth() + 1) + "-" +
38817 // f(this.getUTCDate()) + "T" +
38818 // f(this.getUTCHours()) + ":" +
38819 // f(this.getUTCMinutes()) + ":" +
38820 // f(this.getUTCSeconds()) + "Z";
38823 // You can provide an optional replacer method. It will be passed the
38824 // key and value of each member, with this bound to the containing
38825 // object. The value that is returned from your method will be
38826 // serialized. If your method returns undefined, then the member will
38827 // be excluded from the serialization.
38829 // If the replacer parameter is an array of strings, then it will be
38830 // used to select the members to be serialized. It filters the results
38831 // such that only members with keys listed in the replacer array are
38834 // Values that do not have JSON representations, such as undefined or
38835 // functions, will not be serialized. Such values in objects will be
38836 // dropped; in arrays they will be replaced with null. You can use
38837 // a replacer function to replace those with JSON values.
38839 // JSON.stringify(undefined) returns undefined.
38841 // The optional space parameter produces a stringification of the
38842 // value that is filled with line breaks and indentation to make it
38845 // If the space parameter is a non-empty string, then that string will
38846 // be used for indentation. If the space parameter is a number, then
38847 // the indentation will be that many spaces.
38851 // text = JSON.stringify(["e", {pluribus: "unum"}]);
38852 // // text is '["e",{"pluribus":"unum"}]'
38854 // text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
38855 // // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
38857 // text = JSON.stringify([new Date()], function (key, value) {
38858 // return this[key] instanceof Date
38859 // ? "Date(" + this[key] + ")"
38862 // // text is '["Date(---current time---)"]'
38864 // JSON.parse(text, reviver)
38865 // This method parses a JSON text to produce an object or array.
38866 // It can throw a SyntaxError exception.
38868 // The optional reviver parameter is a function that can filter and
38869 // transform the results. It receives each of the keys and values,
38870 // and its return value is used instead of the original value.
38871 // If it returns what it received, then the structure is not modified.
38872 // If it returns undefined then the member is deleted.
38876 // // Parse the text. Values that look like ISO date strings will
38877 // // be converted to Date objects.
38879 // myData = JSON.parse(text, function (key, value) {
38881 // if (typeof value === "string") {
38883 // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
38885 // return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
38892 // myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
38894 // if (typeof value === "string" &&
38895 // value.slice(0, 5) === "Date(" &&
38896 // value.slice(-1) === ")") {
38897 // d = new Date(value.slice(5, -1));
38905 // This is a reference implementation. You are free to copy, modify, or
38913 JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
38914 getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
38915 lastIndex, length, parse, prototype, push, replace, slice, stringify,
38916 test, toJSON, toString, valueOf
38920 // Create a JSON object only if one does not already exist. We create the
38921 // methods in a closure to avoid creating global variables.
38923 if (typeof JSON !== "object") {
38929 var rx_one = /^[\],:{}\s]*$/;
38930 var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
38931 var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
38932 var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
38933 var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38934 var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
38937 // Format integers to have at least two digits.
38943 function this_value() {
38944 return this.valueOf();
38947 if (typeof Date.prototype.toJSON !== "function") {
38949 Date.prototype.toJSON = function () {
38951 return isFinite(this.valueOf())
38952 ? this.getUTCFullYear() + "-" +
38953 f(this.getUTCMonth() + 1) + "-" +
38954 f(this.getUTCDate()) + "T" +
38955 f(this.getUTCHours()) + ":" +
38956 f(this.getUTCMinutes()) + ":" +
38957 f(this.getUTCSeconds()) + "Z"
38961 Boolean.prototype.toJSON = this_value;
38962 Number.prototype.toJSON = this_value;
38963 String.prototype.toJSON = this_value;
38972 function quote(string) {
38974 // If the string contains no control characters, no quote characters, and no
38975 // backslash characters, then we can safely slap some quotes around it.
38976 // Otherwise we must also replace the offending characters with safe escape
38979 rx_escapable.lastIndex = 0;
38980 return rx_escapable.test(string)
38981 ? "\"" + string.replace(rx_escapable, function (a) {
38983 return typeof c === "string"
38985 : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
38987 : "\"" + string + "\"";
38991 function str(key, holder) {
38993 // Produce a string from holder[key].
38995 var i; // The loop counter.
38996 var k; // The member key.
38997 var v; // The member value.
39001 var value = holder[key];
39003 // If the value has a toJSON method, call it to obtain a replacement value.
39005 if (value && typeof value === "object" &&
39006 typeof value.toJSON === "function") {
39007 value = value.toJSON(key);
39010 // If we were called with a replacer function, then call the replacer to
39011 // obtain a replacement value.
39013 if (typeof rep === "function") {
39014 value = rep.call(holder, key, value);
39017 // What happens next depends on the value's type.
39019 switch (typeof value) {
39021 return quote(value);
39025 // JSON numbers must be finite. Encode non-finite numbers as null.
39027 return isFinite(value)
39034 // If the value is a boolean or null, convert it to a string. Note:
39035 // typeof null does not produce "null". The case is included here in
39036 // the remote chance that this gets fixed someday.
39038 return String(value);
39040 // If the type is "object", we might be dealing with an object or an array or
39045 // Due to a specification blunder in ECMAScript, typeof null is "object",
39046 // so watch out for that case.
39052 // Make an array to hold the partial results of stringifying this object value.
39057 // Is the value an array?
39059 if (Object.prototype.toString.apply(value) === "[object Array]") {
39061 // The value is an array. Stringify every element. Use null as a placeholder
39062 // for non-JSON values.
39064 length = value.length;
39065 for (i = 0; i < length; i += 1) {
39066 partial[i] = str(i, value) || "null";
39069 // Join all of the elements together, separated with commas, and wrap them in
39072 v = partial.length === 0
39075 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
39076 : "[" + partial.join(",") + "]";
39081 // If the replacer is an array, use it to select the members to be stringified.
39083 if (rep && typeof rep === "object") {
39084 length = rep.length;
39085 for (i = 0; i < length; i += 1) {
39086 if (typeof rep[i] === "string") {
39090 partial.push(quote(k) + (
39100 // Otherwise, iterate through all of the keys in the object.
39103 if (Object.prototype.hasOwnProperty.call(value, k)) {
39106 partial.push(quote(k) + (
39116 // Join all of the member texts together, separated with commas,
39117 // and wrap them in braces.
39119 v = partial.length === 0
39122 ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
39123 : "{" + partial.join(",") + "}";
39129 // If the JSON object does not yet have a stringify method, give it one.
39131 if (typeof JSON.stringify !== "function") {
39132 meta = { // table of character substitutions
39141 JSON.stringify = function (value, replacer, space) {
39143 // The stringify method takes a value and an optional replacer, and an optional
39144 // space parameter, and returns a JSON text. The replacer can be a function
39145 // that can replace values, or an array of strings that will select the keys.
39146 // A default replacer method can be provided. Use of the space parameter can
39147 // produce text that is more easily readable.
39153 // If the space parameter is a number, make an indent string containing that
39156 if (typeof space === "number") {
39157 for (i = 0; i < space; i += 1) {
39161 // If the space parameter is a string, it will be used as the indent string.
39163 } else if (typeof space === "string") {
39167 // If there is a replacer, it must be a function or an array.
39168 // Otherwise, throw an error.
39171 if (replacer && typeof replacer !== "function" &&
39172 (typeof replacer !== "object" ||
39173 typeof replacer.length !== "number")) {
39174 throw new Error("JSON.stringify");
39177 // Make a fake root object containing our value under the key of "".
39178 // Return the result of stringifying the value.
39180 return str("", {"": value});
39185 // If the JSON object does not yet have a parse method, give it one.
39187 if (typeof JSON.parse !== "function") {
39188 JSON.parse = function (text, reviver) {
39190 // The parse method takes a text and an optional reviver function, and returns
39191 // a JavaScript value if the text is a valid JSON text.
39195 function walk(holder, key) {
39197 // The walk method is used to recursively walk the resulting structure so
39198 // that modifications can be made.
39202 var value = holder[key];
39203 if (value && typeof value === "object") {
39205 if (Object.prototype.hasOwnProperty.call(value, k)) {
39206 v = walk(value, k);
39207 if (v !== undefined) {
39215 return reviver.call(holder, key, value);
39219 // Parsing happens in four stages. In the first stage, we replace certain
39220 // Unicode characters with escape sequences. JavaScript handles many characters
39221 // incorrectly, either silently deleting them, or treating them as line endings.
39223 text = String(text);
39224 rx_dangerous.lastIndex = 0;
39225 if (rx_dangerous.test(text)) {
39226 text = text.replace(rx_dangerous, function (a) {
39228 ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
39232 // In the second stage, we run the text against regular expressions that look
39233 // for non-JSON patterns. We are especially concerned with "()" and "new"
39234 // because they can cause invocation, and "=" because it can cause mutation.
39235 // But just to be safe, we want to reject all unexpected forms.
39237 // We split the second stage into 4 regexp operations in order to work around
39238 // crippling inefficiencies in IE's and Safari's regexp engines. First we
39239 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
39240 // replace all simple value tokens with "]" characters. Third, we delete all
39241 // open brackets that follow a colon or comma or that begin the text. Finally,
39242 // we look to see that the remaining characters are only whitespace or "]" or
39243 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
39248 .replace(rx_two, "@")
39249 .replace(rx_three, "]")
39250 .replace(rx_four, "")
39254 // In the third stage we use the eval function to compile the text into a
39255 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
39256 // in JavaScript: it can begin a block or an object literal. We wrap the text
39257 // in parens to eliminate the ambiguity.
39259 j = eval("(" + text + ")");
39261 // In the optional fourth stage, we recursively walk the new structure, passing
39262 // each name/value pair to a reviver function for possible transformation.
39264 return (typeof reviver === "function")
39265 ? walk({"": j}, "")
39269 // If the text is not JSON parseable, then a SyntaxError is thrown.
39271 throw new SyntaxError("JSON.parse");
39276 var json2 = json2Plugin;
39278 function json2Plugin() {
39283 var plugins = [json2];
39285 var store_legacy = storeEngine.createStore(all$3, plugins);
39289 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
39290 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
39291 // does not support custom headers, which this uses everywhere.
39292 var osmAuth = function(o) {
39296 // authenticated users will also have a request token secret, but it's
39297 // not used in transactions with the server
39298 oauth.authenticated = function() {
39299 return !!(token('oauth_token') && token('oauth_token_secret'));
39302 oauth.logout = function() {
39303 token('oauth_token', '');
39304 token('oauth_token_secret', '');
39305 token('oauth_request_token_secret', '');
39309 // TODO: detect lack of click event
39310 oauth.authenticate = function(callback) {
39311 if (oauth.authenticated()) return callback();
39315 // ## Getting a request token
39316 var params = timenonce(getAuth(o)),
39317 url = o.url + '/oauth/request_token';
39319 params.oauth_signature = ohauth_1.signature(
39320 o.oauth_secret, '',
39321 ohauth_1.baseString('POST', url, params));
39323 if (!o.singlepage) {
39324 // Create a 600x550 popup window in the center of the screen
39325 var w = 600, h = 550,
39327 ['width', w], ['height', h],
39328 ['left', screen.width / 2 - w / 2],
39329 ['top', screen.height / 2 - h / 2]].map(function(x) {
39330 return x.join('=');
39332 popup = window.open('about:blank', 'oauth_window', settings);
39335 // Request a request token. When this is complete, the popup
39336 // window is redirected to OSM's authorization page.
39337 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
39340 function reqTokenDone(err, xhr) {
39342 if (err) return callback(err);
39343 var resp = ohauth_1.stringQs(xhr.response);
39344 token('oauth_request_token_secret', resp.oauth_token_secret);
39345 var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
39346 oauth_token: resp.oauth_token,
39347 oauth_callback: resolveUrl(o.landing)
39350 if (o.singlepage) {
39351 location.href = authorize_url;
39353 popup.location = authorize_url;
39357 // Called by a function in a landing page, in the popup window. The
39358 // window closes itself.
39359 window.authComplete = function(token) {
39360 var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
39361 get_access_token(oauth_token.oauth_token);
39362 delete window.authComplete;
39365 // ## Getting an request token
39367 // At this point we have an `oauth_token`, brought in from a function
39368 // call on a landing page popup.
39369 function get_access_token(oauth_token) {
39370 var url = o.url + '/oauth/access_token',
39371 params = timenonce(getAuth(o)),
39372 request_token_secret = token('oauth_request_token_secret');
39373 params.oauth_token = oauth_token;
39374 params.oauth_signature = ohauth_1.signature(
39376 request_token_secret,
39377 ohauth_1.baseString('POST', url, params));
39379 // ## Getting an access token
39381 // The final token required for authentication. At this point
39382 // we have a `request token secret`
39383 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39387 function accessTokenDone(err, xhr) {
39389 if (err) return callback(err);
39390 var access_token = ohauth_1.stringQs(xhr.response);
39391 token('oauth_token', access_token.oauth_token);
39392 token('oauth_token_secret', access_token.oauth_token_secret);
39393 callback(null, oauth);
39397 oauth.bootstrapToken = function(oauth_token, callback) {
39398 // ## Getting an request token
39399 // At this point we have an `oauth_token`, brought in from a function
39400 // call on a landing page popup.
39401 function get_access_token(oauth_token) {
39402 var url = o.url + '/oauth/access_token',
39403 params = timenonce(getAuth(o)),
39404 request_token_secret = token('oauth_request_token_secret');
39405 params.oauth_token = oauth_token;
39406 params.oauth_signature = ohauth_1.signature(
39408 request_token_secret,
39409 ohauth_1.baseString('POST', url, params));
39411 // ## Getting an access token
39412 // The final token required for authentication. At this point
39413 // we have a `request token secret`
39414 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
39418 function accessTokenDone(err, xhr) {
39420 if (err) return callback(err);
39421 var access_token = ohauth_1.stringQs(xhr.response);
39422 token('oauth_token', access_token.oauth_token);
39423 token('oauth_token_secret', access_token.oauth_token_secret);
39424 callback(null, oauth);
39427 get_access_token(oauth_token);
39432 // A single XMLHttpRequest wrapper that does authenticated calls if the
39433 // user has logged in.
39434 oauth.xhr = function(options, callback) {
39435 if (!oauth.authenticated()) {
39437 return oauth.authenticate(run);
39439 callback('not authenticated', null);
39447 var params = timenonce(getAuth(o)),
39448 oauth_token_secret = token('oauth_token_secret'),
39449 url = (options.prefix !== false) ? o.url + options.path : options.path,
39450 url_parts = url.replace(/#.*$/, '').split('?', 2),
39451 base_url = url_parts[0],
39452 query = (url_parts.length === 2) ? url_parts[1] : '';
39454 // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
39455 if ((!options.options || !options.options.header ||
39456 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
39458 params = immutable(params, ohauth_1.stringQs(options.content));
39461 params.oauth_token = token('oauth_token');
39462 params.oauth_signature = ohauth_1.signature(
39464 oauth_token_secret,
39465 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
39468 return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
39471 function done(err, xhr) {
39472 if (err) return callback(err);
39473 else if (xhr.responseXML) return callback(err, xhr.responseXML);
39474 else return callback(err, xhr.response);
39478 // pre-authorize this object, if we can just get a token and token_secret
39480 oauth.preauth = function(c) {
39482 if (c.oauth_token) token('oauth_token', c.oauth_token);
39483 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
39487 oauth.options = function(_) {
39488 if (!arguments.length) return o;
39491 o.url = o.url || 'https://www.openstreetmap.org';
39492 o.landing = o.landing || 'land.html';
39493 o.singlepage = o.singlepage || false;
39495 // Optional loading and loading-done functions for nice UI feedback.
39496 // by default, no-ops
39497 o.loading = o.loading || function() {};
39498 o.done = o.done || function() {};
39500 return oauth.preauth(o);
39503 // 'stamp' an authentication object from `getAuth()`
39504 // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
39506 function timenonce(o) {
39507 o.oauth_timestamp = ohauth_1.timestamp();
39508 o.oauth_nonce = ohauth_1.nonce();
39512 // get/set tokens. These are prefixed with the base URL so that `osm-auth`
39513 // can be used with multiple APIs and the keys in `localStorage`
39517 if (store_legacy.enabled) {
39518 token = function (x, y) {
39519 if (arguments.length === 1) return store_legacy.get(o.url + x);
39520 else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
39524 token = function (x, y) {
39525 if (arguments.length === 1) return storage[o.url + x];
39526 else if (arguments.length === 2) return storage[o.url + x] = y;
39530 // Get an authentication object. If you just add and remove properties
39531 // from a single object, you'll need to use `delete` to make sure that
39532 // it doesn't contain undesired properties for authentication
39533 function getAuth(o) {
39535 oauth_consumer_key: o.oauth_consumer_key,
39536 oauth_signature_method: 'HMAC-SHA1'
39540 // potentially pre-authorize
39546 var JXON = new (function () {
39548 sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
39549 aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
39551 function parseText (sValue) {
39552 if (rIsNull.test(sValue)) { return null; }
39553 if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
39554 if (isFinite(sValue)) { return parseFloat(sValue); }
39555 if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
39559 function EmptyTree () { }
39560 EmptyTree.prototype.toString = function () { return 'null'; };
39561 EmptyTree.prototype.valueOf = function () { return null; };
39563 function objectify (vValue) {
39564 return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
39567 function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
39569 nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
39570 bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
39573 sProp, vContent, nLength = 0, sCollectedTxt = '',
39574 vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
39577 for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
39578 oNode = oParentNode.childNodes.item(nItem);
39579 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
39580 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
39581 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
39585 var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
39587 if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
39589 for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
39590 sProp = aCache[nElId].nodeName.toLowerCase();
39591 vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
39592 if (vResult.hasOwnProperty(sProp)) {
39593 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
39594 vResult[sProp].push(vContent);
39596 vResult[sProp] = vContent;
39603 nAttrLen = oParentNode.attributes.length,
39604 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
39606 for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
39607 oAttrib = oParentNode.attributes.item(nAttrib);
39608 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
39612 if (bFreeze) { Object.freeze(oAttrParent); }
39613 vResult[sAttributesProp] = oAttrParent;
39614 nLength -= nAttrLen - 1;
39618 if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
39619 vResult[sValueProp] = vBuiltVal;
39620 } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
39621 vResult = vBuiltVal;
39624 if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
39626 aCache.length = nLevelStart;
39631 function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
39632 var vValue, oChild;
39634 if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
39635 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
39636 } else if (oParentObj.constructor === Date) {
39637 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
39640 for (var sName in oParentObj) {
39641 vValue = oParentObj[sName];
39642 if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
39643 if (sName === sValueProp) {
39644 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
39645 } else if (sName === sAttributesProp) { /* verbosity level is 3 */
39646 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
39647 } else if (sName.charAt(0) === sAttrPref) {
39648 oParentEl.setAttribute(sName.slice(1), vValue);
39649 } else if (vValue.constructor === Array) {
39650 for (var nItem = 0; nItem < vValue.length; nItem++) {
39651 oChild = oXMLDoc.createElement(sName);
39652 loadObjTree(oXMLDoc, oChild, vValue[nItem]);
39653 oParentEl.appendChild(oChild);
39656 oChild = oXMLDoc.createElement(sName);
39657 if (vValue instanceof Object) {
39658 loadObjTree(oXMLDoc, oChild, vValue);
39659 } else if (vValue !== null && vValue !== true) {
39660 oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
39662 oParentEl.appendChild(oChild);
39667 this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
39668 var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
39669 return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
39672 this.unbuild = function (oObjTree) {
39673 var oNewDoc = document.implementation.createDocument('', '', null);
39674 loadObjTree(oNewDoc, oNewDoc, oObjTree);
39678 this.stringify = function (oObjTree) {
39679 return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
39683 // var myObject = JXON.build(doc);
39684 // we got our javascript object! try: alert(JSON.stringify(myObject));
39686 // var newDoc = JXON.unbuild(myObject);
39687 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
39689 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
39690 var urlroot = 'https://www.openstreetmap.org';
39691 var oauth = osmAuth({
39693 oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
39694 oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
39695 loading: authLoading,
39699 var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
39700 var _tiles = { loaded: {}, inflight: {} };
39701 var _changeset = {};
39702 var _entityCache = {};
39703 var _connectionID = 1;
39704 var _tileZoom = 16;
39705 var _rateLimitError;
39706 var _userChangesets;
39711 function authLoading() {
39712 dispatch$3.call('authLoading');
39716 function authDone() {
39717 dispatch$3.call('authDone');
39721 function abortRequest$2(i) {
39728 function getLoc(attrs) {
39729 var lon = attrs.lon && attrs.lon.value;
39730 var lat = attrs.lat && attrs.lat.value;
39731 return [parseFloat(lon), parseFloat(lat)];
39735 function getNodes(obj) {
39736 var elems = obj.getElementsByTagName('nd');
39737 var nodes = new Array(elems.length);
39738 for (var i = 0, l = elems.length; i < l; i++) {
39739 nodes[i] = 'n' + elems[i].attributes.ref.value;
39745 function getTags(obj) {
39746 var elems = obj.getElementsByTagName('tag');
39748 for (var i = 0, l = elems.length; i < l; i++) {
39749 var attrs = elems[i].attributes;
39750 tags[attrs.k.value] = attrs.v.value;
39757 function getMembers(obj) {
39758 var elems = obj.getElementsByTagName('member');
39759 var members = new Array(elems.length);
39760 for (var i = 0, l = elems.length; i < l; i++) {
39761 var attrs = elems[i].attributes;
39763 id: attrs.type.value[0] + attrs.ref.value,
39764 type: attrs.type.value,
39765 role: attrs.role.value
39772 function getVisible(attrs) {
39773 return (!attrs.visible || attrs.visible.value !== 'false');
39778 node: function nodeData(obj, uid) {
39779 var attrs = obj.attributes;
39780 return new osmNode({
39782 visible: getVisible(attrs),
39783 version: attrs.version.value,
39784 changeset: attrs.changeset && attrs.changeset.value,
39785 timestamp: attrs.timestamp && attrs.timestamp.value,
39786 user: attrs.user && attrs.user.value,
39787 uid: attrs.uid && attrs.uid.value,
39788 loc: getLoc(attrs),
39793 way: function wayData(obj, uid) {
39794 var attrs = obj.attributes;
39795 return new osmWay({
39797 visible: getVisible(attrs),
39798 version: attrs.version.value,
39799 changeset: attrs.changeset && attrs.changeset.value,
39800 timestamp: attrs.timestamp && attrs.timestamp.value,
39801 user: attrs.user && attrs.user.value,
39802 uid: attrs.uid && attrs.uid.value,
39803 tags: getTags(obj),
39804 nodes: getNodes(obj),
39808 relation: function relationData(obj, uid) {
39809 var attrs = obj.attributes;
39810 return new osmRelation({
39812 visible: getVisible(attrs),
39813 version: attrs.version.value,
39814 changeset: attrs.changeset && attrs.changeset.value,
39815 timestamp: attrs.timestamp && attrs.timestamp.value,
39816 user: attrs.user && attrs.user.value,
39817 uid: attrs.uid && attrs.uid.value,
39818 tags: getTags(obj),
39819 members: getMembers(obj)
39825 function parse(xml$$1, callback, options) {
39826 options = assignIn({ cache: true }, options);
39827 if (!xml$$1 || !xml$$1.childNodes) return;
39829 var root = xml$$1.childNodes[0];
39830 var children = root.childNodes;
39832 function parseChild(child) {
39833 var parser = parsers[child.nodeName];
39835 var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
39836 if (options.cache && _entityCache[uid]) {
39839 return parser(child, uid);
39843 utilIdleWorker(children, parseChild, callback);
39850 utilRebind(this, dispatch$3, 'on');
39854 reset: function() {
39856 _userChangesets = undefined;
39857 _userDetails = undefined;
39858 _rateLimitError = undefined;
39859 forEach(_tiles.inflight, abortRequest$2);
39860 if (_changeset.inflight) abortRequest$2(_changeset.inflight);
39861 _tiles = { loaded: {}, inflight: {} };
39868 getConnectionId: function() {
39869 return _connectionID;
39873 changesetURL: function(changesetId) {
39874 return urlroot + '/changeset/' + changesetId;
39878 changesetsURL: function(center, zoom) {
39879 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
39880 return urlroot + '/history#map=' +
39881 Math.floor(zoom) + '/' +
39882 center[1].toFixed(precision) + '/' +
39883 center[0].toFixed(precision);
39887 entityURL: function(entity) {
39888 return urlroot + '/' + entity.type + '/' + entity.osmId();
39892 historyURL: function(entity) {
39893 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
39897 userURL: function(username) {
39898 return urlroot + '/user/' + username;
39902 loadFromAPI: function(path, callback, options) {
39903 options = assignIn({ cache: true }, options);
39905 var cid = _connectionID;
39907 function done(err, xml$$1) {
39908 if (that.getConnectionId() !== cid) {
39909 if (callback) callback({ message: 'Connection Switched', status: -1 });
39913 var isAuthenticated = that.authenticated();
39915 // 400 Bad Request, 401 Unauthorized, 403 Forbidden
39916 // Logout and retry the request..
39917 if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
39919 that.loadFromAPI(path, callback);
39921 // else, no retry..
39923 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
39924 // Set the rateLimitError flag and trigger a warning..
39925 if (!isAuthenticated && !_rateLimitError && err &&
39926 (err.status === 509 || err.status === 429)) {
39927 _rateLimitError = err;
39928 dispatch$3.call('change');
39932 if (err) return callback(err, null);
39933 parse(xml$$1, function (entities) {
39934 if (options.cache) {
39935 for (var i in entities) {
39936 _entityCache[entities[i].id] = true;
39939 callback(null, entities);
39945 if (this.authenticated()) {
39946 return oauth.xhr({ method: 'GET', path: path }, done);
39948 var url = urlroot + path;
39949 return d3_xml(url).get(done);
39954 loadEntity: function(id, callback) {
39955 var type = osmEntity$$1.id.type(id);
39956 var osmID = osmEntity$$1.id.toOSM(id);
39957 var options = { cache: false };
39960 '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
39961 function(err, entities) {
39962 if (callback) callback(err, { data: entities });
39969 loadEntityVersion: function(id, version, callback) {
39970 var type = osmEntity$$1.id.type(id);
39971 var osmID = osmEntity$$1.id.toOSM(id);
39972 var options = { cache: false };
39975 '/api/0.6/' + type + '/' + osmID + '/' + version,
39976 function(err, entities) {
39977 if (callback) callback(err, { data: entities });
39984 loadMultiple: function(ids, callback) {
39987 forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
39988 var type = k + 's';
39989 var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
39990 var options = { cache: false };
39992 forEach(chunk(osmIDs, 150), function(arr) {
39994 '/api/0.6/' + type + '?' + type + '=' + arr.join(),
39995 function(err, entities) {
39996 if (callback) callback(err, { data: entities });
40005 authenticated: function() {
40006 return oauth.authenticated();
40010 putChangeset: function(changeset, changes, callback) {
40011 if (_changeset.inflight) {
40012 return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
40016 var cid = _connectionID;
40018 if (_changeset.open) { // reuse existing open changeset..
40019 createdChangeset(null, _changeset.open);
40020 } else { // open a new changeset..
40021 _changeset.inflight = oauth.xhr({
40023 path: '/api/0.6/changeset/create',
40024 options: { header: { 'Content-Type': 'text/xml' } },
40025 content: JXON.stringify(changeset.asJXON())
40026 }, createdChangeset);
40030 function createdChangeset(err, changesetID) {
40031 _changeset.inflight = null;
40034 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40035 if (err.status === 400 || err.status === 401 || err.status === 403) {
40038 return callback(err, changeset);
40040 if (that.getConnectionId() !== cid) {
40041 return callback({ message: 'Connection Switched', status: -1 }, changeset);
40044 _changeset.open = changesetID;
40045 changeset = changeset.update({ id: changesetID });
40047 // Upload the changeset..
40048 _changeset.inflight = oauth.xhr({
40050 path: '/api/0.6/changeset/' + changesetID + '/upload',
40051 options: { header: { 'Content-Type': 'text/xml' } },
40052 content: JXON.stringify(changeset.osmChangeJXON(changes))
40053 }, uploadedChangeset);
40057 function uploadedChangeset(err) {
40058 _changeset.inflight = null;
40060 if (err) return callback(err, changeset);
40062 // Upload was successful, safe to call the callback.
40063 // Add delay to allow for postgres replication #1646 #2678
40064 window.setTimeout(function() {
40065 callback(null, changeset);
40068 _changeset.open = null;
40070 // At this point, we don't really care if the connection was switched..
40071 // Only try to close the changeset if we're still talking to the same server.
40072 if (that.getConnectionId() === cid) {
40073 // Still attempt to close changeset, but ignore response because #2667
40076 path: '/api/0.6/changeset/' + changeset.id + '/close',
40077 options: { header: { 'Content-Type': 'text/xml' } }
40078 }, function() { return true; });
40084 userDetails: function(callback) {
40085 if (_userDetails) {
40086 callback(undefined, _userDetails);
40091 var cid = _connectionID;
40093 function done(err, user_details) {
40095 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40096 if (err.status === 400 || err.status === 401 || err.status === 403) {
40099 return callback(err);
40101 if (that.getConnectionId() !== cid) {
40102 return callback({ message: 'Connection Switched', status: -1 });
40106 var u = user_details.getElementsByTagName('user')[0];
40107 var img = u.getElementsByTagName('img');
40108 var image_url = '';
40110 if (img && img[0] && img[0].getAttribute('href')) {
40111 image_url = img[0].getAttribute('href');
40114 var changesets = u.getElementsByTagName('changesets');
40115 var changesets_count = 0;
40117 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
40118 changesets_count = changesets[0].getAttribute('count');
40122 id: u.attributes.id.value,
40123 display_name: u.attributes.display_name.value,
40124 image_url: image_url,
40125 changesets_count: changesets_count
40128 callback(undefined, _userDetails);
40131 oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
40135 userChangesets: function(callback) {
40136 if (_userChangesets) {
40137 callback(undefined, _userChangesets);
40142 var cid = _connectionID;
40144 this.userDetails(function(err, user) {
40146 return callback(err);
40148 if (that.getConnectionId() !== cid) {
40149 return callback({ message: 'Connection Switched', status: -1 });
40152 function done(err, changesets) {
40154 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
40155 if (err.status === 400 || err.status === 401 || err.status === 403) {
40158 return callback(err);
40160 if (that.getConnectionId() !== cid) {
40161 return callback({ message: 'Connection Switched', status: -1 });
40164 _userChangesets = Array.prototype.map.call(
40165 changesets.getElementsByTagName('changeset'),
40166 function (changeset) {
40167 return { tags: getTags(changeset) };
40169 ).filter(function (changeset) {
40170 var comment = changeset.tags.comment;
40171 return comment && comment !== '';
40174 callback(undefined, _userChangesets);
40177 oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
40182 status: function(callback) {
40184 var cid = _connectionID;
40186 function done(xml$$1) {
40187 if (that.getConnectionId() !== cid) {
40188 return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
40191 // update blacklists
40192 var elements = xml$$1.getElementsByTagName('blacklist');
40194 for (var i = 0; i < elements.length; i++) {
40195 var regex = elements[i].getAttribute('regex'); // needs unencode?
40197 regexes.push(regex);
40200 if (regexes.length) {
40201 _blacklists = regexes;
40205 if (_rateLimitError) {
40206 callback(_rateLimitError, 'rateLimited');
40208 var apiStatus = xml$$1.getElementsByTagName('status');
40209 var val = apiStatus[0].getAttribute('api');
40211 callback(undefined, val);
40215 d3_xml(urlroot + '/api/capabilities').get()
40217 .on('error', callback);
40221 imageryBlacklists: function() {
40222 return _blacklists;
40226 tileZoom: function(_) {
40227 if (!arguments.length) return _tileZoom;
40233 loadTiles: function(projection, dimensions, callback) {
40237 var s = projection.scale() * 2 * Math.PI;
40238 var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
40239 var ts = 256 * Math.pow(2, z - _tileZoom);
40241 s / 2 - projection.translate()[0],
40242 s / 2 - projection.translate()[1]
40245 var tiles = d3geoTile()
40246 .scaleExtent([_tileZoom, _tileZoom])
40249 .translate(projection.translate())()
40250 .map(function(tile) {
40251 var x = tile[0] * ts - origin[0];
40252 var y = tile[1] * ts - origin[1];
40255 id: tile.toString(),
40256 extent: geoExtent$$1(
40257 projection.invert([x, y + ts]),
40258 projection.invert([x + ts, y]))
40262 filter(_tiles.inflight, function(v, i) {
40263 var wanted = find$1(tiles, function(tile) {
40264 return i === tile.id;
40266 if (!wanted) delete _tiles.inflight[i];
40268 }).map(abortRequest$2);
40270 tiles.forEach(function(tile) {
40273 if (_tiles.loaded[id] || _tiles.inflight[id]) return;
40275 if (isEmpty(_tiles.inflight)) {
40276 dispatch$3.call('loading');
40279 _tiles.inflight[id] = that.loadFromAPI(
40280 '/api/0.6/map?bbox=' + tile.extent.toParam(),
40281 function(err, parsed) {
40282 delete _tiles.inflight[id];
40284 _tiles.loaded[id] = true;
40288 callback(err, assignIn({ data: parsed }, tile));
40291 if (isEmpty(_tiles.inflight)) {
40292 dispatch$3.call('loaded');
40300 switch: function(options) {
40301 urlroot = options.urlroot;
40303 oauth.options(assignIn({
40305 loading: authLoading,
40310 this.userChangesets(function() {}); // eagerly load user details/changesets
40311 dispatch$3.call('change');
40316 toggle: function(_) {
40322 loadedTiles: function(_) {
40323 if (!arguments.length) return _tiles.loaded;
40329 logout: function() {
40330 _userChangesets = undefined;
40331 _userDetails = undefined;
40333 dispatch$3.call('change');
40338 authenticate: function(callback) {
40340 var cid = _connectionID;
40341 _userChangesets = undefined;
40342 _userDetails = undefined;
40344 function done(err, res) {
40346 if (callback) callback(err);
40349 if (that.getConnectionId() !== cid) {
40350 if (callback) callback({ message: 'Connection Switched', status: -1 });
40353 _rateLimitError = undefined;
40354 dispatch$3.call('change');
40355 if (callback) callback(err, res);
40356 that.userChangesets(function() {}); // eagerly load user details/changesets
40359 return oauth.authenticate(done);
40363 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
40368 point: 'count_nodes',
40369 vertex: 'count_nodes',
40370 area: 'count_ways',
40373 tag_sort_members = {
40374 point: 'count_node_members',
40375 vertex: 'count_node_members',
40376 area: 'count_way_members',
40377 line: 'count_way_members',
40378 relation: 'count_relation_members'
40386 tag_members_fractions = {
40387 point: 'count_node_members_fraction',
40388 vertex: 'count_node_members_fraction',
40389 area: 'count_way_members_fraction',
40390 line: 'count_way_members_fraction',
40391 relation: 'count_relation_members_fraction'
40395 function sets(params, n, o) {
40396 if (params.geometry && o[params.geometry]) {
40397 params[n] = o[params.geometry];
40403 function setFilter(params) {
40404 return sets(params, 'filter', tag_filters);
40408 function setSort(params) {
40409 return sets(params, 'sortname', tag_sorts);
40413 function setSortMembers(params) {
40414 return sets(params, 'sortname', tag_sort_members);
40418 function clean(params) {
40419 return omit(params, ['geometry', 'debounce']);
40423 function filterKeys(type) {
40424 var count_type = type ? 'count_' + type : 'count_all';
40425 return function(d) {
40426 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
40431 function filterMultikeys(prefix) {
40432 return function(d) {
40433 // d.key begins with prefix, and d.key contains no additional ':'s
40434 var re = new RegExp('^' + prefix + '(.*)$');
40435 var matches = d.key.match(re) || [];
40436 return (matches.length === 2 && matches[1].indexOf(':') === -1);
40441 function filterValues(allowUpperCase) {
40442 return function(d) {
40443 if (d.value.match(/[;,]/) !== null) return false; // exclude some punctuation
40444 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false; // exclude uppercase letters
40445 return parseFloat(d.fraction) > 0.0 || d.in_wiki;
40450 function filterRoles(geometry) {
40451 return function(d) {
40452 if (d.role === '') return false; // exclude empty role
40453 if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
40454 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
40459 function valKey(d) {
40467 function valKeyDescription(d) {
40470 title: d.description || d.value
40475 function roleKey(d) {
40483 // sort keys with ':' lower than keys without ':'
40484 function sortKeys(a, b) {
40485 return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
40486 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
40491 var debouncedRequest = debounce(request, 500, { leading: false });
40493 function request(url, params, exactMatch, callback, loaded) {
40494 if (inflight$1[url]) return;
40496 if (checkCache(url, params, exactMatch, callback)) return;
40498 inflight$1[url] = d3_json(url, function (err, data) {
40499 delete inflight$1[url];
40505 function checkCache(url, params, exactMatch, callback) {
40506 var rp = params.rp || 25,
40507 testQuery = params.query || '',
40511 var hit = taginfoCache[testUrl];
40513 // exact match, or shorter match yielding fewer than max results (rp)
40514 if (hit && (url === testUrl || hit.length < rp)) {
40515 callback(null, hit);
40519 // don't try to shorten the query
40520 if (exactMatch || !testQuery.length) return false;
40522 // do shorten the query to see if we already have a cached result
40523 // that has returned fewer than max results (rp)
40524 testQuery = testQuery.slice(0, -1);
40525 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
40526 } while (testQuery.length >= 0);
40532 var serviceTaginfo = {
40539 // Fetch popular keys. We'll exclude these from `values`
40540 // lookups because they stress taginfo, and they aren't likely
40541 // to yield meaningful autocomplete results.. see #3955
40542 var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
40543 this.keys(params, function(err, data) {
40545 data.forEach(function(d) {
40546 if (d.value === 'opening_hours') return; // exception
40547 popularKeys[d.value] = true;
40553 reset: function() {
40554 forEach(inflight$1, function(req) { req.abort(); });
40559 keys: function(params, callback) {
40560 var doRequest = params.debounce ? debouncedRequest : request;
40561 params = clean(setSort(params));
40562 params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40564 var url = apibase$3 + 'keys/all?' + utilQsString(params);
40565 doRequest(url, params, false, callback, function(err, d) {
40569 var f = filterKeys(params.filter);
40570 var result = d.data.filter(f).sort(sortKeys).map(valKey);
40571 taginfoCache[url] = result;
40572 callback(null, result);
40578 multikeys: function(params, callback) {
40579 var doRequest = params.debounce ? debouncedRequest : request;
40580 params = clean(setSort(params));
40581 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40582 var prefix = params.query;
40584 var url = apibase$3 + 'keys/all?' + utilQsString(params);
40585 doRequest(url, params, true, callback, function(err, d) {
40589 var f = filterMultikeys(prefix);
40590 var result = d.data.filter(f).map(valKey);
40591 taginfoCache[url] = result;
40592 callback(null, result);
40598 values: function(params, callback) {
40599 // Exclude popular keys from values lookups.. see #3955
40600 var key = params.key;
40601 if (key && popularKeys[key]) {
40602 callback(null, []);
40606 var doRequest = params.debounce ? debouncedRequest : request;
40607 params = clean(setSort(setFilter(params)));
40608 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
40610 var url = apibase$3 + 'key/values?' + utilQsString(params);
40611 doRequest(url, params, false, callback, function(err, d) {
40615 // In most cases we prefer taginfo value results with lowercase letters.
40616 // A few OSM keys expect values to contain uppercase values (see #3377).
40617 // This is not an exhaustive list (e.g. `name` also has uppercase values)
40618 // but these are the fields where taginfo value lookup is most useful.
40619 var re = /network|taxon|genus|species|brand|grape_variety|rating|:output|_hours|_times/;
40620 var allowUpperCase = (params.key.match(re) !== null);
40621 var f = filterValues(allowUpperCase);
40623 var result = d.data.filter(f).map(valKeyDescription);
40624 taginfoCache[url] = result;
40625 callback(null, result);
40631 roles: function(params, callback) {
40632 var doRequest = params.debounce ? debouncedRequest : request;
40633 var geometry = params.geometry;
40634 params = clean(setSortMembers(params));
40635 params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
40637 var url = apibase$3 + 'relation/roles?' + utilQsString(params);
40638 doRequest(url, params, true, callback, function(err, d) {
40642 var f = filterRoles(geometry);
40643 var result = d.data.filter(f).map(roleKey);
40644 taginfoCache[url] = result;
40645 callback(null, result);
40651 docs: function(params, callback) {
40652 var doRequest = params.debounce ? debouncedRequest : request;
40653 params = clean(setSort(params));
40655 var path = 'key/wiki_pages?';
40656 if (params.value) path = 'tag/wiki_pages?';
40657 else if (params.rtype) path = 'relation/wiki_pages?';
40659 var url = apibase$3 + path + utilQsString(params);
40660 doRequest(url, params, true, callback, function(err, d) {
40664 taginfoCache[url] = d.data;
40665 callback(null, d.data);
40671 apibase: function(_) {
40672 if (!arguments.length) return apibase$3;
40679 var jsonpCache = {};
40680 window.jsonpCache = jsonpCache;
40682 function jsonpRequest(url, callback) {
40684 if (window.JSONP_FIX) {
40685 if (window.JSONP_DELAY === 0) {
40686 callback(window.JSONP_FIX);
40688 setTimeout(function() {
40689 callback(window.JSONP_FIX);
40690 }, window.JSONP_DELAY || 0);
40696 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
40698 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
40702 function create$$1(url) {
40703 var e = url.match(/callback=(\w+)/),
40704 c = e ? e[1] : rand();
40705 jsonpCache[c] = function(data) {
40707 delete jsonpCache[c];
40710 return 'jsonpCache.' + c;
40713 var cb = create$$1(url),
40714 script = d3_select('head')
40716 .attr('type', 'text/javascript')
40717 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
40720 var endpoint = 'https://www.wikidata.org/w/api.php?';
40722 var serviceWikidata = {
40724 init: function() {},
40725 reset: function() {},
40728 // Given a Wikipedia language and article title, return an array of
40729 // corresponding Wikidata entities.
40730 itemsByTitle: function(lang, title, callback) {
40736 lang = lang || 'en';
40737 jsonpRequest(endpoint + utilQsString({
40738 action: 'wbgetentities',
40740 sites: lang.replace(/-/g, '_') + 'wiki',
40742 languages: 'en', // shrink response by filtering to one language
40743 callback: '{callback}'
40744 }), function(data) {
40745 if (!data || data.error) {
40748 callback(title, data.entities || {});
40755 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
40757 var serviceWikipedia = {
40759 init: function() {},
40760 reset: function() {},
40763 search: function(lang, query, callback) {
40769 lang = lang || 'en';
40770 jsonpRequest(endpoint$1.replace('en', lang) +
40775 srinfo: 'suggestion',
40777 callback: '{callback}',
40779 }), function(data) {
40780 if (!data || !data.query || !data.query.search || data.error) {
40783 var results = data.query.search.map(function(d) { return d.title; });
40784 callback(query, results);
40791 suggestions: function(lang, query, callback) {
40797 lang = lang || 'en';
40798 jsonpRequest(endpoint$1.replace('en', lang) +
40800 action: 'opensearch',
40804 callback: '{callback}',
40806 }), function(data) {
40807 if (!data || data.error) {
40810 callback(data[0], data[1] || []);
40817 translations: function(lang, title, callback) {
40823 jsonpRequest(endpoint$1.replace('en', lang) +
40828 callback: '{callback}',
40831 }), function(data) {
40832 if (!data || !data.query || !data.query.pages || data.error) {
40835 var list = data.query.pages[Object.keys(data.query.pages)[0]],
40837 if (list && list.langlinks) {
40838 list.langlinks.forEach(function(d) {
40839 translations[d.lang] = d['*'];
40842 callback(translations);
40851 geocoder: serviceNominatim,
40852 mapillary: serviceMapillary,
40853 openstreetcam: serviceOpenstreetcam,
40855 taginfo: serviceTaginfo,
40856 wikidata: serviceWikidata,
40857 wikipedia: serviceWikipedia
40860 function svgAreas$$1(projection, context) {
40861 // Patterns only work in Firefox when set directly on element.
40862 // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
40865 cemetery: 'cemetery',
40866 construction: 'construction',
40868 farmland: 'farmland',
40869 grave_yard: 'cemetery',
40871 military: 'construction',
40872 orchard: 'orchard',
40875 wetland: 'wetland',
40878 var patternKeys = ['landuse', 'natural', 'amenity'];
40881 function setPattern(d) {
40882 for (var i = 0; i < patternKeys.length; i++) {
40883 if (d.tags.building && d.tags.building !== 'no') continue;
40885 if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
40886 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
40890 this.style.fill = this.style.stroke = '';
40894 function drawTargets(selection, graph, entities, filter) {
40895 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40896 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40897 var getPath = svgPath(projection).geojson;
40898 var activeID = context.activeID();
40900 // The targets and nopes will be MultiLineString sub-segments of the ways
40901 var data = { targets: [], nopes: [] };
40903 entities.forEach(function(way) {
40904 var features = svgSegmentWay(way, graph, activeID);
40905 data.targets.push.apply(data.targets, features.passive);
40906 data.nopes.push.apply(data.nopes, features.active);
40910 // Targets allow hover and vertex snapping
40911 var targetData = data.targets.filter(getPath);
40912 var targets = selection.selectAll('.area.target-allowed')
40913 .filter(function(d) { return filter(d.properties.entity); })
40914 .data(targetData, function key(d) { return d.id; });
40924 .attr('d', getPath)
40925 .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
40929 var nopeData = data.nopes.filter(getPath);
40930 var nopes = selection.selectAll('.area.target-nope')
40931 .filter(function(d) { return filter(d.properties.entity); })
40932 .data(nopeData, function key(d) { return d.id; });
40942 .attr('d', getPath)
40943 .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
40947 function drawAreas(selection, graph, entities, filter) {
40948 var path = svgPath(projection, graph, true),
40952 for (var i = 0; i < entities.length; i++) {
40953 var entity = entities[i];
40954 if (entity.geometry(graph) !== 'area') continue;
40956 multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
40957 if (multipolygon) {
40958 areas[multipolygon.id] = {
40959 entity: multipolygon.mergeTags(entity.tags),
40960 area: Math.abs(entity.area(graph))
40962 } else if (!areas[entity.id]) {
40963 areas[entity.id] = {
40965 area: Math.abs(entity.area(graph))
40970 areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
40971 areas.sort(function areaSort(a, b) { return b.area - a.area; });
40972 areas = map$3(areas, 'entity');
40974 var strokes = areas.filter(function(area) {
40975 return area.type === 'way';
40985 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
40987 .data(data.clip, osmEntity$$1.key);
40992 var clipPathsEnter = clipPaths.enter()
40993 .append('clipPath')
40994 .attr('class', 'clipPath')
40995 .attr('id', function(entity) { return entity.id + '-clippath'; });
41000 clipPaths.merge(clipPathsEnter)
41005 var layer = selection.selectAll('.layer-areas .layer-areas-areas');
41007 var areagroup = layer
41008 .selectAll('g.areagroup')
41009 .data(['fill', 'shadow', 'stroke']);
41011 areagroup = areagroup.enter()
41013 .attr('class', function(d) { return 'areagroup area-' + d; })
41016 var paths = areagroup
41019 .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
41024 var fills = selection.selectAll('.area-fill path.area').nodes();
41026 var bisect = d3_bisector(function(node) {
41027 return -node.__data__.area(graph);
41030 function sortedByArea(entity) {
41031 if (this._parent.__data__ === 'fill') {
41032 return fills[bisect(fills, -entity.area(graph))];
41036 paths = paths.enter()
41037 .insert('path', sortedByArea)
41039 .each(function(entity) {
41040 var layer = this.parentNode.__data__;
41042 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
41044 if (layer === 'fill') {
41045 this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
41046 setPattern.apply(this, arguments);
41049 .call(svgTagClasses())
41054 selection.selectAll('.layer-areas .layer-areas-targets')
41055 .call(drawTargets, graph, data.stroke, filter);
41061 function svgDebug$$1(projection, context) {
41063 function multipolygons(imagery) {
41064 return imagery.map(function(data$$1) {
41066 type: 'MultiPolygon',
41067 coordinates: [ data$$1.polygon ]
41072 function drawDebug(selection$$1) {
41073 var showsTile = context.getDebug('tile');
41074 var showsCollision = context.getDebug('collision');
41075 var showsImagery = context.getDebug('imagery');
41076 var showsImperial = context.getDebug('imperial');
41077 var showsDriveLeft = context.getDebug('driveLeft');
41078 var showsTouchTargets = context.getDebug('target');
41080 var debugData = [];
41082 debugData.push({ class: 'red', label: 'tile' });
41084 if (showsCollision) {
41085 debugData.push({ class: 'yellow', label: 'collision' });
41087 if (showsImagery) {
41088 debugData.push({ class: 'orange', label: 'imagery' });
41090 if (showsImperial) {
41091 debugData.push({ class: 'cyan', label: 'imperial' });
41093 if (showsDriveLeft) {
41094 debugData.push({ class: 'green', label: 'driveLeft' });
41096 if (showsTouchTargets) {
41097 debugData.push({ class: 'pink', label: 'touchTargets' });
41101 var legend = d3_select('#content')
41102 .selectAll('.debug-legend')
41103 .data(debugData.length ? [0] : []);
41108 legend = legend.enter()
41110 .attr('class', 'fillD debug-legend')
41114 var legendItems = legend.selectAll('.debug-legend-item')
41115 .data(debugData, function(d) { return d.label; });
41120 legendItems.enter()
41122 .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
41123 .text(function(d) { return d.label; });
41126 var layer = selection$$1.selectAll('.layer-debug')
41127 .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
41132 layer = layer.enter()
41134 .attr('class', 'layer-debug')
41138 var extent = context.map().extent();
41139 var dataImagery = data.imagery || [];
41140 var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
41141 if (!source.polygon) return false;
41142 return source.polygon.some(function(polygon) {
41143 return geoPolygonIntersectsPolygon(polygon, extent, true);
41147 var imagery = layer.selectAll('path.debug-imagery')
41148 .data(showsImagery ? availableImagery : []);
41155 .attr('class', 'debug-imagery debug orange');
41158 var imperial = layer
41159 .selectAll('path.debug-imperial')
41160 .data(showsImperial ? [dataImperial] : []);
41167 .attr('class', 'debug-imperial debug cyan');
41170 var driveLeft = layer
41171 .selectAll('path.debug-drive-left')
41172 .data(showsDriveLeft ? [dataDriveLeft] : []);
41179 .attr('class', 'debug-drive-left debug green');
41183 layer.selectAll('path')
41184 .attr('d', svgPath(projection).geojson);
41188 // This looks strange because `enabled` methods on other layers are
41189 // chainable getter/setters, and this one is just a getter.
41190 drawDebug.enabled = function() {
41191 if (!arguments.length) {
41192 return context.getDebug('tile') ||
41193 context.getDebug('collision') ||
41194 context.getDebug('imagery') ||
41195 context.getDebug('imperial') ||
41196 context.getDebug('driveLeft') ||
41197 context.getDebug('target');
41208 A standalone SVG element that contains only a `defs` sub-element. To be
41209 used once globally, since defs IDs must be unique within a document.
41211 function svgDefs(context) {
41213 function SVGSpriteDefinition(id, href) {
41214 return function(defs) {
41216 .mimeType('image/svg+xml')
41217 .response(function(xhr) { return xhr.responseXML; })
41218 .get(function(err, svg) {
41220 defs.node().appendChild(
41221 d3_select(svg.documentElement).attr('id', id).node()
41228 return function drawDefs(selection$$1) {
41229 var defs = selection$$1.append('defs');
41234 .attr('id', 'oneway-marker')
41235 .attr('viewBox', '0 0 10 5')
41238 .attr('markerWidth', 2)
41239 .attr('markerHeight', 2)
41240 .attr('markerUnits', 'strokeWidth')
41241 .attr('orient', 'auto')
41243 .attr('class', 'oneway-marker-path')
41244 .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')
41245 .attr('stroke', 'none')
41246 .attr('fill', '#000')
41247 .attr('opacity', '0.75');
41251 .attr('id', 'viewfield-marker')
41252 .attr('viewBox', '0 0 16 16')
41255 .attr('markerWidth', 4)
41256 .attr('markerHeight', 4)
41257 .attr('markerUnits', 'strokeWidth')
41258 .attr('orient', 'auto')
41260 .attr('class', 'viewfield-marker-path')
41261 .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
41262 .attr('fill', '#333')
41263 .attr('fill-opacity', '0.75')
41264 .attr('stroke', '#fff')
41265 .attr('stroke-width', '0.5px')
41266 .attr('stroke-opacity', '0.75');
41270 .attr('id', 'viewfield-marker-wireframe')
41271 .attr('viewBox', '0 0 16 16')
41274 .attr('markerWidth', 4)
41275 .attr('markerHeight', 4)
41276 .attr('markerUnits', 'strokeWidth')
41277 .attr('orient', 'auto')
41279 .attr('class', 'viewfield-marker-path')
41280 .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
41281 .attr('fill', 'none')
41282 .attr('stroke', '#fff')
41283 .attr('stroke-width', '0.5px')
41284 .attr('stroke-opacity', '0.75');
41287 var patterns = defs.selectAll('pattern')
41289 // pattern name, pattern image name
41290 ['wetland', 'wetland'],
41291 ['construction', 'construction'],
41292 ['cemetery', 'cemetery'],
41293 ['orchard', 'orchard'],
41294 ['farmland', 'farmland'],
41301 .attr('id', function (d) { return 'pattern-' + d[0]; })
41303 .attr('height', 32)
41304 .attr('patternUnits', 'userSpaceOnUse');
41311 .attr('height', 32)
41312 .attr('class', function (d) { return 'pattern-color-' + d[0]; });
41319 .attr('height', 32)
41320 .attr('xlink:href', function (d) {
41321 return context.imagePath('pattern/' + d[1] + '.png');
41325 defs.selectAll('clipPath')
41326 .data([12, 18, 20, 32, 45])
41328 .append('clipPath')
41329 .attr('id', function (d) { return 'clip-square-' + d; })
41333 .attr('width', function (d) { return d; })
41334 .attr('height', function (d) { return d; });
41336 // symbol spritesheets
41338 .call(SVGSpriteDefinition('iD-sprite', context.imagePath('iD-sprite.svg')))
41339 .call(SVGSpriteDefinition('maki-sprite', context.imagePath('maki-sprite.svg')));
41344 * Checks if `value` is `undefined`.
41350 * @param {*} value The value to check.
41351 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
41354 * _.isUndefined(void 0);
41357 * _.isUndefined(null);
41360 function isUndefined(value) {
41361 return value === undefined;
41364 //[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]
41365 //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
41366 //[5] Name ::= NameStartChar (NameChar)*
41367 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
41368 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
41369 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
41370 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
41371 //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(',')
41373 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
41374 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
41375 var S_TAG = 0;//tag name offerring
41376 var S_ATTR = 1;//attr name offerring
41377 var S_ATTR_SPACE=2;//attr name end and space offer
41378 var S_EQ = 3;//=space?
41379 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
41380 var S_ATTR_END = 5;//attr value end and no space(quot end)
41381 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
41382 var S_TAG_CLOSE = 7;//closed el<el />
41384 function XMLReader(){
41388 XMLReader.prototype = {
41389 parse:function(source,defaultNSMap,entityMap){
41390 var domBuilder = this.domBuilder;
41391 domBuilder.startDocument();
41392 _copy(defaultNSMap ,defaultNSMap = {});
41393 parse$1(source,defaultNSMap,entityMap,
41394 domBuilder,this.errorHandler);
41395 domBuilder.endDocument();
41398 function parse$1(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
41399 function fixedFromCharCode(code) {
41400 // String.prototype.fromCharCode does not supports
41401 // > 2 bytes unicode chars directly
41402 if (code > 0xffff) {
41404 var surrogate1 = 0xd800 + (code >> 10)
41405 , surrogate2 = 0xdc00 + (code & 0x3ff);
41407 return String.fromCharCode(surrogate1, surrogate2);
41409 return String.fromCharCode(code);
41412 function entityReplacer(a){
41413 var k = a.slice(1,-1);
41414 if(k in entityMap){
41415 return entityMap[k];
41416 }else if(k.charAt(0) === '#'){
41417 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
41419 errorHandler.error('entity not found:'+a);
41423 function appendText(end){//has some bugs
41425 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
41426 locator&&position(start);
41427 domBuilder.characters(xt,0,end-start);
41431 function position(p,m){
41432 while(p>=lineEnd && (m = linePattern.exec(source))){
41433 lineStart = m.index;
41434 lineEnd = lineStart + m[0].length;
41435 locator.lineNumber++;
41436 //console.log('line++:',locator,startPos,endPos)
41438 locator.columnNumber = p-lineStart+1;
41442 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
41443 var locator = domBuilder.locator;
41445 var parseStack = [{currentNSMap:defaultNSMapCopy}];
41450 var tagStart = source.indexOf('<',start);
41452 if(!source.substr(start).match(/^\s*$/)){
41453 var doc = domBuilder.doc;
41454 var text = doc.createTextNode(source.substr(start));
41455 doc.appendChild(text);
41456 domBuilder.currentElement = text;
41460 if(tagStart>start){
41461 appendText(tagStart);
41463 switch(source.charAt(tagStart+1)){
41465 var end = source.indexOf('>',tagStart+3);
41466 var tagName = source.substring(tagStart+2,end);
41467 var config = parseStack.pop();
41470 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
41471 //console.error('#@@@@@@'+tagName)
41472 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
41473 end = tagStart+1+tagName.length;
41474 }else if(tagName.match(/\s</)){
41475 tagName = tagName.replace(/[\s<].*/,'');
41476 errorHandler.error("end tag name: "+tagName+' maybe not complete');
41477 end = tagStart+1+tagName.length;
41479 //console.error(parseStack.length,parseStack)
41480 //console.error(config);
41481 var localNSMap = config.localNSMap;
41482 var endMatch = config.tagName == tagName;
41483 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
41484 if(endIgnoreCaseMach){
41485 domBuilder.endElement(config.uri,config.localName,tagName);
41487 for(var prefix in localNSMap){
41488 domBuilder.endPrefixMapping(prefix) ;
41492 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
41495 parseStack.push(config);
41501 case '?':// <?...?>
41502 locator&&position(tagStart);
41503 end = parseInstruction(source,tagStart,domBuilder);
41505 case '!':// <!doctype,<![CDATA,<!--
41506 locator&&position(tagStart);
41507 end = parseDCC(source,tagStart,domBuilder,errorHandler);
41510 locator&&position(tagStart);
41511 var el = new ElementAttributes();
41512 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41514 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
41515 var len = el.length;
41518 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
41520 if(!entityMap.nbsp){
41521 errorHandler.warning('unclosed xml attribute');
41524 if(locator && len){
41525 var locator2 = copyLocator(locator,{});
41526 //try{//attribute position fixed
41527 for(var i = 0;i<len;i++){
41529 position(a.offset);
41530 a.locator = copyLocator(locator,{});
41532 //}catch(e){console.error('@@@@@'+e)}
41533 domBuilder.locator = locator2;
41534 if(appendElement(el,domBuilder,currentNSMap)){
41535 parseStack.push(el);
41537 domBuilder.locator = locator;
41539 if(appendElement(el,domBuilder,currentNSMap)){
41540 parseStack.push(el);
41546 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
41547 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
41553 errorHandler.error('element parse error: '+e);
41554 //errorHandler.error('element parse error: '+e);
41561 //TODO: 这里有可能sax回退,有位置错误风险
41562 appendText(Math.max(tagStart,start)+1);
41566 function copyLocator(f,t){
41567 t.lineNumber = f.lineNumber;
41568 t.columnNumber = f.columnNumber;
41573 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
41574 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
41576 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
41580 var s = S_TAG;//status
41582 var c = source.charAt(p);
41585 if(s === S_ATTR){//attrName
41586 attrName = source.slice(start,p);
41588 }else if(s === S_ATTR_SPACE){
41591 //fatalError: equal must after attrName or space after attrName
41592 throw new Error('attribute equal must after attrName');
41597 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
41600 errorHandler.warning('attribute value must after "="');
41601 attrName = source.slice(start,p);
41604 p = source.indexOf(c,start);
41606 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41607 el.add(attrName,value,start-1);
41610 //fatalError: no end quot match
41611 throw new Error('attribute value no end \''+c+'\' match');
41613 }else if(s == S_ATTR_NOQUOT_VALUE){
41614 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41615 //console.log(attrName,value,start,p)
41616 el.add(attrName,value,start);
41618 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
41622 //fatalError: no equal before
41623 throw new Error('attribute value must after "="');
41629 el.setTagName(source.slice(start,p));
41635 case S_ATTR_NOQUOT_VALUE:
41641 throw new Error("attribute invalid close char('/')")
41644 case ''://end document
41645 //throw new Error('unexpected end of input')
41646 errorHandler.error('unexpected end of input');
41648 el.setTagName(source.slice(start,p));
41654 el.setTagName(source.slice(start,p));
41659 case S_ATTR_NOQUOT_VALUE://Compatible state
41661 value = source.slice(start,p);
41662 if(value.slice(-1) === '/'){
41664 value = value.slice(0,-1);
41667 if(s === S_ATTR_SPACE){
41670 if(s == S_ATTR_NOQUOT_VALUE){
41671 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41672 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
41674 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
41675 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
41677 el.add(value,value,start);
41681 throw new Error('attribute value missed!!');
41683 // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
41685 /*xml space '\x20' | #x9 | #xD | #xA; */
41689 if(c<= ' '){//space
41692 el.setTagName(source.slice(start,p));//tagName
41696 attrName = source.slice(start,p);
41699 case S_ATTR_NOQUOT_VALUE:
41700 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
41701 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
41702 el.add(attrName,value,start);
41706 //case S_TAG_SPACE:
41708 //case S_ATTR_SPACE:
41710 //case S_TAG_CLOSE:
41714 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
41715 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
41717 //case S_TAG:void();break;
41718 //case S_ATTR:void();break;
41719 //case S_ATTR_NOQUOT_VALUE:void();break;
41721 var tagName = el.tagName;
41722 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
41723 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
41725 el.add(attrName,attrName,start);
41730 errorHandler.warning('attribute space is required"'+attrName+'"!!');
41736 s = S_ATTR_NOQUOT_VALUE;
41740 throw new Error("elements closed character '/' and '>' must be connected to");
41743 }//end outer switch
41744 //console.log('p++',p)
41749 * @return true if has new namespace define
41751 function appendElement(el,domBuilder,currentNSMap){
41752 var tagName = el.tagName;
41753 var localNSMap = null;
41754 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
41758 var qName = a.qName;
41759 var value = a.value;
41760 var nsp = qName.indexOf(':');
41762 var prefix = a.prefix = qName.slice(0,nsp);
41763 var localName = qName.slice(nsp+1);
41764 var nsPrefix = prefix === 'xmlns' && localName;
41768 nsPrefix = qName === 'xmlns' && '';
41770 //can not set prefix,because prefix !== ''
41771 a.localName = localName ;
41772 //prefix == null for no ns prefix attribute
41773 if(nsPrefix !== false){//hack!!
41774 if(localNSMap == null){
41776 //console.log(currentNSMap,0)
41777 _copy(currentNSMap,currentNSMap={});
41778 //console.log(currentNSMap,1)
41780 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
41781 a.uri = 'http://www.w3.org/2000/xmlns/';
41782 domBuilder.startPrefixMapping(nsPrefix, value);
41788 var prefix = a.prefix;
41789 if(prefix){//no prefix attribute has no namespace
41790 if(prefix === 'xml'){
41791 a.uri = 'http://www.w3.org/XML/1998/namespace';
41792 }if(prefix !== 'xmlns'){
41793 a.uri = currentNSMap[prefix || ''];
41795 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
41799 var nsp = tagName.indexOf(':');
41801 prefix = el.prefix = tagName.slice(0,nsp);
41802 localName = el.localName = tagName.slice(nsp+1);
41804 prefix = null;//important!!
41805 localName = el.localName = tagName;
41807 //no prefix element has default namespace
41808 var ns = el.uri = currentNSMap[prefix || ''];
41809 domBuilder.startElement(ns,localName,tagName,el);
41810 //endPrefixMapping and startPrefixMapping have not any help for dom builder
41811 //localNSMap = null
41813 domBuilder.endElement(ns,localName,tagName);
41815 for(prefix in localNSMap){
41816 domBuilder.endPrefixMapping(prefix);
41820 el.currentNSMap = currentNSMap;
41821 el.localNSMap = localNSMap;
41822 //parseStack.push(el);
41826 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
41827 if(/^(?:script|textarea)$/i.test(tagName)){
41828 var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
41829 var text = source.substring(elStartEnd+1,elEndStart);
41830 if(/[&<]/.test(text)){
41831 if(/^script$/i.test(tagName)){
41832 //if(!/\]\]>/.test(text)){
41833 //lexHandler.startCDATA();
41834 domBuilder.characters(text,0,text.length);
41835 //lexHandler.endCDATA();
41838 }//}else{//text area
41839 text = text.replace(/&#?\w+;/g,entityReplacer);
41840 domBuilder.characters(text,0,text.length);
41846 return elStartEnd+1;
41848 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
41849 //if(tagName in closeMap){
41850 var pos = closeMap[tagName];
41852 //console.log(tagName)
41853 pos = source.lastIndexOf('</'+tagName+'>');
41854 if(pos<elStartEnd){//忘记闭合
41855 pos = source.lastIndexOf('</'+tagName);
41857 closeMap[tagName] =pos;
41859 return pos<elStartEnd;
41862 function _copy(source,target){
41863 for(var n in source){target[n] = source[n];}
41865 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
41866 var next= source.charAt(start+2);
41869 if(source.charAt(start + 3) === '-'){
41870 var end = source.indexOf('-->',start+4);
41871 //append comment source.substring(4,end)//<!--
41873 domBuilder.comment(source,start+4,end-start-4);
41876 errorHandler.error("Unclosed comment");
41884 if(source.substr(start+3,6) == 'CDATA['){
41885 var end = source.indexOf(']]>',start+9);
41886 domBuilder.startCDATA();
41887 domBuilder.characters(source,start+9,end-start-9);
41888 domBuilder.endCDATA();
41892 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
41893 var matchs = split(source,start);
41894 var len = matchs.length;
41895 if(len>1 && /!doctype/i.test(matchs[0][0])){
41896 var name = matchs[1][0];
41897 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
41898 var sysid = len>4 && matchs[4][0];
41899 var lastMatch = matchs[len-1];
41900 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
41901 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
41902 domBuilder.endDTD();
41904 return lastMatch.index+lastMatch[0].length
41912 function parseInstruction(source,start,domBuilder){
41913 var end = source.indexOf('?>',start);
41915 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
41917 var len = match[0].length;
41918 domBuilder.processingInstruction(match[1], match[2]) ;
41930 function ElementAttributes(source){
41933 ElementAttributes.prototype = {
41934 setTagName:function(tagName){
41935 if(!tagNamePattern.test(tagName)){
41936 throw new Error('invalid tagName:'+tagName)
41938 this.tagName = tagName;
41940 add:function(qName,value,offset){
41941 if(!tagNamePattern.test(qName)){
41942 throw new Error('invalid attribute:'+qName)
41944 this[this.length++] = {qName:qName,value:value,offset:offset};
41947 getLocalName:function(i){return this[i].localName},
41948 getLocator:function(i){return this[i].locator},
41949 getQName:function(i){return this[i].qName},
41950 getURI:function(i){return this[i].uri},
41951 getValue:function(i){return this[i].value}
41952 // ,getIndex:function(uri, localName)){
41959 // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
41960 // getType:function(uri,localName){}
41961 // getType:function(i){},
41967 function _set_proto_(thiz,parent){
41968 thiz.__proto__ = parent;
41971 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
41972 _set_proto_ = function(thiz,parent){
41973 function p(){} p.prototype = parent;
41975 for(parent in thiz){
41976 p[parent] = thiz[parent];
41982 function split(source,start){
41985 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
41986 reg.lastIndex = start;
41987 reg.exec(source);//skip <
41988 while(match = reg.exec(source)){
41990 if(match[1])return buf;
41994 var XMLReader_1 = XMLReader;
41997 XMLReader: XMLReader_1
42002 * Object DOMException
42003 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
42004 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
42007 function copy$1(src,dest){
42013 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
42014 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
42016 function _extends(Class,Super){
42017 var pt = Class.prototype;
42019 var ppt = Object.create(Super.prototype);
42020 pt.__proto__ = ppt;
42022 if(!(pt instanceof Super)){
42023 function t(){} t.prototype = Super.prototype;
42026 Class.prototype = pt = t;
42028 if(pt.constructor != Class){
42029 if(typeof Class != 'function'){
42030 console.error("unknow Class:"+Class);
42032 pt.constructor = Class;
42035 var htmlns = 'http://www.w3.org/1999/xhtml' ;
42038 var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
42039 var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
42040 var TEXT_NODE = NodeType.TEXT_NODE = 3;
42041 var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
42042 var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
42043 var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
42044 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
42045 var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
42046 var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
42047 var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
42048 var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
42049 var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
42052 var ExceptionCode = {};
42053 var ExceptionMessage = {};
42054 var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = (ExceptionMessage[1]="Index size error", 1);
42055 var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = (ExceptionMessage[2]="DOMString size error", 2);
42056 var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = (ExceptionMessage[3]="Hierarchy request error", 3);
42057 var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = (ExceptionMessage[4]="Wrong document", 4);
42058 var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = (ExceptionMessage[5]="Invalid character", 5);
42059 var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = (ExceptionMessage[6]="No data allowed", 6);
42060 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = (ExceptionMessage[7]="No modification allowed", 7);
42061 var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = (ExceptionMessage[8]="Not found", 8);
42062 var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = (ExceptionMessage[9]="Not supported", 9);
42063 var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = (ExceptionMessage[10]="Attribute in use", 10);
42065 var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = (ExceptionMessage[11]="Invalid state", 11);
42066 var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = (ExceptionMessage[12]="Syntax error", 12);
42067 var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = (ExceptionMessage[13]="Invalid modification", 13);
42068 var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = (ExceptionMessage[14]="Invalid namespace", 14);
42069 var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = (ExceptionMessage[15]="Invalid access", 15);
42072 function DOMException(code, message) {
42073 if(message instanceof Error){
42074 var error = message;
42077 Error.call(this, ExceptionMessage[code]);
42078 this.message = ExceptionMessage[code];
42079 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
42082 if(message) this.message = this.message + ": " + message;
42084 }DOMException.prototype = Error.prototype;
42085 copy$1(ExceptionCode,DOMException);
42087 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
42088 * 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.
42089 * The items in the NodeList are accessible via an integral index, starting from 0.
42091 function NodeList() {
42092 }NodeList.prototype = {
42094 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
42099 * 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.
42101 * @param index unsigned long
42102 * Index into the collection.
42104 * The node at the indexth position in the NodeList, or null if that is not a valid index.
42106 item: function(index) {
42107 return this[index] || null;
42109 toString:function(isHTML,nodeFilter){
42110 for(var buf = [], i = 0;i<this.length;i++){
42111 serializeToString(this[i],buf,isHTML,nodeFilter);
42113 return buf.join('');
42116 function LiveNodeList(node,refresh){
42118 this._refresh = refresh;
42119 _updateLiveList(this);
42121 function _updateLiveList(list){
42122 var inc = list._node._inc || list._node.ownerDocument._inc;
42123 if(list._inc != inc){
42124 var ls = list._refresh(list._node);
42125 //console.log(ls.length)
42126 __set__(list,'length',ls.length);
42131 LiveNodeList.prototype.item = function(i){
42132 _updateLiveList(this);
42136 _extends(LiveNodeList,NodeList);
42139 * 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.
42140 * NamedNodeMap objects in the DOM are live.
42141 * used for attributes or DocumentType entities
42143 function NamedNodeMap() {
42145 function _findNodeIndex(list,node){
42146 var i = list.length;
42148 if(list[i] === node){return i}
42152 function _addNamedNode(el,list,newAttr,oldAttr){
42154 list[_findNodeIndex(list,oldAttr)] = newAttr;
42156 list[list.length++] = newAttr;
42159 newAttr.ownerElement = el;
42160 var doc = el.ownerDocument;
42162 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
42163 _onAddAttribute(doc,el,newAttr);
42167 function _removeNamedNode(el,list,attr){
42168 //console.log('remove attr:'+attr)
42169 var i = _findNodeIndex(list,attr);
42171 var lastIndex = list.length-1;
42172 while(i<lastIndex){
42173 list[i] = list[++i];
42175 list.length = lastIndex;
42177 var doc = el.ownerDocument;
42179 _onRemoveAttribute(doc,el,attr);
42180 attr.ownerElement = null;
42184 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
42187 NamedNodeMap.prototype = {
42189 item:NodeList.prototype.item,
42190 getNamedItem: function(key) {
42191 // if(key.indexOf(':')>0 || key == 'xmlns'){
42195 var i = this.length;
42197 var attr = this[i];
42198 //console.log(attr.nodeName,key)
42199 if(attr.nodeName == key){
42204 setNamedItem: function(attr) {
42205 var el = attr.ownerElement;
42206 if(el && el!=this._ownerElement){
42207 throw new DOMException(INUSE_ATTRIBUTE_ERR);
42209 var oldAttr = this.getNamedItem(attr.nodeName);
42210 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42214 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
42215 var el = attr.ownerElement, oldAttr;
42216 if(el && el!=this._ownerElement){
42217 throw new DOMException(INUSE_ATTRIBUTE_ERR);
42219 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
42220 _addNamedNode(this._ownerElement,this,attr,oldAttr);
42225 removeNamedItem: function(key) {
42226 var attr = this.getNamedItem(key);
42227 _removeNamedNode(this._ownerElement,this,attr);
42231 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
42234 removeNamedItemNS:function(namespaceURI,localName){
42235 var attr = this.getNamedItemNS(namespaceURI,localName);
42236 _removeNamedNode(this._ownerElement,this,attr);
42239 getNamedItemNS: function(namespaceURI, localName) {
42240 var i = this.length;
42242 var node = this[i];
42243 if(node.localName == localName && node.namespaceURI == namespaceURI){
42251 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
42253 function DOMImplementation(/* Object */ features) {
42254 this._features = {};
42256 for (var feature in features) {
42257 this._features = features[feature];
42261 DOMImplementation.prototype = {
42262 hasFeature: function(/* string */ feature, /* string */ version) {
42263 var versions = this._features[feature.toLowerCase()];
42264 if (versions && (!version || version in versions)) {
42270 // Introduced in DOM Level 2:
42271 createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
42272 var doc = new Document();
42273 doc.implementation = this;
42274 doc.childNodes = new NodeList();
42275 doc.doctype = doctype;
42277 doc.appendChild(doctype);
42280 var root = doc.createElementNS(namespaceURI,qualifiedName);
42281 doc.appendChild(root);
42285 // Introduced in DOM Level 2:
42286 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
42287 var node = new DocumentType();
42288 node.name = qualifiedName;
42289 node.nodeName = qualifiedName;
42290 node.publicId = publicId;
42291 node.systemId = systemId;
42292 // Introduced in DOM Level 2:
42293 //readonly attribute DOMString internalSubset;
42296 // readonly attribute NamedNodeMap entities;
42297 // readonly attribute NamedNodeMap notations;
42304 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
42307 function Node$2() {
42309 Node$2.prototype = {
42312 previousSibling : null,
42313 nextSibling : null,
42317 ownerDocument : null,
42319 namespaceURI : null,
42322 // Modified in DOM Level 2:
42323 insertBefore:function(newChild, refChild){//raises
42324 return _insertBefore(this,newChild,refChild);
42326 replaceChild:function(newChild, oldChild){//raises
42327 this.insertBefore(newChild,oldChild);
42329 this.removeChild(oldChild);
42332 removeChild:function(oldChild){
42333 return _removeChild(this,oldChild);
42335 appendChild:function(newChild){
42336 return this.insertBefore(newChild,null);
42338 hasChildNodes:function(){
42339 return this.firstChild != null;
42341 cloneNode:function(deep){
42342 return cloneNode(this.ownerDocument||this,this,deep);
42344 // Modified in DOM Level 2:
42345 normalize:function(){
42346 var child = this.firstChild;
42348 var next = child.nextSibling;
42349 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
42350 this.removeChild(next);
42351 child.appendData(next.data);
42358 // Introduced in DOM Level 2:
42359 isSupported:function(feature, version){
42360 return this.ownerDocument.implementation.hasFeature(feature,version);
42362 // Introduced in DOM Level 2:
42363 hasAttributes:function(){
42364 return this.attributes.length>0;
42366 lookupPrefix:function(namespaceURI){
42369 var map = el._nsMap;
42373 if(map[n] == namespaceURI){
42378 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42382 // Introduced in DOM Level 3:
42383 lookupNamespaceURI:function(prefix){
42386 var map = el._nsMap;
42390 return map[prefix] ;
42393 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
42397 // Introduced in DOM Level 3:
42398 isDefaultNamespace:function(namespaceURI){
42399 var prefix = this.lookupPrefix(namespaceURI);
42400 return prefix == null;
42405 function _xmlEncoder(c){
42406 return c == '<' && '<' ||
42407 c == '>' && '>' ||
42408 c == '&' && '&' ||
42409 c == '"' && '"' ||
42410 '&#'+c.charCodeAt()+';'
42414 copy$1(NodeType,Node$2);
42415 copy$1(NodeType,Node$2.prototype);
42418 * @param callback return true for continue,false for break
42419 * @return boolean true: break visit;
42421 function _visitNode(node,callback){
42422 if(callback(node)){
42425 if(node = node.firstChild){
42427 if(_visitNode(node,callback)){return true}
42428 }while(node=node.nextSibling)
42434 function Document(){
42436 function _onAddAttribute(doc,el,newAttr){
42438 var ns = newAttr.namespaceURI ;
42439 if(ns == 'http://www.w3.org/2000/xmlns/'){
42441 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
42444 function _onRemoveAttribute(doc,el,newAttr,remove){
42446 var ns = newAttr.namespaceURI ;
42447 if(ns == 'http://www.w3.org/2000/xmlns/'){
42449 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
42452 function _onUpdateChild(doc,el,newChild){
42453 if(doc && doc._inc){
42455 //update childNodes
42456 var cs = el.childNodes;
42458 cs[cs.length++] = newChild;
42461 var child = el.firstChild;
42465 child =child.nextSibling;
42476 * writeable properties:
42477 * nodeValue,Attr:value,CharacterData:data
42480 function _removeChild(parentNode,child){
42481 var previous = child.previousSibling;
42482 var next = child.nextSibling;
42484 previous.nextSibling = next;
42486 parentNode.firstChild = next;
42489 next.previousSibling = previous;
42491 parentNode.lastChild = previous;
42493 _onUpdateChild(parentNode.ownerDocument,parentNode);
42497 * preformance key(refChild == null)
42499 function _insertBefore(parentNode,newChild,nextChild){
42500 var cp = newChild.parentNode;
42502 cp.removeChild(newChild);//remove and update
42504 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42505 var newFirst = newChild.firstChild;
42506 if (newFirst == null) {
42509 var newLast = newChild.lastChild;
42511 newFirst = newLast = newChild;
42513 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
42515 newFirst.previousSibling = pre;
42516 newLast.nextSibling = nextChild;
42520 pre.nextSibling = newFirst;
42522 parentNode.firstChild = newFirst;
42524 if(nextChild == null){
42525 parentNode.lastChild = newLast;
42527 nextChild.previousSibling = newLast;
42530 newFirst.parentNode = parentNode;
42531 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
42532 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
42533 //console.log(parentNode.lastChild.nextSibling == null)
42534 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
42535 newChild.firstChild = newChild.lastChild = null;
42539 function _appendSingleChild(parentNode,newChild){
42540 var cp = newChild.parentNode;
42542 var pre = parentNode.lastChild;
42543 cp.removeChild(newChild);//remove and update
42544 var pre = parentNode.lastChild;
42546 var pre = parentNode.lastChild;
42547 newChild.parentNode = parentNode;
42548 newChild.previousSibling = pre;
42549 newChild.nextSibling = null;
42551 pre.nextSibling = newChild;
42553 parentNode.firstChild = newChild;
42555 parentNode.lastChild = newChild;
42556 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
42558 //console.log("__aa",parentNode.lastChild.nextSibling == null)
42560 Document.prototype = {
42561 //implementation : null,
42562 nodeName : '#document',
42563 nodeType : DOCUMENT_NODE,
42565 documentElement : null,
42568 insertBefore : function(newChild, refChild){//raises
42569 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
42570 var child = newChild.firstChild;
42572 var next = child.nextSibling;
42573 this.insertBefore(child,refChild);
42578 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
42579 this.documentElement = newChild;
42582 return _insertBefore(this,newChild,refChild), newChild.ownerDocument = this, newChild;
42584 removeChild : function(oldChild){
42585 if(this.documentElement == oldChild){
42586 this.documentElement = null;
42588 return _removeChild(this,oldChild);
42590 // Introduced in DOM Level 2:
42591 importNode : function(importedNode,deep){
42592 return importNode(this,importedNode,deep);
42594 // Introduced in DOM Level 2:
42595 getElementById : function(id){
42597 _visitNode(this.documentElement,function(node){
42598 if(node.nodeType == ELEMENT_NODE){
42599 if(node.getAttribute('id') == id){
42608 //document factory method:
42609 createElement : function(tagName){
42610 var node = new Element();
42611 node.ownerDocument = this;
42612 node.nodeName = tagName;
42613 node.tagName = tagName;
42614 node.childNodes = new NodeList();
42615 var attrs = node.attributes = new NamedNodeMap();
42616 attrs._ownerElement = node;
42619 createDocumentFragment : function(){
42620 var node = new DocumentFragment();
42621 node.ownerDocument = this;
42622 node.childNodes = new NodeList();
42625 createTextNode : function(data){
42626 var node = new Text();
42627 node.ownerDocument = this;
42628 node.appendData(data);
42631 createComment : function(data){
42632 var node = new Comment();
42633 node.ownerDocument = this;
42634 node.appendData(data);
42637 createCDATASection : function(data){
42638 var node = new CDATASection();
42639 node.ownerDocument = this;
42640 node.appendData(data);
42643 createProcessingInstruction : function(target,data){
42644 var node = new ProcessingInstruction();
42645 node.ownerDocument = this;
42646 node.tagName = node.target = target;
42647 node.nodeValue= node.data = data;
42650 createAttribute : function(name){
42651 var node = new Attr();
42652 node.ownerDocument = this;
42654 node.nodeName = name;
42655 node.localName = name;
42656 node.specified = true;
42659 createEntityReference : function(name){
42660 var node = new EntityReference();
42661 node.ownerDocument = this;
42662 node.nodeName = name;
42665 // Introduced in DOM Level 2:
42666 createElementNS : function(namespaceURI,qualifiedName){
42667 var node = new Element();
42668 var pl = qualifiedName.split(':');
42669 var attrs = node.attributes = new NamedNodeMap();
42670 node.childNodes = new NodeList();
42671 node.ownerDocument = this;
42672 node.nodeName = qualifiedName;
42673 node.tagName = qualifiedName;
42674 node.namespaceURI = namespaceURI;
42675 if(pl.length == 2){
42676 node.prefix = pl[0];
42677 node.localName = pl[1];
42679 //el.prefix = null;
42680 node.localName = qualifiedName;
42682 attrs._ownerElement = node;
42685 // Introduced in DOM Level 2:
42686 createAttributeNS : function(namespaceURI,qualifiedName){
42687 var node = new Attr();
42688 var pl = qualifiedName.split(':');
42689 node.ownerDocument = this;
42690 node.nodeName = qualifiedName;
42691 node.name = qualifiedName;
42692 node.namespaceURI = namespaceURI;
42693 node.specified = true;
42694 if(pl.length == 2){
42695 node.prefix = pl[0];
42696 node.localName = pl[1];
42698 //el.prefix = null;
42699 node.localName = qualifiedName;
42704 _extends(Document,Node$2);
42707 function Element() {
42709 }Element.prototype = {
42710 nodeType : ELEMENT_NODE,
42711 hasAttribute : function(name){
42712 return this.getAttributeNode(name)!=null;
42714 getAttribute : function(name){
42715 var attr = this.getAttributeNode(name);
42716 return attr && attr.value || '';
42718 getAttributeNode : function(name){
42719 return this.attributes.getNamedItem(name);
42721 setAttribute : function(name, value){
42722 var attr = this.ownerDocument.createAttribute(name);
42723 attr.value = attr.nodeValue = "" + value;
42724 this.setAttributeNode(attr);
42726 removeAttribute : function(name){
42727 var attr = this.getAttributeNode(name);
42728 attr && this.removeAttributeNode(attr);
42731 //four real opeartion method
42732 appendChild:function(newChild){
42733 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
42734 return this.insertBefore(newChild,null);
42736 return _appendSingleChild(this,newChild);
42739 setAttributeNode : function(newAttr){
42740 return this.attributes.setNamedItem(newAttr);
42742 setAttributeNodeNS : function(newAttr){
42743 return this.attributes.setNamedItemNS(newAttr);
42745 removeAttributeNode : function(oldAttr){
42746 //console.log(this == oldAttr.ownerElement)
42747 return this.attributes.removeNamedItem(oldAttr.nodeName);
42749 //get real attribute name,and remove it by removeAttributeNode
42750 removeAttributeNS : function(namespaceURI, localName){
42751 var old = this.getAttributeNodeNS(namespaceURI, localName);
42752 old && this.removeAttributeNode(old);
42755 hasAttributeNS : function(namespaceURI, localName){
42756 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
42758 getAttributeNS : function(namespaceURI, localName){
42759 var attr = this.getAttributeNodeNS(namespaceURI, localName);
42760 return attr && attr.value || '';
42762 setAttributeNS : function(namespaceURI, qualifiedName, value){
42763 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
42764 attr.value = attr.nodeValue = "" + value;
42765 this.setAttributeNode(attr);
42767 getAttributeNodeNS : function(namespaceURI, localName){
42768 return this.attributes.getNamedItemNS(namespaceURI, localName);
42771 getElementsByTagName : function(tagName){
42772 return new LiveNodeList(this,function(base){
42774 _visitNode(base,function(node){
42775 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
42782 getElementsByTagNameNS : function(namespaceURI, localName){
42783 return new LiveNodeList(this,function(base){
42785 _visitNode(base,function(node){
42786 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
42795 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
42796 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
42799 _extends(Element,Node$2);
42801 }Attr.prototype.nodeType = ATTRIBUTE_NODE;
42802 _extends(Attr,Node$2);
42805 function CharacterData() {
42806 }CharacterData.prototype = {
42808 substringData : function(offset, count) {
42809 return this.data.substring(offset, offset+count);
42811 appendData: function(text) {
42812 text = this.data+text;
42813 this.nodeValue = this.data = text;
42814 this.length = text.length;
42816 insertData: function(offset,text) {
42817 this.replaceData(offset,0,text);
42820 appendChild:function(newChild){
42821 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
42823 deleteData: function(offset, count) {
42824 this.replaceData(offset,count,"");
42826 replaceData: function(offset, count, text) {
42827 var start = this.data.substring(0,offset);
42828 var end = this.data.substring(offset+count);
42829 text = start + text + end;
42830 this.nodeValue = this.data = text;
42831 this.length = text.length;
42834 _extends(CharacterData,Node$2);
42836 }Text.prototype = {
42837 nodeName : "#text",
42838 nodeType : TEXT_NODE,
42839 splitText : function(offset) {
42840 var text = this.data;
42841 var newText = text.substring(offset);
42842 text = text.substring(0, offset);
42843 this.data = this.nodeValue = text;
42844 this.length = text.length;
42845 var newNode = this.ownerDocument.createTextNode(newText);
42846 if(this.parentNode){
42847 this.parentNode.insertBefore(newNode, this.nextSibling);
42852 _extends(Text,CharacterData);
42853 function Comment() {
42854 }Comment.prototype = {
42855 nodeName : "#comment",
42856 nodeType : COMMENT_NODE
42858 _extends(Comment,CharacterData);
42860 function CDATASection() {
42861 }CDATASection.prototype = {
42862 nodeName : "#cdata-section",
42863 nodeType : CDATA_SECTION_NODE
42865 _extends(CDATASection,CharacterData);
42868 function DocumentType() {
42869 }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
42870 _extends(DocumentType,Node$2);
42872 function Notation() {
42873 }Notation.prototype.nodeType = NOTATION_NODE;
42874 _extends(Notation,Node$2);
42876 function Entity() {
42877 }Entity.prototype.nodeType = ENTITY_NODE;
42878 _extends(Entity,Node$2);
42880 function EntityReference() {
42881 }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
42882 _extends(EntityReference,Node$2);
42884 function DocumentFragment() {
42885 }DocumentFragment.prototype.nodeName = "#document-fragment";
42886 DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
42887 _extends(DocumentFragment,Node$2);
42890 function ProcessingInstruction() {
42892 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
42893 _extends(ProcessingInstruction,Node$2);
42894 function XMLSerializer$1(){}
42895 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
42896 return nodeSerializeToString.call(node,isHtml,nodeFilter);
42898 Node$2.prototype.toString = nodeSerializeToString;
42899 function nodeSerializeToString(isHtml,nodeFilter){
42901 var refNode = this.nodeType == 9?this.documentElement:this;
42902 var prefix = refNode.prefix;
42903 var uri = refNode.namespaceURI;
42905 if(uri && prefix == null){
42906 //console.log(prefix)
42907 var prefix = refNode.lookupPrefix(uri);
42908 if(prefix == null){
42910 var visibleNamespaces=[
42911 {namespace:uri,prefix:null}
42912 //{namespace:uri,prefix:''}
42916 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
42917 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
42918 return buf.join('');
42920 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
42921 var prefix = node.prefix||'';
42922 var uri = node.namespaceURI;
42923 if (!prefix && !uri){
42926 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
42927 || uri == 'http://www.w3.org/2000/xmlns/'){
42931 var i = visibleNamespaces.length;
42932 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
42934 var ns = visibleNamespaces[i];
42935 // get namespace prefix
42936 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
42937 if (ns.prefix == prefix){
42938 return ns.namespace != uri;
42941 //console.log(isHTML,uri,prefix=='')
42942 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
42945 //node.flag = '11111'
42946 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
42949 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
42951 node = nodeFilter(node);
42953 if(typeof node == 'string'){
42960 //buf.sort.apply(attrs, attributeSorter);
42962 switch(node.nodeType){
42964 if (!visibleNamespaces) visibleNamespaces = [];
42965 var startVisibleNamespaces = visibleNamespaces.length;
42966 var attrs = node.attributes;
42967 var len = attrs.length;
42968 var child = node.firstChild;
42969 var nodeName = node.tagName;
42971 isHTML = (htmlns === node.namespaceURI) ||isHTML;
42972 buf.push('<',nodeName);
42976 for(var i=0;i<len;i++){
42977 // add namespaces for attributes
42978 var attr = attrs.item(i);
42979 if (attr.prefix == 'xmlns') {
42980 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
42981 }else if(attr.nodeName == 'xmlns'){
42982 visibleNamespaces.push({ prefix: '', namespace: attr.value });
42985 for(var i=0;i<len;i++){
42986 var attr = attrs.item(i);
42987 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
42988 var prefix = attr.prefix||'';
42989 var uri = attr.namespaceURI;
42990 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
42991 buf.push(ns, '="' , uri , '"');
42992 visibleNamespaces.push({ prefix: prefix, namespace:uri });
42994 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
42996 // add namespace for current node
42997 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
42998 var prefix = node.prefix||'';
42999 var uri = node.namespaceURI;
43000 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
43001 buf.push(ns, '="' , uri , '"');
43002 visibleNamespaces.push({ prefix: prefix, namespace:uri });
43005 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
43007 //if is cdata child node
43008 if(isHTML && /^script$/i.test(nodeName)){
43011 buf.push(child.data);
43013 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43015 child = child.nextSibling;
43020 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43021 child = child.nextSibling;
43024 buf.push('</',nodeName,'>');
43028 // remove added visible namespaces
43029 //visibleNamespaces.length = startVisibleNamespaces;
43031 case DOCUMENT_NODE:
43032 case DOCUMENT_FRAGMENT_NODE:
43033 var child = node.firstChild;
43035 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
43036 child = child.nextSibling;
43039 case ATTRIBUTE_NODE:
43040 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
43042 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
43043 case CDATA_SECTION_NODE:
43044 return buf.push( '<![CDATA[',node.data,']]>');
43046 return buf.push( "<!--",node.data,"-->");
43047 case DOCUMENT_TYPE_NODE:
43048 var pubid = node.publicId;
43049 var sysid = node.systemId;
43050 buf.push('<!DOCTYPE ',node.name);
43052 buf.push(' PUBLIC "',pubid);
43053 if (sysid && sysid!='.') {
43054 buf.push( '" "',sysid);
43057 }else if(sysid && sysid!='.'){
43058 buf.push(' SYSTEM "',sysid,'">');
43060 var sub = node.internalSubset;
43062 buf.push(" [",sub,"]");
43067 case PROCESSING_INSTRUCTION_NODE:
43068 return buf.push( "<?",node.target," ",node.data,"?>");
43069 case ENTITY_REFERENCE_NODE:
43070 return buf.push( '&',node.nodeName,';');
43071 //case ENTITY_NODE:
43072 //case NOTATION_NODE:
43074 buf.push('??',node.nodeName);
43077 function importNode(doc,node,deep){
43079 switch (node.nodeType) {
43081 node2 = node.cloneNode(false);
43082 node2.ownerDocument = doc;
43083 //var attrs = node2.attributes;
43084 //var len = attrs.length;
43085 //for(var i=0;i<len;i++){
43086 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
43088 case DOCUMENT_FRAGMENT_NODE:
43090 case ATTRIBUTE_NODE:
43093 //case ENTITY_REFERENCE_NODE:
43094 //case PROCESSING_INSTRUCTION_NODE:
43095 ////case TEXT_NODE:
43096 //case CDATA_SECTION_NODE:
43097 //case COMMENT_NODE:
43100 //case DOCUMENT_NODE:
43101 //case DOCUMENT_TYPE_NODE:
43102 //cannot be imported.
43103 //case ENTITY_NODE:
43104 //case NOTATION_NODE:
43105 //can not hit in level3
43109 node2 = node.cloneNode(false);//false
43111 node2.ownerDocument = doc;
43112 node2.parentNode = null;
43114 var child = node.firstChild;
43116 node2.appendChild(importNode(doc,child,deep));
43117 child = child.nextSibling;
43123 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
43124 // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
43125 function cloneNode(doc,node,deep){
43126 var node2 = new node.constructor();
43127 for(var n in node){
43129 if(typeof v != 'object' ){
43135 if(node.childNodes){
43136 node2.childNodes = new NodeList();
43138 node2.ownerDocument = doc;
43139 switch (node2.nodeType) {
43141 var attrs = node.attributes;
43142 var attrs2 = node2.attributes = new NamedNodeMap();
43143 var len = attrs.length;
43144 attrs2._ownerElement = node2;
43145 for(var i=0;i<len;i++){
43146 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
43149 case ATTRIBUTE_NODE:
43153 var child = node.firstChild;
43155 node2.appendChild(cloneNode(doc,child,deep));
43156 child = child.nextSibling;
43162 function __set__(object,key,value){
43163 object[key] = value;
43167 if(Object.defineProperty){
43168 Object.defineProperty(LiveNodeList.prototype,'length',{
43170 _updateLiveList(this);
43171 return this.$$length;
43174 Object.defineProperty(Node$2.prototype,'textContent',{
43176 return getTextContent(this);
43178 set:function(data){
43179 switch(this.nodeType){
43181 case DOCUMENT_FRAGMENT_NODE:
43182 while(this.firstChild){
43183 this.removeChild(this.firstChild);
43185 if(data || String(data)){
43186 this.appendChild(this.ownerDocument.createTextNode(data));
43193 this.nodeValue = data;
43198 function getTextContent(node){
43199 switch(node.nodeType){
43201 case DOCUMENT_FRAGMENT_NODE:
43203 node = node.firstChild;
43205 if(node.nodeType!==7 && node.nodeType !==8){
43206 buf.push(getTextContent(node));
43208 node = node.nextSibling;
43210 return buf.join('');
43212 return node.nodeValue;
43215 __set__ = function(object,key,value){
43216 //console.log(value)
43217 object['$$'+key] = value;
43223 //if(typeof require == 'function'){
43224 var DOMImplementation_1 = DOMImplementation;
43225 var XMLSerializer_1 = XMLSerializer$1;
43229 DOMImplementation: DOMImplementation_1,
43230 XMLSerializer: XMLSerializer_1
43233 var domParser = createCommonjsModule(function (module, exports) {
43234 function DOMParser(options){
43235 this.options = options ||{locator:{}};
43238 DOMParser.prototype.parseFromString = function(source,mimeType){
43239 var options = this.options;
43240 var sax$$1 = new XMLReader();
43241 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
43242 var errorHandler = options.errorHandler;
43243 var locator = options.locator;
43244 var defaultNSMap = options.xmlns||{};
43245 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
43247 domBuilder.setDocumentLocator(locator);
43250 sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
43251 sax$$1.domBuilder = options.domBuilder || domBuilder;
43252 if(/\/x?html?$/.test(mimeType)){
43253 entityMap.nbsp = '\xa0';
43254 entityMap.copy = '\xa9';
43255 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
43257 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
43259 sax$$1.parse(source,defaultNSMap,entityMap);
43261 sax$$1.errorHandler.error("invalid doc source");
43263 return domBuilder.doc;
43265 function buildErrorHandler(errorImpl,domBuilder,locator){
43267 if(domBuilder instanceof DOMHandler){
43270 errorImpl = domBuilder ;
43272 var errorHandler = {};
43273 var isCallback = errorImpl instanceof Function;
43274 locator = locator||{};
43275 function build(key){
43276 var fn = errorImpl[key];
43277 if(!fn && isCallback){
43278 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
43280 errorHandler[key] = fn && function(msg){
43281 fn('[xmldom '+key+']\t'+msg+_locator(locator));
43286 build('fatalError');
43287 return errorHandler;
43290 //console.log('#\n\n\n\n\n\n\n####')
43292 * +ContentHandler+ErrorHandler
43293 * +LexicalHandler+EntityResolver2
43294 * -DeclHandler-DTDHandler
43296 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
43297 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
43298 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
43300 function DOMHandler() {
43301 this.cdata = false;
43303 function position(locator,node){
43304 node.lineNumber = locator.lineNumber;
43305 node.columnNumber = locator.columnNumber;
43308 * @see org.xml.sax.ContentHandler#startDocument
43309 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
43311 DOMHandler.prototype = {
43312 startDocument : function() {
43313 this.doc = new DOMImplementation().createDocument(null, null, null);
43314 if (this.locator) {
43315 this.doc.documentURI = this.locator.systemId;
43318 startElement:function(namespaceURI, localName, qName, attrs) {
43319 var doc = this.doc;
43320 var el = doc.createElementNS(namespaceURI, qName||localName);
43321 var len = attrs.length;
43322 appendElement(this, el);
43323 this.currentElement = el;
43325 this.locator && position(this.locator,el);
43326 for (var i = 0 ; i < len; i++) {
43327 var namespaceURI = attrs.getURI(i);
43328 var value = attrs.getValue(i);
43329 var qName = attrs.getQName(i);
43330 var attr = doc.createAttributeNS(namespaceURI, qName);
43331 this.locator &&position(attrs.getLocator(i),attr);
43332 attr.value = attr.nodeValue = value;
43333 el.setAttributeNode(attr);
43336 endElement:function(namespaceURI, localName, qName) {
43337 var current = this.currentElement;
43338 var tagName = current.tagName;
43339 this.currentElement = current.parentNode;
43341 startPrefixMapping:function(prefix, uri) {
43343 endPrefixMapping:function(prefix) {
43345 processingInstruction:function(target, data) {
43346 var ins = this.doc.createProcessingInstruction(target, data);
43347 this.locator && position(this.locator,ins);
43348 appendElement(this, ins);
43350 ignorableWhitespace:function(ch, start, length) {
43352 characters:function(chars, start, length) {
43353 chars = _toString.apply(this,arguments);
43354 //console.log(chars)
43357 var charNode = this.doc.createCDATASection(chars);
43359 var charNode = this.doc.createTextNode(chars);
43361 if(this.currentElement){
43362 this.currentElement.appendChild(charNode);
43363 }else if(/^\s*$/.test(chars)){
43364 this.doc.appendChild(charNode);
43367 this.locator && position(this.locator,charNode);
43370 skippedEntity:function(name) {
43372 endDocument:function() {
43373 this.doc.normalize();
43375 setDocumentLocator:function (locator) {
43376 if(this.locator = locator){// && !('lineNumber' in locator)){
43377 locator.lineNumber = 0;
43381 comment:function(chars, start, length) {
43382 chars = _toString.apply(this,arguments);
43383 var comm = this.doc.createComment(chars);
43384 this.locator && position(this.locator,comm);
43385 appendElement(this, comm);
43388 startCDATA:function() {
43389 //used in characters() methods
43392 endCDATA:function() {
43393 this.cdata = false;
43396 startDTD:function(name, publicId, systemId) {
43397 var impl = this.doc.implementation;
43398 if (impl && impl.createDocumentType) {
43399 var dt = impl.createDocumentType(name, publicId, systemId);
43400 this.locator && position(this.locator,dt);
43401 appendElement(this, dt);
43405 * @see org.xml.sax.ErrorHandler
43406 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
43408 warning:function(error) {
43409 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
43411 error:function(error) {
43412 console.error('[xmldom error]\t'+error,_locator(this.locator));
43414 fatalError:function(error) {
43415 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
43419 function _locator(l){
43421 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
43424 function _toString(chars,start,length){
43425 if(typeof chars == 'string'){
43426 return chars.substr(start,length)
43427 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
43428 if(chars.length >= start+length || start){
43429 return new java.lang.String(chars,start,length)+'';
43436 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
43437 * used method of org.xml.sax.ext.LexicalHandler:
43438 * #comment(chars, start, length)
43441 * #startDTD(name, publicId, systemId)
43444 * IGNORED method of org.xml.sax.ext.LexicalHandler:
43446 * #startEntity(name)
43450 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
43451 * IGNORED method of org.xml.sax.ext.DeclHandler
43452 * #attributeDecl(eName, aName, type, mode, value)
43453 * #elementDecl(name, model)
43454 * #externalEntityDecl(name, publicId, systemId)
43455 * #internalEntityDecl(name, value)
43456 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
43457 * IGNORED method of org.xml.sax.EntityResolver2
43458 * #resolveEntity(String name,String publicId,String baseURI,String systemId)
43459 * #resolveEntity(publicId, systemId)
43460 * #getExternalSubset(name, baseURI)
43461 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
43462 * IGNORED method of org.xml.sax.DTDHandler
43463 * #notationDecl(name, publicId, systemId) {};
43464 * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
43466 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
43467 DOMHandler.prototype[key] = function(){return null};
43470 /* 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 */
43471 function appendElement (hander,node) {
43472 if (!hander.currentElement) {
43473 hander.doc.appendChild(node);
43475 hander.currentElement.appendChild(node);
43477 }//appendChild and setAttributeNS are preformance key
43479 //if(typeof require == 'function'){
43480 var XMLReader = sax.XMLReader;
43481 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
43482 exports.XMLSerializer = dom.XMLSerializer ;
43483 exports.DOMParser = DOMParser;
43486 var domParser_1 = domParser.DOMImplementation;
43487 var domParser_2 = domParser.XMLSerializer;
43488 var domParser_3 = domParser.DOMParser;
43490 var togeojson = createCommonjsModule(function (module, exports) {
43491 var toGeoJSON = (function() {
43493 var removeSpace = /\s*/g,
43494 trimSpace = /^\s*|\s*$/g,
43495 splitSpace = /\s+/;
43496 // generate a short, numeric hash of a string
43497 function okhash(x) {
43498 if (!x || !x.length) return 0;
43499 for (var i = 0, h = 0; i < x.length; i++) {
43500 h = ((h << 5) - h) + x.charCodeAt(i) | 0;
43503 // all Y children of X
43504 function get(x, y) { return x.getElementsByTagName(y); }
43505 function attr(x, y) { return x.getAttribute(y); }
43506 function attrf(x, y) { return parseFloat(attr(x, y)); }
43507 // one Y child of X, if any, otherwise null
43508 function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
43509 // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
43510 function norm(el) { if (el.normalize) { el.normalize(); } return el; }
43511 // cast array x into numbers
43512 function numarray(x) {
43513 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
43516 // get the content of a text node, if any
43517 function nodeVal(x) {
43518 if (x) { norm(x); }
43519 return (x && x.textContent) || '';
43521 // get the contents of multiple text nodes, if present
43522 function getMulti(x, ys) {
43524 for (k = 0; k < ys.length; k++) {
43525 n = get1(x, ys[k]);
43526 if (n) o[ys[k]] = nodeVal(n);
43530 // add properties of Y to X, overwriting if present in both
43531 function extend(x, y) { for (var k in y) x[k] = y[k]; }
43532 // get one coordinate from a coordinate array, if any
43533 function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
43534 // get all coordinates from a coordinate array as [[],[]]
43535 function coord(v) {
43536 var coords = v.replace(trimSpace, '').split(splitSpace),
43538 for (var i = 0; i < coords.length; i++) {
43539 o.push(coord1(coords[i]));
43543 function coordPair(x) {
43544 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
43545 ele = get1(x, 'ele'),
43546 // handle namespaced attribute in browser
43547 heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
43548 time = get1(x, 'time'),
43551 e = parseFloat(nodeVal(ele));
43558 time: time ? nodeVal(time) : null,
43559 heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
43563 // create a new feature collection parent object
43566 type: 'FeatureCollection',
43572 if (typeof XMLSerializer !== 'undefined') {
43573 /* istanbul ignore next */
43574 serializer = new XMLSerializer();
43575 // only require xmldom in a node environment
43576 } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
43577 serializer = new (domParser.XMLSerializer)();
43579 function xml2str(str) {
43580 // IE9 will create a new XMLSerializer but it'll crash immediately.
43581 // This line is ignored because we don't run coverage tests in IE9
43582 /* istanbul ignore next */
43583 if (str.xml !== undefined) return str.xml;
43584 return serializer.serializeToString(str);
43588 kml: function(doc) {
43591 // styleindex keeps track of hashed styles in order to match features
43592 styleIndex = {}, styleByHash = {},
43593 // stylemapindex keeps track of style maps to expose in properties
43594 styleMapIndex = {},
43595 // atomic geospatial types supported by KML - MultiGeometry is
43596 // handled separately
43597 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
43598 // all root placemarks in the file
43599 placemarks = get(doc, 'Placemark'),
43600 styles = get(doc, 'Style'),
43601 styleMaps = get(doc, 'StyleMap');
43603 for (var k = 0; k < styles.length; k++) {
43604 var hash = okhash(xml2str(styles[k])).toString(16);
43605 styleIndex['#' + attr(styles[k], 'id')] = hash;
43606 styleByHash[hash] = styles[k];
43608 for (var l = 0; l < styleMaps.length; l++) {
43609 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
43610 var pairs = get(styleMaps[l], 'Pair');
43612 for (var m = 0; m < pairs.length; m++) {
43613 pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
43615 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
43618 for (var j = 0; j < placemarks.length; j++) {
43619 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
43621 function kmlColor(v) {
43622 var color, opacity;
43624 if (v.substr(0, 1) === '#') { v = v.substr(1); }
43625 if (v.length === 6 || v.length === 3) { color = v; }
43626 if (v.length === 8) {
43627 opacity = parseInt(v.substr(0, 2), 16) / 255;
43628 color = '#' + v.substr(6, 2) +
43632 return [color, isNaN(opacity) ? undefined : opacity];
43634 function gxCoord(v) { return numarray(v.split(' ')); }
43635 function gxCoords(root) {
43636 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
43637 if (elems.length === 0) elems = get(root, 'gx:coord');
43638 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
43639 var timeElems = get(root, 'when');
43640 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
43646 function getGeometry(root) {
43647 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
43648 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
43649 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
43650 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
43651 for (i = 0; i < geotypes.length; i++) {
43652 geomNodes = get(root, geotypes[i]);
43654 for (j = 0; j < geomNodes.length; j++) {
43655 geomNode = geomNodes[j];
43656 if (geotypes[i] === 'Point') {
43659 coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
43661 } else if (geotypes[i] === 'LineString') {
43663 type: 'LineString',
43664 coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
43666 } else if (geotypes[i] === 'Polygon') {
43667 var rings = get(geomNode, 'LinearRing'),
43669 for (k = 0; k < rings.length; k++) {
43670 coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
43674 coordinates: coords
43676 } else if (geotypes[i] === 'Track' ||
43677 geotypes[i] === 'gx:Track') {
43678 var track = gxCoords(geomNode);
43680 type: 'LineString',
43681 coordinates: track.coords
43683 if (track.times.length) coordTimes.push(track.times);
43690 coordTimes: coordTimes
43693 function getPlacemark(root) {
43694 var geomsAndTimes = getGeometry(root), i, properties = {},
43695 name = nodeVal(get1(root, 'name')),
43696 address = nodeVal(get1(root, 'address')),
43697 styleUrl = nodeVal(get1(root, 'styleUrl')),
43698 description = nodeVal(get1(root, 'description')),
43699 timeSpan = get1(root, 'TimeSpan'),
43700 timeStamp = get1(root, 'TimeStamp'),
43701 extendedData = get1(root, 'ExtendedData'),
43702 lineStyle = get1(root, 'LineStyle'),
43703 polyStyle = get1(root, 'PolyStyle'),
43704 visibility = get1(root, 'visibility');
43706 if (!geomsAndTimes.geoms.length) return [];
43707 if (name) properties.name = name;
43708 if (address) properties.address = address;
43710 if (styleUrl[0] !== '#') {
43711 styleUrl = '#' + styleUrl;
43714 properties.styleUrl = styleUrl;
43715 if (styleIndex[styleUrl]) {
43716 properties.styleHash = styleIndex[styleUrl];
43718 if (styleMapIndex[styleUrl]) {
43719 properties.styleMapHash = styleMapIndex[styleUrl];
43720 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
43722 // Try to populate the lineStyle or polyStyle since we got the style hash
43723 var style = styleByHash[properties.styleHash];
43725 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
43726 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
43729 if (description) properties.description = description;
43731 var begin = nodeVal(get1(timeSpan, 'begin'));
43732 var end = nodeVal(get1(timeSpan, 'end'));
43733 properties.timespan = { begin: begin, end: end };
43736 properties.timestamp = nodeVal(get1(timeStamp, 'when'));
43739 var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
43740 color = linestyles[0],
43741 opacity = linestyles[1],
43742 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43743 if (color) properties.stroke = color;
43744 if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
43745 if (!isNaN(width)) properties['stroke-width'] = width;
43748 var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
43749 pcolor = polystyles[0],
43750 popacity = polystyles[1],
43751 fill = nodeVal(get1(polyStyle, 'fill')),
43752 outline = nodeVal(get1(polyStyle, 'outline'));
43753 if (pcolor) properties.fill = pcolor;
43754 if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
43755 if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
43756 if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
43758 if (extendedData) {
43759 var datas = get(extendedData, 'Data'),
43760 simpleDatas = get(extendedData, 'SimpleData');
43762 for (i = 0; i < datas.length; i++) {
43763 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
43765 for (i = 0; i < simpleDatas.length; i++) {
43766 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
43770 properties.visibility = nodeVal(visibility);
43772 if (geomsAndTimes.coordTimes.length) {
43773 properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
43774 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
43778 geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
43779 type: 'GeometryCollection',
43780 geometries: geomsAndTimes.geoms
43782 properties: properties
43784 if (attr(root, 'id')) feature.id = attr(root, 'id');
43789 gpx: function(doc) {
43791 tracks = get(doc, 'trk'),
43792 routes = get(doc, 'rte'),
43793 waypoints = get(doc, 'wpt'),
43794 // a feature collection
43797 for (i = 0; i < tracks.length; i++) {
43798 feature = getTrack(tracks[i]);
43799 if (feature) gj.features.push(feature);
43801 for (i = 0; i < routes.length; i++) {
43802 feature = getRoute(routes[i]);
43803 if (feature) gj.features.push(feature);
43805 for (i = 0; i < waypoints.length; i++) {
43806 gj.features.push(getPoint(waypoints[i]));
43808 function getPoints(node, pointname) {
43809 var pts = get(node, pointname),
43814 if (l < 2) return {}; // Invalid line in GeoJSON
43815 for (var i = 0; i < l; i++) {
43816 var c = coordPair(pts[i]);
43817 line.push(c.coordinates);
43818 if (c.time) times.push(c.time);
43819 if (c.heartRate) heartRates.push(c.heartRate);
43824 heartRates: heartRates
43827 function getTrack(node) {
43828 var segments = get(node, 'trkseg'),
43833 for (var i = 0; i < segments.length; i++) {
43834 line = getPoints(segments[i], 'trkpt');
43836 if (line.line) track.push(line.line);
43837 if (line.times && line.times.length) times.push(line.times);
43838 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
43841 if (track.length === 0) return;
43842 var properties = getProperties(node);
43843 extend(properties, getLineStyle(get1(node, 'extensions')));
43844 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
43845 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
43848 properties: properties,
43850 type: track.length === 1 ? 'LineString' : 'MultiLineString',
43851 coordinates: track.length === 1 ? track[0] : track
43855 function getRoute(node) {
43856 var line = getPoints(node, 'rtept');
43857 if (!line.line) return;
43858 var prop = getProperties(node);
43859 extend(prop, getLineStyle(get1(node, 'extensions')));
43864 type: 'LineString',
43865 coordinates: line.line
43870 function getPoint(node) {
43871 var prop = getProperties(node);
43872 extend(prop, getMulti(node, ['sym']));
43878 coordinates: coordPair(node).coordinates
43882 function getLineStyle(extensions) {
43885 var lineStyle = get1(extensions, 'line');
43887 var color = nodeVal(get1(lineStyle, 'color')),
43888 opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
43889 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
43890 if (color) style.stroke = color;
43891 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
43892 // GPX width is in mm, convert to px with 96 px per inch
43893 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
43898 function getProperties(node) {
43899 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
43900 links = get(node, 'link');
43901 if (links.length) prop.links = [];
43902 for (var i = 0, link; i < links.length; i++) {
43903 link = { href: attr(links[i], 'href') };
43904 extend(link, getMulti(links[i], ['text', 'type']));
43905 prop.links.push(link);
43915 module.exports = toGeoJSON;
43918 var _initialized = false;
43919 var _enabled = false;
43923 function svgGpx$$1(projection$$1, context, dispatch) {
43924 var _showLabels = true;
43925 var detected = utilDetect();
43931 if (_initialized) return; // run once
43937 event.stopPropagation();
43938 event.preventDefault();
43939 event.dataTransfer.dropEffect = 'copy';
43943 .attr('dropzone', 'copy')
43944 .on('drop.localgpx', function() {
43945 event.stopPropagation();
43946 event.preventDefault();
43947 if (!detected.filedrop) return;
43948 drawGpx.files(event.dataTransfer.files);
43950 .on('dragenter.localgpx', over)
43951 .on('dragexit.localgpx', over)
43952 .on('dragover.localgpx', over);
43954 _initialized = true;
43958 function drawGpx(selection$$1) {
43959 var getPath = svgPath(projection$$1).geojson;
43961 layer = selection$$1.selectAll('.layer-gpx')
43962 .data(_enabled ? [0] : []);
43967 layer = layer.enter()
43969 .attr('class', 'layer-gpx')
43980 paths = paths.enter()
43982 .attr('class', 'gpx')
43986 .attr('d', getPath);
43989 var labelData = _showLabels && _geojson.features ? _geojson.features : [];
43990 labelData = labelData.filter(getPath);
43993 .call(drawLabels, 'gpxlabel-halo', labelData)
43994 .call(drawLabels, 'gpxlabel', labelData);
43997 function drawLabels(selection$$1, textClass, data) {
43998 var labels = selection$$1.selectAll('text.' + textClass)
44006 labels = labels.enter()
44008 .attr('class', textClass)
44010 .text(function(d) {
44011 if (d.properties) {
44012 return d.properties.desc || d.properties.name;
44016 .attr('x', function(d) {
44017 var centroid = getPath.centroid(d);
44018 return centroid[0] + 11;
44020 .attr('y', function(d) {
44021 var centroid = getPath.centroid(d);
44022 return centroid[1];
44028 function toDom(x) {
44029 return (new DOMParser()).parseFromString(x, 'text/xml');
44033 function getExtension(fileName) {
44034 if (isUndefined(fileName)) {
44038 var lastDotIndex = fileName.lastIndexOf('.');
44039 if (lastDotIndex < 0) {
44043 return fileName.substr(lastDotIndex);
44047 function parseSaveAndZoom(extension, data) {
44048 switch (extension) {
44050 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
44053 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
44057 drawGpx.geojson(JSON.parse(data)).fitZoom();
44063 drawGpx.showLabels = function(_) {
44064 if (!arguments.length) return _showLabels;
44070 drawGpx.enabled = function(_) {
44071 if (!arguments.length) return _enabled;
44073 dispatch.call('change');
44078 drawGpx.hasGpx = function() {
44079 return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
44083 drawGpx.geojson = function(gj) {
44084 if (!arguments.length) return _geojson;
44085 if (isEmpty(gj) || isEmpty(gj.features)) return this;
44087 dispatch.call('change');
44092 drawGpx.url = function(url) {
44093 d3_text(url, function(err, data) {
44096 var extension = getExtension(url);
44097 parseSaveAndZoom(extension, data);
44104 drawGpx.files = function(fileList) {
44105 if (!fileList.length) return this;
44106 var f = fileList[0],
44107 reader = new FileReader();
44109 reader.onload = (function(file) {
44111 var extension = getExtension(file.name);
44112 return function (e) {
44113 parseSaveAndZoom(extension, e.target.result);
44117 reader.readAsText(f);
44122 drawGpx.getSrc = function () {
44127 drawGpx.fitZoom = function() {
44128 if (!this.hasGpx()) return this;
44130 var map = context.map();
44131 var viewport = map.trimmedExtent().polygon();
44132 var coords = reduce(_geojson.features, function(coords, feature) {
44133 var c = feature.geometry.coordinates;
44135 /* eslint-disable no-fallthrough */
44136 switch (feature.geometry.type) {
44143 case 'MultiPolygon':
44146 case 'MultiLineString':
44150 /* eslint-enable no-fallthrough */
44152 return union(coords, c);
44155 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
44156 var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
44157 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
44168 function svgIcon(name, svgklass, useklass) {
44169 return function drawIcon(selection) {
44170 selection.selectAll('svg')
44174 .attr('class', 'icon ' + (svgklass || ''))
44176 .attr('xlink:href', name)
44177 .attr('class', useklass);
44181 function svgLabels(projection$$1, context) {
44182 var path = d3_geoPath(projection$$1);
44183 var detected = utilDetect();
44184 var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
44185 var _rdrawn = rbush_1();
44186 var _rskipped = rbush_1();
44187 var _textWidthCache = {};
44188 var _entitybboxes = {};
44190 // Listed from highest to lowest priority
44192 ['line', 'aeroway', '*', 12],
44193 ['line', 'highway', 'motorway', 12],
44194 ['line', 'highway', 'trunk', 12],
44195 ['line', 'highway', 'primary', 12],
44196 ['line', 'highway', 'secondary', 12],
44197 ['line', 'highway', 'tertiary', 12],
44198 ['line', 'highway', '*', 12],
44199 ['line', 'railway', '*', 12],
44200 ['line', 'waterway', '*', 12],
44201 ['area', 'aeroway', '*', 12],
44202 ['area', 'amenity', '*', 12],
44203 ['area', 'building', '*', 12],
44204 ['area', 'historic', '*', 12],
44205 ['area', 'leisure', '*', 12],
44206 ['area', 'man_made', '*', 12],
44207 ['area', 'natural', '*', 12],
44208 ['area', 'shop', '*', 12],
44209 ['area', 'tourism', '*', 12],
44210 ['area', 'camp_site', '*', 12],
44211 ['point', 'aeroway', '*', 10],
44212 ['point', 'amenity', '*', 10],
44213 ['point', 'building', '*', 10],
44214 ['point', 'historic', '*', 10],
44215 ['point', 'leisure', '*', 10],
44216 ['point', 'man_made', '*', 10],
44217 ['point', 'natural', '*', 10],
44218 ['point', 'shop', '*', 10],
44219 ['point', 'tourism', '*', 10],
44220 ['point', 'camp_site', '*', 10],
44221 ['line', 'name', '*', 12],
44222 ['area', 'name', '*', 12],
44223 ['point', 'name', '*', 10]
44227 function blacklisted(preset) {
44228 var noIcons = ['building', 'landuse', 'natural'];
44229 return some(noIcons, function(s) {
44230 return preset.id.indexOf(s) >= 0;
44235 function get(array, prop) {
44236 return function(d, i) { return array[i][prop]; };
44240 function textWidth(text, size, elem) {
44241 var c = _textWidthCache[size];
44242 if (!c) c = _textWidthCache[size] = {};
44248 c[text] = elem.getComputedTextLength();
44252 var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
44253 if (str === null) {
44254 return size / 3 * 2 * text.length;
44256 return size / 3 * (2 * text.length + str.length);
44262 function drawLinePaths(selection, entities, filter, classes, labels) {
44263 var paths = selection.selectAll('path')
44265 .data(entities, osmEntity$$1.key);
44274 .style('stroke-width', get(labels, 'font-size'))
44275 .attr('id', function(d) { return 'labelpath-' + d.id; })
44276 .attr('class', classes)
44278 .attr('d', get(labels, 'lineString'));
44282 function drawLineLabels(selection, entities, filter, classes, labels) {
44283 var texts = selection.selectAll('text.' + classes)
44285 .data(entities, osmEntity$$1.key);
44294 .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
44295 .attr('dy', baselineHack ? '0.35em' : null)
44296 .append('textPath')
44297 .attr('class', 'textpath');
44300 selection.selectAll('text.' + classes).selectAll('.textpath')
44302 .data(entities, osmEntity$$1.key)
44303 .attr('startOffset', '50%')
44304 .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
44305 .text(utilDisplayNameForPath);
44309 function drawPointLabels(selection, entities, filter, classes, labels) {
44310 var texts = selection.selectAll('text.' + classes)
44312 .data(entities, osmEntity$$1.key);
44321 .attr('class', function(d, i) {
44322 return classes + ' ' + labels[i].classes + ' ' + d.id;
44325 .attr('x', get(labels, 'x'))
44326 .attr('y', get(labels, 'y'))
44327 .style('text-anchor', get(labels, 'textAnchor'))
44328 .text(utilDisplayName)
44329 .each(function(d, i) {
44330 textWidth(utilDisplayName(d), labels[i].height, this);
44335 function drawAreaLabels(selection, entities, filter, classes, labels) {
44336 entities = entities.filter(hasText);
44337 labels = labels.filter(hasText);
44338 drawPointLabels(selection, entities, filter, classes, labels);
44340 function hasText(d, i) {
44341 return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
44346 function drawAreaIcons(selection, entities, filter, classes, labels) {
44347 var icons = selection.selectAll('use.' + classes)
44349 .data(entities, osmEntity$$1.key);
44358 .attr('class', 'icon ' + classes)
44359 .attr('width', '17px')
44360 .attr('height', '17px')
44362 .attr('transform', get(labels, 'transform'))
44363 .attr('xlink:href', function(d) {
44364 var preset = context.presets().match(d, context.graph());
44365 var picon = preset && preset.icon;
44370 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
44371 return '#' + picon + (isMaki ? '-15' : '');
44377 function drawCollisionBoxes(selection, rtree, which) {
44378 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
44381 if (context.getDebug('collision')) {
44382 gj = rtree.all().map(function(d) {
44383 return { type: 'Polygon', coordinates: [[
44393 var boxes = selection.selectAll('.' + which)
44403 .attr('class', classes)
44405 .attr('d', d3_geoPath());
44409 function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
44410 var wireframe = context.surface().classed('fill-wireframe');
44411 var zoom = geoScaleToZoom(projection$$1.scale());
44413 var labelable = [];
44414 var renderNodeAs = {};
44415 var i, j, k, entity, geometry;
44417 for (i = 0; i < labelStack.length; i++) {
44418 labelable.push([]);
44424 _entitybboxes = {};
44427 for (i = 0; i < entities.length; i++) {
44428 entity = entities[i];
44430 .concat(_entitybboxes[entity.id] || [])
44431 .concat(_entitybboxes[entity.id + 'I'] || []);
44433 for (j = 0; j < toRemove.length; j++) {
44434 _rdrawn.remove(toRemove[j]);
44435 _rskipped.remove(toRemove[j]);
44440 // Loop through all the entities to do some preprocessing
44441 for (i = 0; i < entities.length; i++) {
44442 entity = entities[i];
44443 geometry = entity.geometry(graph);
44445 // Insert collision boxes around interesting points/vertices
44446 if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
44447 var hasDirections = entity.directions(graph, projection$$1).length;
44450 if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
44451 renderNodeAs[entity.id] = 'point';
44452 markerPadding = 20; // extra y for marker height
44454 renderNodeAs[entity.id] = 'vertex';
44458 var coord = projection$$1(entity.loc);
44459 var nodePadding = 10;
44461 minX: coord[0] - nodePadding,
44462 minY: coord[1] - nodePadding - markerPadding,
44463 maxX: coord[0] + nodePadding,
44464 maxY: coord[1] + nodePadding
44467 doInsert(bbox, entity.id + 'P');
44470 // From here on, treat vertices like points
44471 if (geometry === 'vertex') {
44472 geometry = 'point';
44475 // Determine which entities are label-able
44476 var preset = geometry === 'area' && context.presets().match(entity, graph);
44477 var icon = preset && !blacklisted(preset) && preset.icon;
44479 if (!icon && !utilDisplayName(entity))
44482 for (k = 0; k < labelStack.length; k++) {
44483 var matchGeom = labelStack[k][0];
44484 var matchKey = labelStack[k][1];
44485 var matchVal = labelStack[k][2];
44486 var hasVal = entity.tags[matchKey];
44488 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
44489 labelable[k].push(entity);
44507 // Try and find a valid label for labellable entities
44508 for (k = 0; k < labelable.length; k++) {
44509 var fontSize = labelStack[k][3];
44511 for (i = 0; i < labelable[k].length; i++) {
44512 entity = labelable[k][i];
44513 geometry = entity.geometry(graph);
44515 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
44516 var name = getName(entity);
44517 var width = name && textWidth(name, fontSize);
44520 if (geometry === 'point' || geometry === 'vertex') {
44521 // no point or vertex labels in wireframe mode
44522 // no vertex labels at low zooms (vertices have no icons)
44523 if (wireframe) continue;
44524 var renderAs = renderNodeAs[entity.id];
44525 if (renderAs === 'vertex' && zoom < 17) continue;
44527 p = getPointLabel(entity, width, fontSize, renderAs);
44529 } else if (geometry === 'line') {
44530 p = getLineLabel(entity, width, fontSize);
44532 } else if (geometry === 'area') {
44533 p = getAreaLabel(entity, width, fontSize);
44537 if (geometry === 'vertex') { geometry = 'point'; } // treat vertex like point
44538 p.classes = geometry + ' tag-' + labelStack[k][1];
44539 positions[geometry].push(p);
44540 labelled[geometry].push(entity);
44546 function isInterestingVertex(entity) {
44547 var selectedIDs = context.selectedIDs();
44549 return entity.hasInterestingTags() ||
44550 entity.isEndpoint(graph) ||
44551 entity.isConnected(graph) ||
44552 selectedIDs.indexOf(entity.id) !== -1 ||
44553 some(graph.parentWays(entity), function(parent) {
44554 return selectedIDs.indexOf(parent.id) !== -1;
44559 function getPointLabel(entity, width, height, geometry) {
44560 var y = (geometry === 'point' ? -12 : 0);
44561 var pointOffsets = {
44562 ltr: [15, y, 'start'],
44563 rtl: [-15, y, 'end']
44566 var coord = projection$$1(entity.loc);
44567 var textPadding = 2;
44568 var offset = pointOffsets[textDirection];
44572 x: coord[0] + offset[0],
44573 y: coord[1] + offset[1],
44574 textAnchor: offset[2]
44577 // insert a collision box for the text label..
44579 if (textDirection === 'rtl') {
44581 minX: p.x - width - textPadding,
44582 minY: p.y - (height / 2) - textPadding,
44583 maxX: p.x + textPadding,
44584 maxY: p.y + (height / 2) + textPadding
44588 minX: p.x - textPadding,
44589 minY: p.y - (height / 2) - textPadding,
44590 maxX: p.x + width + textPadding,
44591 maxY: p.y + (height / 2) + textPadding
44595 if (tryInsert([bbox], entity.id, true)) {
44601 function getLineLabel(entity, width, height) {
44602 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
44603 var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
44604 var length = geoPathLength(points);
44606 if (length < width + 20) return;
44608 // todo: properly clip points to viewport
44610 // % along the line to attempt to place the label
44611 var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
44612 25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
44615 for (var i = 0; i < lineOffsets.length; i++) {
44616 var offset = lineOffsets[i];
44617 var middle = offset / 100 * length;
44618 var start = middle - width / 2;
44620 if (start < 0 || start + width > length) continue;
44622 // generate subpath and ignore paths that are invalid or don't cross viewport.
44623 var sub = subpath(points, start, start + width);
44624 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
44628 var isReverse = reverse(sub);
44630 sub = sub.reverse();
44634 var boxsize = (height + 2) / 2;
44636 for (var j = 0; j < sub.length - 1; j++) {
44638 var b = sub[j + 1];
44640 // split up the text into small collision boxes
44641 var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
44643 for (var box = 0; box < num; box++) {
44644 var p = geoVecInterp(a, b, box / num);
44645 var x0 = p[0] - boxsize - padding;
44646 var y0 = p[1] - boxsize - padding;
44647 var x1 = p[0] + boxsize + padding;
44648 var y1 = p[1] + boxsize + padding;
44651 minX: Math.min(x0, x1),
44652 minY: Math.min(y0, y1),
44653 maxX: Math.max(x0, x1),
44654 maxY: Math.max(y0, y1)
44659 if (tryInsert(bboxes, entity.id, false)) { // accept this one
44661 'font-size': height + 2,
44662 lineString: lineString(sub),
44663 startOffset: offset + '%'
44668 function reverse(p) {
44669 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
44670 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
44673 function lineString(points) {
44674 return 'M' + points.join('L');
44677 function subpath(points, from, to) {
44679 var start, end, i0, i1;
44681 for (var i = 0; i < points.length - 1; i++) {
44683 var b = points[i + 1];
44684 var current = geoVecLength(a, b);
44686 if (!start && sofar + current >= from) {
44687 portion = (from - sofar) / current;
44689 a[0] + portion * (b[0] - a[0]),
44690 a[1] + portion * (b[1] - a[1])
44694 if (!end && sofar + current >= to) {
44695 portion = (to - sofar) / current;
44697 a[0] + portion * (b[0] - a[0]),
44698 a[1] + portion * (b[1] - a[1])
44705 var result = points.slice(i0, i1);
44706 result.unshift(start);
44713 function getAreaLabel(entity, width, height) {
44714 var centroid = path.centroid(entity.asGeoJSON(graph, true));
44715 var extent = entity.extent(graph);
44716 var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
44718 if (isNaN(centroid[0]) || areaWidth < 20) return;
44720 var preset = context.presets().match(entity, context.graph());
44721 var picon = preset && preset.icon;
44726 if (picon) { // icon and label..
44728 addLabel(iconSize + padding);
44731 } else { // label only..
44738 function addIcon() {
44739 var iconX = centroid[0] - (iconSize / 2);
44740 var iconY = centroid[1] - (iconSize / 2);
44744 maxX: iconX + iconSize,
44745 maxY: iconY + iconSize
44748 if (tryInsert([bbox], entity.id + 'I', true)) {
44749 p.transform = 'translate(' + iconX + ',' + iconY + ')';
44755 function addLabel(yOffset) {
44756 if (width && areaWidth >= width + 20) {
44757 var labelX = centroid[0];
44758 var labelY = centroid[1] + yOffset;
44760 minX: labelX - (width / 2) - padding,
44761 minY: labelY - (height / 2) - padding,
44762 maxX: labelX + (width / 2) + padding,
44763 maxY: labelY + (height / 2) + padding
44766 if (tryInsert([bbox], entity.id, true)) {
44769 p.textAnchor = 'middle';
44779 // force insert a singular bounding box
44780 // singular box only, no array, id better be unique
44781 function doInsert(bbox, id) {
44784 var oldbox = _entitybboxes[id];
44786 _rdrawn.remove(oldbox);
44788 _entitybboxes[id] = bbox;
44789 _rdrawn.insert(bbox);
44793 function tryInsert(bboxes, id, saveSkipped) {
44794 var skipped = false;
44796 for (var i = 0; i < bboxes.length; i++) {
44797 var bbox = bboxes[i];
44800 // Check that label is visible
44801 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
44805 if (_rdrawn.collides(bbox)) {
44811 _entitybboxes[id] = bboxes;
44815 _rskipped.load(bboxes);
44818 _rdrawn.load(bboxes);
44825 var layer = selection.selectAll('.layer-labels');
44826 var halo = layer.selectAll('.layer-labels-halo');
44827 var label = layer.selectAll('.layer-labels-label');
44828 var debug = layer.selectAll('.layer-labels-debug');
44831 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
44832 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
44835 drawLinePaths(halo, labelled.line, filter, '', positions.line);
44836 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
44837 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
44840 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
44841 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
44842 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
44843 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
44846 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
44847 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
44849 layer.call(filterLabels);
44853 function filterLabels(selection) {
44854 var layers = selection
44855 .selectAll('.layer-labels-label, .layer-labels-halo');
44857 layers.selectAll('.nolabel')
44858 .classed('nolabel', false);
44860 var mouse = context.mouse();
44861 var graph = context.graph();
44862 var selectedIDs = context.selectedIDs();
44866 // hide labels near the mouse
44869 bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
44870 ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
44873 // hide labels on selected nodes (they look weird when dragging / haloed)
44874 for (var i = 0; i < selectedIDs.length; i++) {
44875 var entity = graph.hasEntity(selectedIDs[i]);
44876 if (entity && entity.type === 'node') {
44877 ids.push(selectedIDs[i]);
44881 layers.selectAll(utilEntitySelector(ids))
44882 .classed('nolabel', true);
44885 // draw the mouse bbox if debugging is on..
44886 var debug = selection.selectAll('.layer-labels-debug');
44888 if (context.getDebug('collision')) {
44892 [bbox.minX, bbox.minY],
44893 [bbox.maxX, bbox.minY],
44894 [bbox.maxX, bbox.maxY],
44895 [bbox.minX, bbox.maxY],
44896 [bbox.minX, bbox.minY]
44901 var box = debug.selectAll('.debug-mouse')
44911 .attr('class', 'debug debug-mouse yellow')
44913 .attr('d', d3_geoPath());
44917 var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
44920 drawLabels.observe = function(selection) {
44921 var listener = function() { throttleFilterLabels(selection); };
44922 selection.on('mousemove.hidelabels', listener);
44923 context.on('enter.hidelabels', listener);
44927 drawLabels.off = function(selection) {
44928 throttleFilterLabels.cancel();
44929 selection.on('mousemove.hidelabels', null);
44930 context.on('enter.hidelabels', null);
44937 function svgMapillaryImages$$1(projection, context, dispatch) {
44938 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
44940 var minMarkerZoom = 16;
44941 var minViewfieldZoom = 18;
44942 var layer = d3_select(null);
44947 if (svgMapillaryImages$$1.initialized) return; // run once
44948 svgMapillaryImages$$1.enabled = false;
44949 svgMapillaryImages$$1.initialized = true;
44953 function getService() {
44954 if (services.mapillary && !_mapillary) {
44955 _mapillary = services.mapillary;
44956 _mapillary.event.on('loadedImages', throttledRedraw);
44957 } else if (!services.mapillary && _mapillary) {
44965 function showLayer() {
44966 var service = getService();
44967 if (!service) return;
44969 service.loadViewer(context);
44973 .style('opacity', 0)
44976 .style('opacity', 1)
44977 .on('end', function () { dispatch.call('change'); });
44981 function hideLayer() {
44982 var service = getService();
44984 service.hideViewer();
44987 throttledRedraw.cancel();
44992 .style('opacity', 0)
44993 .on('end', editOff);
44997 function editOn() {
44998 layer.style('display', 'block');
45002 function editOff() {
45003 layer.selectAll('.viewfield-group').remove();
45004 layer.style('display', 'none');
45008 function click(d) {
45009 var service = getService();
45010 if (!service) return;
45014 .updateViewer(d.key, context)
45017 context.map().centerEase(d.loc);
45021 function mouseover(d) {
45022 var service = getService();
45023 if (service) service.setStyles(d);
45027 function mouseout() {
45028 var service = getService();
45029 if (service) service.setStyles(null);
45033 function transform(d) {
45034 var t = svgPointTransform(projection)(d);
45036 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45042 function update() {
45043 var viewer = d3_select('#photoviewer');
45044 var selected = viewer.empty() ? undefined : viewer.datum();
45046 var z = ~~context.map().zoom();
45047 var showMarkers = (z >= minMarkerZoom);
45048 var showViewfields = (z >= minViewfieldZoom);
45050 var service = getService();
45051 var sequences = (service ? service.sequences(projection) : []);
45052 var images = (service && showMarkers ? service.images(projection) : []);
45054 var traces = layer.selectAll('.sequences').selectAll('.sequence')
45055 .data(sequences, function(d) { return d.properties.key; });
45062 traces = traces.enter()
45064 .attr('class', 'sequence')
45066 .attr('d', svgPath(projection).geojson);
45069 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45070 .data(images, function(d) { return d.key; });
45077 var groupsEnter = groups.enter()
45079 .attr('class', 'viewfield-group')
45080 .on('mouseover', mouseover)
45081 .on('mouseout', mouseout)
45082 .on('click', click);
45086 .attr('class', 'viewfield-scale');
45089 var markers = groups
45090 .merge(groupsEnter)
45091 .sort(function(a, b) {
45092 return (a === selected) ? 1
45093 : (b === selected) ? -1
45094 : b.loc[1] - a.loc[1]; // sort Y
45096 .attr('transform', transform)
45097 .select('.viewfield-scale');
45100 markers.selectAll('circle')
45108 var viewfields = markers.selectAll('.viewfield')
45109 .data(showViewfields ? [0] : []);
45114 viewfields.enter() // viewfields may or may not be drawn...
45115 .insert('path', 'circle') // but if they are, draw below the circles
45116 .attr('class', 'viewfield')
45117 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45118 .attr('d', viewfieldPath);
45120 function viewfieldPath() {
45121 var d = this.parentNode.__data__;
45123 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45125 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45131 function drawImages(selection$$1) {
45132 var enabled = svgMapillaryImages$$1.enabled,
45133 service = getService();
45135 layer = selection$$1.selectAll('.layer-mapillary-images')
45136 .data(service ? [0] : []);
45141 var layerEnter = layer.enter()
45143 .attr('class', 'layer-mapillary-images')
45144 .style('display', enabled ? 'block' : 'none');
45148 .attr('class', 'sequences');
45152 .attr('class', 'markers');
45158 if (service && ~~context.map().zoom() >= minZoom) {
45161 service.loadImages(projection);
45169 drawImages.enabled = function(_) {
45170 if (!arguments.length) return svgMapillaryImages$$1.enabled;
45171 svgMapillaryImages$$1.enabled = _;
45172 if (svgMapillaryImages$$1.enabled) {
45177 dispatch.call('change');
45182 drawImages.supported = function() {
45183 return !!getService();
45191 function svgMapillarySigns(projection, context, dispatch) {
45192 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45194 var layer = d3_select(null);
45199 if (svgMapillarySigns.initialized) return; // run once
45200 svgMapillarySigns.enabled = false;
45201 svgMapillarySigns.initialized = true;
45205 function getService() {
45206 if (services.mapillary && !_mapillary) {
45207 _mapillary = services.mapillary;
45208 _mapillary.event.on('loadedSigns', throttledRedraw);
45209 } else if (!services.mapillary && _mapillary) {
45216 function showLayer() {
45217 var service = getService();
45218 if (!service) return;
45220 service.loadViewer(context);
45225 function hideLayer() {
45226 throttledRedraw.cancel();
45231 function editOn() {
45232 layer.style('display', 'block');
45236 function editOff() {
45237 layer.selectAll('.icon-sign').remove();
45238 layer.style('display', 'none');
45242 function click(d) {
45243 var service = getService();
45244 if (!service) return;
45246 context.map().centerEase(d.loc);
45248 var selected = service.getSelectedImage();
45249 var selectedImageKey = selected && selected.key;
45252 // Pick one of the images the sign was detected in,
45253 // preference given to an image already selected.
45254 d.detections.forEach(function(detection) {
45255 if (!imageKey || selectedImageKey === detection.image_key) {
45256 imageKey = detection.image_key;
45261 .selectImage(null, imageKey)
45262 .updateViewer(imageKey, context)
45267 function update() {
45268 var service = getService();
45269 var data = (service ? service.signs(projection) : []);
45270 var viewer = d3_select('#photoviewer');
45271 var selected = viewer.empty() ? undefined : viewer.datum();
45272 var selectedImageKey = selected && selected.key;
45274 var signs = layer.selectAll('.icon-sign')
45275 .data(data, function(d) { return d.key; });
45280 var enter = signs.enter()
45281 .append('foreignObject')
45282 .attr('class', 'icon-sign')
45283 .attr('width', '24px') // for Firefox
45284 .attr('height', '24px') // for Firefox
45285 .classed('selected', function(d) {
45286 return some(d.detections, function(detection) {
45287 return detection.image_key === selectedImageKey;
45290 .on('click', click);
45293 .append('xhtml:body')
45294 .attr('class', 'icon-sign-body')
45295 .html(service.signHTML);
45299 .attr('x', function(d) { return projection(d.loc)[0] - 12; }) // offset by -12px to
45300 .attr('y', function(d) { return projection(d.loc)[1] - 12; }); // center signs on loc
45304 function drawSigns(selection$$1) {
45305 var enabled = svgMapillarySigns.enabled,
45306 service = getService();
45308 layer = selection$$1.selectAll('.layer-mapillary-signs')
45309 .data(service ? [0] : []);
45314 layer = layer.enter()
45316 .attr('class', 'layer-mapillary-signs')
45317 .style('display', enabled ? 'block' : 'none')
45321 if (service && ~~context.map().zoom() >= minZoom) {
45324 service.loadSigns(context, projection);
45332 drawSigns.enabled = function(_) {
45333 if (!arguments.length) return svgMapillarySigns.enabled;
45334 svgMapillarySigns.enabled = _;
45335 if (svgMapillarySigns.enabled) {
45340 dispatch.call('change');
45345 drawSigns.supported = function() {
45346 var service = getService();
45347 return (service && service.signsSupported());
45355 function svgOpenstreetcamImages$$1(projection, context, dispatch) {
45356 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
45358 var minMarkerZoom = 16;
45359 var minViewfieldZoom = 18;
45360 var layer = d3_select(null);
45361 var _openstreetcam;
45365 if (svgOpenstreetcamImages$$1.initialized) return; // run once
45366 svgOpenstreetcamImages$$1.enabled = false;
45367 svgOpenstreetcamImages$$1.initialized = true;
45371 function getService() {
45372 if (services.openstreetcam && !_openstreetcam) {
45373 _openstreetcam = services.openstreetcam;
45374 _openstreetcam.event.on('loadedImages', throttledRedraw);
45375 } else if (!services.openstreetcam && _openstreetcam) {
45376 _openstreetcam = null;
45379 return _openstreetcam;
45383 function showLayer() {
45384 var service = getService();
45385 if (!service) return;
45387 service.loadViewer(context);
45391 .style('opacity', 0)
45394 .style('opacity', 1)
45395 .on('end', function () { dispatch.call('change'); });
45399 function hideLayer() {
45400 var service = getService();
45402 service.hideViewer();
45405 throttledRedraw.cancel();
45410 .style('opacity', 0)
45411 .on('end', editOff);
45415 function editOn() {
45416 layer.style('display', 'block');
45420 function editOff() {
45421 layer.selectAll('.viewfield-group').remove();
45422 layer.style('display', 'none');
45426 function click(d) {
45427 var service = getService();
45428 if (!service) return;
45435 context.map().centerEase(d.loc);
45439 function mouseover(d) {
45440 var service = getService();
45441 if (service) service.setStyles(d);
45445 function mouseout() {
45446 var service = getService();
45447 if (service) service.setStyles(null);
45451 function transform(d) {
45452 var t = svgPointTransform(projection)(d);
45454 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
45460 function update() {
45461 var viewer = d3_select('#photoviewer');
45462 var selected = viewer.empty() ? undefined : viewer.datum();
45464 var z = ~~context.map().zoom();
45465 var showMarkers = (z >= minMarkerZoom);
45466 var showViewfields = (z >= minViewfieldZoom);
45468 var service = getService();
45469 var sequences = (service ? service.sequences(projection) : []);
45470 var images = (service && showMarkers ? service.images(projection) : []);
45472 var traces = layer.selectAll('.sequences').selectAll('.sequence')
45473 .data(sequences, function(d) { return d.properties.key; });
45480 traces = traces.enter()
45482 .attr('class', 'sequence')
45484 .attr('d', svgPath(projection).geojson);
45487 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
45488 .data(images, function(d) { return d.key; });
45495 var groupsEnter = groups.enter()
45497 .attr('class', 'viewfield-group')
45498 .on('mouseover', mouseover)
45499 .on('mouseout', mouseout)
45500 .on('click', click);
45504 .attr('class', 'viewfield-scale');
45507 var markers = groups
45508 .merge(groupsEnter)
45509 .sort(function(a, b) {
45510 return (a === selected) ? 1
45511 : (b === selected) ? -1
45512 : b.loc[1] - a.loc[1]; // sort Y
45514 .attr('transform', transform)
45515 .select('.viewfield-scale');
45518 markers.selectAll('circle')
45526 var viewfields = markers.selectAll('.viewfield')
45527 .data(showViewfields ? [0] : []);
45532 viewfields.enter() // viewfields may or may not be drawn...
45533 .insert('path', 'circle') // but if they are, draw below the circles
45534 .attr('class', 'viewfield')
45535 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
45536 .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');
45540 function drawImages(selection$$1) {
45541 var enabled = svgOpenstreetcamImages$$1.enabled,
45542 service = getService();
45544 layer = selection$$1.selectAll('.layer-openstreetcam-images')
45545 .data(service ? [0] : []);
45550 var layerEnter = layer.enter()
45552 .attr('class', 'layer-openstreetcam-images')
45553 .style('display', enabled ? 'block' : 'none');
45557 .attr('class', 'sequences');
45561 .attr('class', 'markers');
45567 if (service && ~~context.map().zoom() >= minZoom) {
45570 service.loadImages(projection);
45578 drawImages.enabled = function(_) {
45579 if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
45580 svgOpenstreetcamImages$$1.enabled = _;
45581 if (svgOpenstreetcamImages$$1.enabled) {
45586 dispatch.call('change');
45591 drawImages.supported = function() {
45592 return !!getService();
45600 function svgOsm(projection, context, dispatch) {
45601 var enabled = true;
45604 function drawOsm(selection) {
45605 selection.selectAll('.layer-osm')
45606 .data(['covered', 'areas', 'lines', 'points', 'labels'])
45609 .attr('class', function(d) { return 'layer-osm layer-' + d; });
45611 selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
45612 .data(['areas', 'targets'])
45615 .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
45617 selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
45618 .data(['lines', 'targets'])
45621 .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
45623 selection.selectAll('.layer-points').selectAll('.layer-points-group')
45624 .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
45627 .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
45629 selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
45630 .data(['halo', 'label', 'debug'])
45633 .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
45637 function showLayer() {
45638 var layer = context.surface().selectAll('.data-layer-osm');
45642 .classed('disabled', false)
45643 .style('opacity', 0)
45646 .style('opacity', 1)
45647 .on('end interrupt', function () {
45648 dispatch.call('change');
45653 function hideLayer() {
45654 var layer = context.surface().selectAll('.data-layer-osm');
45660 .style('opacity', 0)
45661 .on('end interrupt', function () {
45662 layer.classed('disabled', true);
45663 dispatch.call('change');
45668 drawOsm.enabled = function(_) {
45669 if (!arguments.length) return enabled;
45678 dispatch.call('change');
45686 function svgLayers(projection, context) {
45687 var dispatch$$1 = dispatch('change'),
45688 svg = d3_select(null),
45690 { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
45691 { id: 'gpx', layer: svgGpx$$1(projection, context, dispatch$$1) },
45692 { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
45693 { id: 'mapillary-signs', layer: svgMapillarySigns(projection, context, dispatch$$1) },
45694 { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
45695 { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
45699 function drawLayers(selection$$1) {
45700 svg = selection$$1.selectAll('.surface')
45705 .attr('class', 'surface')
45708 var defs = svg.selectAll('.surface-defs')
45713 .attr('class', 'surface-defs');
45715 var groups = svg.selectAll('.data-layer')
45723 .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
45725 .each(function(d) { d3_select(this).call(d.layer); });
45729 drawLayers.all = function() {
45734 drawLayers.layer = function(id) {
45735 var obj = find$1(layers, function(o) {return o.id === id;});
45736 return obj && obj.layer;
45740 drawLayers.only = function(what) {
45741 var arr = [].concat(what);
45742 drawLayers.remove(difference(map$3(layers, 'id'), arr));
45747 drawLayers.remove = function(what) {
45748 var arr = [].concat(what);
45749 arr.forEach(function(id) {
45750 layers = reject(layers, function(o) {return o.id === id;});
45752 dispatch$$1.call('change');
45757 drawLayers.add = function(what) {
45758 var arr = [].concat(what);
45759 arr.forEach(function(obj) {
45760 if ('id' in obj && 'layer' in obj) {
45764 dispatch$$1.call('change');
45769 drawLayers.dimensions = function(_) {
45770 if (!arguments.length) return utilGetDimensions(svg);
45771 utilSetDimensions(svg, _);
45776 return utilRebind(drawLayers, dispatch$$1, 'on');
45779 function svgLines$$1(projection, context) {
45780 var detected = utilDetect();
45782 var highway_stack = {
45798 function drawTargets(selection, graph, entities, filter$$1) {
45799 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
45800 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
45801 var getPath = svgPath(projection).geojson;
45802 var activeID = context.activeID();
45804 // The targets and nopes will be MultiLineString sub-segments of the ways
45805 var data = { targets: [], nopes: [] };
45807 entities.forEach(function(way) {
45808 var features = svgSegmentWay(way, graph, activeID);
45809 data.targets.push.apply(data.targets, features.passive);
45810 data.nopes.push.apply(data.nopes, features.active);
45814 // Targets allow hover and vertex snapping
45815 var targetData = data.targets.filter(getPath);
45816 var targets = selection.selectAll('.line.target-allowed')
45817 .filter(function(d) { return filter$$1(d.properties.entity); })
45818 .data(targetData, function key(d) { return d.id; });
45828 .attr('d', getPath)
45829 .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
45833 var nopeData = data.nopes.filter(getPath);
45834 var nopes = selection.selectAll('.line.target-nope')
45835 .filter(function(d) { return filter$$1(d.properties.entity); })
45836 .data(nopeData, function key(d) { return d.id; });
45846 .attr('d', getPath)
45847 .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
45851 function drawLines(selection, graph, entities, filter$$1) {
45853 function waystack(a, b) {
45854 var selected = context.selectedIDs();
45855 var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
45856 var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
45858 if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
45859 if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
45860 return scoreA - scoreB;
45864 function drawLineGroup(selection, klass, isSelected) {
45865 // Note: Don't add `.selected` class in draw modes
45866 var mode = context.mode();
45867 var isDrawing = mode && /^draw/.test(mode.id);
45868 var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
45870 var lines = selection
45873 .data(getPathData(isSelected), osmEntity$$1.key);
45878 // Optimization: Call expensive TagClasses only on enter selection. This
45879 // works because osmEntity.key is defined to include the entity v attribute.
45882 .attr('class', function(d) {
45883 var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
45884 return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
45886 .call(svgTagClasses())
45889 .attr('d', getPath)
45890 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
45896 function getPathData(isSelected) {
45897 return function() {
45898 var layer = this.parentNode.__data__;
45899 var data = pathdata[layer] || [];
45900 return data.filter(function(d) {
45902 return context.selectedIDs().indexOf(d.id) !== -1;
45904 return context.selectedIDs().indexOf(d.id) === -1;
45910 var getPath = svgPath(projection, graph);
45913 var onewaydata = {};
45914 var oldMultiPolygonOuters = {};
45916 for (var i = 0; i < entities.length; i++) {
45917 var entity = entities[i];
45918 var outer = osmSimpleMultipolygonOuterMember(entity, graph);
45920 ways.push(entity.mergeTags(outer.tags));
45921 oldMultiPolygonOuters[outer.id] = true;
45922 } else if (entity.geometry(graph) === 'line') {
45927 ways = ways.filter(getPath);
45928 pathdata = groupBy(ways, function(way) { return way.layer(); });
45930 forOwn(pathdata, function(v, k) {
45931 var arr = filter(v, function(d) { return d.isOneWay(); });
45932 onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
45936 var covered = selection.selectAll('.layer-covered'); // under areas
45937 var uncovered = selection.selectAll('.layer-lines .layer-lines-lines'); // over areas
45939 [covered, uncovered].forEach(function(selection) {
45940 var range$$1 = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
45941 var layergroup = selection
45942 .selectAll('g.layergroup')
45945 layergroup = layergroup.enter()
45947 .attr('class', function(d) { return 'layergroup layer' + String(d); })
45948 .merge(layergroup);
45951 .selectAll('g.linegroup')
45952 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
45955 .attr('class', function(d) { return 'linegroup line-' + d; });
45957 layergroup.selectAll('g.line-shadow')
45958 .call(drawLineGroup, 'shadow', false);
45959 layergroup.selectAll('g.line-casing')
45960 .call(drawLineGroup, 'casing', false);
45961 layergroup.selectAll('g.line-stroke')
45962 .call(drawLineGroup, 'stroke', false);
45964 layergroup.selectAll('g.line-shadow-highlighted')
45965 .call(drawLineGroup, 'shadow', true);
45966 layergroup.selectAll('g.line-casing-highlighted')
45967 .call(drawLineGroup, 'casing', true);
45968 layergroup.selectAll('g.line-stroke-highlighted')
45969 .call(drawLineGroup, 'stroke', true);
45972 var onewaygroup = layergroup
45973 .selectAll('g.onewaygroup')
45976 onewaygroup = onewaygroup.enter()
45978 .attr('class', 'onewaygroup')
45979 .merge(onewaygroup);
45981 var oneways = onewaygroup
45985 function data() { return onewaydata[this.parentNode.__data__] || []; },
45986 function key(d) { return [d.id, d.index]; }
45992 oneways = oneways.enter()
45994 .attr('class', 'oneway')
45995 .attr('marker-mid', 'url(#oneway-marker)')
45997 .attr('d', function(d) { return d.d; });
46000 oneways.each(function() { this.parentNode.insertBefore(this, this); });
46005 selection.selectAll('.layer-lines .layer-lines-targets')
46006 .call(drawTargets, graph, ways, filter$$1);
46013 function svgMidpoints$$1(projection, context) {
46014 var targetRadius = 8;
46016 function drawTargets(selection, graph, entities, filter) {
46017 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46018 var getTransform = svgPointTransform(projection).geojson;
46020 var data = entities.map(function(midpoint) {
46030 coordinates: midpoint.loc
46035 var targets = selection.selectAll('.midpoint.target')
46036 .filter(function(d) { return filter(d.properties.entity); })
46037 .data(data, function key(d) { return d.id; });
46046 .attr('r', targetRadius)
46048 .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
46049 .attr('transform', getTransform);
46053 function drawMidpoints(selection, graph, entities, filter, extent) {
46054 var layer = selection.selectAll('.layer-points .layer-points-midpoints');
46056 var mode = context.mode();
46057 if (mode && mode.id !== 'select') {
46058 layer.selectAll('g.midpoint')
46061 selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
46067 var poly = extent.polygon();
46068 var midpoints = {};
46070 for (var i = 0; i < entities.length; i++) {
46071 var entity = entities[i];
46073 if (entity.type !== 'way')
46075 if (!filter(entity))
46077 if (context.selectedIDs().indexOf(entity.id) < 0)
46080 var nodes = graph.childNodes(entity);
46081 for (var j = 0; j < nodes.length - 1; j++) {
46084 var b = nodes[j + 1];
46085 var id = [a.id, b.id].sort().join('-');
46087 if (midpoints[id]) {
46088 midpoints[id].parents.push(entity);
46090 if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
46091 var point = geoVecInterp(a.loc, b.loc, 0.5);
46094 if (extent.intersects(point)) {
46097 for (var k = 0; k < 4; k++) {
46098 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
46100 geoVecLength(projection(a.loc), projection(point)) > 20 &&
46101 geoVecLength(projection(b.loc), projection(point)) > 20)
46114 edge: [a.id, b.id],
46124 function midpointFilter(d) {
46125 if (midpoints[d.id])
46128 for (var i = 0; i < d.parents.length; i++) {
46129 if (filter(d.parents[i])) {
46139 .selectAll('g.midpoint')
46140 .filter(midpointFilter)
46141 .data(values$1(midpoints), function(d) { return d.id; });
46146 var enter = groups.enter()
46147 .insert('g', ':first-child')
46148 .attr('class', 'midpoint');
46152 .attr('points', '-6,8 10,0 -6,-8')
46153 .attr('class', 'shadow');
46157 .attr('points', '-3,4 5,0 -3,-4')
46158 .attr('class', 'fill');
46162 .attr('transform', function(d) {
46163 var translate = svgPointTransform(projection);
46164 var a = graph.entity(d.edge[0]);
46165 var b = graph.entity(d.edge[1]);
46166 var angle = geoAngle(a, b, projection) * (180 / Math.PI);
46167 return translate(d) + ' rotate(' + angle + ')';
46169 .call(svgTagClasses().tags(
46170 function(d) { return d.parents[0].tags; }
46173 // Propagate data bindings.
46174 groups.select('polygon.shadow');
46175 groups.select('polygon.fill');
46178 // Draw touch targets..
46179 selection.selectAll('.layer-points .layer-points-targets')
46180 .call(drawTargets, graph, values$1(midpoints), midpointFilter);
46183 return drawMidpoints;
46186 // Touch targets control which other vertices we can drag a vertex onto.
46188 // - the activeID - nope
46189 // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
46190 // - 2 away from the activeID - nope (would create a self intersecting segment)
46191 // - all others on a linear way - yes
46192 // - all others on a closed way - nope (would create a self intersecting polygon)
46195 // 0 = active vertex - no touch/connect
46196 // 1 = passive vertex - yes touch/connect
46197 // 2 = adjacent vertex - yes but pay attention segmenting a line here
46199 function svgPassiveVertex(node, graph, activeID) {
46200 if (!activeID) return 1;
46201 if (activeID === node.id) return 0;
46203 var parents = graph.parentWays(node);
46205 for (var i = 0; i < parents.length; i++) {
46206 var nodes = parents[i].nodes;
46207 var isClosed = parents[i].isClosed();
46208 for (var j = 0; j < nodes.length; j++) { // find this vertex, look nearby
46209 if (nodes[j] === node.id) {
46215 if (isClosed) { // wraparound if needed
46216 var max = nodes.length - 1;
46217 if (ix1 < 0) ix1 = max + ix1;
46218 if (ix2 < 0) ix2 = max + ix2;
46219 if (ix3 > max) ix3 = ix3 - max;
46220 if (ix4 > max) ix4 = ix4 - max;
46223 if (nodes[ix1] === activeID) return 0; // no - prevent self intersect
46224 else if (nodes[ix2] === activeID) return 2; // ok - adjacent
46225 else if (nodes[ix3] === activeID) return 2; // ok - adjacent
46226 else if (nodes[ix4] === activeID) return 0; // no - prevent self intersect
46227 else if (isClosed && nodes.indexOf(activeID) !== -1) return 0; // no - prevent self intersect
46236 function svgOneWaySegments(projection$$1, graph, dt) {
46237 return function(entity) {
46241 var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
46242 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
46245 if (entity.tags.oneway === '-1') {
46246 coordinates.reverse();
46249 var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
46252 type: 'LineString',
46253 coordinates: coordinates
46254 }, projection$$1.stream(clip({
46255 lineStart: function() {},
46256 lineEnd: function() { a = null; },
46257 point: function(x, y) {
46261 var span = geoVecLength(a, b) - offset;
46264 var heading = geoVecAngle(a, b);
46265 var dx = dt * Math.cos(heading);
46266 var dy = dt * Math.sin(heading);
46268 a[0] + offset * Math.cos(heading),
46269 a[1] + offset * Math.sin(heading)
46272 // gather coordinates
46273 var coord = [a, p];
46274 for (span -= dt; span >= 0; span -= dt) {
46275 p = geoVecAdd(p, [dx, dy]);
46280 // generate svg paths
46284 for (j = 0; j < coord.length; j++) {
46285 segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46287 segments.push({ id: entity.id, index: i++, d: segment });
46289 if (isReversible) {
46291 for (j = coord.length - 1; j >= 0; j--) {
46292 segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
46294 segments.push({ id: entity.id, index: i++, d: segment });
46310 function svgPath(projection$$1, graph, isArea) {
46312 // Explanation of magic numbers:
46313 // "padding" here allows space for strokes to extend beyond the viewport,
46314 // so that the stroke isn't drawn along the edge of the viewport when
46315 // the shape is clipped.
46317 // When drawing lines, pad viewport by 5px.
46318 // When drawing areas, pad viewport by 65px in each direction to allow
46319 // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
46322 var padding = isArea ? 65 : 5;
46323 var viewport = projection$$1.clipExtent();
46324 var paddedExtent = [
46325 [viewport[0][0] - padding, viewport[0][1] - padding],
46326 [viewport[1][0] + padding, viewport[1][1] + padding]
46328 var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
46329 var project = projection$$1.stream;
46330 var path = d3_geoPath()
46331 .projection({stream: function(output) { return project(clip(output)); }});
46333 var svgpath = function(entity) {
46334 if (entity.id in cache) {
46335 return cache[entity.id];
46337 return cache[entity.id] = path(entity.asGeoJSON(graph));
46341 svgpath.geojson = path;
46347 function svgPointTransform(projection$$1) {
46348 var svgpoint = function(entity) {
46349 // http://jsperf.com/short-array-join
46350 var pt = projection$$1(entity.loc);
46351 return 'translate(' + pt[0] + ',' + pt[1] + ')';
46354 svgpoint.geojson = function(d) {
46355 return svgpoint(d.properties.entity);
46362 function svgRelationMemberTags(graph) {
46363 return function(entity) {
46364 var tags = entity.tags;
46365 graph.parentRelations(entity).forEach(function(relation) {
46366 var type = relation.tags.type;
46367 if (type === 'multipolygon' || type === 'boundary') {
46368 tags = assignIn({}, relation.tags, tags);
46376 function svgSegmentWay(way, graph, activeID) {
46377 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
46378 var features = { passive: [], active: [] };
46383 for (var i = 0; i < way.nodes.length; i++) {
46384 node = graph.entity(way.nodes[i]);
46385 type = svgPassiveVertex(node, graph, activeID);
46386 end = { node: node, type: type };
46388 if (start.type !== undefined) {
46389 if (start.node.id === activeID || end.node.id === activeID) {
46391 } else if (isActiveWay && (start.type === 2 || end.type === 2)) { // one adjacent vertex
46392 pushActive(start, end, i);
46393 } else if (start.type === 0 && end.type === 0) { // both active vertices
46394 pushActive(start, end, i);
46396 pushPassive(start, end, i);
46406 function pushActive(start, end, index) {
46407 features.active.push({
46409 id: way.id + '-' + index + '-nope',
46414 nodes: [start.node, end.node],
46418 type: 'LineString',
46419 coordinates: [start.node.loc, end.node.loc]
46424 function pushPassive(start, end, index) {
46425 features.passive.push({
46427 id: way.id + '-' + index,
46431 nodes: [start.node, end.node],
46435 type: 'LineString',
46436 coordinates: [start.node.loc, end.node.loc]
46442 function svgPoints$$1(projection, context) {
46444 function markerPath(selection, klass) {
46446 .attr('class', klass)
46447 .attr('transform', 'translate(-8, -23)')
46448 .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');
46451 function sortY(a, b) {
46452 return b.loc[1] - a.loc[1];
46456 // Avoid exit/enter if we're just moving stuff around.
46457 // The node will get a new version but we only need to run the update selection.
46458 function fastEntityKey(d) {
46459 var mode = context.mode();
46460 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46461 return isMoving ? d.id : osmEntity$$1.key(d);
46465 function drawTargets(selection, graph, entities, filter) {
46466 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46467 var getTransform = svgPointTransform(projection).geojson;
46468 var activeID = context.activeID();
46471 entities.forEach(function(node) {
46472 if (activeID === node.id) return; // draw no target on the activeID
46481 geometry: node.asGeoJSON()
46485 var targets = selection.selectAll('.point.target')
46486 .filter(function(d) { return filter(d.properties.entity); })
46487 .data(data$$1, function key(d) { return d.id; });
46499 .attr('height', 30)
46501 .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
46502 .attr('transform', getTransform);
46506 function drawPoints(selection, graph, entities, filter) {
46507 var wireframe = context.surface().classed('fill-wireframe');
46508 var zoom = geoScaleToZoom(projection.scale());
46510 // points with a direction will render as vertices at higher zooms
46511 function renderAsPoint(entity) {
46512 return entity.geometry(graph) === 'point' &&
46513 !(zoom >= 18 && entity.directions(graph, projection).length);
46516 // all points will render as vertices in wireframe mode too
46517 var points = wireframe ? [] : entities.filter(renderAsPoint);
46519 points.sort(sortY);
46522 var layer = selection.selectAll('.layer-points .layer-points-points');
46524 var groups = layer.selectAll('g.point')
46526 .data(points, fastEntityKey);
46531 var enter = groups.enter()
46533 .attr('class', function(d) { return 'node point ' + d.id; })
46538 .call(markerPath, 'shadow');
46546 .attr('class', 'stroke');
46550 .call(markerPath, 'stroke');
46554 .attr('transform', 'translate(-5, -19)')
46555 .attr('class', 'icon')
46556 .attr('width', '11px')
46557 .attr('height', '11px');
46561 .attr('transform', svgPointTransform(projection))
46562 .call(svgTagClasses());
46564 // Selecting the following implicitly
46565 // sets the data (point entity) on the element
46566 groups.select('.shadow');
46567 groups.select('.stroke');
46568 groups.select('.icon')
46569 .attr('xlink:href', function(entity) {
46570 var preset = context.presets().match(entity, graph);
46571 var picon = preset && preset.icon;
46576 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46577 return '#' + picon + (isMaki ? '-11' : '');
46583 selection.selectAll('.layer-points .layer-points-targets')
46584 .call(drawTargets, graph, points, filter);
46591 function svgTagClasses() {
46593 'building', 'highway', 'railway', 'waterway', 'aeroway',
46594 'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
46595 'leisure', 'military', 'place'
46598 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
46599 'razed', 'demolished', 'obliterated', 'intermittent'
46602 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
46603 'surface', 'tracktype', 'crossing', 'service', 'sport'
46605 tagClassRe = /^tag-/,
46606 tags = function(entity) { return entity.tags; };
46609 var tagClasses = function(selection$$1) {
46610 selection$$1.each(function tagClassesEach(entity) {
46611 var value = this.className,
46612 classes, primary, status;
46614 if (value.baseVal !== undefined) value = value.baseVal;
46616 classes = value.trim().split(/\s+/).filter(function(name) {
46617 return name.length && !tagClassRe.test(name);
46620 var t = tags(entity), i, k, v;
46622 // pick at most one primary classification tag..
46623 for (i = 0; i < primaries.length; i++) {
46626 if (!v || v === 'no') continue;
46629 if (statuses.indexOf(v) !== -1) { // e.g. `railway=abandoned`
46631 classes += ' tag-' + k;
46633 classes += ' tag-' + k + ' tag-' + k + '-' + v;
46639 // add at most one status tag, only if relates to primary tag..
46641 for (i = 0; i < statuses.length; i++) {
46644 if (!v || v === 'no') continue;
46646 if (v === 'yes') { // e.g. `railway=rail + abandoned=yes`
46649 else if (primary && primary === v) { // e.g. `railway=rail + abandoned=railway`
46651 } else if (!primary && primaries.indexOf(v) !== -1) { // e.g. `abandoned=railway`
46654 classes += ' tag-' + v;
46655 } // else ignore e.g. `highway=path + abandoned=railway`
46662 classes += ' tag-status tag-status-' + status;
46665 // add any secondary (structure) tags
46666 for (i = 0; i < secondaries.length; i++) {
46667 k = secondaries[i];
46669 if (!v || v === 'no') continue;
46670 classes += ' tag-' + k + ' tag-' + k + '-' + v;
46673 // For highways, look for surface tagging..
46674 if (primary === 'highway') {
46675 var paved = (t.highway !== 'track');
46678 if (k in osmPavedTags) {
46679 paved = !!osmPavedTags[k][v];
46684 classes += ' tag-unpaved';
46688 classes = classes.trim();
46690 if (classes !== value) {
46691 d3_select(this).attr('class', classes);
46697 tagClasses.tags = function(_) {
46698 if (!arguments.length) return tags;
46706 function svgTurns(projection) {
46708 return function drawTurns(selection, graph, turns) {
46710 function icon(turn) {
46711 var u = turn.u ? '-u' : '';
46712 if (turn.no) return '#turn-no' + u;
46713 if (turn.only) return '#turn-only' + u;
46714 return '#turn-yes' + u;
46717 var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
46720 layer = layer.enter()
46722 .attr('class', 'layer-osm layer-turns')
46726 var groups = layer.selectAll('g.turn')
46727 .data(turns, function(d) { return d.key; });
46733 var enter = groups.enter()
46735 .attr('class', function(d) { return 'turn ' + d.key; });
46738 .filter(function(d) { return !d.u; });
46740 nEnter.append('rect')
46741 .attr('transform', 'translate(-22, -12)')
46742 .attr('width', '44')
46743 .attr('height', '24');
46745 nEnter.append('use')
46746 .attr('transform', 'translate(-22, -12)')
46747 .attr('width', '44')
46748 .attr('height', '24');
46752 .filter(function(d) { return d.u; });
46754 uEnter.append('circle')
46757 uEnter.append('use')
46758 .attr('transform', 'translate(-16, -16)')
46759 .attr('width', '32')
46760 .attr('height', '32');
46767 .attr('opacity', function(d) {
46768 return d.direct === false ? '0.7' : null;
46770 .attr('transform', function(d) {
46772 var toWay = graph.entity(d.to.way);
46773 var toPoints = graph.childNodes(toWay)
46774 .map(function (n) { return n.loc; })
46776 var toLength = geoPathLength(toPoints);
46777 var mid = toLength / 2; // midpoint of destination way
46779 var toNode = graph.entity(d.to.node);
46780 var toVertex = graph.entity(d.to.vertex);
46781 var a = geoAngle(toVertex, toNode, projection);
46782 var o = projection(toVertex.loc);
46783 var r = d.u ? 0 // u-turn: no radius
46784 : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius
46785 : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways
46787 return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
46788 'rotate(' + a * 180 / Math.PI + ')';
46791 groups.select('use')
46792 .attr('xlink:href', icon);
46794 groups.select('rect');
46795 groups.select('circle');
46801 function svgVertices$$1(projection, context) {
46803 // z16-, z17, z18+, w/icon
46804 shadow: [6, 7.5, 7.5, 12],
46805 stroke: [2.5, 3.5, 3.5, 8],
46806 fill: [1, 1.5, 1.5, 1.5]
46809 var _currHoverTarget;
46810 var _currPersistent = {};
46811 var _currHover = {};
46812 var _prevHover = {};
46813 var _currSelected = {};
46814 var _prevSelected = {};
46818 function sortY(a, b) {
46819 return b.loc[1] - a.loc[1];
46822 // Avoid exit/enter if we're just moving stuff around.
46823 // The node will get a new version but we only need to run the update selection.
46824 function fastEntityKey(d) {
46825 var mode = context.mode();
46826 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
46827 return isMoving ? d.id : osmEntity$$1.key(d);
46831 function draw(selection$$1, graph, vertices, sets, filter) {
46832 sets = sets || { selected: {}, important: {}, hovered: {} };
46835 var directions = {};
46836 var wireframe = context.surface().classed('fill-wireframe');
46837 var zoom = geoScaleToZoom(projection.scale());
46838 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
46841 function getIcon(entity) {
46842 if (entity.id in icons) return icons[entity.id];
46845 entity.hasInterestingTags() &&
46846 context.presets().match(entity, graph).icon;
46847 return icons[entity.id];
46851 // memoize directions results, return false for empty arrays (for use in filter)
46852 function getDirections(entity) {
46853 if (entity.id in directions) return directions[entity.id];
46855 var angles = entity.directions(graph, projection);
46856 directions[entity.id] = angles.length ? angles : false;
46861 function updateAttributes(selection$$1) {
46862 ['shadow', 'stroke', 'fill'].forEach(function(klass) {
46863 var rads = radiuses[klass];
46864 selection$$1.selectAll('.' + klass)
46865 .each(function(entity) {
46866 var i = z && getIcon(entity);
46867 var r = rads[i ? 3 : z];
46869 // slightly increase the size of unconnected endpoints #3775
46870 if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
46874 if (klass === 'shadow') { // remember this value, so we don't need to
46875 _radii[entity.id] = r; // recompute it when we draw the touch targets
46880 .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
46884 selection$$1.selectAll('use')
46885 .attr('visibility', (z === 0 ? 'hidden' : null));
46888 vertices.sort(sortY);
46890 var groups = selection$$1.selectAll('g.vertex')
46892 .data(vertices, fastEntityKey);
46899 var enter = groups.enter()
46901 .attr('class', function(d) { return 'node vertex ' + d.id; })
46906 .attr('class', 'shadow');
46910 .attr('class', 'stroke');
46912 // Vertices with icons get a `use`.
46913 enter.filter(function(d) { return getIcon(d); })
46915 .attr('class', 'icon')
46916 .attr('width', '11px')
46917 .attr('height', '11px')
46918 .attr('transform', 'translate(-5.5, -5.5)')
46919 .attr('xlink:href', function(d) {
46920 var picon = getIcon(d);
46921 var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
46922 return '#' + picon + (isMaki ? '-11' : '');
46925 // Vertices with tags get a fill.
46926 enter.filter(function(d) { return d.hasInterestingTags(); })
46928 .attr('class', 'fill');
46933 .attr('transform', svgPointTransform(projection))
46934 .classed('sibling', function(d) { return d.id in sets.selected; })
46935 .classed('shared', function(d) { return graph.isShared(d); })
46936 .classed('endpoint', function(d) { return d.isEndpoint(graph); })
46937 .call(updateAttributes);
46940 // Directional vertices get viewfields
46941 var dgroups = groups.filter(function(d) { return getDirections(d); })
46942 .selectAll('.viewfieldgroup')
46943 .data(function data$$1(d) { return zoom >= 18 ? [d] : []; }, osmEntity$$1.key);
46950 dgroups = dgroups.enter()
46951 .insert('g', '.shadow')
46952 .attr('class', 'viewfieldgroup')
46955 var viewfields = dgroups.selectAll('.viewfield')
46956 .data(getDirections, function key(d) { return d; });
46965 .attr('class', 'viewfield')
46966 .attr('d', 'M0,0H0')
46968 .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
46969 .attr('transform', function(d) { return 'rotate(' + d + ')'; });
46973 function drawTargets(selection$$1, graph, entities, filter) {
46974 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
46975 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
46976 var getTransform = svgPointTransform(projection).geojson;
46977 var activeID = context.activeID();
46978 var data$$1 = { targets: [], nopes: [] };
46980 entities.forEach(function(node) {
46981 if (activeID === node.id) return; // draw no target on the activeID
46983 var vertexType = svgPassiveVertex(node, graph, activeID);
46984 if (vertexType !== 0) { // passive or adjacent - allow to connect
46985 data$$1.targets.push({
46992 geometry: node.asGeoJSON()
46995 data$$1.nopes.push({
46997 id: node.id + '-nope',
47003 geometry: node.asGeoJSON()
47009 // Targets allow hover and vertex snapping
47010 var targets = selection$$1.selectAll('.vertex.target-allowed')
47011 .filter(function(d) { return filter(d.properties.entity); })
47012 .data(data$$1.targets, function key(d) { return d.id; });
47021 .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
47023 .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
47024 .attr('transform', getTransform);
47028 var nopes = selection$$1.selectAll('.vertex.target-nope')
47029 .filter(function(d) { return filter(d.properties.entity); })
47030 .data(data$$1.nopes, function key(d) { return d.id; });
47039 .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
47041 .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
47042 .attr('transform', getTransform);
47046 // Points can also render as vertices:
47047 // 1. in wireframe mode or
47048 // 2. at higher zooms if they have a direction
47049 function renderAsVertex(entity, graph, wireframe, zoom) {
47050 var geometry = entity.geometry(graph);
47051 return geometry === 'vertex' || (geometry === 'point' && (
47052 wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
47057 function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
47060 function addChildVertices(entity) {
47061 var geometry = entity.geometry(graph);
47062 if (!context.features().isHiddenFeature(entity, graph, geometry)) {
47064 if (entity.type === 'way') {
47065 for (i = 0; i < entity.nodes.length; i++) {
47066 var child = graph.hasEntity(entity.nodes[i]);
47068 addChildVertices(child);
47071 } else if (entity.type === 'relation') {
47072 for (i = 0; i < entity.members.length; i++) {
47073 var member = graph.hasEntity(entity.members[i].id);
47075 addChildVertices(member);
47078 } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
47079 results[entity.id] = entity;
47084 ids.forEach(function(id) {
47085 var entity = graph.hasEntity(id);
47086 if (!entity) return;
47088 if (entity.type === 'node') {
47089 if (renderAsVertex(entity, graph, wireframe, zoom)) {
47090 results[entity.id] = entity;
47091 graph.parentWays(entity).forEach(function(entity) {
47092 addChildVertices(entity);
47095 } else { // way, relation
47096 addChildVertices(entity);
47104 function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
47105 var wireframe = context.surface().classed('fill-wireframe');
47106 var zoom = geoScaleToZoom(projection.scale());
47107 var mode = context.mode();
47108 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
47111 _currPersistent = {};
47115 // Collect important vertices from the `entities` list..
47116 // (during a paritial redraw, it will not contain everything)
47117 for (var i = 0; i < entities.length; i++) {
47118 var entity = entities[i];
47119 var geometry = entity.geometry(graph);
47122 // a point that looks like a vertex..
47123 if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
47124 _currPersistent[entity.id] = entity;
47127 // a vertex of some importance..
47128 } else if (geometry === 'vertex' &&
47129 (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
47130 _currPersistent[entity.id] = entity;
47134 // whatever this is, it's not a persistent vertex..
47135 if (!keep && !fullRedraw) {
47136 delete _currPersistent[entity.id];
47140 // 3 sets of vertices to consider:
47142 persistent: _currPersistent, // persistent = important vertices (render always)
47143 selected: _currSelected, // selected + siblings of selected (render always)
47144 hovered: _currHover // hovered + siblings of hovered (render only in draw modes)
47147 var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
47149 // Draw the vertices..
47150 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
47151 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
47152 var filterRendered = function(d) {
47153 return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
47155 selection$$1.selectAll('.layer-points .layer-points-vertices')
47156 .call(draw, graph, currentVisible(all), sets, filterRendered);
47158 // Draw touch targets..
47159 // When drawing, render all targets (not just those affected by a partial redraw)
47160 var filterTouch = function(d) {
47161 return isMoving ? true : filterRendered(d);
47163 selection$$1.selectAll('.layer-points .layer-points-targets')
47164 .call(drawTargets, graph, currentVisible(all), filterTouch);
47167 function currentVisible(which) {
47168 return Object.keys(which)
47169 .map(graph.hasEntity, graph) // the current version of this entity
47170 .filter(function (entity) { return entity && entity.intersects(extent, graph); });
47175 // partial redraw - only update the selected items..
47176 drawVertices.drawSelected = function(selection$$1, graph, extent) {
47177 var wireframe = context.surface().classed('fill-wireframe');
47178 var zoom = geoScaleToZoom(projection.scale());
47180 _prevSelected = _currSelected || {};
47181 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
47183 // note that drawVertices will add `_currSelected` automatically if needed..
47184 var filter = function(d) { return d.id in _prevSelected; };
47185 drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
47189 // partial redraw - only update the hovered items..
47190 drawVertices.drawHover = function(selection$$1, graph, target, extent) {
47191 if (target === _currHoverTarget) return; // continue only if something changed
47193 var wireframe = context.surface().classed('fill-wireframe');
47194 var zoom = geoScaleToZoom(projection.scale());
47196 _prevHover = _currHover || {};
47197 _currHoverTarget = target;
47198 var entity = target && target.properties && target.properties.entity;
47201 _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
47206 // note that drawVertices will add `_currHover` automatically if needed..
47207 var filter = function(d) { return d.id in _prevHover; };
47208 drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
47211 return drawVertices;
47214 function uiAccount(context) {
47215 var osm = context.connection();
47218 function update(selection$$1) {
47221 if (!osm.authenticated()) {
47222 selection$$1.selectAll('#userLink, #logoutLink')
47223 .classed('hide', true);
47227 osm.userDetails(function(err, details) {
47228 var userLink = selection$$1.select('#userLink'),
47229 logoutLink = selection$$1.select('#logoutLink');
47232 logoutLink.html('');
47236 selection$$1.selectAll('#userLink, #logoutLink')
47237 .classed('hide', false);
47240 userLink.append('a')
47241 .attr('href', osm.userURL(details.display_name))
47242 .attr('target', '_blank');
47244 // Add thumbnail or dont
47245 if (details.image_url) {
47246 userLink.append('img')
47247 .attr('class', 'icon pre-text user-icon')
47248 .attr('src', details.image_url);
47251 .call(svgIcon('#icon-avatar', 'pre-text light'));
47255 userLink.append('span')
47256 .attr('class', 'label')
47257 .text(details.display_name);
47259 logoutLink.append('a')
47260 .attr('class', 'logout')
47263 .on('click.logout', function() {
47264 event.preventDefault();
47271 return function(selection$$1) {
47272 selection$$1.append('li')
47273 .attr('id', 'logoutLink')
47274 .classed('hide', true);
47276 selection$$1.append('li')
47277 .attr('id', 'userLink')
47278 .classed('hide', true);
47281 osm.on('change.account', function() { update(selection$$1); });
47282 update(selection$$1);
47287 function uiAttribution(context) {
47291 function attribution(data, klass) {
47292 var div = selection$$1.selectAll('.' + klass)
47297 .attr('class', klass)
47301 var background = div.selectAll('.attribution')
47302 .data(data, function(d) { return d.name(); });
47307 background = background.enter()
47309 .attr('class', 'attribution')
47310 .each(function(d) {
47311 if (d.terms_html) {
47313 .html(d.terms_html);
47319 selection$$1 = d3_select(this)
47321 .attr('href', d.terms_url)
47322 .attr('target', '_blank');
47324 selection$$1 = d3_select(this);
47328 var id_safe = d.id.replace('.', '<TX_DOT>');
47329 var terms_text = t('imagery.' + id_safe + '.attribution.text',
47330 { default: d.terms_text || d.id || d.name() }
47333 if (d.icon && !d.overlay) {
47336 .attr('class', 'source-image')
47337 .attr('src', d.icon);
47342 .attr('class', 'attribution-text')
47345 .merge(background);
47348 var copyright = background.selectAll('.copyright-notice')
47349 .data(function(d) {
47350 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
47351 return notice ? [notice] : [];
47357 copyright = copyright.enter()
47359 .attr('class', 'copyright-notice')
47367 function update() {
47368 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
47369 attribution(context.background().overlayLayerSources().filter(function (s) {
47370 return s.validZoom(context.map().zoom());
47371 }), 'overlay-layer-attribution');
47375 return function(select$$1) {
47376 selection$$1 = select$$1;
47378 context.background()
47379 .on('change.attribution', update);
47382 .on('move.attribution', throttle(update, 400, {leading: false}));
47388 // toggles the visibility of ui elements, using a combination of the
47389 // hide class, which sets display=none, and a d3 transition for opacity.
47390 // this will cause blinking when called repeatedly, so check that the
47391 // value actually changes between calls.
47392 function uiToggle(show, callback) {
47393 return function(selection$$1) {
47395 .style('opacity', show ? 0 : 1)
47396 .classed('hide', false)
47398 .style('opacity', show ? 1 : 0)
47399 .on('end', function() {
47401 .classed('hide', !show)
47402 .style('opacity', null);
47403 if (callback) callback.apply(this);
47408 function uiDisclosure(context, key, expandedDefault) {
47409 var dispatch$$1 = dispatch('toggled'),
47410 _preference = (context.storage('disclosure.' + key + '.expanded')),
47411 _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true')),
47413 _updatePreference = true,
47414 _content = function () {};
47417 var disclosure = function(selection$$1) {
47418 var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
47422 var hideToggleEnter = hideToggle.enter()
47425 .attr('class', 'hide-toggle hide-toggle-' + key)
47426 .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
47430 .attr('class', 'hide-toggle-text');
47433 hideToggle = hideToggleEnter
47434 .merge(hideToggle);
47437 .on('click', toggle)
47438 .classed('expanded', _expanded);
47440 hideToggle.selectAll('.hide-toggle-text')
47443 hideToggle.selectAll('.hide-toggle-icon')
47444 .attr('xlink:href', _expanded ? '#icon-down'
47445 : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47449 var wrap = selection$$1.selectAll('.disclosure-wrap')
47452 wrap = wrap.enter()
47454 .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
47458 .classed('hide', !_expanded)
47462 function toggle() {
47463 event.preventDefault();
47465 _expanded = !_expanded;
47467 if (_updatePreference) {
47468 context.storage('disclosure.' + key + '.expanded', _expanded);
47472 .classed('expanded', _expanded);
47474 hideToggle.selectAll('.hide-toggle-icon')
47475 .attr('xlink:href', _expanded ? '#icon-down'
47476 : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
47480 .call(uiToggle(_expanded));
47482 dispatch$$1.call('toggled', this, _expanded);
47487 disclosure.title = function(_) {
47488 if (!arguments.length) return _title;
47494 disclosure.expanded = function(_) {
47495 if (!arguments.length) return _expanded;
47501 disclosure.updatePreference = function(_) {
47502 if (!arguments.length) return _updatePreference;
47503 _updatePreference = _;
47508 disclosure.content = function(_) {
47509 if (!arguments.length) return _content;
47515 return utilRebind(disclosure, dispatch$$1, 'on');
47518 function uiBackgroundDisplayOptions(context) {
47519 var detected = utilDetect();
47520 var storedOpacity = context.storage('background-opacity');
47522 var maxVal = detected.cssfilters ? 2 : 1;
47524 var sliders = detected.cssfilters
47525 ? ['brightness', 'contrast', 'saturation', 'sharpness']
47529 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
47535 var _selection = d3_select(null);
47538 function clamp(x, min, max) {
47539 return Math.max(min, Math.min(x, max));
47543 function updateValue(d, val) {
47544 if (!val && event && event.target) {
47545 val = event.target.value;
47548 val = clamp(val, minVal, maxVal);
47551 context.background()[d](val);
47553 if (d === 'brightness') {
47554 context.storage('background-opacity', val);
47562 function render(selection$$1) {
47563 var container = selection$$1.selectAll('.display-options-container')
47566 var containerEnter = container.enter()
47568 .attr('class', 'display-options-container controls-list');
47570 // add slider controls
47571 var slidersEnter = containerEnter.selectAll('.display-control')
47575 .attr('class', function(d) { return 'display-control display-control-' + d; });
47579 .text(function(d) { return t('background.' + d); })
47581 .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
47585 .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
47586 .attr('type', 'range')
47587 .attr('min', minVal)
47588 .attr('max', maxVal)
47589 .attr('step', '0.05')
47590 .on('input', function(d) {
47591 var val = d3_select(this).property('value');
47592 updateValue(d, val);
47597 .attr('title', t('background.reset'))
47598 .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
47599 .on('click', function(d) {
47600 if (event.button !== 0) return;
47603 .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47607 container = containerEnter
47610 container.selectAll('.display-option-input')
47611 .property('value', function(d) { return _options[d]; });
47613 container.selectAll('.display-option-value')
47614 .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
47616 container.selectAll('.display-option-reset')
47617 .classed('disabled', function(d) { return _options[d] === 1; });
47619 // first time only, set brightness if needed
47620 if (containerEnter.size() && _options.brightness !== 1) {
47621 context.background().brightness(_options.brightness);
47626 function backgroundDisplayOptions(selection$$1) {
47627 _selection = selection$$1;
47630 .call(uiDisclosure(context, 'background_display_options', true)
47631 .title(t('background.display_options'))
47637 return backgroundDisplayOptions;
47640 function uiBackgroundOffset(context) {
47642 ['right', [0.5, 0]],
47643 ['top', [0, -0.5]],
47644 ['left', [-0.5, 0]],
47645 ['bottom', [0, 0.5]]
47649 function d3_eventCancel() {
47650 event.stopPropagation();
47651 event.preventDefault();
47655 function updateValue() {
47656 var meters = geoOffsetToMeters(context.background().offset());
47657 var x = +meters[0].toFixed(2);
47658 var y = +meters[1].toFixed(2);
47660 d3_selectAll('.nudge-inner-rect')
47662 .classed('error', false)
47663 .property('value', x + ', ' + y);
47665 d3_selectAll('.nudge-reset')
47666 .classed('disabled', function() {
47667 return (x === 0 && y === 0);
47672 function resetOffset() {
47673 context.background().offset([0, 0]);
47678 function nudge(d) {
47679 context.background().nudge(d, context.map().zoom());
47684 function clickNudgeButton(d) {
47686 var timeout = window.setTimeout(function() {
47687 interval = window.setInterval(nudge.bind(null, d), 100);
47690 function doneNudge() {
47691 window.clearTimeout(timeout);
47692 window.clearInterval(interval);
47694 .on('mouseup.buttonoffset', null, true)
47695 .on('mousedown.buttonoffset', null, true);
47699 .on('mouseup.buttonoffset', doneNudge, true)
47700 .on('mousedown.buttonoffset', doneNudge, true);
47706 function inputOffset() {
47707 var input = d3_select(this);
47708 var d = input.node().value;
47710 if (d === '') return resetOffset();
47712 d = d.replace(/;/g, ',').split(',').map(function(n) {
47713 // if n is NaN, it will always get mapped to false.
47714 return !isNaN(n) && n;
47717 if (d.length !== 2 || !d[0] || !d[1]) {
47718 input.classed('error', true);
47722 context.background().offset(geoMetersToOffset(d));
47727 function dragOffset() {
47728 event.preventDefault();
47729 if (event.button !== 0) return;
47731 var origin = [event.clientX, event.clientY];
47733 context.container()
47735 .attr('class', 'nudge-surface');
47738 .on('mousemove.offset', function() {
47739 var latest = [event.clientX, event.clientY];
47741 -(origin[0] - latest[0]) / 4,
47742 -(origin[1] - latest[1]) / 4
47748 .on('mouseup.offset', function() {
47749 if (event.button !== 0) return;
47750 d3_selectAll('.nudge-surface')
47754 .on('mousemove.offset', null)
47755 .on('mouseup.offset', null);
47760 function render(selection$$1) {
47761 var container = selection$$1.selectAll('.nudge-container')
47764 var containerEnter = container.enter()
47766 .attr('class', 'nudge-container cf');
47770 .attr('class', 'nudge-instructions')
47771 .text(t('background.offset'));
47773 var nudgeEnter = containerEnter
47775 .attr('class', 'nudge-outer-rect')
47776 .on('mousedown', dragOffset);
47780 .attr('class', 'nudge-inner-rect')
47782 .on('change', inputOffset);
47786 .selectAll('button')
47787 .data(directions).enter()
47789 .attr('class', function(d) { return d[0] + ' nudge'; })
47790 .on('contextmenu', d3_eventCancel)
47791 .on('mousedown', function(d) {
47792 if (event.button !== 0) return;
47793 clickNudgeButton(d[1]);
47798 .attr('title', t('background.reset'))
47799 .attr('class', 'nudge-reset disabled')
47800 .on('contextmenu', d3_eventCancel)
47801 .on('click', function() {
47802 if (event.button !== 0) return;
47805 .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
47811 function backgroundOffset(selection$$1) {
47813 .call(uiDisclosure(context, 'background_offset', false)
47814 .title(t('background.fix_misalignment'))
47820 context.background()
47821 .on('change.backgroundOffset-update', updateValue);
47823 return backgroundOffset;
47826 var marked = createCommonjsModule(function (module, exports) {
47830 * Block-Level Grammar
47835 code: /^( {4}[^\n]+\n*)+/,
47837 hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
47838 heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
47840 blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
47841 list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
47842 html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
47843 def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
47845 lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
47846 paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/,
47850 block._label = /(?:\\[\[\]]|[^\[\]])+/;
47851 block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/;
47852 block.def = edit(block.def)
47853 .replace('label', block._label)
47854 .replace('title', block._title)
47857 block.bullet = /(?:[*+-]|\d+\.)/;
47858 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
47859 block.item = edit(block.item, 'gm')
47860 .replace(/bull/g, block.bullet)
47863 block.list = edit(block.list)
47864 .replace(/bull/g, block.bullet)
47865 .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
47866 .replace('def', '\\n+(?=' + block.def.source + ')')
47869 block._tag = '(?!(?:'
47870 + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
47871 + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
47872 + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b';
47874 block.html = edit(block.html)
47875 .replace('comment', /<!--[\s\S]*?-->/)
47876 .replace('closed', /<(tag)[\s\S]+?<\/\1>/)
47877 .replace('closing', /<tag(?:"[^"]*"|'[^']*'|\s[^'"\/>\s]*)*?\/?>/)
47878 .replace(/tag/g, block._tag)
47881 block.paragraph = edit(block.paragraph)
47882 .replace('hr', block.hr)
47883 .replace('heading', block.heading)
47884 .replace('lheading', block.lheading)
47885 .replace('tag', '<' + block._tag)
47888 block.blockquote = edit(block.blockquote)
47889 .replace('paragraph', block.paragraph)
47893 * Normal Block Grammar
47896 block.normal = merge({}, block);
47899 * GFM Block Grammar
47902 block.gfm = merge({}, block.normal, {
47903 fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
47905 heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
47908 block.gfm.paragraph = edit(block.paragraph)
47909 .replace('(?!', '(?!'
47910 + block.gfm.fences.source.replace('\\1', '\\2') + '|'
47911 + block.list.source.replace('\\1', '\\3') + '|')
47915 * GFM + Tables Block Grammar
47918 block.tables = merge({}, block.gfm, {
47919 nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
47920 table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
47927 function Lexer(options) {
47929 this.tokens.links = {};
47930 this.options = options || marked.defaults;
47931 this.rules = block.normal;
47933 if (this.options.gfm) {
47934 if (this.options.tables) {
47935 this.rules = block.tables;
47937 this.rules = block.gfm;
47943 * Expose Block Rules
47946 Lexer.rules = block;
47949 * Static Lex Method
47952 Lexer.lex = function(src, options) {
47953 var lexer = new Lexer(options);
47954 return lexer.lex(src);
47961 Lexer.prototype.lex = function(src) {
47963 .replace(/\r\n|\r/g, '\n')
47964 .replace(/\t/g, ' ')
47965 .replace(/\u00a0/g, ' ')
47966 .replace(/\u2424/g, '\n');
47968 return this.token(src, true);
47975 Lexer.prototype.token = function(src, top) {
47976 src = src.replace(/^ +$/gm, '');
47990 if (cap = this.rules.newline.exec(src)) {
47991 src = src.substring(cap[0].length);
47992 if (cap[0].length > 1) {
48000 if (cap = this.rules.code.exec(src)) {
48001 src = src.substring(cap[0].length);
48002 cap = cap[0].replace(/^ {4}/gm, '');
48005 text: !this.options.pedantic
48006 ? cap.replace(/\n+$/, '')
48013 if (cap = this.rules.fences.exec(src)) {
48014 src = src.substring(cap[0].length);
48024 if (cap = this.rules.heading.exec(src)) {
48025 src = src.substring(cap[0].length);
48028 depth: cap[1].length,
48034 // table no leading pipe (gfm)
48035 if (top && (cap = this.rules.nptable.exec(src))) {
48036 src = src.substring(cap[0].length);
48040 header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48041 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48042 cells: cap[3].replace(/\n$/, '').split('\n')
48045 for (i = 0; i < item.align.length; i++) {
48046 if (/^ *-+: *$/.test(item.align[i])) {
48047 item.align[i] = 'right';
48048 } else if (/^ *:-+: *$/.test(item.align[i])) {
48049 item.align[i] = 'center';
48050 } else if (/^ *:-+ *$/.test(item.align[i])) {
48051 item.align[i] = 'left';
48053 item.align[i] = null;
48057 for (i = 0; i < item.cells.length; i++) {
48058 item.cells[i] = item.cells[i].split(/ *\| */);
48061 this.tokens.push(item);
48067 if (cap = this.rules.hr.exec(src)) {
48068 src = src.substring(cap[0].length);
48076 if (cap = this.rules.blockquote.exec(src)) {
48077 src = src.substring(cap[0].length);
48080 type: 'blockquote_start'
48083 cap = cap[0].replace(/^ *> ?/gm, '');
48085 // Pass `top` to keep the current
48086 // "toplevel" state. This is exactly
48087 // how markdown.pl works.
48088 this.token(cap, top);
48091 type: 'blockquote_end'
48098 if (cap = this.rules.list.exec(src)) {
48099 src = src.substring(cap[0].length);
48103 type: 'list_start',
48104 ordered: bull.length > 1
48107 // Get each top-level item.
48108 cap = cap[0].match(this.rules.item);
48114 for (; i < l; i++) {
48117 // Remove the list item's bullet
48118 // so it is seen as the next token.
48119 space = item.length;
48120 item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48122 // Outdent whatever the
48123 // list item contains. Hacky.
48124 if (~item.indexOf('\n ')) {
48125 space -= item.length;
48126 item = !this.options.pedantic
48127 ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48128 : item.replace(/^ {1,4}/gm, '');
48131 // Determine whether the next list item belongs here.
48132 // Backpedal if it does not belong in this list.
48133 if (this.options.smartLists && i !== l - 1) {
48134 b = block.bullet.exec(cap[i + 1])[0];
48135 if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48136 src = cap.slice(i + 1).join('\n') + src;
48141 // Determine whether item is loose or not.
48142 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48143 // for discount behavior.
48144 loose = next || /\n\n(?!\s*$)/.test(item);
48146 next = item.charAt(item.length - 1) === '\n';
48147 if (!loose) loose = next;
48152 ? 'loose_item_start'
48153 : 'list_item_start'
48157 this.token(item, false);
48160 type: 'list_item_end'
48172 if (cap = this.rules.html.exec(src)) {
48173 src = src.substring(cap[0].length);
48175 type: this.options.sanitize
48178 pre: !this.options.sanitizer
48179 && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48186 if (top && (cap = this.rules.def.exec(src))) {
48187 src = src.substring(cap[0].length);
48188 if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
48189 tag = cap[1].toLowerCase();
48190 if (!this.tokens.links[tag]) {
48191 this.tokens.links[tag] = {
48200 if (top && (cap = this.rules.table.exec(src))) {
48201 src = src.substring(cap[0].length);
48205 header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48206 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48207 cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
48210 for (i = 0; i < item.align.length; i++) {
48211 if (/^ *-+: *$/.test(item.align[i])) {
48212 item.align[i] = 'right';
48213 } else if (/^ *:-+: *$/.test(item.align[i])) {
48214 item.align[i] = 'center';
48215 } else if (/^ *:-+ *$/.test(item.align[i])) {
48216 item.align[i] = 'left';
48218 item.align[i] = null;
48222 for (i = 0; i < item.cells.length; i++) {
48223 item.cells[i] = item.cells[i]
48224 .replace(/^ *\| *| *\| *$/g, '')
48228 this.tokens.push(item);
48234 if (cap = this.rules.lheading.exec(src)) {
48235 src = src.substring(cap[0].length);
48238 depth: cap[2] === '=' ? 1 : 2,
48244 // top-level paragraph
48245 if (top && (cap = this.rules.paragraph.exec(src))) {
48246 src = src.substring(cap[0].length);
48249 text: cap[1].charAt(cap[1].length - 1) === '\n'
48250 ? cap[1].slice(0, -1)
48257 if (cap = this.rules.text.exec(src)) {
48258 // Top-level should never reach here.
48259 src = src.substring(cap[0].length);
48268 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48272 return this.tokens;
48276 * Inline-Level Grammar
48280 escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
48281 autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
48283 tag: /^<!--[\s\S]*?-->|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/,
48284 link: /^!?\[(inside)\]\(href\)/,
48285 reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
48286 nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/,
48287 strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
48288 em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/,
48289 code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
48290 br: /^ {2,}\n(?!\s*$)/,
48292 text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
48295 inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
48296 inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
48298 inline.autolink = edit(inline.autolink)
48299 .replace('scheme', inline._scheme)
48300 .replace('email', inline._email)
48303 inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/;
48304 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
48306 inline.link = edit(inline.link)
48307 .replace('inside', inline._inside)
48308 .replace('href', inline._href)
48311 inline.reflink = edit(inline.reflink)
48312 .replace('inside', inline._inside)
48316 * Normal Inline Grammar
48319 inline.normal = merge({}, inline);
48322 * Pedantic Inline Grammar
48325 inline.pedantic = merge({}, inline.normal, {
48326 strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
48327 em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
48331 * GFM Inline Grammar
48334 inline.gfm = merge({}, inline.normal, {
48335 escape: edit(inline.escape).replace('])', '~|])').getRegex(),
48336 url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
48337 .replace('email', inline._email)
48339 _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
48340 del: /^~~(?=\S)([\s\S]*?\S)~~/,
48341 text: edit(inline.text)
48342 .replace(']|', '~]|')
48343 .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
48348 * GFM + Line Breaks Inline Grammar
48351 inline.breaks = merge({}, inline.gfm, {
48352 br: edit(inline.br).replace('{2,}', '*').getRegex(),
48353 text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
48357 * Inline Lexer & Compiler
48360 function InlineLexer(links, options) {
48361 this.options = options || marked.defaults;
48362 this.links = links;
48363 this.rules = inline.normal;
48364 this.renderer = this.options.renderer || new Renderer();
48365 this.renderer.options = this.options;
48368 throw new Error('Tokens array requires a `links` property.');
48371 if (this.options.gfm) {
48372 if (this.options.breaks) {
48373 this.rules = inline.breaks;
48375 this.rules = inline.gfm;
48377 } else if (this.options.pedantic) {
48378 this.rules = inline.pedantic;
48383 * Expose Inline Rules
48386 InlineLexer.rules = inline;
48389 * Static Lexing/Compiling Method
48392 InlineLexer.output = function(src, links, options) {
48393 var inline = new InlineLexer(links, options);
48394 return inline.output(src);
48401 InlineLexer.prototype.output = function(src) {
48410 if (cap = this.rules.escape.exec(src)) {
48411 src = src.substring(cap[0].length);
48417 if (cap = this.rules.autolink.exec(src)) {
48418 src = src.substring(cap[0].length);
48419 if (cap[2] === '@') {
48420 text = escape(this.mangle(cap[1]));
48421 href = 'mailto:' + text;
48423 text = escape(cap[1]);
48426 out += this.renderer.link(href, null, text);
48431 if (!this.inLink && (cap = this.rules.url.exec(src))) {
48432 cap[0] = this.rules._backpedal.exec(cap[0])[0];
48433 src = src.substring(cap[0].length);
48434 if (cap[2] === '@') {
48435 text = escape(cap[0]);
48436 href = 'mailto:' + text;
48438 text = escape(cap[0]);
48439 if (cap[1] === 'www.') {
48440 href = 'http://' + text;
48445 out += this.renderer.link(href, null, text);
48450 if (cap = this.rules.tag.exec(src)) {
48451 if (!this.inLink && /^<a /i.test(cap[0])) {
48452 this.inLink = true;
48453 } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
48454 this.inLink = false;
48456 src = src.substring(cap[0].length);
48457 out += this.options.sanitize
48458 ? this.options.sanitizer
48459 ? this.options.sanitizer(cap[0])
48466 if (cap = this.rules.link.exec(src)) {
48467 src = src.substring(cap[0].length);
48468 this.inLink = true;
48469 out += this.outputLink(cap, {
48473 this.inLink = false;
48478 if ((cap = this.rules.reflink.exec(src))
48479 || (cap = this.rules.nolink.exec(src))) {
48480 src = src.substring(cap[0].length);
48481 link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
48482 link = this.links[link.toLowerCase()];
48483 if (!link || !link.href) {
48484 out += cap[0].charAt(0);
48485 src = cap[0].substring(1) + src;
48488 this.inLink = true;
48489 out += this.outputLink(cap, link);
48490 this.inLink = false;
48495 if (cap = this.rules.strong.exec(src)) {
48496 src = src.substring(cap[0].length);
48497 out += this.renderer.strong(this.output(cap[2] || cap[1]));
48502 if (cap = this.rules.em.exec(src)) {
48503 src = src.substring(cap[0].length);
48504 out += this.renderer.em(this.output(cap[2] || cap[1]));
48509 if (cap = this.rules.code.exec(src)) {
48510 src = src.substring(cap[0].length);
48511 out += this.renderer.codespan(escape(cap[2].trim(), true));
48516 if (cap = this.rules.br.exec(src)) {
48517 src = src.substring(cap[0].length);
48518 out += this.renderer.br();
48523 if (cap = this.rules.del.exec(src)) {
48524 src = src.substring(cap[0].length);
48525 out += this.renderer.del(this.output(cap[1]));
48530 if (cap = this.rules.text.exec(src)) {
48531 src = src.substring(cap[0].length);
48532 out += this.renderer.text(escape(this.smartypants(cap[0])));
48537 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
48548 InlineLexer.prototype.outputLink = function(cap, link) {
48549 var href = escape(link.href),
48550 title = link.title ? escape(link.title) : null;
48552 return cap[0].charAt(0) !== '!'
48553 ? this.renderer.link(href, title, this.output(cap[1]))
48554 : this.renderer.image(href, title, escape(cap[1]));
48558 * Smartypants Transformations
48561 InlineLexer.prototype.smartypants = function(text) {
48562 if (!this.options.smartypants) return text;
48565 .replace(/---/g, '\u2014')
48567 .replace(/--/g, '\u2013')
48569 .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
48570 // closing singles & apostrophes
48571 .replace(/'/g, '\u2019')
48573 .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
48575 .replace(/"/g, '\u201d')
48577 .replace(/\.{3}/g, '\u2026');
48584 InlineLexer.prototype.mangle = function(text) {
48585 if (!this.options.mangle) return text;
48591 for (; i < l; i++) {
48592 ch = text.charCodeAt(i);
48593 if (Math.random() > 0.5) {
48594 ch = 'x' + ch.toString(16);
48596 out += '&#' + ch + ';';
48606 function Renderer(options) {
48607 this.options = options || {};
48610 Renderer.prototype.code = function(code, lang, escaped) {
48611 if (this.options.highlight) {
48612 var out = this.options.highlight(code, lang);
48613 if (out != null && out !== code) {
48620 return '<pre><code>'
48621 + (escaped ? code : escape(code, true))
48622 + '\n</code></pre>';
48625 return '<pre><code class="'
48626 + this.options.langPrefix
48627 + escape(lang, true)
48629 + (escaped ? code : escape(code, true))
48630 + '\n</code></pre>\n';
48633 Renderer.prototype.blockquote = function(quote) {
48634 return '<blockquote>\n' + quote + '</blockquote>\n';
48637 Renderer.prototype.html = function(html) {
48641 Renderer.prototype.heading = function(text, level, raw) {
48645 + this.options.headerPrefix
48646 + raw.toLowerCase().replace(/[^\w]+/g, '-')
48654 Renderer.prototype.hr = function() {
48655 return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
48658 Renderer.prototype.list = function(body, ordered) {
48659 var type = ordered ? 'ol' : 'ul';
48660 return '<' + type + '>\n' + body + '</' + type + '>\n';
48663 Renderer.prototype.listitem = function(text) {
48664 return '<li>' + text + '</li>\n';
48667 Renderer.prototype.paragraph = function(text) {
48668 return '<p>' + text + '</p>\n';
48671 Renderer.prototype.table = function(header, body) {
48682 Renderer.prototype.tablerow = function(content) {
48683 return '<tr>\n' + content + '</tr>\n';
48686 Renderer.prototype.tablecell = function(content, flags) {
48687 var type = flags.header ? 'th' : 'td';
48688 var tag = flags.align
48689 ? '<' + type + ' style="text-align:' + flags.align + '">'
48690 : '<' + type + '>';
48691 return tag + content + '</' + type + '>\n';
48694 // span level renderer
48695 Renderer.prototype.strong = function(text) {
48696 return '<strong>' + text + '</strong>';
48699 Renderer.prototype.em = function(text) {
48700 return '<em>' + text + '</em>';
48703 Renderer.prototype.codespan = function(text) {
48704 return '<code>' + text + '</code>';
48707 Renderer.prototype.br = function() {
48708 return this.options.xhtml ? '<br/>' : '<br>';
48711 Renderer.prototype.del = function(text) {
48712 return '<del>' + text + '</del>';
48715 Renderer.prototype.link = function(href, title, text) {
48716 if (this.options.sanitize) {
48718 var prot = decodeURIComponent(unescape(href))
48719 .replace(/[^\w:]/g, '')
48724 if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
48728 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48729 href = resolveUrl(this.options.baseUrl, href);
48731 var out = '<a href="' + href + '"';
48733 out += ' title="' + title + '"';
48735 out += '>' + text + '</a>';
48739 Renderer.prototype.image = function(href, title, text) {
48740 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
48741 href = resolveUrl(this.options.baseUrl, href);
48743 var out = '<img src="' + href + '" alt="' + text + '"';
48745 out += ' title="' + title + '"';
48747 out += this.options.xhtml ? '/>' : '>';
48751 Renderer.prototype.text = function(text) {
48757 * returns only the textual part of the token
48760 function TextRenderer() {}
48762 // no need for block level renderers
48764 TextRenderer.prototype.strong =
48765 TextRenderer.prototype.em =
48766 TextRenderer.prototype.codespan =
48767 TextRenderer.prototype.del =
48768 TextRenderer.prototype.text = function (text) {
48772 TextRenderer.prototype.link =
48773 TextRenderer.prototype.image = function(href, title, text) {
48777 TextRenderer.prototype.br = function() {
48782 * Parsing & Compiling
48785 function Parser(options) {
48788 this.options = options || marked.defaults;
48789 this.options.renderer = this.options.renderer || new Renderer();
48790 this.renderer = this.options.renderer;
48791 this.renderer.options = this.options;
48795 * Static Parse Method
48798 Parser.parse = function(src, options) {
48799 var parser = new Parser(options);
48800 return parser.parse(src);
48807 Parser.prototype.parse = function(src) {
48808 this.inline = new InlineLexer(src.links, this.options);
48809 // use an InlineLexer with a TextRenderer to extract pure text
48810 this.inlineText = new InlineLexer(
48812 merge({}, this.options, {renderer: new TextRenderer()})
48814 this.tokens = src.reverse();
48817 while (this.next()) {
48828 Parser.prototype.next = function() {
48829 return this.token = this.tokens.pop();
48833 * Preview Next Token
48836 Parser.prototype.peek = function() {
48837 return this.tokens[this.tokens.length - 1] || 0;
48841 * Parse Text Tokens
48844 Parser.prototype.parseText = function() {
48845 var body = this.token.text;
48847 while (this.peek().type === 'text') {
48848 body += '\n' + this.next().text;
48851 return this.inline.output(body);
48855 * Parse Current Token
48858 Parser.prototype.tok = function() {
48859 switch (this.token.type) {
48864 return this.renderer.hr();
48867 return this.renderer.heading(
48868 this.inline.output(this.token.text),
48870 unescape(this.inlineText.output(this.token.text)));
48873 return this.renderer.code(this.token.text,
48875 this.token.escaped);
48887 for (i = 0; i < this.token.header.length; i++) {
48888 cell += this.renderer.tablecell(
48889 this.inline.output(this.token.header[i]),
48890 { header: true, align: this.token.align[i] }
48893 header += this.renderer.tablerow(cell);
48895 for (i = 0; i < this.token.cells.length; i++) {
48896 row = this.token.cells[i];
48899 for (j = 0; j < row.length; j++) {
48900 cell += this.renderer.tablecell(
48901 this.inline.output(row[j]),
48902 { header: false, align: this.token.align[j] }
48906 body += this.renderer.tablerow(cell);
48908 return this.renderer.table(header, body);
48910 case 'blockquote_start': {
48913 while (this.next().type !== 'blockquote_end') {
48914 body += this.tok();
48917 return this.renderer.blockquote(body);
48919 case 'list_start': {
48921 var ordered = this.token.ordered;
48923 while (this.next().type !== 'list_end') {
48924 body += this.tok();
48927 return this.renderer.list(body, ordered);
48929 case 'list_item_start': {
48932 while (this.next().type !== 'list_item_end') {
48933 body += this.token.type === 'text'
48938 return this.renderer.listitem(body);
48940 case 'loose_item_start': {
48943 while (this.next().type !== 'list_item_end') {
48944 body += this.tok();
48947 return this.renderer.listitem(body);
48950 var html = !this.token.pre && !this.options.pedantic
48951 ? this.inline.output(this.token.text)
48953 return this.renderer.html(html);
48955 case 'paragraph': {
48956 return this.renderer.paragraph(this.inline.output(this.token.text));
48959 return this.renderer.paragraph(this.parseText());
48968 function escape(html, encode) {
48970 .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
48971 .replace(/</g, '<')
48972 .replace(/>/g, '>')
48973 .replace(/"/g, '"')
48974 .replace(/'/g, ''');
48977 function unescape(html) {
48978 // explicitly match decimal, hex, and named HTML entities
48979 return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
48980 n = n.toLowerCase();
48981 if (n === 'colon') return ':';
48982 if (n.charAt(0) === '#') {
48983 return n.charAt(1) === 'x'
48984 ? String.fromCharCode(parseInt(n.substring(2), 16))
48985 : String.fromCharCode(+n.substring(1));
48991 function edit(regex, opt) {
48992 regex = regex.source;
48995 replace: function(name, val) {
48996 val = val.source || val;
48997 val = val.replace(/(^|[^\[])\^/g, '$1');
48998 regex = regex.replace(name, val);
49001 getRegex: function() {
49002 return new RegExp(regex, opt);
49007 function resolveUrl(base, href) {
49008 if (!baseUrls[' ' + base]) {
49009 // we can ignore everything in base after the last slash of its path component,
49010 // but we might need to add _that_
49011 // https://tools.ietf.org/html/rfc3986#section-3
49012 if (/^[^:]+:\/*[^/]*$/.test(base)) {
49013 baseUrls[' ' + base] = base + '/';
49015 baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
49018 base = baseUrls[' ' + base];
49020 if (href.slice(0, 2) === '//') {
49021 return base.replace(/:[\s\S]*/, ':') + href;
49022 } else if (href.charAt(0) === '/') {
49023 return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
49025 return base + href;
49029 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
49034 function merge(obj) {
49039 for (; i < arguments.length; i++) {
49040 target = arguments[i];
49041 for (key in target) {
49042 if (Object.prototype.hasOwnProperty.call(target, key)) {
49043 obj[key] = target[key];
49055 function marked(src, opt, callback) {
49056 // throw error in case of non string input
49057 if (typeof src === 'undefined' || src === null) {
49058 throw new Error('marked(): input parameter is undefined or null');
49060 if (typeof src !== 'string') {
49061 throw new Error('marked(): input parameter is of type '
49062 + Object.prototype.toString.call(src) + ', string expected');
49065 if (callback || typeof opt === 'function') {
49071 opt = merge({}, marked.defaults, opt || {});
49073 var highlight = opt.highlight,
49079 tokens = Lexer.lex(src, opt);
49081 return callback(e);
49084 pending = tokens.length;
49086 var done = function(err) {
49088 opt.highlight = highlight;
49089 return callback(err);
49095 out = Parser.parse(tokens, opt);
49100 opt.highlight = highlight;
49104 : callback(null, out);
49107 if (!highlight || highlight.length < 3) {
49111 delete opt.highlight;
49113 if (!pending) return done();
49115 for (; i < tokens.length; i++) {
49117 if (token.type !== 'code') {
49118 return --pending || done();
49120 return highlight(token.text, token.lang, function(err, code) {
49121 if (err) return done(err);
49122 if (code == null || code === token.text) {
49123 return --pending || done();
49126 token.escaped = true;
49127 --pending || done();
49135 if (opt) opt = merge({}, marked.defaults, opt);
49136 return Parser.parse(Lexer.lex(src, opt), opt);
49138 e.message += '\nPlease report this to https://github.com/chjj/marked.';
49139 if ((opt || marked.defaults).silent) {
49140 return '<p>An error occurred:</p><pre>'
49141 + escape(e.message + '', true)
49153 marked.setOptions = function(opt) {
49154 merge(marked.defaults, opt);
49158 marked.defaults = {
49169 langPrefix: 'lang-',
49170 smartypants: false,
49172 renderer: new Renderer(),
49181 marked.Parser = Parser;
49182 marked.parser = Parser.parse;
49184 marked.Renderer = Renderer;
49185 marked.TextRenderer = TextRenderer;
49187 marked.Lexer = Lexer;
49188 marked.lexer = Lexer.lex;
49190 marked.InlineLexer = InlineLexer;
49191 marked.inlineLexer = InlineLexer.output;
49193 marked.parse = marked;
49196 module.exports = marked;
49198 })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
49201 function pointBox(loc, context) {
49202 var rect = context.surfaceRect();
49203 var point$$1 = context.curtainProjection(loc);
49205 left: point$$1[0] + rect.left - 40,
49206 top: point$$1[1] + rect.top - 60,
49213 function pad$1(locOrBox, padding, context) {
49215 if (locOrBox instanceof Array) {
49216 var rect = context.surfaceRect();
49217 var point$$1 = context.curtainProjection(locOrBox);
49219 left: point$$1[0] + rect.left,
49220 top: point$$1[1] + rect.top
49227 left: box.left - padding,
49228 top: box.top - padding,
49229 width: (box.width || 0) + 2 * padding,
49230 height: (box.width || 0) + 2 * padding
49235 function icon(name, svgklass, useklass) {
49236 return '<svg class="icon ' + (svgklass || '') + '">' +
49237 '<use xlink:href="' + name + '"' +
49238 (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
49242 function slugify(text) {
49243 return text.toString().toLowerCase()
49244 .replace(/\s+/g, '-') // Replace spaces with -
49245 .replace(/[^\w\-]+/g, '') // Remove all non-word chars
49246 .replace(/\-\-+/g, '-') // Replace multiple - with single -
49247 .replace(/^-+/, '') // Trim - from start of text
49248 .replace(/-+$/, ''); // Trim - from end of text
49252 // console warning for missing walkthrough names
49253 var missingStrings = {};
49254 function checkKey(key, text) {
49255 if (t(key, { default: undefined}) === undefined) {
49256 if (missingStrings.hasOwnProperty(key)) return; // warn once
49257 missingStrings[key] = text;
49258 var missing = key + ': ' + text;
49259 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49264 function localize(obj) {
49267 // Assign name if entity has one..
49268 var name = obj.tags && obj.tags.name;
49270 key = 'intro.graph.name.' + slugify(name);
49271 obj.tags.name = t(key, { default: name });
49272 checkKey(key, name);
49275 // Assign street name if entity has one..
49276 var street = obj.tags && obj.tags['addr:street'];
49278 key = 'intro.graph.name.' + slugify(street);
49279 obj.tags['addr:street'] = t(key, { default: street });
49280 checkKey(key, street);
49282 // Add address details common across walkthrough..
49284 'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49285 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49287 addrTags.forEach(function(k) {
49288 var key = 'intro.graph.' + k,
49290 val = obj.tags && obj.tags[tag],
49291 str = t(key, { default: val });
49294 if (str.match(/^<.*>$/) !== null) {
49295 delete obj.tags[tag];
49297 obj.tags[tag] = str;
49307 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
49308 function isMostlySquare(points) {
49309 // note: uses 15 here instead of the 12 from actionOrthogonalize because
49310 // actionOrthogonalize can actually straighten some larger angles as it iterates
49311 var threshold = 15, // degrees within right or straight
49312 lowerBound = Math.cos((90 - threshold) * Math.PI / 180), // near right
49313 upperBound = Math.cos(threshold * Math.PI / 180), // near straight
49316 for (var i = 0; i < points.length; i++) {
49317 mag = Math.abs(normalizedDotProduct(i, points));
49318 if (mag > lowerBound && mag < upperBound) {
49326 function normalizedDotProduct(i, points) {
49327 var a = points[(i - 1 + points.length) % points.length],
49329 c = points[(i + 1) % points.length],
49330 p = subtractPoints(a, b),
49331 q = subtractPoints(c, b);
49333 p = normalizePoint(p);
49334 q = normalizePoint(q);
49336 return p[0] * q[0] + p[1] * q[1];
49339 function subtractPoints(a, b) {
49340 return [a[0] - b[0], a[1] - b[1]];
49343 function normalizePoint(point$$1) {
49344 var vector = [0, 0];
49345 var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
49346 if (length !== 0) {
49347 vector[0] = point$$1[0] / length;
49348 vector[1] = point$$1[1] / length;
49356 function selectMenuItem(operation) {
49357 var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
49358 ', .radial-menu .radial-menu-item-' + operation;
49359 return d3_select(selector$$1);
49363 function transitionTime(point1, point2) {
49364 var distance = geoSphericalDistance(point1, point2);
49365 if (distance === 0)
49367 else if (distance < 80)
49373 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","traffic_signals:direction":"both"}},"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","traffic_signals:direction":"both"}},"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","traffic_signals:direction":"both"}},"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.616762,41.952222]},"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.616557,41.951997]},"n3867":{"id":"n3867","loc":[-85.61658,41.952093]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616918,41.952276]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617098,41.952235]},"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.616502,41.951946]},"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","direction":"forward","stop":"minor"}},"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","direction":"forward"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"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","stop":"minor","direction":"backward"}},"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","direction":"forward","stop":"minor"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"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","stop":"minor","direction":"backward"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way","direction":"forward"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way","direction":"backward"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"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","direction":"backward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"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","direction":"backward","stop":"minor"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","stop":"minor","direction":"backward"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way","direction":"forward"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","stop":"minor","direction":"forward"}},"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.618232,41.949913]},"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","direction":"forward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"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","direction":"forward","stop":"minor"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way","direction":"forward"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way","direction":"backward"}},"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","direction":"forward"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way","direction":"backward"}},"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","direction":"forward","stop":"minor"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop","direction":"forward","stop":"all"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"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","direction":"forward","stop":"all"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","direction":"backward","stop":"minor"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","direction":"forward","stop":"minor"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"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","stop":"minor","direction":"backward"}},"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","direction":"forward","stop":"minor"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way","direction":"backward"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way","direction":"forward"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"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","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","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","n3351","n3950","n3354","n3350","n3951","n3349","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"}},"n2934":{"id":"n2934","loc":[-85.617051,41.952263]},"n2935":{"id":"n2935","loc":[-85.61699,41.952276]},"n2937":{"id":"n2937","loc":[-85.616847,41.952262]},"n2938":{"id":"n2938","loc":[-85.616577,41.951956]},"n2939":{"id":"n2939","loc":[-85.61656,41.952044]},"n3348":{"id":"n3348","loc":[-85.61714,41.9522]},"n3349":{"id":"n3349","loc":[-85.616517,41.95212]},"n3350":{"id":"n3350","loc":[-85.616489,41.952033]},"n3351":{"id":"n3351","loc":[-85.616529,41.951907]},"n3354":{"id":"n3354","loc":[-85.616488,41.951994]}};
49375 // Tooltips and svg mask used to highlight certain features
49376 function uiCurtain() {
49378 var surface = d3_select(null),
49379 tooltip = d3_select(null),
49380 darkness = d3_select(null);
49382 function curtain(selection$$1) {
49383 surface = selection$$1
49385 .attr('id', 'curtain')
49386 .style('z-index', 1000)
49387 .style('pointer-events', 'none')
49388 .style('position', 'absolute')
49392 darkness = surface.append('path')
49395 .attr('class', 'curtain-darkness');
49397 d3_select(window).on('resize.curtain', resize);
49399 tooltip = selection$$1.append('div')
49400 .attr('class', 'tooltip')
49401 .style('z-index', 1002);
49405 .attr('class', 'tooltip-arrow');
49409 .attr('class', 'tooltip-inner');
49414 function resize() {
49416 .attr('width', window.innerWidth)
49417 .attr('height', window.innerHeight);
49418 curtain.cut(darkness.datum());
49424 * Reveal cuts the curtain to highlight the given box,
49425 * and shows a tooltip with instructions next to the box.
49427 * @param {String|ClientRect} [box] box used to cut the curtain
49428 * @param {String} [text] text for a tooltip
49429 * @param {Object} [options]
49430 * @param {string} [options.tooltipClass] optional class to add to the tooltip
49431 * @param {integer} [options.duration] transition time in milliseconds
49432 * @param {string} [options.buttonText] if set, create a button with this text label
49433 * @param {function} [options.buttonCallback] if set, the callback for the button
49434 * @param {String|ClientRect} [options.tooltipBox] box for tooltip position, if different from box for the curtain
49436 curtain.reveal = function(box, text, options) {
49437 if (typeof box === 'string') {
49438 box = d3_select(box).node();
49440 if (box && box.getBoundingClientRect) {
49441 box = copyBox(box.getBoundingClientRect());
49444 options = options || {};
49447 if (options.tooltipBox) {
49448 tooltipBox = options.tooltipBox;
49449 if (typeof tooltipBox === 'string') {
49450 tooltipBox = d3_select(tooltipBox).node();
49452 if (tooltipBox && tooltipBox.getBoundingClientRect) {
49453 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
49459 if (tooltipBox && text) {
49460 // pseudo markdown bold text for the instruction section..
49461 var parts = text.split('**');
49462 var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
49464 html += '<span class="instruction">' + parts[1] + '</span>';
49467 html = html.replace(/\*(.*?)\*/g, '<em>$1</em>'); // emphasis
49468 html = html.replace(/\{br\}/g, '<br/><br/>'); // linebreak
49470 if (options.buttonText && options.buttonCallback) {
49471 html += '<div class="button-section">' +
49472 '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
49475 var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
49477 .classed(classes, true)
49478 .selectAll('.tooltip-inner')
49481 if (options.buttonText && options.buttonCallback) {
49482 var button = tooltip.selectAll('.button-section .button.action');
49484 .on('click', function() {
49485 event.preventDefault();
49486 options.buttonCallback();
49490 var tip = copyBox(tooltip.node().getBoundingClientRect()),
49491 w = window.innerWidth,
49492 h = window.innerHeight,
49493 tooltipWidth = 200,
49498 // hack: this will have bottom placement,
49499 // so need to reserve extra space for the tooltip illustration.
49500 if (options.tooltipClass === 'intro-mouse') {
49504 // trim box dimensions to just the portion that fits in the window..
49505 if (tooltipBox.top + tooltipBox.height > h) {
49506 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
49508 if (tooltipBox.left + tooltipBox.width > w) {
49509 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
49512 // determine tooltip placement..
49514 if (tooltipBox.top + tooltipBox.height < 100) {
49515 // tooltip below box..
49518 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49519 tooltipBox.top + tooltipBox.height
49522 } else if (tooltipBox.top > h - 140) {
49523 // tooltip above box..
49526 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
49527 tooltipBox.top - tip.height
49531 // tooltip to the side of the tooltipBox..
49532 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
49534 if (textDirection === 'rtl') {
49535 if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
49537 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49541 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49545 if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
49547 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
49551 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
49556 if (options.duration !== 0 || !tooltip.classed(side)) {
49557 tooltip.call(uiToggle(true));
49561 .style('top', pos[1] + 'px')
49562 .style('left', pos[0] + 'px')
49563 .attr('class', classes + ' ' + side);
49566 // shift tooltip-inner if it is very close to the top or bottom edge
49567 // (doesn't affect the placement of the tooltip-arrow)
49569 if (side === 'left' || side === 'right') {
49571 shiftY = 60 - pos[1];
49573 else if (pos[1] + tip.height > h - 100) {
49574 shiftY = h - pos[1] - tip.height - 100;
49577 tooltip.selectAll('.tooltip-inner')
49578 .style('top', shiftY + 'px');
49582 .classed('in', false)
49583 .call(uiToggle(false));
49586 curtain.cut(box, options.duration);
49592 curtain.cut = function(datum, duration) {
49593 darkness.datum(datum)
49597 if (duration === 0) {
49598 selection$$1 = darkness;
49600 selection$$1 = darkness
49602 .duration(duration || 600)
49607 .attr('d', function(d) {
49608 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
49609 window.innerWidth + ',' + window.innerHeight + 'L' +
49610 window.innerWidth + ',0 Z';
49612 if (!d) return string;
49613 return string + 'M' +
49614 d.left + ',' + d.top + 'L' +
49615 d.left + ',' + (d.top + d.height) + 'L' +
49616 (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
49617 (d.left + d.width) + ',' + (d.top) + 'Z';
49623 curtain.remove = function() {
49626 d3_select(window).on('resize.curtain', null);
49630 // ClientRects are immutable, so copy them to an object,
49631 // in case we need to trim the height/width.
49632 function copyBox(src) {
49636 bottom: src.bottom,
49647 function uiIntroWelcome(context, reveal) {
49648 var dispatch$$1 = dispatch('done'),
49649 listener = clickListener();
49652 title: 'intro.welcome.title'
49656 function welcome() {
49657 context.map().centerZoom([-85.63591, 41.94285], 19);
49658 reveal('.intro-nav-wrap .chapter-welcome',
49659 t('intro.welcome.welcome'),
49660 { buttonText: t('intro.ok'), buttonCallback: practice }
49664 function practice() {
49665 reveal('.intro-nav-wrap .chapter-welcome',
49666 t('intro.welcome.practice'),
49667 { buttonText: t('intro.ok'), buttonCallback: words }
49672 reveal('.intro-nav-wrap .chapter-welcome',
49673 t('intro.welcome.words'),
49674 { buttonText: t('intro.ok'), buttonCallback: mouse }
49680 reveal('.intro-nav-wrap .chapter-welcome',
49681 t('intro.welcome.mouse'),
49682 { buttonText: t('intro.ok'), buttonCallback: leftClick }
49687 function leftClick() {
49691 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49692 t('intro.welcome.leftclick', { num: times }),
49693 { tooltipClass: 'intro-mouse' }
49696 tooltip.selectAll('.tooltip-inner')
49697 .insert('svg', 'span')
49698 .attr('class', 'tooltip-illustration')
49700 .attr('xlink:href', '#walkthrough-mouse');
49704 .attr('class', 'counter');
49706 tooltip.call(listener);
49708 listener.on('click', function(which) {
49709 if (which === 'left') {
49710 d3_select('.curtain-tooltip.intro-mouse .counter')
49711 .text(String(++counter));
49713 if (counter === times) {
49714 window.setTimeout(function() { continueTo(rightClick); }, 1000);
49719 function continueTo(nextStep) {
49720 listener.on('click', null);
49721 tooltip.call(listener.off);
49722 tooltip.select('.counter').remove();
49728 function rightClick() {
49732 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
49733 t('intro.welcome.rightclick', { num: times }),
49734 { tooltipClass: 'intro-mouse' }
49737 tooltip.selectAll('.tooltip-inner')
49738 .insert('svg', 'span')
49739 .attr('class', 'tooltip-illustration')
49741 .attr('xlink:href', '#walkthrough-mouse');
49745 .attr('class', 'counter');
49747 tooltip.call(listener);
49749 listener.on('click', function(which) {
49750 if (which === 'right') {
49751 d3_select('.curtain-tooltip.intro-mouse .counter')
49752 .text(String(++counter));
49754 if (counter === times) {
49755 window.setTimeout(function() { continueTo(chapters); }, 1000);
49760 function continueTo(nextStep) {
49761 listener.on('click', null);
49762 tooltip.call(listener.off);
49763 tooltip.select('.counter').remove();
49769 function chapters() {
49770 dispatch$$1.call('done');
49771 reveal('.intro-nav-wrap .chapter-navigation',
49772 t('intro.welcome.chapters', { next: t('intro.navigation.title') })
49777 chapter.enter = function() {
49782 chapter.exit = function() {
49784 d3_select('.curtain-tooltip.intro-mouse')
49785 .selectAll('.counter')
49790 chapter.restart = function() {
49796 return utilRebind(chapter, dispatch$$1, 'on');
49801 function clickListener() {
49802 var dispatch$$1 = dispatch('click'),
49804 tooltip = d3_select(null),
49807 // `down` keeps track of which buttons/keys are down.
49808 // Setting a property in `down` happens immediately.
49809 // Unsetting a property in `down` is delayed because
49810 // on Windows a contextmenu event happens after keyup/mouseup
49812 function keydown() {
49813 if (event.keyCode === 93) { // context menu
49814 event.preventDefault();
49815 event.stopPropagation();
49816 down.menu = event.timeStamp;
49817 tooltip.classed('rightclick', true);
49823 if (event.keyCode === 93) { // context menu
49824 event.preventDefault();
49825 event.stopPropagation();
49826 var endTime = event.timeStamp,
49827 startTime = down.menu || endTime,
49828 delay = (endTime - startTime < minTime) ? minTime : 0;
49830 window.setTimeout(function() {
49831 tooltip.classed('rightclick', false);
49832 down.menu = undefined; // delayed, for Windows
49835 dispatch$$1.call('click', this, 'right');
49840 function mousedown() {
49841 var button = event.button;
49842 if (button === 0 && !event.ctrlKey) {
49843 tooltip.classed('leftclick', true);
49844 } else if (button === 2) {
49845 tooltip.classed('rightclick', true);
49847 down[button] = event.timeStamp;
49851 function mouseup() {
49852 var button = event.button,
49853 endTime = event.timeStamp,
49854 startTime = down[button] || endTime,
49855 delay = (endTime - startTime < minTime) ? minTime : 0;
49857 if (button === 0 && !event.ctrlKey) {
49858 window.setTimeout(function() {
49859 tooltip.classed('leftclick', false);
49860 down[button] = undefined; // delayed, for Windows
49863 dispatch$$1.call('click', this, 'left');
49865 } else if (button === 2) {
49866 window.setTimeout(function() {
49867 tooltip.classed('rightclick', false);
49868 down[button] = undefined; // delayed, for Windows
49871 dispatch$$1.call('click', this, 'right');
49874 window.setTimeout(function() {
49875 down[button] = undefined; // delayed, for Windows
49881 function contextmenu() {
49882 event.preventDefault();
49883 event.stopPropagation();
49884 if (!down[2] && !down.menu) {
49885 tooltip.classed('rightclick', true);
49886 window.setTimeout(function() {
49887 tooltip.classed('rightclick', false);
49889 dispatch$$1.call('click', this, 'right');
49894 var behavior = function(selection$$1) {
49895 tooltip = selection$$1;
49899 .on('keydown.intro', keydown)
49900 .on('keyup.intro', keyup)
49901 .on('mousedown.intro', mousedown)
49902 .on('mouseup.intro', mouseup)
49903 .on('contextmenu.intro', contextmenu);
49907 behavior.off = function() {
49909 .on('keydown.intro', null)
49910 .on('keyup.intro', null)
49911 .on('mousedown.intro', null)
49912 .on('mouseup.intro', null)
49913 .on('contextmenu.intro', null);
49916 .classed('leftclick', false)
49917 .classed('rightclick', false);
49920 return utilRebind(behavior, dispatch$$1, 'on');
49923 function uiIntroNavigation(context, reveal) {
49924 var dispatch$$1 = dispatch('done'),
49927 townHall = [-85.63591, 41.94285],
49928 springStreetId = 'w397',
49929 springStreetEndId = 'n1834',
49930 springStreet = [-85.63582, 41.94255],
49931 onewayField = context.presets().field('oneway'),
49932 maxspeedField = context.presets().field('maxspeed');
49936 title: 'intro.navigation.title'
49940 function timeout(f, t$$1) {
49941 timeouts.push(window.setTimeout(f, t$$1));
49945 function eventCancel() {
49946 event.stopPropagation();
49947 event.preventDefault();
49951 function isTownHallSelected() {
49952 var ids = context.selectedIDs();
49953 return ids.length === 1 && ids[0] === hallId;
49957 function dragMap() {
49958 context.enter(modeBrowse(context));
49959 context.history().reset('initial');
49961 var msec = transitionTime(townHall, context.map().center());
49962 if (msec) { reveal(null, null, { duration: 0 }); }
49963 context.map().zoom(19).centerEase(townHall, msec);
49965 timeout(function() {
49966 var centerStart = context.map().center();
49968 reveal('#surface', t('intro.navigation.drag'));
49969 context.map().on('drawn.intro', function() {
49970 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
49973 context.map().on('move.intro', function() {
49974 var centerNow = context.map().center();
49975 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
49976 context.map().on('move.intro', null);
49977 timeout(function() { continueTo(zoomMap); }, 3000);
49983 function continueTo(nextStep) {
49984 context.map().on('move.intro drawn.intro', null);
49990 function zoomMap() {
49991 var zoomStart = context.map().zoom();
49994 t('intro.navigation.zoom', {
49995 plus: icon('#icon-plus', 'pre-text'),
49996 minus: icon('#icon-minus', 'pre-text')
50000 context.map().on('drawn.intro', function() {
50002 t('intro.navigation.zoom', {
50003 plus: icon('#icon-plus', 'pre-text'),
50004 minus: icon('#icon-minus', 'pre-text')
50005 }), { duration: 0 }
50009 context.map().on('move.intro', function() {
50010 if (context.map().zoom() !== zoomStart) {
50011 context.map().on('move.intro', null);
50012 timeout(function() { continueTo(features); }, 3000);
50016 function continueTo(nextStep) {
50017 context.map().on('move.intro drawn.intro', null);
50023 function features() {
50024 var onClick = function() { continueTo(pointsLinesAreas); };
50026 reveal('#surface', t('intro.navigation.features'),
50027 { buttonText: t('intro.ok'), buttonCallback: onClick }
50030 context.map().on('drawn.intro', function() {
50031 reveal('#surface', t('intro.navigation.features'),
50032 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50036 function continueTo(nextStep) {
50037 context.map().on('drawn.intro', null);
50042 function pointsLinesAreas() {
50043 var onClick = function() { continueTo(nodesWays); };
50045 reveal('#surface', t('intro.navigation.points_lines_areas'),
50046 { buttonText: t('intro.ok'), buttonCallback: onClick }
50049 context.map().on('drawn.intro', function() {
50050 reveal('#surface', t('intro.navigation.points_lines_areas'),
50051 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50055 function continueTo(nextStep) {
50056 context.map().on('drawn.intro', null);
50061 function nodesWays() {
50062 var onClick = function() { continueTo(clickTownHall); };
50064 reveal('#surface', t('intro.navigation.nodes_ways'),
50065 { buttonText: t('intro.ok'), buttonCallback: onClick }
50068 context.map().on('drawn.intro', function() {
50069 reveal('#surface', t('intro.navigation.nodes_ways'),
50070 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50074 function continueTo(nextStep) {
50075 context.map().on('drawn.intro', null);
50080 function clickTownHall() {
50081 context.enter(modeBrowse(context));
50082 context.history().reset('initial');
50084 reveal(null, null, { duration: 0 });
50085 context.map().zoomEase(19, 500);
50087 timeout(function() {
50088 var entity = context.hasEntity(hallId);
50089 if (!entity) return;
50090 context.map().centerEase(entity.loc, 500);
50092 timeout(function() {
50093 var entity = context.hasEntity(hallId);
50094 if (!entity) return;
50095 var box = pointBox(entity.loc, context);
50096 reveal(box, t('intro.navigation.click_townhall'));
50098 context.map().on('move.intro drawn.intro', function() {
50099 var entity = context.hasEntity(hallId);
50100 if (!entity) return;
50101 var box = pointBox(entity.loc, context);
50102 reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50105 context.on('enter.intro', function() {
50106 if (isTownHallSelected()) continueTo(selectedTownHall);
50109 }, 550); // after centerEase
50111 }, 550); // after zoomEase
50113 context.history().on('change.intro', function() {
50114 if (!context.hasEntity(hallId)) {
50115 continueTo(clickTownHall);
50119 function continueTo(nextStep) {
50120 context.on('enter.intro', null);
50121 context.map().on('move.intro drawn.intro', null);
50122 context.history().on('change.intro', null);
50128 function selectedTownHall() {
50129 if (!isTownHallSelected()) return clickTownHall();
50131 var entity = context.hasEntity(hallId);
50132 if (!entity) return clickTownHall();
50134 var box = pointBox(entity.loc, context);
50135 var onClick = function() { continueTo(editorTownHall); };
50137 reveal(box, t('intro.navigation.selected_townhall'),
50138 { buttonText: t('intro.ok'), buttonCallback: onClick }
50141 context.map().on('move.intro drawn.intro', function() {
50142 var entity = context.hasEntity(hallId);
50143 if (!entity) return;
50144 var box = pointBox(entity.loc, context);
50145 reveal(box, t('intro.navigation.selected_townhall'),
50146 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50150 context.history().on('change.intro', function() {
50151 if (!context.hasEntity(hallId)) {
50152 continueTo(clickTownHall);
50156 function continueTo(nextStep) {
50157 context.map().on('move.intro drawn.intro', null);
50158 context.history().on('change.intro', null);
50164 function editorTownHall() {
50165 if (!isTownHallSelected()) return clickTownHall();
50167 // disallow scrolling
50168 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50170 var onClick = function() { continueTo(presetTownHall); };
50172 reveal('.entity-editor-pane',
50173 t('intro.navigation.editor_townhall'),
50174 { buttonText: t('intro.ok'), buttonCallback: onClick }
50177 context.on('exit.intro', function() {
50178 continueTo(clickTownHall);
50181 context.history().on('change.intro', function() {
50182 if (!context.hasEntity(hallId)) {
50183 continueTo(clickTownHall);
50187 function continueTo(nextStep) {
50188 context.on('exit.intro', null);
50189 context.history().on('change.intro', null);
50190 d3_select('.inspector-wrap').on('wheel.intro', null);
50196 function presetTownHall() {
50197 if (!isTownHallSelected()) return clickTownHall();
50199 // reset pane, in case user happened to change it..
50200 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50201 // disallow scrolling
50202 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50204 // preset match, in case the user happened to change it.
50205 var entity = context.entity(context.selectedIDs()[0]);
50206 var preset = context.presets().match(entity, context.graph());
50208 var onClick = function() { continueTo(fieldsTownHall); };
50210 context.on('exit.intro', function() {
50211 continueTo(clickTownHall);
50214 context.history().on('change.intro', function() {
50215 if (!context.hasEntity(hallId)) {
50216 continueTo(clickTownHall);
50220 reveal('.inspector-body .preset-list-item.inspector-inner',
50221 t('intro.navigation.preset_townhall', { preset: preset.name() }),
50222 { buttonText: t('intro.ok'), buttonCallback: onClick }
50225 function continueTo(nextStep) {
50226 context.on('exit.intro', null);
50227 context.history().on('change.intro', null);
50228 d3_select('.inspector-wrap').on('wheel.intro', null);
50234 function fieldsTownHall() {
50235 if (!isTownHallSelected()) return clickTownHall();
50237 // reset pane, in case user happened to change it..
50238 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50239 // disallow scrolling
50240 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50242 var onClick = function() { continueTo(closeTownHall); };
50244 reveal('.inspector-body .preset-editor',
50245 t('intro.navigation.fields_townhall'),
50246 { buttonText: t('intro.ok'), buttonCallback: onClick }
50249 context.on('exit.intro', function() {
50250 continueTo(clickTownHall);
50253 context.history().on('change.intro', function() {
50254 if (!context.hasEntity(hallId)) {
50255 continueTo(clickTownHall);
50259 function continueTo(nextStep) {
50260 context.on('exit.intro', null);
50261 context.history().on('change.intro', null);
50262 d3_select('.inspector-wrap').on('wheel.intro', null);
50268 function closeTownHall() {
50269 if (!isTownHallSelected()) return clickTownHall();
50271 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50272 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50274 reveal('.entity-editor-pane',
50275 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50278 context.on('exit.intro', function() {
50279 continueTo(searchStreet);
50282 context.history().on('change.intro', function() {
50283 // update the close icon in the tooltip if the user edits something.
50284 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50285 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50287 reveal('.entity-editor-pane',
50288 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
50293 function continueTo(nextStep) {
50294 context.on('exit.intro', null);
50295 context.history().on('change.intro', null);
50301 function searchStreet() {
50302 context.enter(modeBrowse(context));
50303 context.history().reset('initial'); // ensure spring street exists
50305 var msec = transitionTime(springStreet, context.map().center());
50306 if (msec) { reveal(null, null, { duration: 0 }); }
50307 context.map().zoom(19).centerEase(springStreet, msec); // ..and user can see it
50309 timeout(function() {
50310 reveal('.search-header input',
50311 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
50314 d3_select('.search-header input')
50315 .on('keyup.intro', checkSearchResult);
50320 function checkSearchResult() {
50321 var first = d3_select('.feature-list-item:nth-child(0n+2)'), // skip "No Results" item
50322 firstName = first.select('.entity-name'),
50323 name = t('intro.graph.name.spring-street');
50325 if (!firstName.empty() && firstName.text() === name) {
50326 reveal(first.node(),
50327 t('intro.navigation.choose_street', { name: name }),
50331 context.on('exit.intro', function() {
50332 continueTo(selectedStreet);
50335 d3_select('.search-header input')
50336 .on('keydown.intro', eventCancel, true)
50337 .on('keyup.intro', null);
50340 function continueTo(nextStep) {
50341 context.on('exit.intro', null);
50342 d3_select('.search-header input')
50343 .on('keydown.intro', null)
50344 .on('keyup.intro', null);
50350 function selectedStreet() {
50351 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50352 return searchStreet();
50355 var onClick = function() { continueTo(editorStreet); };
50356 var entity = context.entity(springStreetEndId);
50357 var box = pointBox(entity.loc, context);
50361 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50362 { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
50365 timeout(function() {
50366 context.map().on('move.intro drawn.intro', function() {
50367 var entity = context.hasEntity(springStreetEndId);
50368 if (!entity) return;
50369 var box = pointBox(entity.loc, context);
50372 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
50373 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50376 }, 600); // after reveal.
50378 context.on('enter.intro', function(mode) {
50379 if (!context.hasEntity(springStreetId)) {
50380 return continueTo(searchStreet);
50382 var ids = context.selectedIDs();
50383 if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
50384 // keep Spring Street selected..
50385 context.enter(modeSelect(context, [springStreetId]));
50389 context.history().on('change.intro', function() {
50390 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
50391 timeout(function() {
50392 continueTo(searchStreet);
50393 }, 300); // after any transition (e.g. if user deleted intersection)
50397 function continueTo(nextStep) {
50398 context.map().on('move.intro drawn.intro', null);
50399 context.on('enter.intro', null);
50400 context.history().on('change.intro', null);
50406 function editorStreet() {
50407 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50408 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50410 reveal('.entity-editor-pane',
50411 t('intro.navigation.editor_street', {
50412 button: icon(href, 'pre-text'),
50413 field1: onewayField.label(),
50414 field2: maxspeedField.label()
50418 context.on('exit.intro', function() {
50422 context.history().on('change.intro', function() {
50423 // update the close icon in the tooltip if the user edits something.
50424 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50425 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50427 reveal('.entity-editor-pane',
50428 t('intro.navigation.editor_street', {
50429 button: icon(href, 'pre-text'),
50430 field1: onewayField.label().toLowerCase(),
50431 field2: maxspeedField.label().toLowerCase()
50432 }), { duration: 0 }
50436 function continueTo(nextStep) {
50437 context.on('exit.intro', null);
50438 context.history().on('change.intro', null);
50445 dispatch$$1.call('done');
50446 reveal('#id-container',
50447 t('intro.navigation.play', { next: t('intro.points.title') }), {
50448 tooltipBox: '.intro-nav-wrap .chapter-point',
50449 buttonText: t('intro.ok'),
50450 buttonCallback: function() { reveal('#id-container'); }
50456 chapter.enter = function() {
50461 chapter.exit = function() {
50462 timeouts.forEach(window.clearTimeout);
50463 context.on('enter.intro exit.intro', null);
50464 context.map().on('move.intro drawn.intro', null);
50465 context.history().on('change.intro', null);
50466 d3_select('.inspector-wrap').on('wheel.intro', null);
50467 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
50471 chapter.restart = function() {
50477 return utilRebind(chapter, dispatch$$1, 'on');
50480 function uiIntroPoint(context, reveal) {
50481 var dispatch$$1 = dispatch('done'),
50483 intersection = [-85.63279, 41.94394],
50484 building = [-85.632422, 41.944045],
50485 cafePreset = context.presets().item('amenity/cafe'),
50490 title: 'intro.points.title'
50494 function timeout(f, t$$1) {
50495 timeouts.push(window.setTimeout(f, t$$1));
50499 function revealEditMenu(loc, text, options) {
50500 var rect = context.surfaceRect();
50501 var point$$1 = context.curtainProjection(loc);
50503 var width = 250 + (2 * pad);
50505 var startX = rect.left + point$$1[0];
50506 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
50509 top: point$$1[1] + rect.top - 60,
50513 reveal(box, text, options);
50517 function eventCancel() {
50518 event.stopPropagation();
50519 event.preventDefault();
50523 function addPoint() {
50524 context.enter(modeBrowse(context));
50525 context.history().reset('initial');
50527 var msec = transitionTime(intersection, context.map().center());
50528 if (msec) { reveal(null, null, { duration: 0 }); }
50529 context.map().zoom(19).centerEase(intersection, msec);
50531 timeout(function() {
50532 var tooltip = reveal('button.add-point',
50533 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
50537 tooltip.selectAll('.tooltip-inner')
50538 .insert('svg', 'span')
50539 .attr('class', 'tooltip-illustration')
50541 .attr('xlink:href', '#poi-images');
50543 context.on('enter.intro', function(mode) {
50544 if (mode.id !== 'add-point') return;
50545 continueTo(placePoint);
50549 function continueTo(nextStep) {
50550 context.on('enter.intro', null);
50556 function placePoint() {
50557 if (context.mode().id !== 'add-point') {
50558 return chapter.restart();
50561 var pointBox$$1 = pad$1(building, 150, context);
50562 reveal(pointBox$$1, t('intro.points.place_point'));
50564 context.map().on('move.intro drawn.intro', function() {
50565 pointBox$$1 = pad$1(building, 150, context);
50566 reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
50569 context.on('enter.intro', function(mode) {
50570 if (mode.id !== 'select') return chapter.restart();
50571 pointId = context.mode().selectedIDs()[0];
50572 continueTo(searchPreset);
50575 function continueTo(nextStep) {
50576 context.map().on('move.intro drawn.intro', null);
50577 context.on('enter.intro', null);
50583 function searchPreset() {
50584 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50588 // disallow scrolling
50589 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50591 d3_select('.preset-search-input')
50592 .on('keydown.intro', null)
50593 .on('keyup.intro', checkPresetSearch);
50595 reveal('.preset-search-input',
50596 t('intro.points.search_cafe', { preset: cafePreset.name() })
50599 context.on('enter.intro', function(mode) {
50600 if (!pointId || !context.hasEntity(pointId)) {
50601 return continueTo(addPoint);
50604 var ids = context.selectedIDs();
50605 if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
50606 // keep the user's point selected..
50607 context.enter(modeSelect(context, [pointId]));
50609 // disallow scrolling
50610 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50612 d3_select('.preset-search-input')
50613 .on('keydown.intro', null)
50614 .on('keyup.intro', checkPresetSearch);
50616 reveal('.preset-search-input',
50617 t('intro.points.search_cafe', { preset: cafePreset.name() })
50620 context.history().on('change.intro', null);
50625 function checkPresetSearch() {
50626 var first = d3_select('.preset-list-item:first-child');
50628 if (first.classed('preset-amenity-cafe')) {
50629 d3_select('.preset-search-input')
50630 .on('keydown.intro', eventCancel, true)
50631 .on('keyup.intro', null);
50633 reveal(first.select('.preset-list-button').node(),
50634 t('intro.points.choose_cafe', { preset: cafePreset.name() }),
50638 context.history().on('change.intro', function() {
50639 continueTo(aboutFeatureEditor);
50644 function continueTo(nextStep) {
50645 context.on('enter.intro', null);
50646 context.history().on('change.intro', null);
50647 d3_select('.inspector-wrap').on('wheel.intro', null);
50648 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50654 function aboutFeatureEditor() {
50655 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50659 timeout(function() {
50660 reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
50661 tooltipClass: 'intro-points-describe',
50662 buttonText: t('intro.ok'),
50663 buttonCallback: function() { continueTo(addName); }
50667 context.on('exit.intro', function() {
50668 // if user leaves select mode here, just continue with the tutorial.
50669 continueTo(reselectPoint);
50672 function continueTo(nextStep) {
50673 context.on('exit.intro', null);
50679 function addName() {
50680 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50684 // reset pane, in case user happened to change it..
50685 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50687 timeout(function() {
50688 // It's possible for the user to add a name in a previous step..
50689 // If so, don't tell them to add the name in this step.
50690 // Give them an OK button instead.
50691 var entity = context.entity(pointId);
50692 if (entity.tags.name) {
50693 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
50694 tooltipClass: 'intro-points-describe',
50695 buttonText: t('intro.ok'),
50696 buttonCallback: function() { continueTo(addCloseEditor); }
50698 tooltip.select('.instruction').style('display', 'none');
50701 reveal('.entity-editor-pane', t('intro.points.add_name'),
50702 { tooltipClass: 'intro-points-describe' }
50707 context.history().on('change.intro', function() {
50708 continueTo(addCloseEditor);
50711 context.on('exit.intro', function() {
50712 // if user leaves select mode here, just continue with the tutorial.
50713 continueTo(reselectPoint);
50716 function continueTo(nextStep) {
50717 context.on('exit.intro', null);
50718 context.history().on('change.intro', null);
50724 function addCloseEditor() {
50725 // reset pane, in case user happened to change it..
50726 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50728 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50729 var href = d3_select(selector$$1).attr('href') || '#icon-close';
50731 context.on('exit.intro', function() {
50732 continueTo(reselectPoint);
50735 reveal('.entity-editor-pane',
50736 t('intro.points.add_close', { button: icon(href, 'pre-text') })
50739 function continueTo(nextStep) {
50740 context.on('exit.intro', null);
50746 function reselectPoint() {
50747 if (!pointId) return chapter.restart();
50748 var entity = context.hasEntity(pointId);
50749 if (!entity) return chapter.restart();
50751 // make sure it's still a cafe, in case user somehow changed it..
50752 var oldPreset = context.presets().match(entity, context.graph());
50753 context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
50755 context.enter(modeBrowse(context));
50757 var msec = transitionTime(entity.loc, context.map().center());
50758 if (msec) { reveal(null, null, { duration: 0 }); }
50759 context.map().centerEase(entity.loc, msec);
50761 timeout(function() {
50762 var box = pointBox(entity.loc, context);
50763 reveal(box, t('intro.points.reselect'), { duration: 600 });
50765 timeout(function() {
50766 context.map().on('move.intro drawn.intro', function() {
50767 var entity = context.hasEntity(pointId);
50768 if (!entity) return chapter.restart();
50769 var box = pointBox(entity.loc, context);
50770 reveal(box, t('intro.points.reselect'), { duration: 0 });
50772 }, 600); // after reveal..
50774 context.on('enter.intro', function(mode) {
50775 if (mode.id !== 'select') return;
50776 continueTo(updatePoint);
50781 function continueTo(nextStep) {
50782 context.map().on('move.intro drawn.intro', null);
50783 context.on('enter.intro', null);
50789 function updatePoint() {
50790 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50791 return continueTo(reselectPoint);
50794 // reset pane, in case user happened to untag the point..
50795 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50797 context.on('exit.intro', function() {
50798 continueTo(reselectPoint);
50801 context.history().on('change.intro', function() {
50802 continueTo(updateCloseEditor);
50805 timeout(function() {
50806 reveal('.entity-editor-pane', t('intro.points.update'),
50807 { tooltipClass: 'intro-points-describe' }
50811 function continueTo(nextStep) {
50812 context.on('exit.intro', null);
50813 context.history().on('change.intro', null);
50819 function updateCloseEditor() {
50820 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
50821 return continueTo(reselectPoint);
50824 // reset pane, in case user happened to change it..
50825 d3_select('.inspector-wrap .panewrap').style('right', '0%');
50827 context.on('exit.intro', function() {
50828 continueTo(rightClickPoint);
50831 timeout(function() {
50832 reveal('.entity-editor-pane',
50833 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
50837 function continueTo(nextStep) {
50838 context.on('exit.intro', null);
50844 function rightClickPoint() {
50845 if (!pointId) return chapter.restart();
50846 var entity = context.hasEntity(pointId);
50847 if (!entity) return chapter.restart();
50849 context.enter(modeBrowse(context));
50851 var box = pointBox(entity.loc, context);
50852 reveal(box, t('intro.points.rightclick'), { duration: 600 });
50854 timeout(function() {
50855 context.map().on('move.intro drawn.intro', function() {
50856 var entity = context.hasEntity(pointId);
50857 if (!entity) return chapter.restart();
50858 var box = pointBox(entity.loc, context);
50859 reveal(box, t('intro.points.rightclick'), { duration: 0 });
50861 }, 600); // after reveal
50863 context.on('enter.intro', function(mode) {
50864 if (mode.id !== 'select') return;
50865 var ids = context.selectedIDs();
50866 if (ids.length !== 1 || ids[0] !== pointId) return;
50868 timeout(function() {
50869 var node = selectMenuItem('delete').node();
50871 continueTo(enterDelete);
50872 }, 300); // after menu visible
50875 function continueTo(nextStep) {
50876 context.on('enter.intro', null);
50877 context.map().on('move.intro drawn.intro', null);
50883 function enterDelete() {
50884 if (!pointId) return chapter.restart();
50885 var entity = context.hasEntity(pointId);
50886 if (!entity) return chapter.restart();
50888 var node = selectMenuItem('delete').node();
50889 if (!node) { return continueTo(rightClickPoint); }
50891 revealEditMenu(entity.loc,
50892 t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
50895 timeout(function() {
50896 context.map().on('move.intro drawn.intro', function() {
50897 revealEditMenu(entity.loc,
50898 t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
50902 }, 300); // after menu visible
50904 context.on('exit.intro', function() {
50905 if (!pointId) return chapter.restart();
50906 var entity = context.hasEntity(pointId);
50907 if (entity) return continueTo(rightClickPoint); // point still exists
50910 context.history().on('change.intro', function(changed) {
50911 if (changed.deleted().length) {
50916 function continueTo(nextStep) {
50917 context.map().on('move.intro drawn.intro', null);
50918 context.history().on('change.intro', null);
50919 context.on('exit.intro', null);
50926 context.history().on('change.intro', function() {
50930 var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
50931 reveal('#bar button.undo-button',
50932 t('intro.points.undo', { button: icon(iconName, 'pre-text') })
50935 function continueTo(nextStep) {
50936 context.history().on('change.intro', null);
50943 dispatch$$1.call('done');
50944 reveal('#id-container',
50945 t('intro.points.play', { next: t('intro.areas.title') }), {
50946 tooltipBox: '.intro-nav-wrap .chapter-area',
50947 buttonText: t('intro.ok'),
50948 buttonCallback: function() { reveal('#id-container'); }
50954 chapter.enter = function() {
50959 chapter.exit = function() {
50960 timeouts.forEach(window.clearTimeout);
50961 context.on('enter.intro exit.intro', null);
50962 context.map().on('move.intro drawn.intro', null);
50963 context.history().on('change.intro', null);
50964 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50965 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
50969 chapter.restart = function() {
50975 return utilRebind(chapter, dispatch$$1, 'on');
50978 function uiIntroArea(context, reveal) {
50979 var dispatch$$1 = dispatch('done'),
50980 playground = [-85.63552, 41.94159],
50981 playgroundPreset = context.presets().item('leisure/playground'),
50982 descriptionField = context.presets().field('description'),
50988 title: 'intro.areas.title'
50992 function timeout(f, t$$1) {
50993 timeouts.push(window.setTimeout(f, t$$1));
50997 function eventCancel() {
50998 event.stopPropagation();
50999 event.preventDefault();
51003 function revealPlayground(center, text, options) {
51004 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
51005 var box = pad$1(center, padding, context);
51006 reveal(box, text, options);
51010 function addArea() {
51011 context.enter(modeBrowse(context));
51012 context.history().reset('initial');
51015 var msec = transitionTime(playground, context.map().center());
51016 if (msec) { reveal(null, null, { duration: 0 }); }
51017 context.map().zoom(19).centerEase(playground, msec);
51019 timeout(function() {
51020 var tooltip = reveal('button.add-area',
51021 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
51023 tooltip.selectAll('.tooltip-inner')
51024 .insert('svg', 'span')
51025 .attr('class', 'tooltip-illustration')
51027 .attr('xlink:href', '#landuse-images');
51029 context.on('enter.intro', function(mode) {
51030 if (mode.id !== 'add-area') return;
51031 continueTo(startPlayground);
51035 function continueTo(nextStep) {
51036 context.on('enter.intro', null);
51042 function startPlayground() {
51043 if (context.mode().id !== 'add-area') {
51044 return chapter.restart();
51048 context.map().zoomEase(19.5, 500);
51050 timeout(function() {
51051 revealPlayground(playground,
51052 t('intro.areas.start_playground'), { duration: 250 }
51055 timeout(function() {
51056 context.map().on('move.intro drawn.intro', function() {
51057 revealPlayground(playground,
51058 t('intro.areas.start_playground'), { duration: 0 }
51061 context.on('enter.intro', function(mode) {
51062 if (mode.id !== 'draw-area') return chapter.restart();
51063 continueTo(continuePlayground);
51065 }, 250); // after reveal
51067 }, 550); // after easing
51069 function continueTo(nextStep) {
51070 context.map().on('move.intro drawn.intro', null);
51071 context.on('enter.intro', null);
51077 function continuePlayground() {
51078 if (context.mode().id !== 'draw-area') {
51079 return chapter.restart();
51083 revealPlayground(playground,
51084 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51088 timeout(function() {
51089 context.map().on('move.intro drawn.intro', function() {
51090 revealPlayground(playground,
51091 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51095 }, 250); // after reveal
51097 context.on('enter.intro', function(mode) {
51098 if (mode.id === 'draw-area') {
51099 var entity = context.hasEntity(context.selectedIDs()[0]);
51100 if (entity && entity.nodes.length >= 6) {
51101 return continueTo(finishPlayground);
51105 } else if (mode.id === 'select') {
51106 areaId = context.selectedIDs()[0];
51107 return continueTo(searchPresets);
51109 return chapter.restart();
51113 function continueTo(nextStep) {
51114 context.map().on('move.intro drawn.intro', null);
51115 context.on('enter.intro', null);
51121 function finishPlayground() {
51122 if (context.mode().id !== 'draw-area') {
51123 return chapter.restart();
51127 revealPlayground(playground,
51128 t('intro.areas.finish_playground'), { duration: 250 }
51131 timeout(function() {
51132 context.map().on('move.intro drawn.intro', function() {
51133 revealPlayground(playground,
51134 t('intro.areas.finish_playground'), { duration: 0 }
51137 }, 250); // after reveal
51139 context.on('enter.intro', function(mode) {
51140 if (mode.id === 'draw-area') {
51142 } else if (mode.id === 'select') {
51143 areaId = context.selectedIDs()[0];
51144 return continueTo(searchPresets);
51146 return chapter.restart();
51150 function continueTo(nextStep) {
51151 context.map().on('move.intro drawn.intro', null);
51152 context.on('enter.intro', null);
51158 function searchPresets() {
51159 if (!areaId || !context.hasEntity(areaId)) {
51162 var ids = context.selectedIDs();
51163 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51164 context.enter(modeSelect(context, [areaId]));
51167 // disallow scrolling
51168 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51170 timeout(function() {
51171 // reset pane, in case user somehow happened to change it..
51172 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51174 d3_select('.preset-search-input')
51175 .on('keydown.intro', null)
51176 .on('keyup.intro', checkPresetSearch);
51178 reveal('.preset-search-input',
51179 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51181 }, 400); // after preset list pane visible..
51183 context.on('enter.intro', function(mode) {
51184 if (!areaId || !context.hasEntity(areaId)) {
51185 return continueTo(addArea);
51188 var ids = context.selectedIDs();
51189 if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51190 // keep the user's area selected..
51191 context.enter(modeSelect(context, [areaId]));
51193 // reset pane, in case user somehow happened to change it..
51194 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51195 // disallow scrolling
51196 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51198 d3_select('.preset-search-input')
51199 .on('keydown.intro', null)
51200 .on('keyup.intro', checkPresetSearch);
51202 reveal('.preset-search-input',
51203 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51206 context.history().on('change.intro', null);
51210 function checkPresetSearch() {
51211 var first = d3_select('.preset-list-item:first-child');
51213 if (first.classed('preset-leisure-playground')) {
51214 reveal(first.select('.preset-list-button').node(),
51215 t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51219 d3_select('.preset-search-input')
51220 .on('keydown.intro', eventCancel, true)
51221 .on('keyup.intro', null);
51223 context.history().on('change.intro', function() {
51224 continueTo(clickAddField);
51229 function continueTo(nextStep) {
51230 d3_select('.inspector-wrap').on('wheel.intro', null);
51231 context.on('enter.intro', null);
51232 context.history().on('change.intro', null);
51233 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51239 function clickAddField() {
51240 if (!areaId || !context.hasEntity(areaId)) {
51243 var ids = context.selectedIDs();
51244 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51245 return searchPresets();
51248 if (!d3_select('.form-field-description').empty()) {
51249 return continueTo(describePlayground);
51252 // disallow scrolling
51253 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51255 timeout(function() {
51256 // reset pane, in case user somehow happened to change it..
51257 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51259 // It's possible for the user to add a description in a previous step..
51260 // If they did this already, just continue to next step.
51261 var entity = context.entity(areaId);
51262 if (entity.tags.description) {
51263 return continueTo(play);
51266 // scroll "Add field" into view
51267 var box = d3_select('.more-fields').node().getBoundingClientRect();
51268 if (box.top > 300) {
51269 var pane = d3_select('.entity-editor-pane .inspector-body');
51270 var start = pane.node().scrollTop;
51271 var end = start + (box.top - 300);
51276 .tween('scroll.inspector', function() {
51278 var i = d3_interpolateNumber(start, end);
51279 return function(t$$1) {
51280 node.scrollTop = i(t$$1);
51285 timeout(function() {
51286 reveal('.more-fields .combobox-input',
51287 t('intro.areas.add_field'),
51291 d3_select('.more-fields .combobox-input')
51292 .on('click.intro', function() {
51293 continueTo(chooseDescriptionField);
51295 }, 300); // after "Add Field" visible
51297 }, 400); // after editor pane visible
51299 context.on('exit.intro', function() {
51300 return continueTo(searchPresets);
51303 function continueTo(nextStep) {
51304 d3_select('.inspector-wrap').on('wheel.intro', null);
51305 d3_select('.more-fields .combobox-input').on('click.intro', null);
51306 context.on('exit.intro', null);
51312 function chooseDescriptionField() {
51313 if (!areaId || !context.hasEntity(areaId)) {
51316 var ids = context.selectedIDs();
51317 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51318 return searchPresets();
51321 if (!d3_select('.form-field-description').empty()) {
51322 return continueTo(describePlayground);
51325 // Make sure combobox is ready..
51326 if (d3_select('div.combobox').empty()) {
51327 return continueTo(clickAddField);
51329 // Watch for the combobox to go away..
51331 watcher = window.setInterval(function() {
51332 if (d3_select('div.combobox').empty()) {
51333 window.clearInterval(watcher);
51334 timeout(function() {
51335 if (d3_select('.form-field-description').empty()) {
51336 continueTo(retryChooseDescription);
51338 continueTo(describePlayground);
51340 }, 300); // after description field added.
51344 reveal('div.combobox',
51345 t('intro.areas.choose_field', { field: descriptionField.label() }),
51349 context.on('exit.intro', function() {
51350 return continueTo(searchPresets);
51353 function continueTo(nextStep) {
51354 if (watcher) window.clearInterval(watcher);
51355 context.on('exit.intro', null);
51361 function describePlayground() {
51362 if (!areaId || !context.hasEntity(areaId)) {
51365 var ids = context.selectedIDs();
51366 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51367 return searchPresets();
51370 // reset pane, in case user happened to change it..
51371 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51373 if (d3_select('.form-field-description').empty()) {
51374 return continueTo(retryChooseDescription);
51377 context.on('exit.intro', function() {
51381 reveal('.entity-editor-pane',
51382 t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
51386 function continueTo(nextStep) {
51387 context.on('exit.intro', null);
51393 function retryChooseDescription() {
51394 if (!areaId || !context.hasEntity(areaId)) {
51397 var ids = context.selectedIDs();
51398 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51399 return searchPresets();
51402 // reset pane, in case user happened to change it..
51403 d3_select('.inspector-wrap .panewrap').style('right', '0%');
51405 reveal('.entity-editor-pane',
51406 t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
51407 buttonText: t('intro.ok'),
51408 buttonCallback: function() { continueTo(clickAddField); }
51411 context.on('exit.intro', function() {
51412 return continueTo(searchPresets);
51415 function continueTo(nextStep) {
51416 context.on('exit.intro', null);
51423 dispatch$$1.call('done');
51424 reveal('#id-container',
51425 t('intro.areas.play', { next: t('intro.lines.title') }), {
51426 tooltipBox: '.intro-nav-wrap .chapter-line',
51427 buttonText: t('intro.ok'),
51428 buttonCallback: function() { reveal('#id-container'); }
51434 chapter.enter = function() {
51439 chapter.exit = function() {
51440 timeouts.forEach(window.clearTimeout);
51441 context.on('enter.intro exit.intro', null);
51442 context.map().on('move.intro drawn.intro', null);
51443 context.history().on('change.intro', null);
51444 d3_select('.inspector-wrap').on('wheel.intro', null);
51445 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51446 d3_select('.more-fields .combobox-input').on('click.intro', null);
51450 chapter.restart = function() {
51456 return utilRebind(chapter, dispatch$$1, 'on');
51459 function uiIntroLine(context, reveal) {
51460 var dispatch$$1 = dispatch('done'),
51462 tulipRoadId = null,
51463 flowerRoadId = 'w646',
51464 tulipRoadStart = [-85.6297754121684, 41.95805253325314],
51465 tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
51466 tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
51467 roadCategory = context.presets().item('category-road'),
51468 residentialPreset = context.presets().item('highway/residential'),
51469 woodRoadId = 'w525',
51470 woodRoadEndId = 'n2862',
51471 woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
51472 woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
51473 woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
51474 washingtonStreetId = 'w522',
51475 twelfthAvenueId = 'w1',
51476 eleventhAvenueEndId = 'n3550',
51477 twelfthAvenueEndId = 'n5',
51478 washingtonSegmentId = null,
51479 eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
51480 twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
51481 deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
51482 twelfthAvenue = [-85.62219310052491, 41.952505413152956];
51486 title: 'intro.lines.title'
51490 function timeout(f, t$$1) {
51491 timeouts.push(window.setTimeout(f, t$$1));
51495 function eventCancel() {
51496 event.stopPropagation();
51497 event.preventDefault();
51501 function revealEditMenu(loc, text, options) {
51502 var rect = context.surfaceRect();
51503 var point$$1 = context.curtainProjection(loc);
51505 var width = 250 + (2 * pad);
51507 var startX = rect.left + point$$1[0];
51508 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51511 top: point$$1[1] + rect.top - 60,
51515 reveal(box, text, options);
51519 function addLine() {
51520 context.enter(modeBrowse(context));
51521 context.history().reset('initial');
51523 var msec = transitionTime(tulipRoadStart, context.map().center());
51524 if (msec) { reveal(null, null, { duration: 0 }); }
51525 context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
51527 timeout(function() {
51528 var tooltip = reveal('button.add-line',
51529 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
51531 tooltip.selectAll('.tooltip-inner')
51532 .insert('svg', 'span')
51533 .attr('class', 'tooltip-illustration')
51535 .attr('xlink:href', '#feature-images');
51537 context.on('enter.intro', function(mode) {
51538 if (mode.id !== 'add-line') return;
51539 continueTo(startLine);
51543 function continueTo(nextStep) {
51544 context.on('enter.intro', null);
51550 function startLine() {
51551 if (context.mode().id !== 'add-line') {
51552 return chapter.restart();
51555 tulipRoadId = null;
51557 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
51558 var box = pad$1(tulipRoadStart, padding, context);
51559 box.height = box.height + 100;
51560 reveal(box, t('intro.lines.start_line'));
51562 context.map().on('move.intro drawn.intro', function() {
51563 padding = 70 * Math.pow(2, context.map().zoom() - 18);
51564 box = pad$1(tulipRoadStart, padding, context);
51565 box.height = box.height + 100;
51566 reveal(box, t('intro.lines.start_line'), { duration: 0 });
51569 context.on('enter.intro', function(mode) {
51570 if (mode.id !== 'draw-line') return chapter.restart();
51571 continueTo(drawLine);
51574 function continueTo(nextStep) {
51575 context.map().on('move.intro drawn.intro', null);
51576 context.on('enter.intro', null);
51582 function drawLine() {
51583 if (context.mode().id !== 'draw-line') {
51584 return chapter.restart();
51587 tulipRoadId = context.mode().selectedIDs()[0];
51588 context.map().centerEase(tulipRoadMidpoint, 500);
51590 timeout(function() {
51591 var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51592 var box = pad$1(tulipRoadMidpoint, padding, context);
51593 box.height = box.height * 2;
51595 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
51598 context.map().on('move.intro drawn.intro', function() {
51599 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
51600 box = pad$1(tulipRoadMidpoint, padding, context);
51601 box.height = box.height * 2;
51603 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
51607 }, 550); // after easing..
51609 context.history().on('change.intro', function() {
51610 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51611 if (!entity) return chapter.restart();
51613 if (isLineConnected()) {
51614 continueTo(continueLine);
51618 context.on('enter.intro', function(mode) {
51619 if (mode.id === 'draw-line')
51621 else if (mode.id === 'select') {
51622 continueTo(retryIntersect);
51626 return chapter.restart();
51629 function continueTo(nextStep) {
51630 context.map().on('move.intro drawn.intro', null);
51631 context.history().on('change.intro', null);
51632 context.on('enter.intro', null);
51638 function isLineConnected() {
51639 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51640 if (!entity) return false;
51642 var drawNodes = context.graph().childNodes(entity);
51643 return some(drawNodes, function(node) {
51644 return some(context.graph().parentWays(node), function(parent) {
51645 return parent.id === flowerRoadId;
51651 function retryIntersect() {
51652 d3_select(window).on('mousedown.intro', eventCancel, true);
51654 var box = pad$1(tulipRoadIntersection, 80, context);
51656 t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
51659 timeout(chapter.restart, 3000);
51663 function continueLine() {
51664 if (context.mode().id !== 'draw-line') return chapter.restart();
51665 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
51666 if (!entity) return chapter.restart();
51668 context.map().centerEase(tulipRoadIntersection, 500);
51670 reveal('#surface', t('intro.lines.continue_line'));
51672 context.on('enter.intro', function(mode) {
51673 if (mode.id === 'draw-line')
51675 else if (mode.id === 'select')
51676 return continueTo(chooseCategoryRoad);
51678 return chapter.restart();
51681 function continueTo(nextStep) {
51682 context.on('enter.intro', null);
51688 function chooseCategoryRoad() {
51689 if (context.mode().id !== 'select') {
51690 return chapter.restart();
51693 context.on('exit.intro', function() {
51694 return chapter.restart();
51697 var button = d3_select('.preset-category-road .preset-list-button');
51698 if (button.empty()) return chapter.restart();
51700 // disallow scrolling
51701 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51703 timeout(function() {
51704 // reset pane, in case user somehow happened to change it..
51705 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51707 reveal(button.node(),
51708 t('intro.lines.choose_category_road', { category: roadCategory.name() })
51711 button.on('click.intro', function() {
51712 continueTo(choosePresetResidential);
51715 }, 400); // after editor pane visible
51717 function continueTo(nextStep) {
51718 d3_select('.inspector-wrap').on('wheel.intro', null);
51719 d3_select('.preset-list-button').on('click.intro', null);
51720 context.on('exit.intro', null);
51726 function choosePresetResidential() {
51727 if (context.mode().id !== 'select') {
51728 return chapter.restart();
51731 context.on('exit.intro', function() {
51732 return chapter.restart();
51735 var subgrid = d3_select('.preset-category-road .subgrid');
51736 if (subgrid.empty()) return chapter.restart();
51738 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
51739 .on('click.intro', function() {
51740 continueTo(retryPresetResidential);
51743 subgrid.selectAll('.preset-highway-residential .preset-list-button')
51744 .on('click.intro', function() {
51745 continueTo(nameRoad);
51748 timeout(function() {
51749 reveal(subgrid.node(),
51750 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
51751 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
51755 function continueTo(nextStep) {
51756 d3_select('.preset-list-button').on('click.intro', null);
51757 context.on('exit.intro', null);
51763 // selected wrong road type
51764 function retryPresetResidential() {
51765 if (context.mode().id !== 'select') {
51766 return chapter.restart();
51769 context.on('exit.intro', function() {
51770 return chapter.restart();
51773 // disallow scrolling
51774 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51776 timeout(function() {
51777 var button = d3_select('.entity-editor-pane .preset-list-button');
51779 reveal(button.node(),
51780 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
51783 button.on('click.intro', function() {
51784 continueTo(chooseCategoryRoad);
51789 function continueTo(nextStep) {
51790 d3_select('.inspector-wrap').on('wheel.intro', null);
51791 d3_select('.preset-list-button').on('click.intro', null);
51792 context.on('exit.intro', null);
51798 function nameRoad() {
51799 context.on('exit.intro', function() {
51800 continueTo(didNameRoad);
51803 timeout(function() {
51804 reveal('.entity-editor-pane',
51805 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
51806 { tooltipClass: 'intro-lines-name_road' }
51810 function continueTo(nextStep) {
51811 context.on('exit.intro', null);
51817 function didNameRoad() {
51818 context.history().checkpoint('doneAddLine');
51820 timeout(function() {
51821 reveal('#surface', t('intro.lines.did_name_road'), {
51822 buttonText: t('intro.ok'),
51823 buttonCallback: function() { continueTo(updateLine); }
51827 function continueTo(nextStep) {
51833 function updateLine() {
51834 context.history().reset('doneAddLine');
51835 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51836 return chapter.restart();
51839 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
51840 if (msec) { reveal(null, null, { duration: 0 }); }
51841 context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
51843 timeout(function() {
51844 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51845 var box = pad$1(woodRoadDragMidpoint, padding, context);
51846 var advance = function() { continueTo(addNode); };
51848 reveal(box, t('intro.lines.update_line'),
51849 { buttonText: t('intro.ok'), buttonCallback: advance }
51852 context.map().on('move.intro drawn.intro', function() {
51853 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
51854 var box = pad$1(woodRoadDragMidpoint, padding, context);
51855 reveal(box, t('intro.lines.update_line'),
51856 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
51861 function continueTo(nextStep) {
51862 context.map().on('move.intro drawn.intro', null);
51868 function addNode() {
51869 context.history().reset('doneAddLine');
51870 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51871 return chapter.restart();
51874 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51875 var box = pad$1(woodRoadAddNode, padding, context);
51876 reveal(box, t('intro.lines.add_node'));
51878 context.map().on('move.intro drawn.intro', function() {
51879 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
51880 var box = pad$1(woodRoadAddNode, padding, context);
51881 reveal(box, t('intro.lines.add_node'), { duration: 0 });
51884 context.history().on('change.intro', function(changed) {
51885 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51886 return continueTo(updateLine);
51888 if (changed.created().length === 1) {
51889 timeout(function() { continueTo(startDragEndpoint); }, 500);
51893 context.on('enter.intro', function(mode) {
51894 if (mode.id !== 'select') {
51895 continueTo(updateLine);
51899 function continueTo(nextStep) {
51900 context.map().on('move.intro drawn.intro', null);
51901 context.history().on('change.intro', null);
51902 context.on('enter.intro', null);
51908 function startDragEndpoint() {
51909 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51910 return continueTo(updateLine);
51912 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51913 var box = pad$1(woodRoadDragEndpoint, padding, context);
51914 reveal(box, t('intro.lines.start_drag_endpoint'));
51916 context.map().on('move.intro drawn.intro', function() {
51917 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51918 return continueTo(updateLine);
51920 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51921 var box = pad$1(woodRoadDragEndpoint, padding, context);
51922 reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
51924 var entity = context.entity(woodRoadEndId);
51925 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
51926 continueTo(finishDragEndpoint);
51930 function continueTo(nextStep) {
51931 context.map().on('move.intro drawn.intro', null);
51937 function finishDragEndpoint() {
51938 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51939 return continueTo(updateLine);
51942 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51943 var box = pad$1(woodRoadDragEndpoint, padding, context);
51944 reveal(box, t('intro.lines.finish_drag_endpoint'));
51946 context.map().on('move.intro drawn.intro', function() {
51947 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51948 return continueTo(updateLine);
51950 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
51951 var box = pad$1(woodRoadDragEndpoint, padding, context);
51952 reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
51954 var entity = context.entity(woodRoadEndId);
51955 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
51956 continueTo(startDragEndpoint);
51960 context.on('enter.intro', function() {
51961 continueTo(startDragMidpoint);
51964 function continueTo(nextStep) {
51965 context.map().on('move.intro drawn.intro', null);
51966 context.on('enter.intro', null);
51972 function startDragMidpoint() {
51973 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51974 return continueTo(updateLine);
51976 if (context.selectedIDs().indexOf(woodRoadId) === -1) {
51977 context.enter(modeSelect(context, [woodRoadId]));
51980 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51981 var box = pad$1(woodRoadDragMidpoint, padding, context);
51982 reveal(box, t('intro.lines.start_drag_midpoint'));
51984 context.map().on('move.intro drawn.intro', function() {
51985 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
51986 return continueTo(updateLine);
51988 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
51989 var box = pad$1(woodRoadDragMidpoint, padding, context);
51990 reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
51993 context.history().on('change.intro', function(changed) {
51994 if (changed.created().length === 1) {
51995 continueTo(continueDragMidpoint);
51999 context.on('enter.intro', function(mode) {
52000 if (mode.id !== 'select') {
52001 // keep Wood Road selected so midpoint triangles are drawn..
52002 context.enter(modeSelect(context, [woodRoadId]));
52006 function continueTo(nextStep) {
52007 context.map().on('move.intro drawn.intro', null);
52008 context.history().on('change.intro', null);
52009 context.on('enter.intro', null);
52015 function continueDragMidpoint() {
52016 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52017 return continueTo(updateLine);
52020 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52021 var box = pad$1(woodRoadDragEndpoint, padding, context);
52024 var advance = function() {
52025 context.history().checkpoint('doneUpdateLine');
52026 continueTo(deleteLines);
52029 reveal(box, t('intro.lines.continue_drag_midpoint'),
52030 { buttonText: t('intro.ok'), buttonCallback: advance }
52033 context.map().on('move.intro drawn.intro', function() {
52034 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52035 return continueTo(updateLine);
52037 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52038 var box = pad$1(woodRoadDragEndpoint, padding, context);
52040 reveal(box, t('intro.lines.continue_drag_midpoint'),
52041 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52045 function continueTo(nextStep) {
52046 context.map().on('move.intro drawn.intro', null);
52052 function deleteLines() {
52053 context.history().reset('doneUpdateLine');
52054 context.enter(modeBrowse(context));
52056 if (!context.hasEntity(washingtonStreetId) ||
52057 !context.hasEntity(twelfthAvenueId) ||
52058 !context.hasEntity(eleventhAvenueEndId)) {
52059 return chapter.restart();
52062 var msec = transitionTime(deleteLinesLoc, context.map().center());
52063 if (msec) { reveal(null, null, { duration: 0 }); }
52064 context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52066 timeout(function() {
52067 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52068 var box = pad$1(deleteLinesLoc, padding, context);
52071 var advance = function() { continueTo(rightClickIntersection); };
52073 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52074 { buttonText: t('intro.ok'), buttonCallback: advance }
52077 context.map().on('move.intro drawn.intro', function() {
52078 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52079 var box = pad$1(deleteLinesLoc, padding, context);
52082 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52083 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52087 context.history().on('change.intro', function() {
52088 timeout(function() {
52089 continueTo(deleteLines);
52090 }, 500); // after any transition (e.g. if user deleted intersection)
52095 function continueTo(nextStep) {
52096 context.map().on('move.intro drawn.intro', null);
52097 context.history().on('change.intro', null);
52103 function rightClickIntersection() {
52104 context.history().reset('doneUpdateLine');
52105 context.enter(modeBrowse(context));
52107 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52109 timeout(function() {
52110 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52111 var box = pad$1(eleventhAvenueEnd, padding, context);
52112 reveal(box, t('intro.lines.rightclick_intersection',
52113 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52116 context.map().on('move.intro drawn.intro', function() {
52117 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52118 var box = pad$1(eleventhAvenueEnd, padding, context);
52119 reveal(box, t('intro.lines.rightclick_intersection',
52120 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52125 context.on('enter.intro', function(mode) {
52126 if (mode.id !== 'select') return;
52127 var ids = context.selectedIDs();
52128 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52130 timeout(function() {
52131 var node = selectMenuItem('split').node();
52133 continueTo(splitIntersection);
52134 }, 300); // after menu visible
52137 context.history().on('change.intro', function() {
52138 timeout(function() {
52139 continueTo(deleteLines);
52140 }, 300); // after any transition (e.g. if user deleted intersection)
52145 function continueTo(nextStep) {
52146 context.map().on('move.intro drawn.intro', null);
52147 context.on('enter.intro', null);
52148 context.history().on('change.intro', null);
52154 function splitIntersection() {
52155 if (!context.hasEntity(washingtonStreetId) ||
52156 !context.hasEntity(twelfthAvenueId) ||
52157 !context.hasEntity(eleventhAvenueEndId)) {
52158 return continueTo(deleteLines);
52161 var node = selectMenuItem('split').node();
52162 if (!node) { return continueTo(rightClickIntersection); }
52164 var wasChanged = false;
52165 var menuCoords = context.map().mouseCoordinates();
52166 washingtonSegmentId = null;
52168 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52169 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52172 context.map().on('move.intro drawn.intro', function() {
52173 var node = selectMenuItem('split').node();
52174 if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52176 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52177 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52182 context.history().on('change.intro', function(changed) {
52184 timeout(function() {
52185 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52186 washingtonSegmentId = changed.created()[0].id;
52187 continueTo(didSplit);
52189 washingtonSegmentId = null;
52190 continueTo(retrySplit);
52192 }, 300); // after any transition (e.g. if user deleted intersection)
52195 function continueTo(nextStep) {
52196 context.map().on('move.intro drawn.intro', null);
52197 context.history().on('change.intro', null);
52203 function retrySplit() {
52204 context.enter(modeBrowse(context));
52205 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52206 var advance = function() { continueTo(rightClickIntersection); };
52208 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52209 var box = pad$1(eleventhAvenueEnd, padding, context);
52210 reveal(box, t('intro.lines.retry_split'),
52211 { buttonText: t('intro.ok'), buttonCallback: advance }
52214 context.map().on('move.intro drawn.intro', function() {
52215 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52216 var box = pad$1(eleventhAvenueEnd, padding, context);
52217 reveal(box, t('intro.lines.retry_split'),
52218 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52222 function continueTo(nextStep) {
52223 context.map().on('move.intro drawn.intro', null);
52229 function didSplit() {
52230 if (!washingtonSegmentId ||
52231 !context.hasEntity(washingtonSegmentId) ||
52232 !context.hasEntity(washingtonStreetId) ||
52233 !context.hasEntity(twelfthAvenueId) ||
52234 !context.hasEntity(eleventhAvenueEndId)) {
52235 return continueTo(rightClickIntersection);
52238 var ids = context.selectedIDs();
52239 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52240 var street = t('intro.graph.name.washington-street');
52242 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52243 var box = pad$1(twelfthAvenue, padding, context);
52244 box.width = box.width / 2;
52245 reveal(box, t(string, { street1: street, street2: street }),
52249 timeout(function() {
52250 context.map().zoom(18).centerEase(twelfthAvenue, 500);
52252 context.map().on('move.intro drawn.intro', function() {
52253 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52254 var box = pad$1(twelfthAvenue, padding, context);
52255 box.width = box.width / 2;
52256 reveal(box, t(string, { street1: street, street2: street }),
52260 }, 600); // after initial reveal and curtain cut
52262 context.on('enter.intro', function() {
52263 var ids = context.selectedIDs();
52264 if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52265 continueTo(multiSelect);
52269 context.history().on('change.intro', function() {
52270 if (!washingtonSegmentId ||
52271 !context.hasEntity(washingtonSegmentId) ||
52272 !context.hasEntity(washingtonStreetId) ||
52273 !context.hasEntity(twelfthAvenueId) ||
52274 !context.hasEntity(eleventhAvenueEndId)) {
52275 return continueTo(rightClickIntersection);
52279 function continueTo(nextStep) {
52280 context.map().on('move.intro drawn.intro', null);
52281 context.on('enter.intro', null);
52282 context.history().on('change.intro', null);
52288 function multiSelect() {
52289 if (!washingtonSegmentId ||
52290 !context.hasEntity(washingtonSegmentId) ||
52291 !context.hasEntity(washingtonStreetId) ||
52292 !context.hasEntity(twelfthAvenueId) ||
52293 !context.hasEntity(eleventhAvenueEndId)) {
52294 return continueTo(rightClickIntersection);
52297 var ids = context.selectedIDs();
52298 var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
52299 var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
52301 if (hasWashington && hasTwelfth) {
52302 return continueTo(multiRightClick);
52303 } else if (!hasWashington && !hasTwelfth) {
52304 return continueTo(didSplit);
52307 context.map().zoom(18).centerEase(twelfthAvenue, 500);
52309 timeout(function() {
52310 var selected, other, padding, box;
52311 if (hasWashington) {
52312 selected = t('intro.graph.name.washington-street');
52313 other = t('intro.graph.name.12th-avenue');
52314 padding = 60 * Math.pow(2, context.map().zoom() - 18);
52315 box = pad$1(twelfthAvenueEnd, padding, context);
52318 selected = t('intro.graph.name.12th-avenue');
52319 other = t('intro.graph.name.washington-street');
52320 padding = 200 * Math.pow(2, context.map().zoom() - 18);
52321 box = pad$1(twelfthAvenue, padding, context);
52326 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
52329 context.map().on('move.intro drawn.intro', function() {
52330 if (hasWashington) {
52331 selected = t('intro.graph.name.washington-street');
52332 other = t('intro.graph.name.12th-avenue');
52333 padding = 60 * Math.pow(2, context.map().zoom() - 18);
52334 box = pad$1(twelfthAvenueEnd, padding, context);
52337 selected = t('intro.graph.name.12th-avenue');
52338 other = t('intro.graph.name.washington-street');
52339 padding = 200 * Math.pow(2, context.map().zoom() - 18);
52340 box = pad$1(twelfthAvenue, padding, context);
52345 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
52350 context.on('enter.intro', function() {
52351 continueTo(multiSelect);
52354 context.history().on('change.intro', function() {
52355 if (!washingtonSegmentId ||
52356 !context.hasEntity(washingtonSegmentId) ||
52357 !context.hasEntity(washingtonStreetId) ||
52358 !context.hasEntity(twelfthAvenueId) ||
52359 !context.hasEntity(eleventhAvenueEndId)) {
52360 return continueTo(rightClickIntersection);
52365 function continueTo(nextStep) {
52366 context.map().on('move.intro drawn.intro', null);
52367 context.on('enter.intro', null);
52368 context.history().on('change.intro', null);
52374 function multiRightClick() {
52375 if (!washingtonSegmentId ||
52376 !context.hasEntity(washingtonSegmentId) ||
52377 !context.hasEntity(washingtonStreetId) ||
52378 !context.hasEntity(twelfthAvenueId) ||
52379 !context.hasEntity(eleventhAvenueEndId)) {
52380 return continueTo(rightClickIntersection);
52383 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52384 var box = pad$1(twelfthAvenue, padding, context);
52385 reveal(box, t('intro.lines.multi_rightclick'));
52387 context.map().on('move.intro drawn.intro', function() {
52388 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52389 var box = pad$1(twelfthAvenue, padding, context);
52390 reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
52393 d3_select(window).on('click.intro contextmenu.intro', function() {
52394 timeout(function() {
52395 var ids = context.selectedIDs();
52396 if (ids.length === 2 &&
52397 ids.indexOf(twelfthAvenueId) !== -1 &&
52398 ids.indexOf(washingtonSegmentId) !== -1) {
52399 var node = selectMenuItem('delete').node();
52401 continueTo(multiDelete);
52402 } else if (ids.length === 1 &&
52403 ids.indexOf(washingtonSegmentId) !== -1) {
52404 return continueTo(multiSelect);
52406 return continueTo(didSplit);
52408 }, 300); // after edit menu visible
52411 context.history().on('change.intro', function() {
52412 if (!washingtonSegmentId ||
52413 !context.hasEntity(washingtonSegmentId) ||
52414 !context.hasEntity(washingtonStreetId) ||
52415 !context.hasEntity(twelfthAvenueId) ||
52416 !context.hasEntity(eleventhAvenueEndId)) {
52417 return continueTo(rightClickIntersection);
52421 function continueTo(nextStep) {
52422 context.map().on('move.intro drawn.intro', null);
52423 d3_select(window).on('click.intro contextmenu.intro', null, true);
52424 context.history().on('change.intro', null);
52430 function multiDelete() {
52431 if (!washingtonSegmentId ||
52432 !context.hasEntity(washingtonSegmentId) ||
52433 !context.hasEntity(washingtonStreetId) ||
52434 !context.hasEntity(twelfthAvenueId) ||
52435 !context.hasEntity(eleventhAvenueEndId)) {
52436 return continueTo(rightClickIntersection);
52439 var node = selectMenuItem('delete').node();
52440 if (!node) return continueTo(multiRightClick);
52442 var menuCoords = context.map().mouseCoordinates();
52443 revealEditMenu(menuCoords,
52444 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
52447 context.map().on('move.intro drawn.intro', function() {
52448 revealEditMenu(menuCoords,
52449 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
52454 context.on('exit.intro', function() {
52455 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52456 return continueTo(multiSelect); // left select mode but roads still exist
52460 context.history().on('change.intro', function() {
52461 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
52462 continueTo(retryDelete); // changed something but roads still exist
52468 function continueTo(nextStep) {
52469 context.map().on('move.intro drawn.intro', null);
52470 context.on('exit.intro', null);
52471 context.history().on('change.intro', null);
52477 function retryDelete() {
52478 context.enter(modeBrowse(context));
52480 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52481 var box = pad$1(twelfthAvenue, padding, context);
52482 reveal(box, t('intro.lines.retry_delete'), {
52483 buttonText: t('intro.ok'),
52484 buttonCallback: function() { continueTo(multiSelect); }
52487 function continueTo(nextStep) {
52494 dispatch$$1.call('done');
52495 reveal('#id-container',
52496 t('intro.lines.play', { next: t('intro.buildings.title') }), {
52497 tooltipBox: '.intro-nav-wrap .chapter-building',
52498 buttonText: t('intro.ok'),
52499 buttonCallback: function() { reveal('#id-container'); }
52505 chapter.enter = function() {
52510 chapter.exit = function() {
52511 timeouts.forEach(window.clearTimeout);
52512 d3_select(window).on('mousedown.intro', null, true);
52513 context.on('enter.intro exit.intro', null);
52514 context.map().on('move.intro drawn.intro', null);
52515 context.history().on('change.intro', null);
52516 d3_select('.inspector-wrap').on('wheel.intro', null);
52517 d3_select('.preset-list-button').on('click.intro', null);
52521 chapter.restart = function() {
52527 return utilRebind(chapter, dispatch$$1, 'on');
52530 function uiIntroBuilding(context, reveal) {
52531 var dispatch$$1 = dispatch('done'),
52532 house = [-85.62815, 41.95638],
52533 tank = [-85.62732, 41.95347],
52534 buildingCatetory = context.presets().item('category-building'),
52535 housePreset = context.presets().item('building/house'),
52536 tankPreset = context.presets().item('man_made/storage_tank'),
52543 title: 'intro.buildings.title'
52547 function timeout(f, t$$1) {
52548 timeouts.push(window.setTimeout(f, t$$1));
52552 function eventCancel() {
52553 event.stopPropagation();
52554 event.preventDefault();
52558 function revealHouse(center, text, options) {
52559 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
52560 var box = pad$1(center, padding, context);
52561 reveal(box, text, options);
52565 function revealTank(center, text, options) {
52566 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
52567 var box = pad$1(center, padding, context);
52568 reveal(box, text, options);
52572 function revealEditMenu(loc, text, options) {
52573 var rect = context.surfaceRect();
52574 var point$$1 = context.curtainProjection(loc);
52576 var width = 250 + (2 * pad);
52578 var startX = rect.left + point$$1[0];
52579 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52582 top: point$$1[1] + rect.top - 60,
52586 reveal(box, text, options);
52590 function addHouse() {
52591 context.enter(modeBrowse(context));
52592 context.history().reset('initial');
52595 var msec = transitionTime(house, context.map().center());
52596 if (msec) { reveal(null, null, { duration: 0 }); }
52597 context.map().zoom(19).centerEase(house, msec);
52599 timeout(function() {
52600 var tooltip = reveal('button.add-area',
52601 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
52603 tooltip.selectAll('.tooltip-inner')
52604 .insert('svg', 'span')
52605 .attr('class', 'tooltip-illustration')
52607 .attr('xlink:href', '#building-images');
52609 context.on('enter.intro', function(mode) {
52610 if (mode.id !== 'add-area') return;
52611 continueTo(startHouse);
52615 function continueTo(nextStep) {
52616 context.on('enter.intro', null);
52622 function startHouse() {
52623 if (context.mode().id !== 'add-area') {
52624 return continueTo(addHouse);
52628 context.map().zoomEase(20, 500);
52630 timeout(function() {
52631 revealHouse(house, t('intro.buildings.start_building'));
52633 context.map().on('move.intro drawn.intro', function() {
52634 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
52637 context.on('enter.intro', function(mode) {
52638 if (mode.id !== 'draw-area') return chapter.restart();
52639 continueTo(continueHouse);
52642 }, 550); // after easing
52644 function continueTo(nextStep) {
52645 context.map().on('move.intro drawn.intro', null);
52646 context.on('enter.intro', null);
52652 function continueHouse() {
52653 if (context.mode().id !== 'draw-area') {
52654 return continueTo(addHouse);
52659 revealHouse(house, t('intro.buildings.continue_building'));
52661 context.map().on('move.intro drawn.intro', function() {
52662 revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
52665 context.on('enter.intro', function(mode) {
52666 if (mode.id === 'draw-area') {
52668 } else if (mode.id === 'select') {
52669 var graph = context.graph(),
52670 way = context.entity(context.selectedIDs()[0]),
52671 nodes = graph.childNodes(way),
52672 points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
52674 if (isMostlySquare(points)) {
52676 return continueTo(chooseCategoryBuilding);
52678 return continueTo(retryHouse);
52682 return chapter.restart();
52686 function continueTo(nextStep) {
52687 context.map().on('move.intro drawn.intro', null);
52688 context.on('enter.intro', null);
52694 function retryHouse() {
52695 var onClick = function() { continueTo(addHouse); };
52697 revealHouse(house, t('intro.buildings.retry_building'),
52698 { buttonText: t('intro.ok'), buttonCallback: onClick }
52701 context.map().on('move.intro drawn.intro', function() {
52702 revealHouse(house, t('intro.buildings.retry_building'),
52703 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
52707 function continueTo(nextStep) {
52708 context.map().on('move.intro drawn.intro', null);
52714 function chooseCategoryBuilding() {
52715 if (!houseId || !context.hasEntity(houseId)) {
52718 var ids = context.selectedIDs();
52719 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52720 context.enter(modeSelect(context, [houseId]));
52723 // disallow scrolling
52724 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52726 timeout(function() {
52727 // reset pane, in case user somehow happened to change it..
52728 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52730 var button = d3_select('.preset-category-building .preset-list-button');
52732 reveal(button.node(),
52733 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
52736 button.on('click.intro', function() {
52737 button.on('click.intro', null);
52738 continueTo(choosePresetHouse);
52741 }, 400); // after preset list pane visible..
52744 context.on('enter.intro', function(mode) {
52745 if (!houseId || !context.hasEntity(houseId)) {
52746 return continueTo(addHouse);
52748 var ids = context.selectedIDs();
52749 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52750 return continueTo(chooseCategoryBuilding);
52754 function continueTo(nextStep) {
52755 d3_select('.inspector-wrap').on('wheel.intro', null);
52756 d3_select('.preset-list-button').on('click.intro', null);
52757 context.on('enter.intro', null);
52763 function choosePresetHouse() {
52764 if (!houseId || !context.hasEntity(houseId)) {
52767 var ids = context.selectedIDs();
52768 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52769 context.enter(modeSelect(context, [houseId]));
52772 // disallow scrolling
52773 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52775 timeout(function() {
52776 // reset pane, in case user somehow happened to change it..
52777 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52779 var button = d3_select('.preset-building-house .preset-list-button');
52781 reveal(button.node(),
52782 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
52786 button.on('click.intro', function() {
52787 button.on('click.intro', null);
52788 continueTo(closeEditorHouse);
52792 }, 400); // after preset list pane visible..
52794 context.on('enter.intro', function(mode) {
52795 if (!houseId || !context.hasEntity(houseId)) {
52796 return continueTo(addHouse);
52798 var ids = context.selectedIDs();
52799 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
52800 return continueTo(chooseCategoryBuilding);
52804 function continueTo(nextStep) {
52805 d3_select('.inspector-wrap').on('wheel.intro', null);
52806 d3_select('.preset-list-button').on('click.intro', null);
52807 context.on('enter.intro', null);
52813 function closeEditorHouse() {
52814 if (!houseId || !context.hasEntity(houseId)) {
52817 var ids = context.selectedIDs();
52818 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
52819 context.enter(modeSelect(context, [houseId]));
52822 context.history().checkpoint('hasHouse');
52824 context.on('exit.intro', function() {
52825 continueTo(rightClickHouse);
52828 timeout(function() {
52829 reveal('.entity-editor-pane',
52830 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
52834 function continueTo(nextStep) {
52835 context.on('exit.intro', null);
52841 function rightClickHouse() {
52842 if (!houseId) return chapter.restart();
52844 context.enter(modeBrowse(context));
52845 context.history().reset('hasHouse');
52846 context.map().centerEase(house, 500);
52848 timeout(function() {
52849 if (context.map().zoom() < 20) {
52850 context.map().zoomEase(20, 500);
52854 context.on('enter.intro', function(mode) {
52855 if (mode.id !== 'select') return;
52856 var ids = context.selectedIDs();
52857 if (ids.length !== 1 || ids[0] !== houseId) return;
52859 timeout(function() {
52860 var node = selectMenuItem('orthogonalize').node();
52862 continueTo(clickSquare);
52863 }, 300); // after menu visible
52866 context.map().on('move.intro drawn.intro', function() {
52867 revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
52870 context.history().on('change.intro', function() {
52871 continueTo(rightClickHouse);
52874 function continueTo(nextStep) {
52875 context.on('enter.intro', null);
52876 context.map().on('move.intro drawn.intro', null);
52877 context.history().on('change.intro', null);
52883 function clickSquare() {
52884 if (!houseId) return chapter.restart();
52885 var entity = context.hasEntity(houseId);
52886 if (!entity) return continueTo(rightClickHouse);
52888 var node = selectMenuItem('orthogonalize').node();
52889 if (!node) { return continueTo(rightClickHouse); }
52891 var wasChanged = false;
52892 var menuCoords = context.map().mouseCoordinates();
52894 revealEditMenu(menuCoords,
52895 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
52898 context.on('enter.intro', function(mode) {
52899 if (mode.id === 'browse') {
52900 continueTo(rightClickHouse);
52901 } else if (mode.id === 'move' || mode.id === 'rotate') {
52902 continueTo(retryClickSquare);
52906 context.map().on('move.intro drawn.intro', function() {
52907 var node = selectMenuItem('orthogonalize').node();
52908 if (!wasChanged && !node) { return continueTo(rightClickHouse); }
52910 revealEditMenu(menuCoords,
52911 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
52916 context.history().on('change.intro', function() {
52918 context.history().on('change.intro', null);
52920 // Something changed. Wait for transition to complete and check undo annotation.
52921 timeout(function() {
52922 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
52923 continueTo(doneSquare);
52925 continueTo(retryClickSquare);
52927 }, 500); // after transitioned actions
52930 function continueTo(nextStep) {
52931 context.on('enter.intro', null);
52932 context.map().on('move.intro drawn.intro', null);
52933 context.history().on('change.intro', null);
52939 function retryClickSquare() {
52940 context.enter(modeBrowse(context));
52942 revealHouse(house, t('intro.buildings.retry_square'), {
52943 buttonText: t('intro.ok'),
52944 buttonCallback: function() { continueTo(rightClickHouse); }
52947 function continueTo(nextStep) {
52953 function doneSquare() {
52954 context.history().checkpoint('doneSquare');
52956 revealHouse(house, t('intro.buildings.done_square'), {
52957 buttonText: t('intro.ok'),
52958 buttonCallback: function() { continueTo(addTank); }
52961 function continueTo(nextStep) {
52967 function addTank() {
52968 context.enter(modeBrowse(context));
52969 context.history().reset('doneSquare');
52972 var msec = transitionTime(tank, context.map().center());
52973 if (msec) { reveal(null, null, { duration: 0 }); }
52974 context.map().zoom(19.5).centerEase(tank, msec);
52976 timeout(function() {
52977 reveal('button.add-area',
52978 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
52981 context.on('enter.intro', function(mode) {
52982 if (mode.id !== 'add-area') return;
52983 continueTo(startTank);
52987 function continueTo(nextStep) {
52988 context.on('enter.intro', null);
52994 function startTank() {
52995 if (context.mode().id !== 'add-area') {
52996 return continueTo(addTank);
53001 timeout(function() {
53002 revealTank(tank, t('intro.buildings.start_tank'));
53004 context.map().on('move.intro drawn.intro', function() {
53005 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
53008 context.on('enter.intro', function(mode) {
53009 if (mode.id !== 'draw-area') return chapter.restart();
53010 continueTo(continueTank);
53013 }, 550); // after easing
53015 function continueTo(nextStep) {
53016 context.map().on('move.intro drawn.intro', null);
53017 context.on('enter.intro', null);
53023 function continueTank() {
53024 if (context.mode().id !== 'draw-area') {
53025 return continueTo(addTank);
53030 revealTank(tank, t('intro.buildings.continue_tank'));
53032 context.map().on('move.intro drawn.intro', function() {
53033 revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53036 context.on('enter.intro', function(mode) {
53037 if (mode.id === 'draw-area') {
53039 } else if (mode.id === 'select') {
53040 tankId = context.selectedIDs()[0];
53041 return continueTo(searchPresetTank);
53043 return continueTo(addTank);
53047 function continueTo(nextStep) {
53048 context.map().on('move.intro drawn.intro', null);
53049 context.on('enter.intro', null);
53055 function searchPresetTank() {
53056 if (!tankId || !context.hasEntity(tankId)) {
53059 var ids = context.selectedIDs();
53060 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53061 context.enter(modeSelect(context, [tankId]));
53064 // disallow scrolling
53065 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53067 timeout(function() {
53068 // reset pane, in case user somehow happened to change it..
53069 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53071 d3_select('.preset-search-input')
53072 .on('keydown.intro', null)
53073 .on('keyup.intro', checkPresetSearch);
53075 reveal('.preset-search-input',
53076 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53078 }, 400); // after preset list pane visible..
53080 context.on('enter.intro', function(mode) {
53081 if (!tankId || !context.hasEntity(tankId)) {
53082 return continueTo(addTank);
53085 var ids = context.selectedIDs();
53086 if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53087 // keep the user's area selected..
53088 context.enter(modeSelect(context, [tankId]));
53090 // reset pane, in case user somehow happened to change it..
53091 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53092 // disallow scrolling
53093 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53095 d3_select('.preset-search-input')
53096 .on('keydown.intro', null)
53097 .on('keyup.intro', checkPresetSearch);
53099 reveal('.preset-search-input',
53100 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53103 context.history().on('change.intro', null);
53107 function checkPresetSearch() {
53108 var first = d3_select('.preset-list-item:first-child');
53110 if (first.classed('preset-man_made-storage_tank')) {
53111 reveal(first.select('.preset-list-button').node(),
53112 t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53116 d3_select('.preset-search-input')
53117 .on('keydown.intro', eventCancel, true)
53118 .on('keyup.intro', null);
53120 context.history().on('change.intro', function() {
53121 continueTo(closeEditorTank);
53126 function continueTo(nextStep) {
53127 d3_select('.inspector-wrap').on('wheel.intro', null);
53128 context.on('enter.intro', null);
53129 context.history().on('change.intro', null);
53130 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53136 function closeEditorTank() {
53137 if (!tankId || !context.hasEntity(tankId)) {
53140 var ids = context.selectedIDs();
53141 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53142 context.enter(modeSelect(context, [tankId]));
53145 context.history().checkpoint('hasTank');
53147 context.on('exit.intro', function() {
53148 continueTo(rightClickTank);
53151 timeout(function() {
53152 reveal('.entity-editor-pane',
53153 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53157 function continueTo(nextStep) {
53158 context.on('exit.intro', null);
53164 function rightClickTank() {
53165 if (!tankId) return continueTo(addTank);
53167 context.enter(modeBrowse(context));
53168 context.history().reset('hasTank');
53169 context.map().centerEase(tank, 500);
53171 timeout(function() {
53172 context.on('enter.intro', function(mode) {
53173 if (mode.id !== 'select') return;
53174 var ids = context.selectedIDs();
53175 if (ids.length !== 1 || ids[0] !== tankId) return;
53177 timeout(function() {
53178 var node = selectMenuItem('circularize').node();
53180 continueTo(clickCircle);
53181 }, 300); // after menu visible
53184 revealTank(tank, t('intro.buildings.rightclick_tank'));
53186 context.map().on('move.intro drawn.intro', function() {
53187 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53190 context.history().on('change.intro', function() {
53191 continueTo(rightClickTank);
53196 function continueTo(nextStep) {
53197 context.on('enter.intro', null);
53198 context.map().on('move.intro drawn.intro', null);
53199 context.history().on('change.intro', null);
53205 function clickCircle() {
53206 if (!tankId) return chapter.restart();
53207 var entity = context.hasEntity(tankId);
53208 if (!entity) return continueTo(rightClickTank);
53210 var node = selectMenuItem('circularize').node();
53211 if (!node) { return continueTo(rightClickTank); }
53213 var wasChanged = false;
53214 var menuCoords = context.map().mouseCoordinates();
53216 revealEditMenu(menuCoords,
53217 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53220 context.on('enter.intro', function(mode) {
53221 if (mode.id === 'browse') {
53222 continueTo(rightClickTank);
53223 } else if (mode.id === 'move' || mode.id === 'rotate') {
53224 continueTo(retryClickCircle);
53228 context.map().on('move.intro drawn.intro', function() {
53229 var node = selectMenuItem('circularize').node();
53230 if (!wasChanged && !node) { return continueTo(rightClickTank); }
53232 revealEditMenu(menuCoords,
53233 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53238 context.history().on('change.intro', function() {
53240 context.history().on('change.intro', null);
53242 // Something changed. Wait for transition to complete and check undo annotation.
53243 timeout(function() {
53244 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53247 continueTo(retryClickCircle);
53249 }, 500); // after transitioned actions
53252 function continueTo(nextStep) {
53253 context.on('enter.intro', null);
53254 context.map().on('move.intro drawn.intro', null);
53255 context.history().on('change.intro', null);
53261 function retryClickCircle() {
53262 context.enter(modeBrowse(context));
53264 revealTank(tank, t('intro.buildings.retry_circle'), {
53265 buttonText: t('intro.ok'),
53266 buttonCallback: function() { continueTo(rightClickTank); }
53269 function continueTo(nextStep) {
53276 dispatch$$1.call('done');
53277 reveal('#id-container',
53278 t('intro.buildings.play', { next: t('intro.startediting.title') }), {
53279 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
53280 buttonText: t('intro.ok'),
53281 buttonCallback: function() { reveal('#id-container'); }
53287 chapter.enter = function() {
53292 chapter.exit = function() {
53293 timeouts.forEach(window.clearTimeout);
53294 context.on('enter.intro exit.intro', null);
53295 context.map().on('move.intro drawn.intro', null);
53296 context.history().on('change.intro', null);
53297 d3_select('.inspector-wrap').on('wheel.intro', null);
53298 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53299 d3_select('.more-fields .combobox-input').on('click.intro', null);
53303 chapter.restart = function() {
53309 return utilRebind(chapter, dispatch$$1, 'on');
53312 function uiModal(selection$$1, blocking) {
53313 var keybinding = d3keybinding('modal');
53314 var previous = selection$$1.select('div.modal');
53315 var animate = previous.empty();
53317 previous.transition()
53319 .style('opacity', 0)
53322 var shaded = selection$$1
53324 .attr('class', 'shaded')
53325 .style('opacity', 0);
53327 shaded.close = function() {
53331 .style('opacity',0)
53337 .style('top','0px');
53345 .attr('class', 'modal fillL col6');
53348 shaded.on('click.remove-modal', function() {
53349 if (event.target === this) {
53354 modal.append('button')
53355 .attr('class', 'close')
53356 .on('click', shaded.close)
53357 .call(svgIcon('#icon-close'));
53360 .on('⌫', shaded.close)
53361 .on('⎋', shaded.close);
53363 d3_select(document)
53369 .attr('class', 'content');
53372 shaded.transition().style('opacity', 1);
53374 shaded.style('opacity', 1);
53381 function uiIntroStartEditing(context, reveal) {
53382 var dispatch$$1 = dispatch('done', 'startEditing'),
53383 modalSelection = d3_select(null);
53387 title: 'intro.startediting.title'
53390 function showHelp() {
53391 reveal('.map-control.help-control',
53392 t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
53393 buttonText: t('intro.ok'),
53394 buttonCallback: function() { shortcuts(); }
53399 function shortcuts() {
53400 reveal('.map-control.help-control',
53401 t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
53402 buttonText: t('intro.ok'),
53403 buttonCallback: function() { showSave(); }
53408 function showSave() {
53409 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
53410 reveal('#bar button.save',
53411 t('intro.startediting.save'), {
53412 buttonText: t('intro.ok'),
53413 buttonCallback: function() { showStart(); }
53418 function showStart() {
53419 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
53421 modalSelection = uiModal(context.container());
53423 modalSelection.select('.modal')
53424 .attr('class', 'modal-splash modal col6');
53426 modalSelection.selectAll('.close').remove();
53428 var startbutton = modalSelection.select('.content')
53429 .attr('class', 'fillL')
53431 .attr('class', 'modal-section huge-modal-button')
53432 .on('click', function() {
53433 modalSelection.remove();
53438 .attr('class', 'illustration')
53440 .attr('xlink:href', '#logo-walkthrough');
53444 .text(t('intro.startediting.start'));
53446 dispatch$$1.call('startEditing');
53450 chapter.enter = function() {
53455 chapter.exit = function() {
53456 modalSelection.remove();
53457 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
53461 return utilRebind(chapter, dispatch$$1, 'on');
53465 welcome: uiIntroWelcome,
53466 navigation: uiIntroNavigation,
53467 point: uiIntroPoint,
53470 building: uiIntroBuilding,
53471 startEditing: uiIntroStartEditing
53474 var chapterFlow = [
53485 function uiIntro(context) {
53486 var introGraph = {},
53490 // create entities for intro graph and localize names
53491 for (var id in dataIntroGraph) {
53492 introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
53496 function intro(selection$$1) {
53497 context.enter(modeBrowse(context));
53499 // Save current map state
53500 var osm = context.connection(),
53501 history = context.history().toJSON(),
53502 hash = window.location.hash,
53503 center = context.map().center(),
53504 zoom = context.map().zoom(),
53505 background = context.background().baseLayerSource(),
53506 overlays = context.background().overlayLayerSources(),
53507 opacity = d3_selectAll('#map .layer-background').style('opacity'),
53508 loadedTiles = osm && osm.loadedTiles(),
53509 baseEntities = context.history().graph().base().entities,
53510 countryCode = services.geocoder.countryCode;
53513 context.inIntro(true);
53515 // Load semi-real data used in intro
53516 if (osm) { osm.toggle(false).reset(); }
53517 context.history().reset();
53518 context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
53519 context.history().checkpoint('initial');
53521 var esri = context.background().findSource('EsriWorldImagery');
53523 context.background().baseLayerSource(esri);
53525 context.background().bing();
53527 overlays.forEach(function (d) {
53528 context.background().toggleOverlayLayer(d);
53532 services.geocoder.countryCode = function(location, callback) {
53533 callback(null, t('intro.graph.countrycode'));
53536 d3_selectAll('#map .layer-background').style('opacity', 1);
53538 var curtain = uiCurtain();
53539 selection$$1.call(curtain);
53541 // store that the user started the walkthrough..
53542 context.storage('walkthrough_started', 'yes');
53544 // restore previous walkthrough progress..
53545 var storedProgress = context.storage('walkthrough_progress') || '';
53546 var progress = storedProgress.split(';').filter(Boolean);
53548 var chapters = chapterFlow.map(function(chapter, i) {
53549 var s = chapterUi[chapter](context, curtain.reveal)
53550 .on('done', function() {
53551 context.presets().init(); // clear away "recent" presets
53553 buttons.filter(function(d) {
53554 return d.title === s.title;
53555 }).classed('finished', true);
53557 if (i < chapterFlow.length - 1) {
53558 var next = chapterFlow[i + 1];
53559 d3_select('button.chapter-' + next)
53560 .classed('next', true);
53563 // store walkthrough progress..
53564 progress.push(chapter);
53565 context.storage('walkthrough_progress', uniq(progress).join(';'));
53570 chapters[chapters.length - 1].on('startEditing', function() {
53571 // store walkthrough progress..
53572 progress.push('startEditing');
53573 context.storage('walkthrough_progress', uniq(progress).join(';'));
53575 // store if walkthrough is completed..
53576 var incomplete = difference(chapterFlow, progress);
53577 if (!incomplete.length) {
53578 context.storage('walkthrough_completed', 'yes');
53583 d3_selectAll('#map .layer-background').style('opacity', opacity);
53584 if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
53585 context.history().reset().merge(values$1(baseEntities));
53586 context.background().baseLayerSource(background);
53587 overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
53588 if (history) { context.history().fromJSON(history, false); }
53589 context.map().centerZoom(center, zoom);
53590 window.location.replace(hash);
53591 services.geocoder.countryCode = countryCode;
53592 context.inIntro(false);
53595 var navwrap = selection$$1
53597 .attr('class', 'intro-nav-wrap fillD');
53601 .attr('class', 'intro-nav-wrap-logo')
53603 .attr('xlink:href', '#logo-walkthrough');
53605 var buttonwrap = navwrap
53607 .attr('class', 'joined')
53608 .selectAll('button.chapter');
53610 var buttons = buttonwrap
53614 .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
53615 .on('click', enterChapter);
53619 .text(function(d) { return t(d.title); });
53623 .attr('class', 'status')
53624 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
53626 enterChapter(chapters[0]);
53629 function enterChapter(newChapter) {
53630 if (currChapter) { currChapter.exit(); }
53631 context.enter(modeBrowse(context));
53633 currChapter = newChapter;
53634 currChapter.enter();
53637 .classed('next', false)
53638 .classed('active', function(d) {
53639 return d.title === currChapter.title;
53648 function uiTooltipHtml(text, key, heading) {
53652 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
53655 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
53658 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
53659 '<span class="keyhint">' + key + '</span></div>';
53665 function uiMapData(context) {
53666 var key = t('map_data.key');
53667 var features = context.features().keys();
53668 var layers = context.layers();
53669 var fills = ['wireframe', 'partial', 'full'];
53671 var _fillSelected = context.storage('area-fill') || 'partial';
53672 var _shown = false;
53673 var _dataLayerContainer = d3_select(null);
53674 var _fillList = d3_select(null);
53675 var _featureList = d3_select(null);
53678 function showsFeature(d) {
53679 return context.features().enabled(d);
53683 function autoHiddenFeature(d) {
53684 return context.features().autoHidden(d);
53688 function clickFeature(d) {
53689 context.features().toggle(d);
53694 function showsFill(d) {
53695 return _fillSelected === d;
53699 function setFill(d) {
53700 fills.forEach(function(opt) {
53701 context.surface().classed('fill-' + opt, Boolean(opt === d));
53705 context.storage('area-fill', d);
53706 if (d !== 'wireframe') {
53707 context.storage('area-fill-toggle', d);
53713 function showsLayer(which) {
53714 var layer = layers.layer(which);
53716 return layer.enabled();
53722 function setLayer(which, enabled) {
53723 var layer = layers.layer(which);
53725 layer.enabled(enabled);
53731 function toggleLayer(which) {
53732 setLayer(which, !showsLayer(which));
53736 function drawPhotoItems(selection$$1) {
53737 var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
53738 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
53739 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
53741 function layerSupported(d) {
53742 return d.layer && d.layer.supported();
53744 function layerEnabled(d) {
53745 return layerSupported(d) && d.layer.enabled();
53748 var ul = selection$$1
53749 .selectAll('.layer-list-photos')
53754 .attr('class', 'layer-list layer-list-photos')
53757 var li = ul.selectAll('.list-item-photos')
53763 var liEnter = li.enter()
53765 .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
53767 var labelEnter = liEnter
53769 .each(function(d) {
53772 .title(t(d.id.replace('-', '_') + '.tooltip'))
53779 .attr('type', 'checkbox')
53780 .on('change', function(d) { toggleLayer(d.id); });
53784 .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
53792 .classed('active', layerEnabled)
53793 .selectAll('input')
53794 .property('checked', layerEnabled);
53798 function drawOsmItem(selection$$1) {
53799 var osm = layers.layer('osm'),
53800 showsOsm = osm.enabled();
53802 var ul = selection$$1
53803 .selectAll('.layer-list-osm')
53804 .data(osm ? [0] : []);
53811 var ulEnter = ul.enter()
53813 .attr('class', 'layer-list layer-list-osm');
53815 var liEnter = ulEnter
53817 .attr('class', 'list-item-osm');
53819 var labelEnter = liEnter
53822 .title(t('map_data.layers.osm.tooltip'))
53828 .attr('type', 'checkbox')
53829 .on('change', function() { toggleLayer('osm'); });
53833 .text(t('map_data.layers.osm.title'));
53839 ul.selectAll('.list-item-osm')
53840 .classed('active', showsOsm)
53841 .selectAll('input')
53842 .property('checked', showsOsm);
53846 function drawGpxItem(selection$$1) {
53847 var gpx = layers.layer('gpx'),
53848 hasGpx = gpx && gpx.hasGpx(),
53849 showsGpx = hasGpx && gpx.enabled();
53851 var ul = selection$$1
53852 .selectAll('.layer-list-gpx')
53853 .data(gpx ? [0] : []);
53860 var ulEnter = ul.enter()
53862 .attr('class', 'layer-list layer-list-gpx');
53864 var liEnter = ulEnter
53866 .attr('class', 'list-item-gpx');
53870 .attr('class', 'list-item-gpx-extent')
53872 .title(t('gpx.zoom'))
53873 .placement((textDirection === 'rtl') ? 'right' : 'left')
53875 .on('click', function() {
53876 event.preventDefault();
53877 event.stopPropagation();
53880 .call(svgIcon('#icon-search'));
53884 .attr('class', 'list-item-gpx-browse')
53886 .title(t('gpx.browse'))
53887 .placement((textDirection === 'rtl') ? 'right' : 'left')
53889 .on('click', function() {
53890 d3_select(document.createElement('input'))
53891 .attr('type', 'file')
53892 .on('change', function() {
53893 gpx.files(event.target.files);
53897 .call(svgIcon('#icon-geolocate'));
53899 var labelEnter = liEnter
53902 .title(t('gpx.drag_drop'))
53908 .attr('type', 'checkbox')
53909 .on('change', function() { toggleLayer('gpx'); });
53913 .text(t('gpx.local_layer'));
53919 ul.selectAll('.list-item-gpx')
53920 .classed('active', showsGpx)
53921 .selectAll('label')
53922 .classed('deemphasize', !hasGpx)
53923 .selectAll('input')
53924 .property('disabled', !hasGpx)
53925 .property('checked', showsGpx);
53929 function drawListItems(selection$$1, data, type, name, change, active) {
53930 var items = selection$$1.selectAll('li')
53938 var enter = items.enter()
53940 .attr('class', 'layer')
53943 .title(function(d) {
53944 var tip = t(name + '.' + d + '.tooltip'),
53945 key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
53947 if (name === 'feature' && autoHiddenFeature(d)) {
53948 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
53949 tip += '<div>' + msg + '</div>';
53951 return uiTooltipHtml(tip, key);
53961 .attr('type', type)
53962 .attr('name', name)
53963 .on('change', change);
53967 .text(function(d) { return t(name + '.' + d + '.description'); });
53974 .classed('active', active)
53975 .selectAll('input')
53976 .property('checked', active)
53977 .property('indeterminate', function(d) {
53978 return (name === 'feature' && autoHiddenFeature(d));
53983 function renderDataLayers(selection$$1) {
53984 var container = selection$$1.selectAll('data-layer-container')
53987 _dataLayerContainer = container.enter()
53989 .attr('class', 'data-layer-container')
53994 function renderFillList(selection$$1) {
53995 var container = selection$$1.selectAll('layer-fill-list')
53998 _fillList = container.enter()
54000 .attr('class', 'layer-list layer-fill-list')
54005 function renderFeatureList(selection$$1) {
54006 var container = selection$$1.selectAll('layer-feature-list')
54009 _featureList = container.enter()
54011 .attr('class', 'layer-list layer-feature-list')
54016 function update() {
54017 _dataLayerContainer
54019 .call(drawPhotoItems)
54020 .call(drawGpxItem);
54023 .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
54026 .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
54030 function toggleWireframe() {
54032 event.preventDefault();
54033 event.stopPropagation();
54036 if (_fillSelected === 'wireframe') {
54037 _fillSelected = context.storage('area-fill-toggle') || 'partial';
54039 _fillSelected = 'wireframe';
54042 setFill(_fillSelected);
54043 context.map().pan([0,0]); // trigger a redraw
54047 function mapData(selection$$1) {
54049 function hidePane() {
54053 function togglePane() {
54054 if (event) event.preventDefault();
54055 paneTooltip.hide(button);
54056 setVisible(!button.classed('active'));
54059 function setVisible(show) {
54060 if (show !== _shown) {
54061 button.classed('active', show);
54065 uiBackground.hidePane();
54070 .style('display', 'block')
54071 .style('right', '-300px')
54074 .style('right', '0px');
54078 .style('display', 'block')
54079 .style('right', '0px')
54082 .style('right', '-300px')
54083 .on('end', function() {
54084 d3_select(this).style('display', 'none');
54091 var pane = selection$$1
54093 .attr('class', 'fillL map-overlay col3 content hide');
54095 var paneTooltip = tooltip()
54096 .placement((textDirection === 'rtl') ? 'right' : 'left')
54098 .title(uiTooltipHtml(t('map_data.description'), key));
54100 var button = selection$$1
54102 .attr('tabindex', -1)
54103 .on('click', togglePane)
54104 .call(svgIcon('#icon-data', 'light'))
54105 .call(paneTooltip);
54110 .text(t('map_data.title'));
54116 .attr('class', 'map-data-data-layers')
54117 .call(uiDisclosure(context, 'data_layers', true)
54118 .title(t('map_data.data_layers'))
54119 .content(renderDataLayers)
54125 .attr('class', 'map-data-area-fills')
54126 .call(uiDisclosure(context, 'fill_area', false)
54127 .title(t('map_data.fill_area'))
54128 .content(renderFillList)
54134 .attr('class', 'map-data-feature-filters')
54135 .call(uiDisclosure(context, 'map_features', false)
54136 .title(t('map_data.map_features'))
54137 .content(renderFeatureList)
54143 .on('change.map_data-update', update);
54146 setFill(_fillSelected);
54148 var keybinding = d3keybinding('features')
54149 .on(key, togglePane)
54150 .on(t('area_fill.wireframe.key'), toggleWireframe)
54151 .on([t('background.key'), t('help.key')], hidePane);
54153 d3_select(document)
54156 uiMapData.hidePane = hidePane;
54157 uiMapData.togglePane = togglePane;
54158 uiMapData.setVisible = setVisible;
54164 function uiShortcuts() {
54165 var detected = utilDetect();
54167 var modalSelection;
54168 var savedSelection;
54171 var keybinding = d3keybinding('shortcuts')
54172 .on(t('shortcuts.toggle.key'), function () {
54173 if (d3_selectAll('.modal-shortcuts').size()) { // already showing
54174 if (modalSelection) {
54175 modalSelection.close();
54176 modalSelection = null;
54179 modalSelection = uiModal(savedSelection);
54180 shortcutsModal(modalSelection);
54184 d3_select(document)
54189 function shortcutsModal(modalSelection) {
54190 modalSelection.select('.modal')
54191 .classed('modal-shortcuts', true);
54193 var shortcutsModal = modalSelection.select('.content');
54197 .attr('class', 'modal-section')
54199 .text(t('shortcuts.title'));
54206 function render(selection$$1) {
54207 var wrapper = selection$$1
54208 .selectAll('.wrapper')
54211 var wrapperEnter = wrapper
54214 .attr('class', 'wrapper modal-section');
54216 var tabsBar = wrapperEnter
54218 .attr('class', 'tabs-bar');
54220 var shortcutsList = wrapperEnter
54222 .attr('class', 'shortcuts-list');
54224 wrapper = wrapper.merge(wrapperEnter);
54228 .data(dataShortcuts);
54230 var tabsEnter = tabs
54233 .attr('class', 'tab')
54234 .on('click', function (d, i) {
54236 render(selection$$1);
54241 .text(function (d) { return t(d.text); });
54247 wrapper.selectAll('.tab')
54248 .classed('active', function (d, i) {
54249 return i === activeTab;
54253 var shortcuts = shortcutsList
54254 .selectAll('.shortcut-tab')
54255 .data(dataShortcuts);
54257 var shortcutsEnter = shortcuts
54260 .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54262 var columnsEnter = shortcutsEnter
54263 .selectAll('.shortcut-column')
54264 .data(function (d) { return d.columns; })
54267 .attr('class', 'shortcut-column');
54269 var rowsEnter = columnsEnter
54270 .selectAll('.shortcut-row')
54271 .data(function (d) { return d.rows; })
54274 .attr('class', 'shortcut-row');
54277 var sectionRows = rowsEnter
54278 .filter(function (d) { return !d.shortcuts; });
54285 .attr('class', 'shortcut-section')
54287 .text(function (d) { return t(d.text); });
54290 var shortcutRows = rowsEnter
54291 .filter(function (d) { return d.shortcuts; });
54293 var shortcutKeys = shortcutRows
54295 .attr('class', 'shortcut-keys');
54297 var modifierKeys = shortcutKeys
54298 .filter(function (d) { return d.modifiers; });
54301 .selectAll('kbd.modifier')
54302 .data(function (d) {
54303 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54305 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54308 return d.modifiers;
54312 .each(function () {
54313 var selection$$1 = d3_select(this);
54317 .attr('class', 'modifier')
54318 .text(function (d) { return uiCmd.display(d); });
54327 .selectAll('kbd.shortcut')
54328 .data(function (d) {
54329 var arr = d.shortcuts;
54330 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54332 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54336 return arr.map(function(s) {
54339 separator: d.separator
54344 .each(function (d, i, nodes) {
54345 var selection$$1 = d3_select(this);
54346 var click = d.shortcut.toLowerCase().match(/(.*).click/);
54348 if (click && click[1]) {
54350 .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54354 .attr('class', 'shortcut')
54355 .text(function (d) {
54356 var key = d.shortcut;
54357 return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54361 if (i < nodes.length - 1) {
54364 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54370 .filter(function(d) { return d.gesture; })
54371 .each(function () {
54372 var selection$$1 = d3_select(this);
54380 .attr('class', 'gesture')
54381 .text(function (d) { return t(d.gesture); });
54387 .attr('class', 'shortcut-desc')
54388 .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54391 shortcuts = shortcuts
54392 .merge(shortcutsEnter);
54395 wrapper.selectAll('.shortcut-tab')
54396 .style('display', function (d, i) {
54397 return i === activeTab ? 'flex' : 'none';
54402 return function(selection$$1, show) {
54403 savedSelection = selection$$1;
54405 modalSelection = uiModal(selection$$1);
54406 shortcutsModal(modalSelection);
54411 function uiHelp(context) {
54412 var key = t('help.key');
54435 'select_left_click',
54436 'select_right_click',
54438 'multiselect_shift_click',
54439 'multiselect_lasso',
54452 ['feature_editor', [
54459 'fields_all_fields',
54461 'fields_add_field',
54470 'add_point_finish',
54475 'delete_point_command'
54484 'modify_line_dragnode',
54485 'modify_line_addnode',
54488 'connect_line_display',
54489 'connect_line_drag',
54490 'connect_line_tag',
54491 'disconnect_line_h',
54492 'disconnect_line_command',
54494 'move_line_command',
54495 'move_line_connected',
54498 'delete_line_command'
54505 'add_area_command',
54509 'square_area_command',
54511 'modify_area_dragnode',
54512 'modify_area_addnode',
54515 'delete_area_command'
54521 'edit_relation_add',
54522 'edit_relation_delete',
54523 'maintain_relation_h',
54524 'maintain_relation',
54525 'relation_types_h',
54528 'multipolygon_create',
54529 'multipolygon_merge',
54530 'turn_restriction_h',
54531 'turn_restriction',
54532 'turn_restriction_field',
54533 'turn_restriction_editing',
54568 'help.help.open_data_h': 3,
54569 'help.help.before_start_h': 3,
54570 'help.help.open_source_h': 3,
54571 'help.overview.navigation_h': 3,
54572 'help.overview.features_h': 3,
54573 'help.editing.select_h': 3,
54574 'help.editing.multiselect_h': 3,
54575 'help.editing.undo_redo_h': 3,
54576 'help.editing.save_h': 3,
54577 'help.editing.upload_h': 3,
54578 'help.editing.backups_h': 3,
54579 'help.editing.keyboard_h': 3,
54580 'help.feature_editor.type_h': 3,
54581 'help.feature_editor.fields_h': 3,
54582 'help.feature_editor.tags_h': 3,
54583 'help.points.add_point_h': 3,
54584 'help.points.move_point_h': 3,
54585 'help.points.delete_point_h': 3,
54586 'help.lines.add_line_h': 3,
54587 'help.lines.modify_line_h': 3,
54588 'help.lines.connect_line_h': 3,
54589 'help.lines.disconnect_line_h': 3,
54590 'help.lines.move_line_h': 3,
54591 'help.lines.delete_line_h': 3,
54592 'help.areas.point_or_area_h': 3,
54593 'help.areas.add_area_h': 3,
54594 'help.areas.square_area_h': 3,
54595 'help.areas.modify_area_h': 3,
54596 'help.areas.delete_area_h': 3,
54597 'help.relations.edit_relation_h': 3,
54598 'help.relations.maintain_relation_h': 3,
54599 'help.relations.relation_types_h': 2,
54600 'help.relations.multipolygon_h': 3,
54601 'help.relations.turn_restriction_h': 3,
54602 'help.relations.route_h': 3,
54603 'help.relations.boundary_h': 3,
54604 'help.imagery.sources_h': 3,
54605 'help.imagery.offsets_h': 3,
54606 'help.streetlevel.using_h': 3,
54607 'help.gps.using_h': 3,
54610 var replacements = {
54611 point: icon('#icon-point', 'pre-text'),
54612 line: icon('#icon-line', 'pre-text'),
54613 area: icon('#icon-area', 'pre-text'),
54614 plus: icon('#icon-plus', 'pre-text'),
54615 minus: icon('#icon-minus', 'pre-text'),
54616 orthogonalize: icon('#operation-orthogonalize', 'pre-text'),
54617 disconnect: icon('#operation-disconnect', 'pre-text'),
54618 layers: icon('#icon-layers', 'pre-text'),
54619 data: icon('#icon-data', 'pre-text'),
54620 inspect: icon('#icon-inspect', 'pre-text'),
54621 move: icon('#operation-move', 'pre-text'),
54622 merge: icon('#operation-merge', 'pre-text'),
54623 delete: icon('#operation-delete', 'pre-text'),
54624 close: icon('#icon-close', 'pre-text'),
54625 undo: icon(textDirection === 'rtl' ? '#icon-redo' : '#icon-undo', 'pre-text'),
54626 redo: icon(textDirection === 'rtl' ? '#icon-undo' : '#icon-redo', 'pre-text'),
54627 save: icon('#icon-save', 'pre-text'),
54628 leftclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'left'),
54629 rightclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'right'),
54630 shift: uiCmd.display('⇧'),
54631 alt: uiCmd.display('⌥'),
54632 return: uiCmd.display('↵'),
54633 version: context.version
54636 // For each section, squash all the texts into a single markdown document
54637 var docs = docKeys.map(function(key) {
54638 var helpkey = 'help.' + key[0];
54639 var text = key[1].reduce(function(all, part) {
54640 var subkey = helpkey + '.' + part;
54641 var depth = headings[subkey]; // is this subkey a heading?
54642 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
54643 return all + hhh + t(subkey, replacements) + '\n\n';
54647 title: t(helpkey + '.title'),
54648 html: marked(text.trim())
54653 function help(selection$$1) {
54655 function hidePane() {
54660 function togglePane() {
54661 if (event) event.preventDefault();
54662 tooltipBehavior.hide(button);
54663 setVisible(!button.classed('active'));
54667 function setVisible(show) {
54668 if (show !== shown) {
54669 button.classed('active', show);
54673 uiBackground.hidePane();
54674 uiMapData.hidePane();
54676 pane.style('display', 'block')
54677 .style('right', '-500px')
54680 .style('right', '0px');
54683 pane.style('right', '0px')
54686 .style('right', '-500px')
54687 .on('end', function() {
54688 d3_select(this).style('display', 'none');
54695 function clickHelp(d, i) {
54696 var rtl = (textDirection === 'rtl');
54697 pane.property('scrollTop', 0);
54698 doctitle.html(d.title);
54701 body.selectAll('a')
54702 .attr('target', '_blank');
54703 menuItems.classed('selected', function(m) {
54704 return m.title === d.title;
54709 nav.call(drawNext).call(drawPrevious);
54711 nav.call(drawPrevious).call(drawNext);
54715 function drawNext(selection$$1) {
54716 if (i < docs.length - 1) {
54717 var nextLink = selection$$1
54719 .attr('class', 'next')
54720 .on('click', function() {
54721 clickHelp(docs[i + 1], i + 1);
54726 .text(docs[i + 1].title)
54727 .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
54732 function drawPrevious(selection$$1) {
54734 var prevLink = selection$$1
54736 .attr('class', 'previous')
54737 .on('click', function() {
54738 clickHelp(docs[i - 1], i - 1);
54742 .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
54744 .text(docs[i - 1].title);
54750 function clickWalkthrough() {
54751 if (context.inIntro()) return;
54752 context.container().call(uiIntro(context));
54757 function clickShortcuts() {
54758 context.container().call(uiShortcuts(context), true);
54762 var pane = selection$$1.append('div')
54763 .attr('class', 'help-wrap map-overlay fillL col6 content hide');
54764 var tooltipBehavior = tooltip()
54765 .placement((textDirection === 'rtl') ? 'right' : 'left')
54767 .title(uiTooltipHtml(t('help.title'), key));
54768 var button = selection$$1.append('button')
54769 .attr('tabindex', -1)
54770 .on('click', togglePane)
54771 .call(svgIcon('#icon-help', 'light'))
54772 .call(tooltipBehavior);
54778 .attr('class', 'toc');
54780 var menuItems = toc.selectAll('li')
54785 .html(function(d) { return d.title; })
54786 .on('click', clickHelp);
54788 var shortcuts = toc
54790 .attr('class', 'shortcuts')
54793 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
54797 .on('click', clickShortcuts);
54801 .text(t('shortcuts.title'));
54803 var walkthrough = toc
54805 .attr('class', 'walkthrough')
54807 .on('click', clickWalkthrough);
54811 .attr('class', 'logo logo-walkthrough')
54813 .attr('xlink:href', '#logo-walkthrough');
54817 .text(t('splash.walkthrough'));
54822 .attr('class', 'left-content');
54824 var doctitle = content
54826 .text(t('help.title'));
54830 .attr('class', 'body');
54834 .attr('class', 'nav');
54836 clickHelp(docs[0], 0);
54838 var keybinding = d3keybinding('help')
54839 .on(key, togglePane)
54840 .on([t('background.key'), t('map_data.key')], hidePane);
54842 d3_select(document)
54845 uiHelp.hidePane = hidePane;
54846 uiHelp.togglePane = togglePane;
54847 uiHelp.setVisible = setVisible;
54853 function localeDateString(s) {
54854 if (!s) return null;
54855 var detected = utilDetect();
54856 var options = { day: 'numeric', month: 'short', year: 'numeric' };
54857 var d = new Date(s);
54858 if (isNaN(d.getTime())) return null;
54859 return d.toLocaleDateString(detected.locale, options);
54862 function vintageRange(vintage) {
54864 if (vintage.start || vintage.end) {
54865 s = (vintage.start || '?');
54866 if (vintage.start !== vintage.end) {
54867 s += ' - ' + (vintage.end || '?');
54874 function rendererBackgroundSource(data) {
54875 var source = clone(data);
54876 var offset = [0, 0];
54877 var name = source.name;
54878 var description = source.description;
54879 var best = !!source.best;
54880 var template = source.template;
54882 source.scaleExtent = data.scaleExtent || [0, 22];
54883 source.overzoom = data.overzoom !== false;
54886 source.offset = function(_) {
54887 if (!arguments.length) return offset;
54893 source.nudge = function(_, zoomlevel) {
54894 offset[0] += _[0] / Math.pow(2, zoomlevel);
54895 offset[1] += _[1] / Math.pow(2, zoomlevel);
54900 source.name = function() {
54901 var id_safe = source.id.replace('.', '<TX_DOT>');
54902 return t('imagery.' + id_safe + '.name', { default: name });
54906 source.description = function() {
54907 var id_safe = source.id.replace('.', '<TX_DOT>');
54908 return t('imagery.' + id_safe + '.description', { default: description });
54912 source.best = function() {
54917 source.area = function() {
54918 if (!data.polygon) return Number.MAX_VALUE; // worldwide
54919 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
54920 return isNaN(area) ? 0 : area;
54924 source.imageryUsed = function() {
54925 return name || source.id;
54929 source.template = function(_) {
54930 if (!arguments.length) return template;
54931 if (source.id === 'custom') template = _;
54936 source.url = function(coord) {
54937 if (this.type === 'wms') {
54938 var tileToProjectedCoords = (function(x, y, z) {
54939 //polyfill for IE11, PhantomJS
54940 var sinh = Math.sinh || function(x) {
54941 var y = Math.exp(x);
54942 return (y - 1 / y) / 2;
54945 var zoomSize = Math.pow(2, z);
54946 var lon = x / zoomSize * Math.PI * 2 - Math.PI;
54947 var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
54949 switch (this.projection) {
54950 case 'EPSG:4326': // todo: alternative codes of WGS 84?
54952 x: lon * 180 / Math.PI,
54953 y: lat * 180 / Math.PI
54955 default: // EPSG:3857 and synonyms
54956 var mercCoords = mercatorRaw(lon, lat);
54958 x: 20037508.34 / Math.PI * mercCoords[0],
54959 y: 20037508.34 / Math.PI * mercCoords[1]
54963 var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
54964 var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
54966 .replace('{width}', 256)
54967 .replace('{height}', 256)
54968 .replace('{proj}', this.projection)
54969 .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
54972 .replace('{x}', coord[0])
54973 .replace('{y}', coord[1])
54974 // TMS-flipped y coordinate
54975 .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
54976 .replace(/\{z(oom)?\}/, coord[2])
54977 .replace(/\{switch:([^}]+)\}/, function(s, r) {
54978 var subdomains = r.split(',');
54979 return subdomains[(coord[0] + coord[1]) % subdomains.length];
54981 .replace('{u}', function() {
54983 for (var zoom = coord[2]; zoom > 0; zoom--) {
54985 var mask = 1 << (zoom - 1);
54986 if ((coord[0] & mask) !== 0) b++;
54987 if ((coord[1] & mask) !== 0) b += 2;
54995 source.intersects = function(extent) {
54996 extent = extent.polygon();
54997 return !data.polygon || data.polygon.some(function(polygon) {
54998 return geoPolygonIntersectsPolygon(polygon, extent, true);
55003 source.validZoom = function(z) {
55004 return source.scaleExtent[0] <= z &&
55005 (source.overzoom || source.scaleExtent[1] > z);
55009 source.isLocatorOverlay = function() {
55010 return source.id === 'mapbox_locator_overlay';
55014 /* hides a source from the list, but leaves it available for use */
55015 source.isHidden = function() {
55016 return source.id === 'DigitalGlobe-Premium-vintage' ||
55017 source.id === 'DigitalGlobe-Standard-vintage';
55021 source.copyrightNotices = function() {};
55024 source.getMetadata = function(center, tileCoord, callback) {
55026 start: localeDateString(source.startDate),
55027 end: localeDateString(source.endDate)
55029 vintage.range = vintageRange(vintage);
55031 var metadata = { vintage: vintage };
55032 callback(null, metadata);
55040 rendererBackgroundSource.Bing = function(data, dispatch) {
55041 // http://msdn.microsoft.com/en-us/library/ff701716.aspx
55042 // http://msdn.microsoft.com/en-us/library/ff701701.aspx
55044 data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
55046 var bing = rendererBackgroundSource(data),
55047 key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
55048 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
55049 key + '&jsonp={callback}',
55054 jsonpRequest(url, function(json) {
55055 providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
55057 attribution: provider.attribution,
55058 areas: provider.coverageAreas.map(function(area) {
55060 zoom: [area.zoomMin, area.zoomMax],
55061 extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
55066 dispatch.call('change');
55070 bing.copyrightNotices = function(zoom, extent) {
55071 zoom = Math.min(zoom, 21);
55072 return providers.filter(function(provider) {
55073 return some(provider.areas, function(area) {
55074 return extent.intersects(area.extent) &&
55075 area.zoom[0] <= zoom &&
55076 area.zoom[1] >= zoom;
55078 }).map(function(provider) {
55079 return provider.attribution;
55084 bing.getMetadata = function(center, tileCoord, callback) {
55085 var tileId = tileCoord.slice(0, 3).join('/'),
55086 zoom = Math.min(tileCoord[2], 21),
55087 centerPoint = center[1] + ',' + center[0], // lat,lng
55088 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
55089 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
55091 if (inflight[tileId]) return;
55093 if (!cache[tileId]) {
55094 cache[tileId] = {};
55096 if (cache[tileId] && cache[tileId].metadata) {
55097 return callback(null, cache[tileId].metadata);
55100 inflight[tileId] = true;
55101 jsonpRequest(url, function(result) {
55102 delete inflight[tileId];
55104 var err = (!result && 'Unknown Error') || result.errorDetails;
55106 return callback(err);
55109 start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
55110 end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
55112 vintage.range = vintageRange(vintage);
55114 var metadata = { vintage: vintage };
55115 cache[tileId].metadata = metadata;
55116 return callback(null, metadata);
55122 bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
55130 rendererBackgroundSource.Esri = function(data) {
55132 // don't request blank tiles, instead overzoom real tiles - #4327
55133 // deprecated technique, but it works (for now)
55134 if (data.template.match(/blankTile/) === null) {
55135 data.template = data.template + '?blankTile=false';
55138 var esri = rendererBackgroundSource(data),
55142 esri.getMetadata = function(center, tileCoord, callback) {
55143 var tileId = tileCoord.slice(0, 3).join('/'),
55144 zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
55145 centerPoint = center[0] + ',' + center[1], // long, lat (as it should be)
55146 unknown = t('info_panels.background.unknown'),
55151 if (inflight[tileId]) return;
55154 case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
55167 metadataLayer = 99;
55171 // build up query using the layer appropriate to the current zoom
55172 if (esri.id === 'EsriWorldImagery') {
55173 url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
55174 } else if (esri.id === 'EsriWorldImageryClarity') {
55175 url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
55178 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
55180 if (!cache[tileId]) {
55181 cache[tileId] = {};
55183 if (cache[tileId] && cache[tileId].metadata) {
55184 return callback(null, cache[tileId].metadata);
55187 // accurate metadata is only available >= 13
55188 if (metadataLayer === 99) {
55197 description: unknown,
55198 resolution: unknown,
55202 callback(null, metadata);
55205 inflight[tileId] = true;
55206 jsonpRequest(url, function(result) {
55207 delete inflight[tileId];
55211 err = 'Unknown Error';
55212 } else if (result.features && result.features.length < 1) {
55213 err = 'No Results';
55214 } else if (result.error && result.error.message) {
55215 err = result.error.message;
55219 return callback(err);
55221 // pass through the discrete capture date from metadata
55222 var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
55224 start: captureDate,
55230 source: clean(result.features[0].attributes.NICE_NAME),
55231 description: clean(result.features[0].attributes.NICE_DESC),
55232 resolution: clean(result.features[0].attributes.SRC_RES),
55233 accuracy: clean(result.features[0].attributes.SRC_ACC)
55236 // append units - meters
55237 if (isFinite(metadata.resolution)) {
55238 metadata.resolution += ' m';
55240 if (isFinite(metadata.accuracy)) {
55241 metadata.accuracy += ' m';
55244 cache[tileId].metadata = metadata;
55245 return callback(null, metadata);
55251 function clean(val) {
55252 return String(val).trim() || unknown;
55260 rendererBackgroundSource.None = function() {
55261 var source = rendererBackgroundSource({ id: 'none', template: '' });
55264 source.name = function() {
55265 return t('background.none');
55269 source.imageryUsed = function() {
55274 source.area = function() {
55275 return -1; // sources in background pane are sorted by area
55283 rendererBackgroundSource.Custom = function(template) {
55284 var source = rendererBackgroundSource({ id: 'custom', template: template });
55287 source.name = function() {
55288 return t('background.custom');
55292 source.imageryUsed = function() {
55293 return 'Custom (' + source.template() + ')';
55297 source.area = function() {
55298 return -2; // sources in background pane are sorted by area
55305 function rendererTileLayer(context) {
55306 var tileSize = 256;
55307 var transformProp = utilPrefixCSSProperty('Transform');
55308 var geotile = d3geoTile();
55317 // blacklist overlay tiles around Null Island..
55318 function nearNullIsland(x, y, z) {
55320 var center = Math.pow(2, z - 1);
55321 var width = Math.pow(2, z - 6);
55322 var min = center - (width / 2);
55323 var max = center + (width / 2) - 1;
55324 return x >= min && x <= max && y >= min && y <= max;
55330 function tileSizeAtZoom(d, z) {
55331 var EPSILON = 0.002;
55332 return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
55336 function atZoom(t$$1, distance) {
55337 var power = Math.pow(2, distance);
55339 Math.floor(t$$1[0] * power),
55340 Math.floor(t$$1[1] * power),
55346 function lookUp(d) {
55347 for (var up = -1; up > -d[2]; up--) {
55348 var tile = atZoom(d, up);
55349 if (_cache[_source.url(tile)] !== false) {
55356 function uniqueBy(a, n) {
55359 for (var i = 0; i < a.length; i++) {
55360 if (seen[a[i][n]] === undefined) {
55362 seen[a[i][n]] = true;
55369 function addSource(d) {
55370 d.push(_source.url(d));
55375 // Update tiles based on current state of `projection`.
55376 function background(selection$$1) {
55377 _zoom = geoScaleToZoom(_projection.scale(), tileSize);
55382 _source.offset()[0] * Math.pow(2, _zoom),
55383 _source.offset()[1] * Math.pow(2, _zoom)
55386 pixelOffset = [0, 0];
55390 _projection.translate()[0] + pixelOffset[0],
55391 _projection.translate()[1] + pixelOffset[1]
55395 .scale(_projection.scale() * 2 * Math.PI)
55396 .translate(translate);
55399 _projection.scale() * Math.PI - translate[0],
55400 _projection.scale() * Math.PI - translate[1]
55403 render(selection$$1);
55407 // Derive the tiles onscreen, remove those offscreen and position them.
55408 // Important that this part not depend on `_projection` because it's
55409 // rentered when tiles load/error (see #644).
55410 function render(selection$$1) {
55411 if (!_source) return;
55413 var showDebug = context.getDebug('tile') && !_source.overlay;
55415 if (_source.validZoom(_zoom)) {
55416 geotile().forEach(function(d) {
55418 if (d[3] === '') return;
55419 if (typeof d[3] !== 'string') return; // Workaround for #2295
55421 if (_cache[d[3]] === false && lookUp(d)) {
55422 requests.push(addSource(lookUp(d)));
55426 requests = uniqueBy(requests, 3).filter(function(r) {
55427 if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
55430 // don't re-request tiles which have failed in the past
55431 return _cache[r[3]] !== false;
55437 _cache[d[3]] = true;
55441 .classed('tile-loaded', true);
55442 render(selection$$1);
55445 function error(d) {
55446 _cache[d[3]] = false;
55451 render(selection$$1);
55454 function imageTransform(d) {
55455 var ts = tileSize * Math.pow(2, _zoom - d[2]);
55456 var scale = tileSizeAtZoom(d, _zoom);
55457 return 'translate(' +
55458 ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
55459 ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
55460 'scale(' + scale + ',' + scale + ')';
55463 function tileCenter(d) {
55464 var ts = tileSize * Math.pow(2, _zoom - d[2]);
55466 ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
55467 ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
55471 function debugTransform(d) {
55472 var coord = tileCenter(d);
55473 return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
55477 // Pick a representative tile near the center of the viewport
55478 // (This is useful for sampling the imagery vintage)
55479 var dims = geotile.size();
55480 var mapCenter = [dims[0] / 2, dims[1] / 2];
55481 var minDist = Math.max(dims[0], dims[1]);
55484 requests.forEach(function(d) {
55485 var c = tileCenter(d);
55486 var dist = geoVecLength(c, mapCenter);
55487 if (dist < minDist) {
55494 var image = selection$$1.selectAll('img')
55495 .data(requests, function(d) { return d[3]; });
55498 .style(transformProp, imageTransform)
55499 .classed('tile-removing', true)
55500 .classed('tile-center', false)
55502 var tile = d3_select(this);
55503 window.setTimeout(function() {
55504 if (tile.classed('tile-removing')) {
55512 .attr('class', 'tile')
55513 .attr('src', function(d) { return d[3]; })
55514 .on('error', error)
55517 .style(transformProp, imageTransform)
55518 .classed('tile-debug', showDebug)
55519 .classed('tile-removing', false)
55520 .classed('tile-center', function(d) { return d === nearCenter; });
55524 var debug = selection$$1.selectAll('.tile-label-debug')
55525 .data(showDebug ? requests : [], function(d) { return d[3]; });
55531 var debugEnter = debug.enter()
55533 .attr('class', 'tile-label-debug');
55537 .attr('class', 'tile-label-debug-coord');
55541 .attr('class', 'tile-label-debug-vintage');
55543 debug = debug.merge(debugEnter);
55546 .style(transformProp, debugTransform);
55549 .selectAll('.tile-label-debug-coord')
55550 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
55553 .selectAll('.tile-label-debug-vintage')
55554 .each(function(d) {
55555 var span = d3_select(this);
55556 var center = context.projection.invert(tileCenter(d));
55557 _source.getMetadata(center, d, function(err, result) {
55558 span.text((result && result.vintage && result.vintage.range) ||
55559 t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
55568 background.projection = function(_) {
55569 if (!arguments.length) return _projection;
55575 background.dimensions = function(_) {
55576 if (!arguments.length) return geotile.size();
55582 background.source = function(_) {
55583 if (!arguments.length) return _source;
55586 geotile.scaleExtent(_source.scaleExtent);
55594 function rendererBackground(context) {
55595 var dispatch$$1 = dispatch('change');
55596 var detected = utilDetect();
55597 var baseLayer = rendererTileLayer(context).projection(context.projection);
55598 var _overlayLayers = [];
55599 var _backgroundSources = [];
55600 var _brightness = 1;
55602 var _saturation = 1;
55603 var _sharpness = 1;
55606 function background(selection$$1) {
55608 var baseFilter = '';
55609 if (detected.cssfilters) {
55610 if (_brightness !== 1) {
55611 baseFilter += 'brightness(' + _brightness + ')';
55613 if (_contrast !== 1) {
55614 baseFilter += 'contrast(' + _contrast + ')';
55616 if (_saturation !== 1) {
55617 baseFilter += 'saturate(' + _saturation + ')';
55619 if (_sharpness < 1) { // gaussian blur
55620 var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
55621 baseFilter += 'blur(' + blur + 'px)';
55625 var base = selection$$1.selectAll('.layer-background')
55628 base = base.enter()
55629 .insert('div', '.layer-data')
55630 .attr('class', 'layer layer-background')
55633 if (detected.cssfilters) {
55634 base.style('filter', baseFilter || null);
55636 base.style('opacity', _brightness);
55640 var imagery = base.selectAll('.layer-imagery')
55645 .attr('class', 'layer layer-imagery')
55650 var maskFilter = '';
55651 var mixBlendMode = '';
55652 if (detected.cssfilters && _sharpness > 1) { // apply unsharp mask
55653 mixBlendMode = 'overlay';
55654 maskFilter = 'saturate(0) blur(3px) invert(1)';
55656 var contrast = _sharpness - 1;
55657 maskFilter += ' contrast(' + contrast + ')';
55659 var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
55660 maskFilter += ' brightness(' + brightness + ')';
55663 var mask = base.selectAll('.layer-unsharp-mask')
55664 .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
55671 .attr('class', 'layer layer-mask layer-unsharp-mask')
55674 .style('filter', maskFilter || null)
55675 .style('mix-blend-mode', mixBlendMode || null);
55678 var overlays = selection$$1.selectAll('.layer-overlay')
55679 .data(_overlayLayers, function(d) { return d.source().name(); });
55685 .insert('div', '.layer-data')
55686 .attr('class', 'layer layer-overlay')
55688 .each(function(layer) { d3_select(this).call(layer); });
55692 background.updateImagery = function() {
55693 if (context.inIntro()) return;
55695 var b = background.baseLayerSource(),
55697 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55698 .map(function (d) { return d.source().id; })
55700 meters = geoOffsetToMeters(b.offset()),
55702 x = +meters[0].toFixed(2),
55703 y = +meters[1].toFixed(2),
55704 q = utilStringQs(window.location.hash.substring(1));
55707 if (id === 'custom') {
55708 id = 'custom:' + b.template();
55714 delete q.background;
55723 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
55724 q.offset = x + ',' + y;
55729 if (!window.mocha) {
55730 window.location.replace('#' + utilQsString(q, true));
55733 var imageryUsed = [b.imageryUsed()];
55736 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
55737 .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
55739 var gpx = context.layers().layer('gpx');
55740 if (gpx && gpx.enabled() && gpx.hasGpx()) {
55741 // Include a string like '.gpx data file' or '.geojson data file'
55742 var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
55743 var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
55744 imageryUsed.push(extension + 'data file');
55747 var mapillary_images = context.layers().layer('mapillary-images');
55748 if (mapillary_images && mapillary_images.enabled()) {
55749 imageryUsed.push('Mapillary Images');
55752 var mapillary_signs = context.layers().layer('mapillary-signs');
55753 if (mapillary_signs && mapillary_signs.enabled()) {
55754 imageryUsed.push('Mapillary Signs');
55757 var openstreetcam_images = context.layers().layer('openstreetcam-images');
55758 if (openstreetcam_images && openstreetcam_images.enabled()) {
55759 imageryUsed.push('OpenStreetCam Images');
55762 context.history().imageryUsed(imageryUsed);
55766 background.sources = function(extent) {
55767 return _backgroundSources.filter(function(source) {
55768 return source.intersects(extent);
55773 background.dimensions = function(_) {
55775 baseLayer.dimensions(_);
55777 _overlayLayers.forEach(function(layer) {
55778 layer.dimensions(_);
55783 background.baseLayerSource = function(d) {
55784 if (!arguments.length) return baseLayer.source();
55786 // test source against OSM imagery blacklists..
55787 var osm = context.connection();
55788 if (!osm) return background;
55790 var blacklists = context.connection().imageryBlacklists();
55792 var template = d.template(),
55797 for (i = 0; i < blacklists.length; i++) {
55799 regex = new RegExp(blacklists[i]);
55800 fail = regex.test(template);
55808 // ensure at least one test was run.
55810 regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
55811 fail = regex.test(template);
55814 baseLayer.source(!fail ? d : background.findSource('none'));
55815 dispatch$$1.call('change');
55816 background.updateImagery();
55821 background.findSource = function(id) {
55822 return find$1(_backgroundSources, function(d) {
55823 return d.id && d.id === id;
55828 background.bing = function() {
55829 background.baseLayerSource(background.findSource('Bing'));
55833 background.showsLayer = function(d) {
55834 return d.id === baseLayer.source().id ||
55835 _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
55839 background.overlayLayerSources = function() {
55840 return _overlayLayers.map(function (l) { return l.source(); });
55844 background.toggleOverlayLayer = function(d) {
55847 for (var i = 0; i < _overlayLayers.length; i++) {
55848 layer = _overlayLayers[i];
55849 if (layer.source() === d) {
55850 _overlayLayers.splice(i, 1);
55851 dispatch$$1.call('change');
55852 background.updateImagery();
55857 layer = rendererTileLayer(context)
55859 .projection(context.projection)
55860 .dimensions(baseLayer.dimensions()
55863 _overlayLayers.push(layer);
55864 dispatch$$1.call('change');
55865 background.updateImagery();
55869 background.nudge = function(d, zoom) {
55870 baseLayer.source().nudge(d, zoom);
55871 dispatch$$1.call('change');
55872 background.updateImagery();
55877 background.offset = function(d) {
55878 if (!arguments.length) return baseLayer.source().offset();
55879 baseLayer.source().offset(d);
55880 dispatch$$1.call('change');
55881 background.updateImagery();
55886 background.brightness = function(d) {
55887 if (!arguments.length) return _brightness;
55889 if (context.mode()) dispatch$$1.call('change');
55894 background.contrast = function(d) {
55895 if (!arguments.length) return _contrast;
55897 if (context.mode()) dispatch$$1.call('change');
55902 background.saturation = function(d) {
55903 if (!arguments.length) return _saturation;
55905 if (context.mode()) dispatch$$1.call('change');
55910 background.sharpness = function(d) {
55911 if (!arguments.length) return _sharpness;
55913 if (context.mode()) dispatch$$1.call('change');
55918 background.init = function() {
55919 function parseMap(qmap) {
55920 if (!qmap) return false;
55921 var args = qmap.split('/').map(Number);
55922 if (args.length < 3 || args.some(isNaN)) return false;
55923 return geoExtent$$1([args[2], args[1]]);
55926 var dataImagery = data.imagery || [],
55927 q = utilStringQs(window.location.hash.substring(1)),
55928 requested = q.background || q.layer,
55929 extent = parseMap(q.map),
55933 // Add all the available imagery sources
55934 _backgroundSources = dataImagery.map(function(source) {
55935 if (source.type === 'bing') {
55936 return rendererBackgroundSource.Bing(source, dispatch$$1);
55937 } else if (/^EsriWorldImagery/.test(source.id)) {
55938 return rendererBackgroundSource.Esri(source);
55940 return rendererBackgroundSource(source);
55944 first = _backgroundSources.length && _backgroundSources[0];
55947 _backgroundSources.unshift(rendererBackgroundSource.None());
55950 var template = context.storage('background-custom-template') || '';
55951 var custom = rendererBackgroundSource.Custom(template);
55952 _backgroundSources.unshift(custom);
55955 // Decide which background layer to display
55956 if (!requested && extent) {
55957 best = find$1(this.sources(extent), function(s) { return s.best(); });
55959 if (requested && requested.indexOf('custom:') === 0) {
55960 template = requested.replace(/^custom:/, '');
55961 background.baseLayerSource(custom.template(template));
55962 context.storage('background-custom-template', template);
55964 background.baseLayerSource(
55965 background.findSource(requested) ||
55967 background.findSource(context.storage('background-last-used')) ||
55968 background.findSource('Bing') ||
55970 background.findSource('none')
55974 var locator = find$1(_backgroundSources, function(d) {
55975 return d.overlay && d.default;
55979 background.toggleOverlayLayer(locator);
55982 var overlays = (q.overlays || '').split(',');
55983 overlays.forEach(function(overlay) {
55984 overlay = background.findSource(overlay);
55986 background.toggleOverlayLayer(overlay);
55991 var gpx = context.layers().layer('gpx');
55998 var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
55999 return !isNaN(n) && n;
56002 if (offset.length === 2) {
56003 background.offset(geoMetersToOffset(offset));
56009 return utilRebind(background, dispatch$$1, 'on');
56012 function rendererFeatures(context) {
56013 var traffic_roads = {
56015 'motorway_link': true,
56017 'trunk_link': true,
56019 'primary_link': true,
56021 'secondary_link': true,
56023 'tertiary_link': true,
56024 'residential': true,
56025 'unclassified': true,
56026 'living_street': true
56029 var service_roads = {
56041 'pedestrian': true,
56045 var past_futures = {
56047 'construction': true,
56049 'dismantled': true,
56052 'demolished': true,
56053 'obliterated': true
56056 var dispatch$$1 = dispatch('change', 'redraw'),
56065 function update() {
56066 if (!window.mocha) {
56067 var q = utilStringQs(window.location.hash.substring(1));
56068 var disabled = features.disabled();
56069 if (disabled.length) {
56070 q.disable_features = disabled.join(',');
56072 delete q.disable_features;
56074 window.location.replace('#' + utilQsString(q, true));
56075 context.storage('disabled-features', disabled.join(','));
56077 _hidden = features.hidden();
56078 dispatch$$1.call('change');
56079 dispatch$$1.call('redraw');
56083 function defineFeature(k, filter, max) {
56084 var isEnabled = true;
56089 enabled: isEnabled, // whether the user wants it enabled..
56091 currentMax: (max || Infinity),
56092 defaultMax: (max || Infinity),
56093 enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
56094 disable: function() { this.enabled = false; this.currentMax = 0; },
56095 hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
56096 autoHidden: function() { return this.hidden() && this.currentMax > 0; }
56101 defineFeature('points', function isPoint(entity, resolver, geometry) {
56102 return geometry === 'point';
56105 defineFeature('traffic_roads', function isTrafficRoad(entity) {
56106 return traffic_roads[entity.tags.highway];
56109 defineFeature('service_roads', function isServiceRoad(entity) {
56110 return service_roads[entity.tags.highway];
56113 defineFeature('paths', function isPath(entity) {
56114 return paths[entity.tags.highway];
56117 defineFeature('buildings', function isBuilding(entity) {
56119 !!entity.tags['building:part'] ||
56120 (!!entity.tags.building && entity.tags.building !== 'no') ||
56121 entity.tags.amenity === 'shelter' ||
56122 entity.tags.parking === 'multi-storey' ||
56123 entity.tags.parking === 'sheds' ||
56124 entity.tags.parking === 'carports' ||
56125 entity.tags.parking === 'garage_boxes'
56129 defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
56130 return geometry === 'area' &&
56131 !_features.buildings.filter(entity) &&
56132 !_features.water.filter(entity);
56135 defineFeature('boundaries', function isBoundary(entity) {
56136 return !!entity.tags.boundary;
56139 defineFeature('water', function isWater(entity) {
56141 !!entity.tags.waterway ||
56142 entity.tags.natural === 'water' ||
56143 entity.tags.natural === 'coastline' ||
56144 entity.tags.natural === 'bay' ||
56145 entity.tags.landuse === 'pond' ||
56146 entity.tags.landuse === 'basin' ||
56147 entity.tags.landuse === 'reservoir' ||
56148 entity.tags.landuse === 'salt_pond'
56152 defineFeature('rail', function isRail(entity) {
56154 !!entity.tags.railway ||
56155 entity.tags.landuse === 'railway'
56157 traffic_roads[entity.tags.highway] ||
56158 service_roads[entity.tags.highway] ||
56159 paths[entity.tags.highway]
56163 defineFeature('power', function isPower(entity) {
56164 return !!entity.tags.power;
56167 // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
56168 defineFeature('past_future', function isPastFuture(entity) {
56170 traffic_roads[entity.tags.highway] ||
56171 service_roads[entity.tags.highway] ||
56172 paths[entity.tags.highway]
56173 ) { return false; }
56175 var strings = Object.keys(entity.tags);
56177 for (var i = 0; i < strings.length; i++) {
56178 var s = strings[i];
56179 if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
56184 // Lines or areas that don't match another feature filter.
56185 // IMPORTANT: The 'others' feature must be the last one defined,
56186 // so that code in getMatches can skip this test if `hasMatch = true`
56187 defineFeature('others', function isOther(entity, resolver, geometry) {
56188 return (geometry === 'line' || geometry === 'area');
56192 function features() {}
56195 features.features = function() {
56200 features.keys = function() {
56205 features.enabled = function(k) {
56206 if (!arguments.length) {
56207 return _keys.filter(function(k) { return _features[k].enabled; });
56209 return _features[k] && _features[k].enabled;
56213 features.disabled = function(k) {
56214 if (!arguments.length) {
56215 return _keys.filter(function(k) { return !_features[k].enabled; });
56217 return _features[k] && !_features[k].enabled;
56221 features.hidden = function(k) {
56222 if (!arguments.length) {
56223 return _keys.filter(function(k) { return _features[k].hidden(); });
56225 return _features[k] && _features[k].hidden();
56229 features.autoHidden = function(k) {
56230 if (!arguments.length) {
56231 return _keys.filter(function(k) { return _features[k].autoHidden(); });
56233 return _features[k] && _features[k].autoHidden();
56237 features.enable = function(k) {
56238 if (_features[k] && !_features[k].enabled) {
56239 _features[k].enable();
56245 features.disable = function(k) {
56246 if (_features[k] && _features[k].enabled) {
56247 _features[k].disable();
56253 features.toggle = function(k) {
56254 if (_features[k]) {
56255 (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
56261 features.resetStats = function() {
56262 for (var i = 0; i < _keys.length; i++) {
56263 _features[_keys[i]].count = 0;
56265 dispatch$$1.call('change');
56269 features.gatherStats = function(d, resolver, dimensions) {
56270 var needsRedraw = false,
56271 type = groupBy(d, function(ent) { return ent.type; }),
56272 entities = [].concat(type.relation || [], type.way || [], type.node || []),
56273 currHidden, geometry, matches, i, j;
56275 for (i = 0; i < _keys.length; i++) {
56276 _features[_keys[i]].count = 0;
56279 // adjust the threshold for point/building culling based on viewport size..
56280 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
56281 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
56283 for (i = 0; i < entities.length; i++) {
56284 geometry = entities[i].geometry(resolver);
56285 if (!(geometry === 'vertex' || geometry === 'relation')) {
56286 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
56287 for (j = 0; j < matches.length; j++) {
56288 _features[matches[j]].count++;
56293 currHidden = features.hidden();
56294 if (currHidden !== _hidden) {
56295 _hidden = currHidden;
56296 needsRedraw = true;
56297 dispatch$$1.call('change');
56300 return needsRedraw;
56304 features.stats = function() {
56305 for (var i = 0; i < _keys.length; i++) {
56306 _stats[_keys[i]] = _features[_keys[i]].count;
56313 features.clear = function(d) {
56314 for (var i = 0; i < d.length; i++) {
56315 features.clearEntity(d[i]);
56320 features.clearEntity = function(entity) {
56321 delete _cache[osmEntity$$1.key(entity)];
56325 features.reset = function() {
56330 features.getMatches = function(entity, resolver, geometry) {
56331 if (geometry === 'vertex' || geometry === 'relation') return {};
56333 var ent = osmEntity$$1.key(entity);
56334 if (!_cache[ent]) {
56338 if (!_cache[ent].matches) {
56342 for (var i = 0; i < _keys.length; i++) {
56343 if (_keys[i] === 'others') {
56344 if (hasMatch) continue;
56346 // Multipolygon members:
56348 // 1. is a way that hasn't matched other 'interesting' feature rules,
56349 // 2. and it belongs to a single parent multipolygon relation
56350 // ...then match whatever feature rules the parent multipolygon has matched.
56351 // see #2548, #2887
56354 // For this to work, getMatches must be called on relations before ways.
56356 if (entity.type === 'way') {
56357 var parents = features.getParents(entity, resolver, geometry);
56358 if (parents.length === 1 && parents[0].isMultipolygon()) {
56359 var pkey = osmEntity$$1.key(parents[0]);
56360 if (_cache[pkey] && _cache[pkey].matches) {
56361 matches = clone(_cache[pkey].matches);
56368 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
56369 matches[_keys[i]] = hasMatch = true;
56372 _cache[ent].matches = matches;
56375 return _cache[ent].matches;
56379 features.getParents = function(entity, resolver, geometry) {
56380 if (geometry === 'point') return [];
56382 var ent = osmEntity$$1.key(entity);
56383 if (!_cache[ent]) {
56387 if (!_cache[ent].parents) {
56389 if (geometry === 'vertex') {
56390 parents = resolver.parentWays(entity);
56391 } else { // 'line', 'area', 'relation'
56392 parents = resolver.parentRelations(entity);
56394 _cache[ent].parents = parents;
56396 return _cache[ent].parents;
56400 features.isHiddenFeature = function(entity, resolver, geometry) {
56401 if (!_hidden.length) return false;
56402 if (!entity.version) return false;
56404 var matches = features.getMatches(entity, resolver, geometry);
56406 for (var i = 0; i < _hidden.length; i++) {
56407 if (matches[_hidden[i]]) return true;
56413 features.isHiddenChild = function(entity, resolver, geometry) {
56414 if (!_hidden.length) return false;
56415 if (!entity.version || geometry === 'point') return false;
56417 var parents = features.getParents(entity, resolver, geometry);
56418 if (!parents.length) return false;
56420 for (var i = 0; i < parents.length; i++) {
56421 if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
56429 features.hasHiddenConnections = function(entity, resolver) {
56430 if (!_hidden.length) return false;
56431 var childNodes, connections;
56433 if (entity.type === 'midpoint') {
56434 childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
56437 childNodes = entity.nodes ? resolver.childNodes(entity) : [];
56438 connections = features.getParents(entity, resolver, entity.geometry(resolver));
56441 // gather ways connected to child nodes..
56442 connections = reduce(childNodes, function(result, e) {
56443 return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
56446 return connections.length ? some(connections, function(e) {
56447 return features.isHidden(e, resolver, e.geometry(resolver));
56452 features.isHidden = function(entity, resolver, geometry) {
56453 if (!_hidden.length) return false;
56454 if (!entity.version) return false;
56456 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
56457 return fn(entity, resolver, geometry);
56461 features.filter = function(d, resolver) {
56462 if (!_hidden.length) return d;
56465 for (var i = 0; i < d.length; i++) {
56467 if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
56468 result.push(entity);
56475 features.init = function() {
56476 var storage = context.storage('disabled-features');
56478 var storageDisabled = storage.replace(/;/g, ',').split(',');
56479 storageDisabled.forEach(features.disable);
56482 var q = utilStringQs(window.location.hash.substring(1));
56483 if (q.disable_features) {
56484 var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
56485 hashDisabled.forEach(features.disable);
56489 return utilRebind(features, dispatch$$1, 'on');
56492 function utilBindOnce(target, type, listener, capture) {
56493 var typeOnce = type + '.once';
56495 target.on(typeOnce, null);
56496 listener.apply(this, arguments);
56498 target.on(typeOnce, one, capture);
56502 function rendererMap(context) {
56504 var dimensions = [1, 1],
56505 dispatch$$1 = dispatch('move', 'drawn'),
56506 projection = context.projection,
56507 curtainProjection = context.curtainProjection,
56508 dblclickEnabled = true,
56509 redrawEnabled = true,
56510 transformStart = projection.transform(),
56512 transformed = false,
56514 drawLayers = svgLayers(projection, context),
56515 drawPoints = svgPoints$$1(projection, context),
56516 drawVertices = svgVertices$$1(projection, context),
56517 drawLines = svgLines$$1(projection, context),
56518 drawAreas = svgAreas$$1(projection, context),
56519 drawMidpoints = svgMidpoints$$1(projection, context),
56520 drawLabels = svgLabels(projection, context),
56521 supersurface = d3_select(null),
56522 wrapper = d3_select(null),
56523 surface = d3_select(null),
56527 var zoom$$1 = d3_zoom()
56528 .scaleExtent([ztok(2), ztok(24)])
56529 .interpolate(d3_interpolate)
56530 .filter(zoomEventFilter)
56531 .on('zoom', zoomPan);
56533 var _selection = d3_select(null);
56535 var scheduleRedraw = throttle(redraw, 750);
56536 // var isRedrawScheduled = false;
56537 // var pendingRedrawCall;
56538 // function scheduleRedraw() {
56539 // // Only schedule the redraw if one has not already been set.
56540 // if (isRedrawScheduled) return;
56541 // isRedrawScheduled = true;
56542 // var that = this;
56543 // var args = arguments;
56544 // pendingRedrawCall = window.requestIdleCallback(function () {
56545 // // Reset the boolean so future redraws can be set.
56546 // isRedrawScheduled = false;
56547 // redraw.apply(that, args);
56548 // }, { timeout: 1400 });
56551 function cancelPendingRedraw() {
56552 scheduleRedraw.cancel();
56553 // isRedrawScheduled = false;
56554 // window.cancelIdleCallback(pendingRedrawCall);
56557 function map(selection$$1) {
56559 _selection = selection$$1;
56562 .on('change.map', immediateRedraw);
56564 var osm = context.connection();
56566 osm.on('change.map', immediateRedraw);
56570 .on('change.map', immediateRedraw)
56571 .on('undone.map redone.map', function(stack) {
56572 var mode = context.mode().id;
56573 if (mode !== 'browse' && mode !== 'select') return;
56575 var followSelected = false;
56576 if (Array.isArray(stack.selectedIDs)) {
56577 followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
56579 modeSelect(context, stack.selectedIDs).follow(followSelected)
56582 if (!followSelected && stack.transform) {
56583 map.transformEase(stack.transform);
56587 context.background()
56588 .on('change.map', immediateRedraw);
56591 .on('redraw.map', immediateRedraw);
56594 .on('change.map', function() {
56595 context.background().updateImagery();
56600 .on('dblclick.map', dblClick)
56602 .call(zoom$$1.transform, projection.transform());
56604 supersurface = selection$$1.append('div')
56605 .attr('id', 'supersurface')
56606 .call(utilSetTransform, 0, 0);
56608 // Need a wrapper div because Opera can't cope with an absolutely positioned
56609 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
56610 wrapper = supersurface
56612 .attr('class', 'layer layer-data');
56614 map.surface = surface = wrapper
56616 .selectAll('.surface')
56617 .attr('id', 'surface');
56620 .call(drawLabels.observe)
56621 .on('mousedown.zoom', function() {
56622 if (event.button === 2) {
56623 event.stopPropagation();
56626 .on('mouseup.zoom', function() {
56627 if (resetTransform()) immediateRedraw();
56629 .on('mousemove.map', function() {
56632 .on('mouseover.vertices', function() {
56633 if (map.editable() && !transformed) {
56634 var hover = event.target.__data__;
56635 surface.selectAll('.data-layer-osm')
56636 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56637 dispatch$$1.call('drawn', this, { full: false });
56640 .on('mouseout.vertices', function() {
56641 if (map.editable() && !transformed) {
56642 var hover = event.relatedTarget && event.relatedTarget.__data__;
56643 surface.selectAll('.data-layer-osm')
56644 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
56645 dispatch$$1.call('drawn', this, { full: false });
56650 .call(context.background());
56652 context.on('enter.map', function() {
56653 if (map.editable() && !transformed) {
56655 // redraw immediately any objects affected by a change in selectedIDs.
56656 var graph = context.graph();
56657 var selectedAndParents = {};
56658 context.selectedIDs().forEach(function(id) {
56659 var entity = graph.hasEntity(id);
56661 selectedAndParents[entity.id] = entity;
56662 if (entity.type === 'node') {
56663 graph.parentWays(entity).forEach(function(parent) {
56664 selectedAndParents[parent.id] = parent;
56669 var data = values$1(selectedAndParents);
56670 var filter = function(d) { return d.id in selectedAndParents; };
56672 data = context.features().filter(data, graph);
56674 surface.selectAll('.data-layer-osm')
56675 .call(drawVertices.drawSelected, graph, map.extent())
56676 .call(drawLines, graph, data, filter)
56677 .call(drawAreas, graph, data, filter)
56678 .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
56680 dispatch$$1.call('drawn', this, { full: false });
56683 // redraw everything else later
56688 map.dimensions(utilGetDimensions(selection$$1));
56692 function zoomEventFilter() {
56693 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
56694 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
56695 // This can happen if a previous `mousedown` occurred without a `mouseup`.
56696 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
56697 // so that d3-zoom won't stop propagation of new `mousedown` events.
56698 if (event.type === 'mousedown') {
56699 var hasOrphan = false;
56700 var listeners = window.__on;
56701 for (var i = 0; i < listeners.length; i++) {
56702 var listener = listeners[i];
56703 if (listener.name === 'zoom' && listener.type === 'mouseup') {
56709 var event$$1 = window.CustomEvent;
56711 event$$1 = new event$$1('mouseup');
56713 event$$1 = window.document.createEvent('Event');
56714 event$$1.initEvent('mouseup', false, false);
56716 // Event needs to be dispatched with an event.view property.
56717 event$$1.view = window;
56718 window.dispatchEvent(event$$1);
56722 return event.button !== 2; // ignore right clicks
56727 return 256 * Math.pow(2, z);
56731 return Math.max(Math.log(k) / Math.LN2 - 8, 0);
56734 function pxCenter() {
56735 return [dimensions[0] / 2, dimensions[1] / 2];
56739 function drawVector(difference, extent) {
56740 var mode = context.mode();
56741 var graph = context.graph();
56742 var features = context.features();
56743 var all = context.intersects(map.extent());
56744 var fullRedraw = false;
56749 var complete = difference.complete(map.extent());
56750 data = compact(values$1(complete));
56751 filter = function(d) { return d.id in complete; };
56752 features.clear(data);
56755 // force a full redraw if gatherStats detects that a feature
56756 // should be auto-hidden (e.g. points or buildings)..
56757 if (features.gatherStats(all, graph, dimensions)) {
56758 extent = undefined;
56762 data = context.intersects(map.extent().intersection(extent));
56763 var set$$1 = set$2(map$3(data, 'id'));
56764 filter = function(d) { return set$$1.has(d.id); };
56769 filter = utilFunctor(true);
56773 data = features.filter(data, graph);
56775 if (mode && mode.id === 'select') {
56776 // update selected vertices - the user might have just double-clicked a way,
56777 // creating a new vertex, triggering a partial redraw without a mode change
56778 surface.selectAll('.data-layer-osm')
56779 .call(drawVertices.drawSelected, graph, map.extent());
56782 surface.selectAll('.data-layer-osm')
56783 .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
56784 .call(drawLines, graph, data, filter)
56785 .call(drawAreas, graph, data, filter)
56786 .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
56787 .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
56788 .call(drawPoints, graph, data, filter);
56790 dispatch$$1.call('drawn', this, {full: true});
56794 function editOff() {
56795 context.features().resetStats();
56796 surface.selectAll('.layer-osm *').remove();
56798 var mode = context.mode();
56799 if (mode && mode.id !== 'save') {
56800 context.enter(modeBrowse(context));
56803 dispatch$$1.call('drawn', this, {full: true});
56807 function dblClick() {
56808 if (!dblclickEnabled) {
56809 event.preventDefault();
56810 event.stopImmediatePropagation();
56815 function zoomPan(manualEvent) {
56816 var event$$1 = (manualEvent || event);
56817 var source = event$$1.sourceEvent;
56818 var eventTransform = event$$1.transform;
56820 if (transformStart.x === eventTransform.x &&
56821 transformStart.y === eventTransform.y &&
56822 transformStart.k === eventTransform.k) {
56823 return; // no change
56826 // Normalize mousewheel - #3029
56827 // If wheel delta is provided in LINE units, recalculate it in PIXEL units
56828 // We are essentially redoing the calculations that occur here:
56829 // https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
56830 // See this for more info:
56831 // https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
56832 if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
56833 // pick sensible scroll amount if user scrolling fast or slow..
56834 var lines = Math.abs(source.deltaY);
56835 var scroll = lines > 2 ? 40 : lines * 10;
56837 var t0 = transformed ? transformLast : transformStart;
56838 var p0 = mouse(source);
56839 var p1 = t0.invert(p0);
56840 var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
56841 var x2 = p0[0] - p1[0] * k2;
56842 var y2 = p0[1] - p1[1] * k2;
56844 eventTransform = identity$7.translate(x2,y2).scale(k2);
56845 _selection.node().__zoom = eventTransform;
56848 if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
56849 surface.interrupt();
56850 uiFlash().text(t('cannot_zoom'))();
56851 setZoom(context.minEditableZoom(), true);
56853 dispatch$$1.call('move', this, map);
56857 projection.transform(eventTransform);
56859 var scale = eventTransform.k / transformStart.k;
56860 var tX = (eventTransform.x / scale - transformStart.x) * scale;
56861 var tY = (eventTransform.y / scale - transformStart.y) * scale;
56863 if (context.inIntro()) {
56864 curtainProjection.transform({
56865 x: eventTransform.x - tX,
56866 y: eventTransform.y - tY,
56867 k: eventTransform.k
56871 if (source) mousemove = event$$1;
56872 transformed = true;
56873 transformLast = eventTransform;
56874 utilSetTransform(supersurface, tX, tY, scale);
56877 dispatch$$1.call('move', this, map);
56881 function resetTransform() {
56882 if (!transformed) return false;
56884 // deprecation warning - Radial Menu to be removed in iD v3
56885 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
56886 utilSetTransform(supersurface, 0, 0);
56887 transformed = false;
56888 if (context.inIntro()) {
56889 curtainProjection.transform(projection.transform());
56895 function redraw(difference, extent) {
56896 if (surface.empty() || !redrawEnabled) return;
56898 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
56899 // It would result in artifacts where differenced entities are redrawn with
56900 // one transform and unchanged entities with another.
56901 if (resetTransform()) {
56902 difference = extent = undefined;
56905 var z = String(~~map.zoom());
56906 if (surface.attr('data-zoom') !== z) {
56907 surface.attr('data-zoom', z)
56908 .classed('low-zoom', z <= 16);
56912 supersurface.call(context.background());
56919 if (map.editable()) {
56920 context.loadTiles(projection, dimensions);
56921 drawVector(difference, extent);
56926 transformStart = projection.transform();
56933 var immediateRedraw = function(difference, extent) {
56934 if (!difference && !extent) cancelPendingRedraw();
56935 redraw(difference, extent);
56939 function pointLocation(p) {
56940 var translate = projection.translate(),
56941 scale = projection.scale() * 2 * Math.PI;
56942 return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
56946 function locationPoint(l) {
56947 var translate = projection.translate(),
56948 scale = projection.scale() * 2 * Math.PI;
56949 return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
56953 map.mouse = function() {
56954 var event$$1 = mousemove || event;
56957 while ((s = event$$1.sourceEvent)) { event$$1 = s; }
56958 return mouse(event$$1);
56965 map.mouseCoordinates = function() {
56966 var coord = map.mouse() || pxCenter();
56967 return projection.invert(coord);
56971 map.dblclickEnable = function(_) {
56972 if (!arguments.length) return dblclickEnabled;
56973 dblclickEnabled = _;
56978 map.redrawEnable = function(_) {
56979 if (!arguments.length) return redrawEnabled;
56985 function setTransform(t2, duration, force) {
56986 var t$$1 = projection.transform();
56987 if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
56994 .duration(duration)
56995 .on('start', function() { map.startEase(); })
56996 .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
56998 projection.transform(t2);
56999 transformStart = t2;
57000 _selection.call(zoom$$1.transform, transformStart);
57005 function setZoom(z2, force, duration) {
57006 if (z2 === map.zoom() && !force) {
57010 var k = projection.scale(),
57011 k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
57012 center = pxCenter(),
57013 l = pointLocation(center);
57015 projection.scale(k2);
57017 var t$$1 = projection.translate();
57018 l = locationPoint(l);
57020 t$$1[0] += center[0] - l[0];
57021 t$$1[1] += center[1] - l[1];
57024 projection.scale(k); // reset scale
57027 .duration(duration)
57028 .on('start', function() { map.startEase(); })
57029 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
57031 projection.translate(t$$1);
57032 transformStart = projection.transform();
57033 _selection.call(zoom$$1.transform, transformStart);
57040 function setCenter(loc2, duration) {
57041 var c = map.center();
57042 if (loc2[0] === c[0] && loc2[1] === c[1]) {
57046 var t$$1 = projection.translate(),
57047 k = projection.scale(),
57049 ll = projection(loc2);
57051 t$$1[0] = t$$1[0] - ll[0] + pxC[0];
57052 t$$1[1] = t$$1[1] - ll[1] + pxC[1];
57057 .duration(duration)
57058 .on('start', function() { map.startEase(); })
57059 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57061 projection.translate(t$$1);
57062 transformStart = projection.transform();
57063 _selection.call(zoom$$1.transform, transformStart);
57070 map.pan = function(delta, duration) {
57071 var t$$1 = projection.translate(),
57072 k = projection.scale();
57074 t$$1[0] += delta[0];
57075 t$$1[1] += delta[1];
57080 .duration(duration)
57081 .on('start', function() { map.startEase(); })
57082 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
57084 projection.translate(t$$1);
57085 transformStart = projection.transform();
57086 _selection.call(zoom$$1.transform, transformStart);
57087 dispatch$$1.call('move', this, map);
57095 map.dimensions = function(_) {
57096 if (!arguments.length) return dimensions;
57097 var center = map.center();
57099 drawLayers.dimensions(dimensions);
57100 context.background().dimensions(dimensions);
57101 projection.clipExtent([[0, 0], dimensions]);
57102 mouse = utilFastMouse(supersurface.node());
57110 function zoomIn(delta) {
57111 setZoom(~~map.zoom() + delta, true, 250);
57114 function zoomOut(delta) {
57115 setZoom(~~map.zoom() - delta, true, 250);
57118 map.zoomIn = function() { zoomIn(1); };
57119 map.zoomInFurther = function() { zoomIn(4); };
57121 map.zoomOut = function() { zoomOut(1); };
57122 map.zoomOutFurther = function() { zoomOut(4); };
57125 map.center = function(loc2) {
57126 if (!arguments.length) {
57127 return projection.invert(pxCenter());
57130 if (setCenter(loc2)) {
57131 dispatch$$1.call('move', this, map);
57139 map.zoom = function(z2) {
57140 if (!arguments.length) {
57141 return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
57144 if (z2 < minzoom) {
57145 surface.interrupt();
57146 uiFlash().text(t('cannot_zoom'))();
57147 z2 = context.minEditableZoom();
57151 dispatch$$1.call('move', this, map);
57159 map.zoomTo = function(entity, zoomLimits) {
57160 var extent = entity.extent(context.graph());
57161 if (!isFinite(extent.area())) return;
57163 var z2 = map.trimmedExtentZoom(extent);
57164 zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
57165 map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
57169 map.centerZoom = function(loc2, z2) {
57170 var centered = setCenter(loc2),
57171 zoomed = setZoom(z2);
57173 if (centered || zoomed) {
57174 dispatch$$1.call('move', this, map);
57182 map.centerEase = function(loc2, duration) {
57183 duration = duration || 250;
57184 setCenter(loc2, duration);
57189 map.zoomEase = function(z2, duration) {
57190 duration = duration || 250;
57191 setZoom(z2, false, duration);
57196 map.transformEase = function(t2, duration) {
57197 duration = duration || 250;
57198 setTransform(t2, duration, false);
57203 map.startEase = function() {
57204 utilBindOnce(surface, 'mousedown.ease', function() {
57211 map.cancelEase = function() {
57212 _selection.interrupt();
57217 map.extent = function(_) {
57218 if (!arguments.length) {
57219 return new geoExtent$$1(projection.invert([0, dimensions[1]]),
57220 projection.invert([dimensions[0], 0]));
57222 var extent = geoExtent$$1(_);
57223 map.centerZoom(extent.center(), map.extentZoom(extent));
57228 map.trimmedExtent = function(_) {
57229 if (!arguments.length) {
57230 var headerY = 60, footerY = 30, pad = 10;
57231 return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
57232 projection.invert([dimensions[0] - pad, headerY + pad]));
57234 var extent = geoExtent$$1(_);
57235 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
57240 function calcZoom(extent, dim) {
57241 var tl = projection([extent[0][0], extent[1][1]]),
57242 br = projection([extent[1][0], extent[0][1]]);
57244 // Calculate maximum zoom that fits extent
57245 var hFactor = (br[0] - tl[0]) / dim[0],
57246 vFactor = (br[1] - tl[1]) / dim[1],
57247 hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
57248 vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
57249 newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
57255 map.extentZoom = function(_) {
57256 return calcZoom(geoExtent$$1(_), dimensions);
57260 map.trimmedExtentZoom = function(_) {
57261 var trimY = 120, trimX = 40,
57262 trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
57263 return calcZoom(geoExtent$$1(_), trimmed);
57267 map.editable = function() {
57268 var osmLayer = surface.selectAll('.data-layer-osm');
57269 if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
57271 return map.zoom() >= context.minEditableZoom();
57275 map.minzoom = function(_) {
57276 if (!arguments.length) return minzoom;
57282 map.layers = drawLayers;
57285 return utilRebind(map, dispatch$$1, 'on');
57288 function uiMapInMap(context) {
57290 function map_in_map(selection$$1) {
57291 var backgroundLayer = rendererTileLayer(context);
57292 var overlayLayers = {};
57293 var projection$$1 = geoRawMercator();
57294 var gpxLayer = svgGpx$$1(projection$$1, context).showLabels(false);
57295 var debugLayer = svgDebug$$1(projection$$1, context);
57296 var zoom$$1 = d3_zoom()
57297 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
57298 .on('start', zoomStarted)
57299 .on('zoom', zoomed)
57300 .on('end', zoomEnded);
57301 var isTransformed = false;
57302 var isHidden = true;
57303 var skipEvents = false;
57304 var gesture = null;
57305 var zDiff = 6; // by default, minimap renders at (main zoom - 6)
57306 var wrap = d3_select(null);
57307 var tiles = d3_select(null);
57308 var viewport = d3_select(null);
57309 var tStart; // transform at start of gesture
57310 var tCurr; // transform at most recent event
57314 function zoomStarted() {
57315 if (skipEvents) return;
57316 tStart = tCurr = projection$$1.transform();
57321 function zoomed() {
57322 if (skipEvents) return;
57324 var x = event.transform.x;
57325 var y = event.transform.y;
57326 var k = event.transform.k;
57327 var isZooming = (k !== tStart.k);
57328 var isPanning = (x !== tStart.x || y !== tStart.y);
57330 if (!isZooming && !isPanning) {
57331 return; // no change
57334 // lock in either zooming or panning, don't allow both in minimap.
57336 gesture = isZooming ? 'zoom' : 'pan';
57339 var tMini = projection$$1.transform();
57342 if (gesture === 'zoom') {
57343 var dMini = utilGetDimensions(wrap);
57344 var cMini = geoVecScale(dMini, 0.5);
57345 scale = k / tMini.k;
57346 tX = (cMini[0] / scale - cMini[0]) * scale;
57347 tY = (cMini[1] / scale - cMini[1]) * scale;
57355 utilSetTransform(tiles, tX, tY, scale);
57356 utilSetTransform(viewport, 0, 0, scale);
57357 isTransformed = true;
57358 tCurr = identity$7.translate(x, y).scale(k);
57360 var zMain = geoScaleToZoom(context.projection.scale());
57361 var zMini = geoScaleToZoom(k);
57363 zDiff = zMain - zMini;
57369 function zoomEnded() {
57370 if (skipEvents) return;
57371 if (gesture !== 'pan') return;
57373 updateProjection();
57375 var dMini = utilGetDimensions(wrap);
57376 var cMini = geoVecScale(dMini, 0.5);
57377 context.map().center(projection$$1.invert(cMini)); // recenter main map..
57381 function updateProjection() {
57382 var loc = context.map().center();
57383 var dMini = utilGetDimensions(wrap);
57384 var cMini = geoVecScale(dMini, 0.5);
57385 var tMain = context.projection.transform();
57386 var zMain = geoScaleToZoom(tMain.k);
57387 var zMini = Math.max(zMain - zDiff, 0.5);
57388 var kMini = geoZoomToScale(zMini);
57391 .translate([tMain.x, tMain.y])
57394 var point$$1 = projection$$1(loc);
57395 var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
57396 var xMini = cMini[0] - point$$1[0] + tMain.x + mouse[0];
57397 var yMini = cMini[1] - point$$1[1] + tMain.y + mouse[1];
57400 .translate([xMini, yMini])
57401 .clipExtent([[0, 0], dMini]);
57403 tCurr = projection$$1.transform();
57405 if (isTransformed) {
57406 utilSetTransform(tiles, 0, 0);
57407 utilSetTransform(viewport, 0, 0);
57408 isTransformed = false;
57412 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
57415 wrap.call(zoom$$1.transform, tCurr);
57416 skipEvents = false;
57420 function redraw() {
57421 clearTimeout(timeoutId);
57422 if (isHidden) return;
57424 updateProjection();
57426 var dMini = utilGetDimensions(wrap);
57427 var zMini = geoScaleToZoom(projection$$1.scale());
57429 // setup tile container
57431 .selectAll('.map-in-map-tiles')
57434 tiles = tiles.enter()
57436 .attr('class', 'map-in-map-tiles')
57439 // redraw background
57441 .source(context.background().baseLayerSource())
57442 .projection(projection$$1)
57443 .dimensions(dMini);
57445 var background = tiles
57446 .selectAll('.map-in-map-background')
57451 .attr('class', 'map-in-map-background')
57453 .call(backgroundLayer);
57457 var overlaySources = context.background().overlayLayerSources();
57458 var activeOverlayLayers = [];
57459 for (var i = 0; i < overlaySources.length; i++) {
57460 if (overlaySources[i].validZoom(zMini)) {
57461 if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
57462 activeOverlayLayers.push(overlayLayers[i]
57463 .source(overlaySources[i])
57464 .projection(projection$$1)
57465 .dimensions(dMini));
57469 var overlay = tiles
57470 .selectAll('.map-in-map-overlay')
57473 overlay = overlay.enter()
57475 .attr('class', 'map-in-map-overlay')
57479 var overlays = overlay
57481 .data(activeOverlayLayers, function(d) { return d.source().name(); });
57486 overlays = overlays.enter()
57489 .each(function(layer) { d3_select(this).call(layer); });
57492 var dataLayers = tiles
57493 .selectAll('.map-in-map-data')
57499 dataLayers = dataLayers.enter()
57501 .attr('class', 'map-in-map-data')
57507 // redraw viewport bounding box
57508 if (gesture !== 'pan') {
57509 var getPath = d3_geoPath(projection$$1);
57510 var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
57512 viewport = wrap.selectAll('.map-in-map-viewport')
57515 viewport = viewport.enter()
57517 .attr('class', 'map-in-map-viewport')
57521 var path = viewport.selectAll('.map-in-map-bbox')
57526 .attr('class', 'map-in-map-bbox')
57528 .attr('d', getPath)
57529 .classed('thick', function(d) { return getPath.area(d) < 30; });
57534 function queueRedraw() {
57535 clearTimeout(timeoutId);
57536 timeoutId = setTimeout(function() { redraw(); }, 750);
57540 function toggle() {
57541 if (event) event.preventDefault();
57543 isHidden = !isHidden;
57545 d3_select('.minimap-toggle-item')
57546 .classed('active', !isHidden)
57548 .property('checked', !isHidden);
57552 .style('display', 'block')
57553 .style('opacity', '1')
57556 .style('opacity', '0')
57557 .on('end', function() {
57558 selection$$1.selectAll('.map-in-map')
57559 .style('display', 'none');
57563 .style('display', 'block')
57564 .style('opacity', '0')
57567 .style('opacity', '1')
57568 .on('end', function() {
57575 uiMapInMap.toggle = toggle;
57577 wrap = selection$$1.selectAll('.map-in-map')
57580 wrap = wrap.enter()
57582 .attr('class', 'map-in-map')
57583 .style('display', (isHidden ? 'none' : 'block'))
57585 .on('dblclick.zoom', null)
57589 .on('drawn.map-in-map', function(drawn) {
57590 if (drawn.full === true) {
57597 var keybinding = d3keybinding('map-in-map')
57598 .on(t('background.minimap.key'), toggle);
57600 d3_select(document)
57607 function uiBackground(context) {
57608 var key = t('background.key');
57610 var _customSource = context.background().findSource('custom');
57611 var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
57612 var _shown = false;
57614 var _backgroundList = d3_select(null);
57615 var _overlayList = d3_select(null);
57616 var _displayOptionsContainer = d3_select(null);
57617 var _offsetContainer = d3_select(null);
57619 var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
57620 var backgroundOffset = uiBackgroundOffset(context);
57623 function setTooltips(selection$$1) {
57624 selection$$1.each(function(d, i, nodes) {
57625 var item = d3_select(this).select('label');
57626 var span = item.select('span');
57627 var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
57628 var description = d.description();
57629 var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
57631 if (d === _previousBackground) {
57632 item.call(tooltip()
57633 .placement(placement)
57635 .title(function() {
57636 var tip = '<div>' + t('background.switch') + '</div>';
57637 return uiTooltipHtml(tip, uiCmd('⌘' + key));
57640 } else if (description || isOverflowing) {
57641 item.call(tooltip()
57642 .placement(placement)
57643 .title(description || d.name())
57646 item.call(tooltip().destroy);
57652 function updateLayerSelections(selection$$1) {
57653 function active(d) {
57654 return context.background().showsLayer(d);
57657 selection$$1.selectAll('.layer')
57658 .classed('active', active)
57659 .classed('switch', function(d) { return d === _previousBackground; })
57661 .selectAll('input')
57662 .property('checked', active);
57666 function chooseBackground(d) {
57667 if (d.id === 'custom' && !d.template()) {
57668 return editCustom();
57671 event.preventDefault();
57672 _previousBackground = context.background().baseLayerSource();
57673 context.storage('background-last-used-toggle', _previousBackground.id);
57674 context.storage('background-last-used', d.id);
57675 context.background().baseLayerSource(d);
57676 _backgroundList.call(updateLayerSelections);
57677 document.activeElement.blur();
57681 function editCustom() {
57682 event.preventDefault();
57683 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
57684 var template = window.prompt(
57685 t('background.custom_prompt', { example: example }),
57686 _customSource.template() || example
57690 context.storage('background-custom-template', template);
57691 _customSource.template(template);
57692 chooseBackground(_customSource);
57694 _backgroundList.call(updateLayerSelections);
57699 function chooseOverlay(d) {
57700 event.preventDefault();
57701 context.background().toggleOverlayLayer(d);
57702 _overlayList.call(updateLayerSelections);
57703 document.activeElement.blur();
57707 function drawListItems(layerList, type, change, filter) {
57708 var sources = context.background()
57709 .sources(context.map().extent())
57712 var layerLinks = layerList.selectAll('li.layer')
57713 .data(sources, function(d) { return d.name(); });
57718 var enter = layerLinks.enter()
57720 .attr('class', 'layer')
57721 .classed('layer-custom', function(d) { return d.id === 'custom'; })
57722 .classed('best', function(d) { return d.best(); });
57724 enter.filter(function(d) { return d.id === 'custom'; })
57726 .attr('class', 'layer-browse')
57728 .title(t('background.custom_button'))
57729 .placement((textDirection === 'rtl') ? 'right' : 'left')
57731 .on('click', editCustom)
57732 .call(svgIcon('#icon-search'));
57734 enter.filter(function(d) { return d.best(); })
57736 .attr('class', 'best')
57738 .title(t('background.best_imagery'))
57739 .placement((textDirection === 'rtl') ? 'right' : 'left')
57749 .attr('type', type)
57750 .attr('name', 'layers')
57751 .on('change', change);
57755 .text(function(d) { return d.name(); });
57758 layerList.selectAll('li.layer')
57760 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
57763 .call(updateLayerSelections);
57766 function sortSources(a, b) {
57767 return a.best() && !b.best() ? -1
57768 : b.best() && !a.best() ? 1
57769 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
57774 function renderBackgroundList(selection$$1) {
57776 // the background list
57777 var container = selection$$1.selectAll('.layer-background-list')
57780 _backgroundList = container.enter()
57782 .attr('class', 'layer-list layer-background-list')
57783 .attr('dir', 'auto')
57787 // add minimap toggle below list
57788 var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
57792 .attr('class', 'layer-list minimap-toggle-list')
57794 .attr('class', 'layer minimap-toggle-item');
57796 var minimapLabelEnter = minimapEnter
57800 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
57806 .attr('type', 'checkbox')
57807 .on('change', function() {
57808 event.preventDefault();
57809 uiMapInMap.toggle();
57814 .text(t('background.minimap.description'));
57817 // "Info / Report a Problem" link
57818 selection$$1.selectAll('.imagery-faq')
57822 .attr('class', 'imagery-faq')
57824 .attr('target', '_blank')
57825 .attr('tabindex', -1)
57826 .call(svgIcon('#icon-out-link', 'inline'))
57827 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
57829 .text(t('background.imagery_source_faq'));
57833 function renderOverlayList(selection$$1) {
57834 var container = selection$$1.selectAll('.layer-overlay-list')
57837 _overlayList = container.enter()
57839 .attr('class', 'layer-list layer-overlay-list')
57840 .attr('dir', 'auto')
57845 function update() {
57847 .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
57850 .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
57852 _displayOptionsContainer
57853 .call(backgroundDisplayOptions);
57856 .call(backgroundOffset);
57860 function quickSwitch() {
57862 event.stopImmediatePropagation();
57863 event.preventDefault();
57865 if (_previousBackground) {
57866 chooseBackground(_previousBackground);
57871 function background(selection$$1) {
57873 function hidePane() {
57877 function togglePane() {
57878 if (event) event.preventDefault();
57879 paneTooltip.hide(button);
57880 setVisible(!button.classed('active'));
57883 function setVisible(show) {
57884 if (show !== _shown) {
57885 button.classed('active', show);
57889 uiMapData.hidePane();
57894 .style('display', 'block')
57895 .style('right', '-300px')
57898 .style('right', '0px');
57902 .style('display', 'block')
57903 .style('right', '0px')
57906 .style('right', '-300px')
57907 .on('end', function() {
57908 d3_select(this).style('display', 'none');
57915 var pane = selection$$1
57917 .attr('class', 'fillL map-overlay col3 content hide');
57919 var paneTooltip = tooltip()
57920 .placement((textDirection === 'rtl') ? 'right' : 'left')
57922 .title(uiTooltipHtml(t('background.description'), key));
57924 var button = selection$$1
57926 .attr('tabindex', -1)
57927 .on('click', togglePane)
57928 .call(svgIcon('#icon-layers', 'light'))
57929 .call(paneTooltip);
57933 .text(t('background.title'));
57938 .attr('class', 'background-background-list-container')
57939 .call(uiDisclosure(context, 'background_list', true)
57940 .title(t('background.backgrounds'))
57941 .content(renderBackgroundList)
57947 .attr('class', 'background-overlay-list-container')
57948 .call(uiDisclosure(context, 'overlay_list', true)
57949 .title(t('background.overlays'))
57950 .content(renderOverlayList)
57954 _displayOptionsContainer = pane
57956 .attr('class', 'background-display-options');
57959 _offsetContainer = pane
57961 .attr('class', 'background-offset');
57966 .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
57968 context.background()
57969 .on('change.background-update', update);
57974 var keybinding = d3keybinding('background')
57975 .on(key, togglePane)
57976 .on(uiCmd('⌘' + key), quickSwitch)
57977 .on([t('map_data.key'), t('help.key')], hidePane);
57979 d3_select(document)
57982 uiBackground.hidePane = hidePane;
57983 uiBackground.togglePane = togglePane;
57984 uiBackground.setVisible = setVisible;
57990 function uiContributors(context) {
57991 var osm = context.connection(),
57992 debouncedUpdate = debounce(function() { update(); }, 1000),
57995 wrap = d3_select(null);
57998 function update() {
58002 entities = context.intersects(context.map().extent());
58004 entities.forEach(function(entity) {
58005 if (entity && entity.user) users[entity.user] = true;
58008 var u = Object.keys(users),
58009 subset = u.slice(0, u.length > limit ? limit - 1 : limit);
58012 .call(svgIcon('#icon-nearby', 'pre-text light'));
58014 var userList = d3_select(document.createElement('span'));
58016 userList.selectAll()
58020 .attr('class', 'user-link')
58021 .attr('href', function(d) { return osm.userURL(d); })
58022 .attr('target', '_blank')
58023 .attr('tabindex', -1)
58026 if (u.length > limit) {
58027 var count = d3_select(document.createElement('span'));
58030 .attr('target', '_blank')
58031 .attr('tabindex', -1)
58032 .attr('href', function() {
58033 return osm.changesetsURL(context.map().center(), context.map().zoom());
58035 .text(u.length - limit + 1);
58037 wrap.append('span')
58038 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
58041 wrap.append('span')
58042 .html(t('contributors.list', { users: userList.html() }));
58049 .style('opacity', 0);
58051 } else if (hidden) {
58054 .style('opacity', 1);
58059 return function(selection$$1) {
58061 wrap = selection$$1;
58064 osm.on('loaded.contributors', debouncedUpdate);
58065 context.map().on('move.contributors', debouncedUpdate);
58069 function uiFeatureInfo(context) {
58070 function update(selection$$1) {
58071 var features = context.features(),
58072 stats = features.stats(),
58074 hiddenList = compact(map$3(features.hidden(), function(k) {
58077 return String(stats[k]) + ' ' + t('feature.' + k + '.description');
58081 selection$$1.html('');
58083 if (hiddenList.length) {
58084 var tooltipBehavior = tooltip()
58087 .title(function() {
58088 return uiTooltipHtml(hiddenList.join('<br/>'));
58091 var warning = selection$$1.append('a')
58093 .attr('tabindex', -1)
58094 .html(t('feature_info.hidden_warning', { count: count }))
58095 .call(tooltipBehavior)
58096 .on('click', function() {
58097 tooltipBehavior.hide(warning);
58098 // open map data panel?
58099 event.preventDefault();
58104 .classed('hide', !hiddenList.length);
58108 return function(selection$$1) {
58109 update(selection$$1);
58111 context.features().on('change.feature_info', function() {
58112 update(selection$$1);
58117 function uiFullScreen(context) {
58118 var element = context.container().node(),
58119 keybinding = d3keybinding('full-screen');
58123 function getFullScreenFn() {
58124 if (element.requestFullscreen) {
58125 return element.requestFullscreen;
58126 } else if (element.msRequestFullscreen) {
58127 return element.msRequestFullscreen;
58128 } else if (element.mozRequestFullScreen) {
58129 return element.mozRequestFullScreen;
58130 } else if (element.webkitRequestFullscreen) {
58131 return element.webkitRequestFullscreen;
58136 function getExitFullScreenFn() {
58137 if (document.exitFullscreen) {
58138 return document.exitFullscreen;
58139 } else if (document.msExitFullscreen) {
58140 return document.msExitFullscreen;
58141 } else if (document.mozCancelFullScreen) {
58142 return document.mozCancelFullScreen;
58143 } else if (document.webkitExitFullscreen) {
58144 return document.webkitExitFullscreen;
58149 function isFullScreen() {
58150 return document.fullscreenElement ||
58151 document.mozFullScreenElement ||
58152 document.webkitFullscreenElement ||
58153 document.msFullscreenElement;
58157 function isSupported() {
58158 return !!getFullScreenFn();
58162 function fullScreen() {
58163 event.preventDefault();
58164 if (!isFullScreen()) {
58165 // button.classed('active', true);
58166 getFullScreenFn().apply(element);
58168 // button.classed('active', false);
58169 getExitFullScreenFn().apply(document);
58174 return function() { // selection) {
58175 if (!isSupported())
58178 // button = selection.append('button')
58179 // .attr('title', t('full_screen'))
58180 // .attr('tabindex', -1)
58181 // .on('click', fullScreen)
58184 // button.append('span')
58185 // .attr('class', 'icon full-screen');
58187 var detected = utilDetect();
58188 var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
58189 keybinding.on(keys, fullScreen);
58191 d3_select(document)
58196 function uiLoading(context) {
58197 var _modalSelection = d3_select(null);
58199 var _blocking = false;
58202 var loading = function(selection$$1) {
58203 _modalSelection = uiModal(selection$$1, _blocking);
58205 var loadertext = _modalSelection.select('.content')
58206 .classed('loading-modal', true)
58208 .attr('class', 'modal-section fillL');
58212 .attr('class', 'loader')
58213 .attr('src', context.imagePath('loader-white.gif'));
58219 _modalSelection.select('button.close')
58220 .attr('class', 'hide');
58226 loading.message = function(_) {
58227 if (!arguments.length) return _message;
58233 loading.blocking = function(_) {
58234 if (!arguments.length) return _blocking;
58240 loading.close = function() {
58241 _modalSelection.remove();
58248 function uiGeolocate(context) {
58249 var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
58250 locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
58255 if (context.inIntro()) return;
58256 context.enter(modeBrowse(context));
58257 context.container().call(locating);
58258 navigator.geolocation.getCurrentPosition(success, error, geoOptions);
58260 // This timeout ensures that we still call finish() even if
58261 // the user declines to share their location in Firefox
58262 timeoutId = setTimeout(finish, 10000 /* 10sec */ );
58266 function success(position) {
58267 var map = context.map(),
58268 extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
58269 .padByMeters(position.coords.accuracy);
58271 map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
58281 function finish() {
58282 locating.close(); // unblock ui
58283 if (timeoutId) { clearTimeout(timeoutId); }
58284 timeoutId = undefined;
58288 return function(selection) {
58289 if (!navigator.geolocation) return;
58293 .attr('tabindex', -1)
58294 .attr('title', t('geolocate.title'))
58295 .on('click', click)
58296 .call(svgIcon('#icon-geolocate', 'light'))
58298 .placement((textDirection === 'rtl') ? 'right' : 'left'));
58302 function uiPanelBackground(context) {
58303 var background = context.background();
58304 var currSourceName = null;
58306 var metadataKeys = [
58307 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
58310 var debouncedRedraw = debounce(redraw, 250);
58312 function redraw(selection$$1) {
58313 var source = background.baseLayerSource(),
58314 isDG = (source.id.match(/^DigitalGlobe/i) !== null);
58316 if (currSourceName !== source.name()) {
58317 currSourceName = source.name();
58321 selection$$1.html('');
58323 var list = selection$$1
58325 .attr('class', 'background-info');
58329 .text(currSourceName);
58331 metadataKeys.forEach(function(k) {
58332 // DigitalGlobe vintage is available in raster layers for now.
58333 if (isDG && k === 'vintage') return;
58337 .attr('class', 'background-info-list-' + k)
58338 .classed('hide', !metadata[k])
58339 .text(t('info_panels.background.' + k) + ':')
58341 .attr('class', 'background-info-span-' + k)
58342 .text(metadata[k]);
58345 debouncedGetMetadata(selection$$1);
58347 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
58351 .text(t('info_panels.background.' + toggleTiles))
58353 .attr('class', 'button button-toggle-tiles')
58354 .on('click', function() {
58355 event.preventDefault();
58356 context.setDebug('tile', !context.getDebug('tile'));
58357 selection$$1.call(redraw);
58361 var key = source.id + '-vintage';
58362 var sourceVintage = context.background().findSource(key);
58363 var showsVintage = context.background().showsLayer(sourceVintage);
58364 var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
58367 .text(t('info_panels.background.' + toggleVintage))
58369 .attr('class', 'button button-toggle-vintage')
58370 .on('click', function() {
58371 event.preventDefault();
58372 context.background().toggleOverlayLayer(sourceVintage);
58373 selection$$1.call(redraw);
58377 // disable if necessary
58378 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
58379 if (source.id !== layerId) {
58380 var key = layerId + '-vintage';
58381 var sourceVintage = context.background().findSource(key);
58382 if (context.background().showsLayer(sourceVintage)) {
58383 context.background().toggleOverlayLayer(sourceVintage);
58390 var debouncedGetMetadata = debounce(getMetadata, 250);
58392 function getMetadata(selection$$1) {
58393 var tile = d3_select('.layer-background img.tile-center'); // tile near viewport center
58394 if (tile.empty()) return;
58396 var sourceName = currSourceName,
58398 zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
58399 center = context.map().center();
58402 metadata.zoom = String(zoom);
58403 selection$$1.selectAll('.background-info-list-zoom')
58404 .classed('hide', false)
58405 .selectAll('.background-info-span-zoom')
58406 .text(metadata.zoom);
58408 if (!d || !d.length >= 3) return;
58410 background.baseLayerSource().getMetadata(center, d, function(err, result) {
58411 if (err || currSourceName !== sourceName) return;
58414 var vintage = result.vintage;
58415 metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
58416 selection$$1.selectAll('.background-info-list-vintage')
58417 .classed('hide', false)
58418 .selectAll('.background-info-span-vintage')
58419 .text(metadata.vintage);
58421 // update other metdata
58422 without(metadataKeys, 'zoom', 'vintage')
58423 .forEach(function(k) {
58424 var val = result[k];
58426 selection$$1.selectAll('.background-info-list-' + k)
58427 .classed('hide', !val)
58428 .selectAll('.background-info-span-' + k)
58435 var panel = function(selection$$1) {
58436 selection$$1.call(redraw);
58439 .on('drawn.info-background', function() {
58440 selection$$1.call(debouncedRedraw);
58442 .on('move.info-background', function() {
58443 selection$$1.call(debouncedGetMetadata);
58448 panel.off = function() {
58450 .on('drawn.info-background', null)
58451 .on('move.info-background', null);
58454 panel.id = 'background';
58455 panel.title = t('info_panels.background.title');
58456 panel.key = t('info_panels.background.key');
58462 function uiPanelHistory(context) {
58465 function displayTimestamp(entity) {
58466 if (!entity.timestamp) return t('info_panels.history.unknown');
58467 var detected = utilDetect();
58469 day: 'numeric', month: 'short', year: 'numeric',
58470 hour: 'numeric', minute: 'numeric', second: 'numeric'
58472 var d = new Date(entity.timestamp);
58473 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
58474 return d.toLocaleString(detected.locale, options);
58478 function displayUser(selection, entity) {
58479 if (!entity.user) {
58482 .text(t('info_panels.history.unknown'));
58488 .attr('class', 'user-name')
58489 .text(entity.user);
58491 var links = selection
58493 .attr('class', 'links');
58498 .attr('class', 'user-osm-link')
58499 .attr('href', osm.userURL(entity.user))
58500 .attr('target', '_blank')
58501 .attr('tabindex', -1)
58507 .attr('class', 'user-hdyc-link')
58508 .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
58509 .attr('target', '_blank')
58510 .attr('tabindex', -1)
58515 function displayChangeset(selection, entity) {
58516 if (!entity.changeset) {
58519 .text(t('info_panels.history.unknown'));
58525 .attr('class', 'changeset-id')
58526 .text(entity.changeset);
58528 var links = selection
58530 .attr('class', 'links');
58535 .attr('class', 'changeset-osm-link')
58536 .attr('href', osm.changesetURL(entity.changeset))
58537 .attr('target', '_blank')
58538 .attr('tabindex', -1)
58544 .attr('class', 'changeset-osmcha-link')
58545 .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
58546 .attr('target', '_blank')
58547 .attr('tabindex', -1)
58552 function redraw(selection) {
58553 var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
58554 singular = selected.length === 1 ? selected[0] : null;
58556 osm = context.connection();
58558 selection.html('');
58562 .attr('class', 'history-heading')
58563 .text(singular || t('info_panels.history.selected', { n: selected.length }));
58565 if (!singular) return;
58567 var entity = context.entity(singular);
58569 var list = selection
58574 .text(t('info_panels.history.version') + ':')
58576 .text(entity.version);
58580 .text(t('info_panels.history.last_edit') + ':')
58582 .text(displayTimestamp(entity));
58586 .text(t('info_panels.history.edited_by') + ':')
58587 .call(displayUser, entity);
58591 .text(t('info_panels.history.changeset') + ':')
58592 .call(displayChangeset, entity);
58597 .attr('class', 'view-history-on-osm')
58598 .attr('target', '_blank')
58599 .attr('tabindex', -1)
58600 .attr('href', osm.historyURL(entity))
58601 .call(svgIcon('#icon-out-link', 'inline'))
58603 .text(t('info_panels.history.link_text'));
58608 var panel = function(selection) {
58609 selection.call(redraw);
58612 .on('drawn.info-history', function() {
58613 selection.call(redraw);
58617 panel.off = function() {
58619 .on('drawn.info-history', null);
58622 panel.id = 'history';
58623 panel.title = t('info_panels.history.title');
58624 panel.key = t('info_panels.history.key');
58632 var OSM_PRECISION = 7;
58633 var locale$2 = utilDetect().locale;
58636 * Returns a localized representation of the given length measurement.
58638 * @param {Number} m area in meters
58639 * @param {Boolean} isImperial true for U.S. customary units; false for metric
58641 function displayLength(m , isImperial ) {
58642 var d = m * (isImperial ? 3.28084 : 1),
58655 unit = 'kilometers';
58661 return t('units.' + unit, {
58662 quantity: d.toLocaleString(locale$2, {
58663 maximumSignificantDigits: 4
58669 * Returns a localized representation of the given area measurement.
58671 * @param {Number} m2 area in square meters
58672 * @param {Boolean} isImperial true for U.S. customary units; false for metric
58674 function displayArea(m2 , isImperial ) {
58675 var d = m2 * (isImperial ? 10.7639111056 : 1),
58681 if (d >= 6969600) { // > 0.25mi² show mi²
58683 unit1 = 'square_miles';
58686 unit1 = 'square_feet';
58689 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
58695 if (d >= 250000) { // > 0.25km² show km²
58697 unit1 = 'square_kilometers';
58700 unit1 = 'square_meters';
58703 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
58705 unit2 = 'hectares';
58709 area = t('units.' + unit1, {
58710 quantity: d1.toLocaleString(locale$2, {
58711 maximumSignificantDigits: 4
58716 return t('units.area_pair', {
58718 area2: t('units.' + unit2, {
58719 quantity: d2.toLocaleString(locale$2, {
58720 maximumSignificantDigits: 2
58729 function wrap(x , min , max ) {
58731 return ((x - min) % d + d) % d + min;
58734 function clamp(x , min , max ) {
58735 return Math.max(min, Math.min(x, max));
58738 function displayCoordinate(deg , pos , neg ) {
58739 var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60,
58740 sec = (min - Math.floor(min)) * 60,
58741 displayDegrees = t('units.arcdegrees', {
58742 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
58746 if (Math.floor(sec) > 0) {
58747 displayCoordinate = displayDegrees +
58748 t('units.arcminutes', {
58749 quantity: Math.floor(min).toLocaleString(locale$2)
58751 t('units.arcseconds', {
58752 quantity: Math.round(sec).toLocaleString(locale$2)
58754 } else if (Math.floor(min) > 0) {
58755 displayCoordinate = displayDegrees +
58756 t('units.arcminutes', {
58757 quantity: Math.round(min).toLocaleString(locale$2)
58760 displayCoordinate = t('units.arcdegrees', {
58761 quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
58766 return displayCoordinate;
58768 return t('units.coordinate', {
58769 coordinate: displayCoordinate,
58770 direction: t('units.' + (deg > 0 ? pos : neg))
58776 * Returns given coordinate pair in degree-minute-second format.
58778 * @param {Array<Number>} coord longitude and latitude
58780 function dmsCoordinatePair(coord ) {
58781 return t('units.coordinate_pair', {
58782 latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
58783 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
58788 * Returns the given coordinate pair in decimal format.
58789 * note: unlocalized to avoid comma ambiguity - see #4765
58791 * @param {Array<Number>} coord longitude and latitude
58793 function decimalCoordinatePair(coord ) {
58794 return t('units.coordinate_pair', {
58795 latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
58796 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
58800 function uiPanelLocation(context) {
58801 var currLocation = '';
58804 function redraw(selection) {
58805 selection.html('');
58807 var list = selection
58810 // Mouse coordinates
58811 var coord = context.map().mouseCoordinates();
58812 if (coord.some(isNaN)) {
58813 coord = context.map().center();
58818 .text(dmsCoordinatePair(coord))
58820 .text(decimalCoordinatePair(coord));
58825 .attr('class', 'location-info')
58826 .text(currLocation || ' ');
58828 debouncedGetLocation(selection, coord);
58832 var debouncedGetLocation = debounce(getLocation, 250);
58833 function getLocation(selection, coord) {
58834 if (!services.geocoder) {
58835 currLocation = t('info_panels.location.unknown_location');
58836 selection.selectAll('.location-info')
58837 .text(currLocation);
58839 services.geocoder.reverse(coord, function(err, result) {
58840 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
58841 selection.selectAll('.location-info')
58842 .text(currLocation);
58848 var panel = function(selection) {
58849 selection.call(redraw);
58852 .on('mousemove.info-location', function() {
58853 selection.call(redraw);
58857 panel.off = function() {
58859 .on('mousemove.info-location', null);
58862 panel.id = 'location';
58863 panel.title = t('info_panels.location.title');
58864 panel.key = t('info_panels.location.key');
58870 function uiPanelMeasurement(context) {
58871 var locale = utilDetect().locale,
58872 isImperial = (locale.toLowerCase() === 'en-us');
58875 function radiansToMeters(r) {
58876 // using WGS84 authalic radius (6371007.1809 m)
58877 return r * 6371007.1809;
58880 function steradiansToSqmeters(r) {
58881 // http://gis.stackexchange.com/a/124857/40446
58882 return r / (4 * Math.PI) * 510065621724000;
58886 function toLineString(feature) {
58887 if (feature.type === 'LineString') return feature;
58889 var result = { type: 'LineString', coordinates: [] };
58890 if (feature.type === 'Polygon') {
58891 result.coordinates = feature.coordinates[0];
58892 } else if (feature.type === 'MultiPolygon') {
58893 result.coordinates = feature.coordinates[0][0];
58899 function nodeCount(feature) {
58900 if (feature.type === 'LineString') return feature.coordinates.length;
58902 if (feature.type === 'Polygon') {
58903 return feature.coordinates[0].length - 1;
58908 function redraw(selection$$1) {
58909 var resolver = context.graph();
58910 var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
58911 var singular = selected.length === 1 ? selected[0] : null;
58912 var extent = geoExtent$$1();
58915 selection$$1.html('');
58919 .attr('class', 'measurement-heading')
58920 .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
58922 if (!selected.length) return;
58925 for (var i = 0; i < selected.length; i++) {
58926 entity = context.entity(selected[i]);
58927 extent._extend(entity.extent(resolver));
58929 center = extent.center();
58932 var list = selection$$1
58936 // multiple features, just display extent center..
58940 .text(t('info_panels.measurement.center') + ':');
58941 coordItem.append('span')
58942 .text(dmsCoordinatePair(center));
58943 coordItem.append('span')
58944 .text(decimalCoordinatePair(center));
58948 // single feature, display details..
58949 if (!entity) return;
58950 var geometry = entity.geometry(resolver);
58952 if (geometry === 'line' || geometry === 'area') {
58953 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
58954 feature = entity.asGeoJSON(resolver),
58955 length = radiansToMeters(d3_geoLength(toLineString(feature))),
58956 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
58957 centroid = d3_geoCentroid(feature);
58961 .text(t('info_panels.measurement.geometry') + ':')
58964 closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
58967 if (entity.type !== 'relation') {
58970 .text(t('info_panels.measurement.node_count') + ':')
58972 .text(nodeCount(feature).toLocaleString(locale));
58976 var area = steradiansToSqmeters(entity.area(resolver));
58979 .text(t('info_panels.measurement.area') + ':')
58981 .text(displayArea(area, isImperial));
58987 .text(lengthLabel + ':')
58989 .text(displayLength(length, isImperial));
58993 .text(t('info_panels.measurement.centroid') + ':');
58994 coordItem.append('span')
58995 .text(dmsCoordinatePair(centroid));
58996 coordItem.append('span')
58997 .text(decimalCoordinatePair(centroid));
58999 var toggle = isImperial ? 'imperial' : 'metric';
59003 .text(t('info_panels.measurement.' + toggle))
59005 .attr('class', 'button button-toggle-units')
59006 .on('click', function() {
59007 event.preventDefault();
59008 isImperial = !isImperial;
59009 selection$$1.call(redraw);
59013 var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
59017 .text(t('info_panels.measurement.geometry') + ':')
59019 .text(t('geometry.' + geometry));
59023 .text(centerLabel + ':');
59024 coordItem.append('span')
59025 .text(dmsCoordinatePair(center));
59026 coordItem.append('span')
59027 .text(decimalCoordinatePair(center));
59032 var panel = function(selection$$1) {
59033 selection$$1.call(redraw);
59036 .on('drawn.info-measurement', function() {
59037 selection$$1.call(redraw);
59041 panel.off = function() {
59043 .on('drawn.info-measurement', null);
59046 panel.id = 'measurement';
59047 panel.title = t('info_panels.measurement.title');
59048 panel.key = t('info_panels.measurement.key');
59054 var uiInfoPanels = {
59055 background: uiPanelBackground,
59056 history: uiPanelHistory,
59057 location: uiPanelLocation,
59058 measurement: uiPanelMeasurement,
59061 function uiInfo(context) {
59062 var ids = Object.keys(uiInfoPanels),
59063 wasActive = ['measurement'],
59068 ids.forEach(function(k) {
59070 panels[k] = uiInfoPanels[k](context);
59076 function info(selection$$1) {
59078 function redraw() {
59079 var activeids = ids.filter(function(k) { return active[k]; }).sort();
59081 var containers = infoPanels.selectAll('.panel-container')
59082 .data(activeids, function(k) { return k; });
59085 .style('opacity', 1)
59088 .style('opacity', 0)
59089 .on('end', function(d) {
59091 .call(panels[d].off)
59095 var enter = containers.enter()
59097 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
59100 .style('opacity', 0)
59103 .style('opacity', 1);
59107 .attr('class', 'panel-title fillD2');
59111 .text(function(d) { return panels[d].title; });
59115 .attr('class', 'close')
59116 .on('click', function (d) { toggle(d); })
59117 .call(svgIcon('#icon-close'));
59121 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
59124 // redraw the panels
59125 infoPanels.selectAll('.panel-content')
59126 .each(function(d) {
59127 d3_select(this).call(panels[d]);
59132 function toggle(which) {
59134 event.stopImmediatePropagation();
59135 event.preventDefault();
59138 var activeids = ids.filter(function(k) { return active[k]; });
59140 if (which) { // toggle one
59141 active[which] = !active[which];
59142 if (activeids.length === 1 && activeids[0] === which) { // none active anymore
59143 wasActive = [which];
59145 } else { // toggle all
59146 if (activeids.length) {
59147 wasActive = activeids;
59148 activeids.forEach(function(k) { active[k] = false; });
59150 wasActive.forEach(function(k) { active[k] = true; });
59158 var infoPanels = selection$$1.selectAll('.info-panels')
59161 infoPanels = infoPanels.enter()
59163 .attr('class', 'info-panels')
59164 .merge(infoPanels);
59168 var keybinding = d3keybinding('info')
59169 .on(uiCmd('⌘' + t('info_panels.key')), toggle);
59171 ids.forEach(function(k) {
59172 var key = t('info_panels.' + k + '.key', { default: null });
59175 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
59178 d3_select(document)
59185 function uiModes(context) {
59187 modeAddPoint$$1(context),
59188 modeAddLine$$1(context),
59189 modeAddArea$$1(context)
59193 function editable() {
59194 var mode = context.mode();
59195 return context.editable() && mode && mode.id !== 'save';
59199 return function(selection$$1) {
59200 var buttons = selection$$1.selectAll('button.add-button')
59203 buttons = buttons.enter()
59205 .attr('tabindex', -1)
59206 .attr('class', function(mode) { return mode.id + ' add-button col4'; })
59207 .on('click.mode-buttons', function(mode) {
59208 // When drawing, ignore accidental clicks on mode buttons - #4042
59209 var currMode = context.mode().id;
59210 if (currMode.match(/^draw/) !== null) return;
59212 if (mode.id === currMode) {
59213 context.enter(modeBrowse(context));
59215 context.enter(mode);
59219 .placement('bottom')
59221 .title(function(mode) {
59222 return uiTooltipHtml(mode.description, mode.key);
59227 .each(function(d) {
59229 .call(svgIcon('#icon-' + d.button, 'pre-text'));
59234 .attr('class', 'label')
59235 .text(function(mode) { return mode.title; });
59238 .on('enter.editor', function(entered) {
59239 selection$$1.selectAll('button.add-button')
59240 .classed('active', function(mode) { return entered.button === mode.button; });
59241 context.container()
59242 .classed('mode-' + entered.id, true);
59246 .on('exit.editor', function(exited) {
59247 context.container()
59248 .classed('mode-' + exited.id, false);
59251 var keybinding = d3keybinding('mode-buttons');
59253 modes.forEach(function(mode) {
59254 keybinding.on(mode.key, function() {
59256 if (mode.id === context.mode().id) {
59257 context.enter(modeBrowse(context));
59259 context.enter(mode);
59265 d3_select(document)
59269 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
59272 .on('move.modes', debouncedUpdate)
59273 .on('drawn.modes', debouncedUpdate);
59276 .on('enter.modes', update);
59280 function update() {
59281 selection$$1.selectAll('button.add-button')
59282 .property('disabled', !editable());
59287 function uiNotice(context) {
59289 return function(selection$$1) {
59290 var div = selection$$1
59292 .attr('class', 'notice');
59296 .attr('class', 'zoom-to notice fillD')
59297 .on('click', function() {
59298 context.map().zoomEase(context.minEditableZoom());
59300 .on('wheel', function() { // let wheel events pass through #4482
59301 var e2 = new WheelEvent(event.type, event);
59302 context.surface().node().dispatchEvent(e2);
59306 .call(svgIcon('#icon-plus', 'pre-text'))
59308 .attr('class', 'label')
59309 .text(t('zoom_in_edit'));
59312 function disableTooHigh() {
59313 var canEdit = context.map().zoom() >= context.minEditableZoom();
59314 div.style('display', canEdit ? 'none' : 'block');
59318 .on('move.notice', debounce(disableTooHigh, 500));
59324 function uiRestore(context) {
59326 return function(selection) {
59327 if (!context.history().lock() || !context.history().restorableChanges())
59330 var modalSelection = uiModal(selection, true);
59332 modalSelection.select('.modal')
59333 .attr('class', 'modal fillL col6');
59335 var introModal = modalSelection.select('.content');
59338 .attr('class','cf');
59342 .attr('class', 'modal-section')
59344 .text(t('restore.heading'));
59348 .attr('class','modal-section')
59350 .text(t('restore.description'));
59352 var buttonWrap = introModal
59354 .attr('class', 'modal-actions cf');
59356 var restore = buttonWrap
59358 .attr('class', 'restore col6')
59359 .on('click', function() {
59360 context.history().restore();
59361 modalSelection.remove();
59366 .attr('class', 'logo logo-restore')
59368 .attr('xlink:href', '#logo-restore');
59372 .text(t('restore.restore'));
59374 var reset = buttonWrap
59376 .attr('class', 'reset col6')
59377 .on('click', function() {
59378 context.history().clearSaved();
59379 modalSelection.remove();
59384 .attr('class', 'logo logo-reset')
59386 .attr('xlink:href', '#logo-reset');
59390 .text(t('restore.reset'));
59392 restore.node().focus();
59396 function uiSave(context) {
59397 var history = context.history();
59398 var key = uiCmd('⌘S');
59401 function saving() {
59402 var mode = context.mode();
59403 return mode && mode.id === 'save';
59408 event.preventDefault();
59409 if (!context.inIntro() && !saving() && history.hasChanges()) {
59410 context.enter(modeSave$$1(context));
59415 function getBackground(numChanges) {
59417 if (numChanges === 0) {
59419 } else if (numChanges <= 50) {
59420 step = numChanges / 50;
59421 return d3_interpolateRgb('#fff', '#ff8')(step); // white -> yellow
59423 step = Math.min((numChanges - 50) / 50, 1.0);
59424 return d3_interpolateRgb('#ff8', '#f88')(step); // yellow -> red
59429 return function(selection$$1) {
59430 var numChanges = 0;
59432 function updateCount() {
59433 var _ = history.difference().summary().length;
59434 if (_ === numChanges) return;
59438 .title(uiTooltipHtml(
59439 t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
59442 var background = getBackground(numChanges);
59445 .classed('disabled', numChanges === 0)
59446 .classed('has-count', numChanges > 0)
59447 .style('background', background);
59449 button.select('span.count')
59451 .style('background', background)
59452 .style('border-color', background);
59456 var tooltipBehavior = tooltip()
59457 .placement('bottom')
59459 .title(uiTooltipHtml(t('save.no_changes'), key));
59461 var button = selection$$1
59463 .attr('class', 'save col12 disabled')
59464 .attr('tabindex', -1)
59466 .call(tooltipBehavior);
59469 .call(svgIcon('#icon-save', 'pre-text'))
59471 .attr('class', 'label')
59472 .text(t('save.title'));
59476 .attr('class', 'count')
59482 var keybinding = d3keybinding('uiSave')
59483 .on(key, save, true);
59485 d3_select(document)
59489 .on('change.save', updateCount);
59492 .on('enter.save', function() {
59493 button.property('disabled', saving());
59494 if (saving()) button.call(tooltipBehavior.hide);
59499 function uiScale(context) {
59500 var projection = context.projection,
59501 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
59506 function scaleDefs(loc1, loc2) {
59507 var lat = (loc2[1] + loc1[1]) / 2,
59508 conversion = (isImperial ? 3.28084 : 1),
59509 dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
59510 scale = { dist: 0, px: 0, text: '' },
59511 buckets, i, val, dLon;
59514 buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
59516 buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
59519 // determine a user-friendly endpoint for the scale
59520 for (i = 0; i < buckets.length; i++) {
59523 scale.dist = Math.floor(dist / val) * val;
59526 scale.dist = +dist.toFixed(2);
59530 dLon = geoMetersToLon(scale.dist / conversion, lat);
59531 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
59533 scale.text = displayLength(scale.dist / conversion, isImperial);
59539 function update(selection) {
59540 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
59541 var dims = context.map().dimensions(),
59542 loc1 = projection.invert([0, dims[1]]),
59543 loc2 = projection.invert([maxLength, dims[1]]),
59544 scale = scaleDefs(loc1, loc2);
59546 selection.select('#scale-path')
59547 .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
59549 selection.select('#scale-textgroup')
59550 .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
59552 selection.select('#scale-text')
59557 return function(selection) {
59558 function switchUnits() {
59559 isImperial = !isImperial;
59560 selection.call(update);
59563 var scalegroup = selection.append('svg')
59564 .attr('id', 'scale')
59565 .on('click', switchUnits)
59567 .attr('transform', 'translate(10,11)');
59571 .attr('id', 'scale-path');
59575 .attr('id', 'scale-textgroup')
59577 .attr('id', 'scale-text');
59579 selection.call(update);
59581 context.map().on('move.scale', function() {
59587 var pair_1 = pair$1;
59589 function search(x, dims, r) {
59590 if (!dims) dims = 'NSEW';
59591 if (typeof x !== 'string') return { val: null, regex: r };
59593 r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
59596 if (!m) return { val: null, regex: r };
59598 var dim = m[1] || m[5];
59599 if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
59602 val: (((m[2]) ? parseFloat(m[2]) : 0) +
59603 ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
59604 ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
59605 ((dim === 'S' || dim === 'W') ? -1 : 1),
59612 function pair$1(x, dims) {
59614 var one = search(x, dims);
59615 if (one.val === null) return null;
59616 var two = search(x, dims, one.regex);
59617 if (two.val === null) return null;
59618 // null if one/two are not contiguous.
59619 if (one.raw + two.raw !== x) return null;
59621 return swapdim(one.val, two.val, one.dim);
59623 return [one.val, two.val];
59627 function swapdim(a, b, dim) {
59628 if (dim === 'N' || dim === 'S') return [a, b];
59629 if (dim === 'W' || dim === 'E') return [b, a];
59632 function uiFeatureList(context) {
59633 var keybinding = d3keybinding('uiFeatureList');
59634 var _geocodeResults;
59637 function featureList(selection$$1) {
59638 var header = selection$$1
59640 .attr('class', 'header fillL cf');
59644 .text(t('inspector.feature_list'));
59646 var searchWrap = selection$$1
59648 .attr('class', 'search-header');
59650 var search = searchWrap
59652 .attr('placeholder', t('inspector.search'))
59653 .attr('type', 'search')
59655 .on('keypress', keypress)
59656 .on('keydown', keydown)
59657 .on('input', inputevent);
59660 .call(svgIcon('#icon-search', 'pre-text'));
59662 var listWrap = selection$$1
59664 .attr('class', 'inspector-body');
59666 var list = listWrap
59668 .attr('class', 'feature-list cf');
59671 .on('exit.feature-list', clearSearch);
59673 .on('drawn.feature-list', mapDrawn);
59676 .on(uiCmd('⌘F'), focusSearch);
59678 d3_select(document)
59682 function focusSearch() {
59683 var mode = context.mode() && context.mode().id;
59684 if (mode !== 'browse') return;
59686 event.preventDefault();
59687 search.node().focus();
59691 function keydown() {
59692 if (event.keyCode === 27) { // escape
59693 search.node().blur();
59698 function keypress() {
59699 var q = search.property('value'),
59700 items = list.selectAll('.feature-list-item');
59701 if (event.keyCode === 13 && q.length && items.size()) { // return
59702 click(items.datum());
59707 function inputevent() {
59708 _geocodeResults = undefined;
59713 function clearSearch() {
59714 search.property('value', '');
59719 function mapDrawn(e) {
59726 function features() {
59729 var graph = context.graph();
59730 var q = search.property('value').toLowerCase();
59732 if (!q) return result;
59734 var idMatch = q.match(/^([nwr])([0-9]+)$/);
59739 geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
59740 type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
59745 var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
59747 if (locationMatch) {
59748 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
59752 type: t('inspector.location'),
59753 name: dmsCoordinatePair([loc[1], loc[0]]),
59758 function addEntity(entity) {
59759 if (entity.id in entities || result.length > 200)
59762 entities[entity.id] = true;
59764 var name = utilDisplayName(entity) || '';
59765 if (name.toLowerCase().indexOf(q) >= 0) {
59766 var matched = context.presets().match(entity, graph);
59767 var type = (matched && matched.name()) || utilDisplayType(entity.id);
59772 geometry: context.geometry(entity.id),
59778 graph.parentRelations(entity).forEach(function(parent) {
59783 var visible = context.surface().selectAll('.point, .line, .area').nodes();
59784 for (var i = 0; i < visible.length && result.length <= 200; i++) {
59785 var datum = visible[i].__data__;
59786 var entity = datum && datum.properties && datum.properties.entity;
59787 if (entity) { addEntity(entity); }
59790 (_geocodeResults || []).forEach(function(d) {
59791 if (d.osm_type && d.osm_id) { // some results may be missing these - #1890
59793 // Make a temporary osmEntity so we can preset match
59794 // and better localize the search result - #4725
59795 var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
59797 tags[d.class] = d.type;
59799 var attrs = { id: id, type: d.osm_type, tags: tags };
59800 if (d.osm_type === 'way') { // for ways, add some fake closed nodes
59801 attrs.nodes = ['a','a']; // so that geometry area is possible
59804 var tempEntity = osmEntity$$1(attrs);
59805 var tempGraph = coreGraph$$1([tempEntity]);
59806 var matched = context.presets().match(tempEntity, tempGraph);
59807 var type = (matched && matched.name()) || utilDisplayType(id);
59811 geometry: tempEntity.geometry(tempGraph),
59813 name: d.display_name,
59814 extent: new geoExtent$$1(
59815 [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
59816 [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
59825 function drawList() {
59826 var value = search.property('value');
59827 var results = features();
59829 list.classed('filtered', value.length);
59831 var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
59833 var resultsIndicator = list.selectAll('.no-results-item')
59837 .property('disabled', true)
59838 .attr('class', 'no-results-item')
59839 .call(svgIcon('#icon-alert', 'pre-text'));
59841 resultsIndicator.append('span')
59842 .attr('class', 'entity-name');
59844 list.selectAll('.no-results-item .entity-name')
59845 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
59847 if (services.geocoder) {
59848 list.selectAll('.geocode-item')
59852 .attr('class', 'geocode-item')
59853 .on('click', geocoderSearch)
59855 .attr('class', 'label')
59857 .attr('class', 'entity-name')
59858 .text(t('geocoder.search'));
59861 list.selectAll('.no-results-item')
59862 .style('display', (value.length && !results.length) ? 'block' : 'none');
59864 list.selectAll('.geocode-item')
59865 .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
59867 list.selectAll('.feature-list-item')
59871 var items = list.selectAll('.feature-list-item')
59872 .data(results, function(d) { return d.id; });
59874 var enter = items.enter()
59875 .insert('button', '.geocode-item')
59876 .attr('class', 'feature-list-item')
59877 .on('mouseover', mouseover)
59878 .on('mouseout', mouseout)
59879 .on('click', click);
59883 .attr('class', 'label');
59886 .each(function(d) {
59888 .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
59893 .attr('class', 'entity-type')
59894 .text(function(d) { return d.type; });
59898 .attr('class', 'entity-name')
59899 .text(function(d) { return d.name; });
59902 .style('opacity', 0)
59904 .style('opacity', 1);
59913 function mouseover(d) {
59914 if (d.id === -1) return;
59916 context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
59917 .classed('hover', true);
59921 function mouseout() {
59922 context.surface().selectAll('.hover')
59923 .classed('hover', false);
59927 function click(d) {
59928 event.preventDefault();
59930 context.map().centerZoom([d.location[1], d.location[0]], 20);
59932 else if (d.entity) {
59933 if (d.entity.type === 'node') {
59934 context.map().center(d.entity.loc);
59935 } else if (d.entity.type === 'way') {
59936 var center = context.projection(context.map().center());
59937 var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
59938 context.map().center(edge.loc);
59940 context.enter(modeSelect(context, [d.entity.id]));
59942 context.zoomToEntity(d.id);
59947 function geocoderSearch() {
59948 services.geocoder.search(search.property('value'), function (err, resp) {
59949 _geocodeResults = resp || [];
59956 return featureList;
59959 function uiPresetIcon() {
59960 var preset, geometry;
59963 function presetIcon(selection$$1) {
59964 selection$$1.each(render);
59968 function getIcon(p, geom) {
59971 else if (geom === 'line')
59972 return 'other-line';
59973 else if (geom === 'vertex')
59974 return p.isFallback() ? '' : 'poi-vertex';
59976 return 'marker-stroked';
59980 function render() {
59981 var selection$$1 = d3_select(this),
59982 p = preset.apply(this, arguments),
59983 geom = geometry.apply(this, arguments),
59984 picon = getIcon(p, geom),
59985 isPoi = picon.match(/^poi-/) !== null,
59986 isMaki = dataFeatureIcons.indexOf(picon) !== -1,
59987 isFramed = (geom === 'area' || geom === 'verex');
59990 function tag_classes(p) {
59992 for (var i in p.tags) {
59994 if (p.tags[i] !== '*') {
59995 s += ' tag-' + i + '-' + p.tags[i];
60002 var fill = selection$$1.selectAll('.preset-icon-fill')
60005 fill = fill.enter()
60010 .attr('class', function() {
60011 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
60015 var areaFrame = selection$$1.selectAll('.preset-icon-frame')
60016 .data((geom === 'area') ? [0] : []);
60021 areaFrame = areaFrame.enter()
60023 .attr('class', 'preset-icon-frame')
60024 .call(svgIcon('#preset-icon-frame'));
60027 var icon = selection$$1.selectAll('.preset-icon')
60030 icon = icon.enter()
60032 .attr('class', 'preset-icon')
60037 .attr('class', 'preset-icon preset-icon-' +
60038 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
60041 icon.selectAll('svg')
60042 .attr('class', function() {
60043 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
60046 icon.selectAll('use')
60047 .attr('href', '#' + picon + (isMaki ? '-15' : ''));
60051 presetIcon.preset = function(_) {
60052 if (!arguments.length) return preset;
60053 preset = utilFunctor(_);
60058 presetIcon.geometry = function(_) {
60059 if (!arguments.length) return geometry;
60060 geometry = utilFunctor(_);
60067 function d3combobox() {
60068 var dispatch$$1 = dispatch('accept');
60069 var _container = d3_select(document.body);
60071 var _suggestions = [];
60073 var _caseSensitive = false;
60075 var _fetcher = function(val, cb) {
60076 cb(_data.filter(function(d) {
60080 .indexOf(val.toLowerCase()) !== -1;
60084 var combobox = function(input, attachTo) {
60086 var wrapper = _container
60087 .selectAll('div.combobox')
60088 .filter(function(d) { return d === input.node(); });
60089 var shown = !wrapper.empty();
60090 var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
60093 .classed('combobox-input', true)
60094 .on('focus.typeahead', focus)
60095 .on('blur.typeahead', blur)
60096 .on('keydown.typeahead', keydown)
60097 .on('keyup.typeahead', keyup)
60098 .on('input.typeahead', change)
60100 var parent = this.parentNode;
60101 var sibling = this.nextSibling;
60103 var caret = d3_select(parent).selectAll('.combobox-caret')
60104 .filter(function(d) { return d === input.node(); })
60105 .data([input.node()]);
60107 caret = caret.enter()
60108 .insert('div', function() { return sibling; })
60109 .attr('class', 'combobox-caret')
60113 .on('mousedown', function () {
60114 // prevent the form element from blurring. it blurs
60116 event.stopPropagation();
60117 event.preventDefault();
60119 input.node().focus();
60128 fetch(value(), render);
60132 window.setTimeout(hide, 150);
60137 wrapper = _container
60138 .insert('div', ':first-child')
60139 .datum(input.node())
60140 .attr('class', 'combobox')
60141 .style('position', 'absolute')
60142 .style('display', 'block')
60143 .style('left', '0px')
60144 .on('mousedown', function () {
60145 // prevent moving focus out of the text field
60146 event.preventDefault();
60150 .on('scroll.combobox', render, true);
60162 .on('scroll.combobox', null);
60168 function keydown() {
60169 switch (event.keyCode) {
60170 // backspace, delete
60173 input.on('input.typeahead', function() {
60176 var start = input.property('selectionStart');
60177 input.node().setSelectionRange(start, start);
60178 input.on('input.typeahead', change);
60183 wrapper.selectAll('a.selected').each(function (d) {
60184 dispatch$$1.call('accept', this, d);
60190 event.preventDefault();
60194 if (tagName === 'textarea' && !shown) return;
60196 event.preventDefault();
60200 if (tagName === 'textarea' && !shown) return;
60202 event.preventDefault();
60205 event.stopPropagation();
60209 switch (event.keyCode) {
60216 wrapper.selectAll('a.selected').each(function (d) {
60217 dispatch$$1.call('accept', this, d);
60224 function change() {
60225 fetch(value(), function() {
60226 if (input.property('selectionEnd') === input.property('value').length) {
60233 function nav(dir) {
60234 if (!_suggestions.length) return;
60235 idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
60236 input.property('value', _suggestions[idx].value);
60242 var value = input.property('value');
60243 var start = input.property('selectionStart');
60244 var end = input.property('selectionEnd');
60246 if (start && end) {
60247 value = value.substring(0, start);
60253 function fetch(v, cb) {
60254 _fetcher.call(input, v, function(_) {
60260 function autocomplete() {
60261 var v = _caseSensitive ? value() : value().toLowerCase();
60266 var suggestion, compare;
60268 for (var i = 0; i < _suggestions.length; i++) {
60269 suggestion = _suggestions[i].value;
60270 compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
60272 // if search string matches suggestion exactly, pick it..
60273 if (compare === v) {
60277 // otherwise lock in the first result that starts with the search string..
60278 } else if (best === -1 && compare.indexOf(v) === 0) {
60285 suggestion = _suggestions[best].value;
60286 input.property('value', suggestion);
60287 input.node().setSelectionRange(v.length, suggestion.length);
60291 function render() {
60292 if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
60299 var options = wrapper
60300 .selectAll('a.combobox-option')
60301 .data(_suggestions, function(d) { return d.value; });
60308 .attr('class', 'combobox-option')
60309 .text(function(d) { return d.value; })
60311 .attr('title', function(d) { return d.title; })
60312 .classed('selected', function(d, i) { return i === idx; })
60313 .on('mouseover', select$$1)
60314 .on('click', accept)
60318 var node = attachTo ? attachTo.node() : input.node();
60319 var rect = node.getBoundingClientRect();
60322 .style('left', (rect.left + 5) + 'px')
60323 .style('width', (rect.width - 10) + 'px')
60324 .style('top', rect.height + rect.top + 'px');
60327 function select$$1(d, i) {
60332 function ensureVisible() {
60333 var node = wrapper.selectAll('a.selected').node();
60334 if (node) node.scrollIntoView();
60337 function accept(d) {
60338 if (!shown) return;
60339 input.property('value', d.value);
60340 utilTriggerEvent(input, 'change');
60341 dispatch$$1.call('accept', this, d);
60346 combobox.fetcher = function(_) {
60347 if (!arguments.length) return _fetcher;
60352 combobox.data = function(_) {
60353 if (!arguments.length) return _data;
60358 combobox.minItems = function(_) {
60359 if (!arguments.length) return _minItems;
60364 combobox.caseSensitive = function(_) {
60365 if (!arguments.length) return _caseSensitive;
60366 _caseSensitive = _;
60370 combobox.container = function(_) {
60371 if (!arguments.length) return _container;
60376 return utilRebind(combobox, dispatch$$1, 'on');
60380 d3combobox.off = function(input) {
60382 .on('focus.typeahead', null)
60383 .on('blur.typeahead', null)
60384 .on('keydown.typeahead', null)
60385 .on('keyup.typeahead', null)
60386 .on('input.typeahead', null)
60388 d3_select(this.parentNode).selectAll('.combobox-caret')
60389 .filter(function(d) { return d === input.node(); })
60390 .on('mousedown', null);
60394 .on('scroll.combobox', null);
60397 function uiRawMemberEditor(context) {
60398 var taginfo = services.taginfo,
60402 function selectMember(d) {
60403 event.preventDefault();
60404 context.enter(modeSelect(context, [d.id]));
60408 function changeRole(d) {
60409 var role = d3_select(this).property('value');
60410 var member = { id: d.id, type: d.type, role: role };
60412 actionChangeMember(d.relation.id, member, d.index),
60413 t('operations.change_role.annotation')
60418 function deleteMember(d) {
60420 actionDeleteMember(d.relation.id, d.index),
60421 t('operations.delete_member.annotation')
60424 if (!context.hasEntity(d.relation.id)) {
60425 context.enter(modeBrowse(context));
60430 function rawMemberEditor(selection$$1) {
60431 var entity = context.entity(_entityID),
60434 entity.members.slice(0, 1000).forEach(function(member, index) {
60441 member: context.hasEntity(member.id)
60445 var gt = entity.members.length > 1000 ? '>' : '';
60446 selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
60447 .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
60449 .updatePreference(false)
60450 .on('toggled', function(expanded) {
60451 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60457 function content(wrap) {
60458 var list = wrap.selectAll('.member-list')
60461 list = list.enter()
60463 .attr('class', 'member-list')
60467 var items = list.selectAll('li')
60468 .data(memberships, function(d) {
60469 return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
60470 (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
60477 var enter = items.enter()
60479 .attr('class', 'member-row form-field')
60480 .classed('member-incomplete', function(d) { return !d.member; });
60483 .each(function(d) {
60485 var label = d3_select(this).append('label')
60486 .attr('class', 'form-label')
60489 .on('click', selectMember);
60491 label.append('span')
60492 .attr('class', 'member-entity-type')
60493 .text(function(d) {
60494 var matched = context.presets().match(d.member, context.graph());
60495 return (matched && matched.name()) || utilDisplayType(d.member.id);
60498 label.append('span')
60499 .attr('class', 'member-entity-name')
60500 .text(function(d) { return utilDisplayName(d.member); });
60503 d3_select(this).append('label')
60504 .attr('class', 'form-label')
60505 .text(t('inspector.incomplete', { id: d.id }));
60511 .attr('class', 'member-role')
60512 .property('type', 'text')
60513 .attr('maxlength', 255)
60514 .attr('placeholder', t('inspector.role'))
60516 .property('value', function(d) { return d.role; })
60517 .on('change', changeRole);
60521 .attr('tabindex', -1)
60522 .attr('class', 'remove button-input-action member-delete minor')
60523 .on('click', deleteMember)
60524 .call(svgIcon('#operation-delete'));
60527 enter.each(bindTypeahead);
60531 function bindTypeahead(d) {
60532 var row = d3_select(this),
60533 role = row.selectAll('input.member-role');
60535 function sort(value, data) {
60536 var sameletter = [],
60538 for (var i = 0; i < data.length; i++) {
60539 if (data[i].value.substring(0, value.length) === value) {
60540 sameletter.push(data[i]);
60542 other.push(data[i]);
60545 return sameletter.concat(other);
60548 role.call(d3combobox()
60549 .container(context.container())
60550 .fetcher(function(role, callback) {
60551 var rtype = entity.tags.type;
60554 rtype: rtype || '',
60555 geometry: context.geometry(d.member.id),
60557 }, function(err, data) {
60558 if (!err) callback(sort(role, data));
60564 function unbind() {
60565 var row = d3_select(this);
60567 row.selectAll('input.member-role')
60568 .call(d3combobox.off);
60574 rawMemberEditor.entityID = function(_) {
60575 if (!arguments.length) return _entityID;
60577 return rawMemberEditor;
60581 return rawMemberEditor;
60584 function uiRawMembershipEditor(context) {
60585 var taginfo = services.taginfo,
60590 function selectRelation(d) {
60591 event.preventDefault();
60592 context.enter(modeSelect(context, [d.relation.id]));
60596 function changeRole(d) {
60597 var role = d3_select(this).property('value');
60599 actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
60600 t('operations.change_role.annotation')
60605 function addMembership(d, role) {
60606 _showBlank = false;
60608 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
60612 actionAddMember(d.relation.id, member),
60613 t('operations.add_member.annotation')
60617 var relation = osmRelation();
60619 actionAddEntity(relation),
60620 actionAddMember(relation.id, member),
60621 t('operations.add.annotation.relation')
60624 context.enter(modeSelect(context, [relation.id]));
60629 function deleteMembership(d) {
60631 actionDeleteMember(d.relation.id, d.index),
60632 t('operations.delete_member.annotation')
60637 function relations(q) {
60638 var newRelation = { relation: null, value: t('inspector.new_relation') };
60640 var graph = context.graph();
60642 context.intersects(context.extent()).forEach(function(entity) {
60643 if (entity.type !== 'relation' || entity.id === _entityID)
60646 var matched = context.presets().match(entity, graph),
60647 presetName = (matched && matched.name()) || t('inspector.relation'),
60648 entityName = utilDisplayName(entity) || '';
60650 var value = presetName + ' ' + entityName;
60651 if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
60654 result.push({ relation: entity, value: value });
60657 result.sort(function(a, b) {
60658 return osmRelation.creationOrder(a.relation, b.relation);
60661 // Dedupe identical names by appending relation id - see #2891
60662 var dupeGroups = filter(
60663 groupBy(result, 'value'),
60664 function(v) { return v.length > 1; }
60667 dupeGroups.forEach(function(group) {
60668 group.forEach(function(obj) {
60669 obj.value += ' ' + obj.relation.id;
60673 forEach(result, function(obj) {
60674 obj.title = obj.value;
60677 result.unshift(newRelation);
60682 function rawMembershipEditor(selection$$1) {
60683 var entity = context.entity(_entityID),
60684 parents = context.graph().parentRelations(entity),
60687 parents.slice(0, 1000).forEach(function(relation) {
60688 relation.members.forEach(function(member, index) {
60689 if (member.id === entity.id) {
60690 memberships.push({ relation: relation, member: member, index: index });
60695 var gt = parents.length > 1000 ? '>' : '';
60696 selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
60697 .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
60699 .updatePreference(false)
60700 .on('toggled', function(expanded) {
60701 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
60707 function content(wrap) {
60708 var list = wrap.selectAll('.member-list')
60711 list = list.enter()
60713 .attr('class', 'member-list')
60717 var items = list.selectAll('li.member-row-normal')
60718 .data(memberships, function(d) {
60719 return osmEntity$$1.key(d.relation) + ',' + d.index;
60726 var enter = items.enter()
60728 .attr('class', 'member-row member-row-normal form-field');
60732 .attr('class', 'form-label')
60735 .on('click', selectRelation);
60739 .attr('class', 'member-entity-type')
60740 .text(function(d) {
60741 var matched = context.presets().match(d.relation, context.graph());
60742 return (matched && matched.name()) || t('inspector.relation');
60747 .attr('class', 'member-entity-name')
60748 .text(function(d) { return utilDisplayName(d.relation); });
60752 .attr('class', 'member-role')
60753 .property('type', 'text')
60754 .attr('maxlength', 255)
60755 .attr('placeholder', t('inspector.role'))
60757 .property('value', function(d) { return d.member.role; })
60758 .on('change', changeRole);
60762 .attr('tabindex', -1)
60763 .attr('class', 'remove button-input-action member-delete minor')
60764 .on('click', deleteMembership)
60765 .call(svgIcon('#operation-delete'));
60768 enter.each(bindTypeahead);
60772 var newrow = list.selectAll('.member-row-new')
60773 .data(_showBlank ? [0] : []);
60778 enter = newrow.enter()
60780 .attr('class', 'member-row member-row-new form-field');
60784 .attr('type', 'text')
60785 .attr('class', 'member-entity-input')
60790 .attr('class', 'member-role')
60791 .property('type', 'text')
60792 .attr('maxlength', 255)
60793 .attr('placeholder', t('inspector.role'))
60795 .on('change', changeRole);
60799 .attr('tabindex', -1)
60800 .attr('class', 'remove button-input-action member-delete minor')
60801 .on('click', deleteMembership)
60802 .call(svgIcon('#operation-delete'));
60807 newrow.selectAll('.member-entity-input')
60809 .container(context.container())
60811 .fetcher(function(value, callback) { callback(relations(value)); })
60812 .on('accept', onAccept)
60816 var addrel = wrap.selectAll('.add-relation')
60819 addrel = addrel.enter()
60821 .attr('class', 'add-relation')
60825 .call(svgIcon('#icon-plus', 'light'))
60826 .on('click', function() {
60829 list.selectAll('.member-entity-input').node().focus();
60833 function onAccept(d) {
60834 var role = list.selectAll('.member-row-new .member-role').property('value');
60835 addMembership(d, role);
60839 function bindTypeahead(d) {
60840 var row = d3_select(this),
60841 role = row.selectAll('input.member-role');
60843 function sort(value, data) {
60844 var sameletter = [],
60846 for (var i = 0; i < data.length; i++) {
60847 if (data[i].value.substring(0, value.length) === value) {
60848 sameletter.push(data[i]);
60850 other.push(data[i]);
60853 return sameletter.concat(other);
60856 role.call(d3combobox()
60857 .container(context.container())
60858 .fetcher(function(role, callback) {
60859 var rtype = d.relation.tags.type;
60862 rtype: rtype || '',
60863 geometry: context.geometry(_entityID),
60865 }, function(err, data) {
60866 if (!err) callback(sort(role, data));
60872 function unbind() {
60873 var row = d3_select(this);
60875 row.selectAll('input.member-role')
60876 .call(d3combobox.off);
60882 rawMembershipEditor.entityID = function(_) {
60883 if (!arguments.length) return _entityID;
60885 return rawMembershipEditor;
60889 return rawMembershipEditor;
60892 function uiTagReference(tag) {
60893 var taginfo = services.taginfo;
60894 var tagReference = {};
60896 var _button = d3_select(null);
60897 var _body = d3_select(null);
60902 function findLocal(data) {
60903 var locale = utilDetect().locale.toLowerCase();
60906 if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br'
60907 localized = find$1(data, function(d) {
60908 return d.lang.toLowerCase() === locale;
60910 if (localized) return localized;
60913 // try the non-regional version of a language, like
60914 // 'en' if the language is 'en-US'
60915 if (locale.indexOf('-') !== -1) {
60916 var first = locale.split('-')[0];
60917 localized = find$1(data, function(d) {
60918 return d.lang.toLowerCase() === first;
60920 if (localized) return localized;
60923 // finally fall back to english
60924 return find$1(data, function(d) {
60925 return d.lang.toLowerCase() === 'en';
60930 function load(param) {
60931 if (!taginfo) return;
60934 .classed('tag-reference-loading', true);
60936 taginfo.docs(param, function show(err, data) {
60938 if (!err && data) {
60939 docs = findLocal(data);
60944 if (!docs || !docs.title) {
60945 if (param.hasOwnProperty('value')) {
60946 load(omit(param, 'value')); // retry with key only
60950 .attr('class', 'tag-reference-description')
60951 .text(t('inspector.no_documentation_key'));
60957 if (docs.image && docs.image.thumb_url_prefix) {
60960 .attr('class', 'tag-reference-wiki-image')
60961 .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
60962 .on('load', function() { done(); })
60963 .on('error', function() { d3_select(this).remove(); done(); });
60970 .attr('class', 'tag-reference-description')
60971 .text(docs.description || t('inspector.documentation_redirect'));
60975 .attr('class', 'tag-reference-link')
60976 .attr('target', '_blank')
60977 .attr('tabindex', -1)
60978 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
60979 .call(svgIcon('#icon-out-link', 'inline'))
60981 .text(t('inspector.reference'));
60983 // Add link to info about "good changeset comments" - #2923
60984 if (param.key === 'comment') {
60987 .attr('class', 'tag-reference-comment-link')
60988 .attr('target', '_blank')
60989 .attr('tabindex', -1)
60990 .call(svgIcon('#icon-out-link', 'inline'))
60991 .attr('href', t('commit.about_changeset_comments_link'))
60993 .text(t('commit.about_changeset_comments'));
61003 .classed('tag-reference-loading', false);
61006 .classed('expanded', true)
61009 .style('max-height', '200px')
61010 .style('opacity', '1');
61020 .style('max-height', '0px')
61021 .style('opacity', '0')
61022 .on('end', function () {
61023 _body.classed('expanded', false);
61030 tagReference.button = function(selection$$1) {
61031 _button = selection$$1.selectAll('.tag-reference-button')
61034 _button = _button.enter()
61036 .attr('class', 'tag-reference-button')
61037 .attr('tabindex', -1)
61038 .call(svgIcon('#icon-inspect'))
61042 .on('click', function () {
61043 event.stopPropagation();
61044 event.preventDefault();
61047 } else if (_loaded) {
61056 tagReference.body = function(selection$$1) {
61057 var tagid = tag.rtype || (tag.key + '-' + tag.value);
61058 _body = selection$$1.selectAll('.tag-reference-body')
61059 .data([tagid], function(d) { return d; });
61064 _body = _body.enter()
61066 .attr('class', 'tag-reference-body cf')
61067 .style('max-height', '0')
61068 .style('opacity', '0')
61071 if (_showing === false) {
61077 tagReference.showing = function(_) {
61078 if (!arguments.length) return _showing;
61080 return tagReference;
61084 return tagReference;
61087 function uiRawTagEditor(context) {
61088 var taginfo = services.taginfo,
61089 dispatch$$1 = dispatch('change'),
61090 _readOnlyTags = [],
61091 _showBlank = false,
61092 _updatePreference = true,
61101 function rawTagEditor(selection$$1) {
61102 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
61104 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
61105 .title(t('inspector.all_tags') + ' (' + count + ')')
61106 .on('toggled', toggled)
61107 .updatePreference(_updatePreference)
61110 // Sometimes we want to force the raw_tag_editor to be opened/closed..
61111 // When undefined, uiDisclosure will use the user's stored preference.
61112 if (_expanded !== undefined) {
61113 disclosure.expanded(_expanded);
61116 selection$$1.call(disclosure);
61118 function toggled(expanded) {
61119 _expanded = expanded;
61121 selection$$1.node().parentNode.scrollTop += 200;
61127 function content(wrap) {
61128 var entries = map$3(_tags, function(v, k) {
61129 return { key: k, value: v };
61132 if (!entries.length || _showBlank) {
61133 _showBlank = false;
61134 entries.push({key: '', value: ''});
61138 var list = wrap.selectAll('.tag-list')
61141 list = list.enter()
61143 .attr('class', 'tag-list')
61146 var newTag = wrap.selectAll('.add-tag')
61151 .attr('class', 'add-tag')
61152 .on('click', addTag)
61153 .call(svgIcon('#icon-plus', 'light'));
61156 var items = list.selectAll('.tag-row')
61157 .data(entries, function(d) { return d.key; });
61165 var enter = items.enter()
61167 .attr('class', 'tag-row cf')
61168 .classed('readonly', isReadOnly);
61172 .attr('class', 'key-wrap')
61174 .property('type', 'text')
61175 .attr('class', 'key')
61176 .attr('maxlength', 255)
61178 .on('blur', keyChange)
61179 .on('change', keyChange);
61183 .attr('class', 'input-wrap-position')
61185 .property('type', 'text')
61186 .attr('class', 'value')
61187 .attr('maxlength', 255)
61189 .on('blur', valueChange)
61190 .on('change', valueChange)
61191 .on('keydown.push-more', pushMore);
61195 .attr('tabindex', -1)
61196 .attr('class', 'remove minor')
61197 .call(svgIcon('#operation-delete'));
61204 .sort(function(a, b) {
61205 return (a.key === _newRow && b.key !== _newRow) ? 1
61206 : (a.key !== _newRow && b.key === _newRow) ? -1
61207 : d3_ascending(a.key, b.key);
61211 .each(function(tag) {
61212 var row = d3_select(this),
61213 key = row.select('input.key'), // propagate bound data to child
61214 value = row.select('input.value'); // propagate bound data to child
61216 if (_entityID && taginfo) {
61217 bindTypeahead(key, value);
61220 var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
61223 if (isRelation && tag.key === 'type') {
61224 reference = uiTagReference({ rtype: tag.value }, context);
61226 reference = uiTagReference({ key: tag.key, value: tag.value }, context);
61229 if (_state === 'hover') {
61230 reference.showing(false);
61234 .call(reference.button)
61235 .call(reference.body);
61238 items.selectAll('input.key')
61239 .attr('title', function(d) { return d.key; })
61240 .call(utilGetSetValue, function(d) { return d.key; })
61241 .property('disabled', isReadOnly);
61243 items.selectAll('input.value')
61244 .attr('title', function(d) { return d.value; })
61245 .call(utilGetSetValue, function(d) { return d.value; })
61246 .property('disabled', isReadOnly);
61248 items.selectAll('button.remove')
61249 .on('click', removeTag);
61253 function isReadOnly(d) {
61254 for (var i = 0; i < _readOnlyTags.length; i++) {
61255 if (d.key.match(_readOnlyTags[i]) !== null) {
61263 function pushMore() {
61264 if (event.keyCode === 9 && !event.shiftKey &&
61265 list.selectAll('li:last-child input.value').node() === this) {
61271 function bindTypeahead(key, value) {
61272 if (isReadOnly({ key: key })) return;
61273 var geometry = context.geometry(_entityID);
61275 key.call(d3combobox()
61276 .container(context.container())
61277 .fetcher(function(value, callback) {
61280 geometry: geometry,
61282 }, function(err, data) {
61283 if (!err) callback(sort(value, data));
61287 value.call(d3combobox()
61288 .container(context.container())
61289 .fetcher(function(value, callback) {
61292 key: utilGetSetValue(key),
61293 geometry: geometry,
61295 }, function(err, data) {
61296 if (!err) callback(sort(value, data));
61301 function sort(value, data) {
61302 var sameletter = [],
61304 for (var i = 0; i < data.length; i++) {
61305 if (data[i].value.substring(0, value.length) === value) {
61306 sameletter.push(data[i]);
61308 other.push(data[i]);
61311 return sameletter.concat(other);
61316 function unbind() {
61317 var row = d3_select(this);
61319 row.selectAll('input.key')
61320 .call(d3combobox.off);
61322 row.selectAll('input.value')
61323 .call(d3combobox.off);
61327 function keyChange(d) {
61329 kNew = this.value.trim(),
61333 if (isReadOnly({ key: kNew })) {
61338 if (kNew && kNew !== kOld) {
61339 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
61341 suffix = +(match[2] || 1);
61342 while (_tags[kNew]) { // rename key if already in use
61343 kNew = base + '_' + suffix++;
61346 tag[kOld] = undefined;
61347 tag[kNew] = d.value;
61349 d.key = kNew; // Maintain DOM identity through the subsequent update.
61351 if (_newRow === kOld) { // see if this row is still a new row
61352 _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
61356 dispatch$$1.call('change', this, tag);
61360 function valueChange(d) {
61361 if (isReadOnly(d)) return;
61363 tag[d.key] = this.value;
61365 if (_newRow === d.key && d.key !== '' && d.value !== '') { // not a new row anymore
61366 _newRow = undefined;
61369 dispatch$$1.call('change', this, tag);
61373 function removeTag(d) {
61374 if (isReadOnly(d)) return;
61376 tag[d.key] = undefined;
61377 dispatch$$1.call('change', this, tag);
61378 d3_select(this.parentNode).remove();
61382 function addTag() {
61383 // Wrapped in a setTimeout in case it's being called from a blur
61384 // handler. Without the setTimeout, the call to `content` would
61385 // wipe out the pending value change.
61386 setTimeout(function() {
61389 list.selectAll('li:last-child input.key').node().focus();
61395 rawTagEditor.state = function(_) {
61396 if (!arguments.length) return _state;
61398 return rawTagEditor;
61402 rawTagEditor.preset = function(_) {
61403 if (!arguments.length) return _preset;
61405 if (_preset.isFallback()) {
61407 _updatePreference = false;
61409 _expanded = undefined;
61410 _updatePreference = true;
61412 return rawTagEditor;
61416 rawTagEditor.tags = function(_) {
61417 if (!arguments.length) return _tags;
61419 return rawTagEditor;
61423 rawTagEditor.entityID = function(_) {
61424 if (!arguments.length) return _entityID;
61426 return rawTagEditor;
61430 rawTagEditor.expanded = function(_) {
61431 if (!arguments.length) return _expanded;
61433 _updatePreference = false;
61434 return rawTagEditor;
61438 rawTagEditor.readOnlyTags = function(_) {
61439 if (!arguments.length) return _readOnlyTags;
61441 return rawTagEditor;
61445 return utilRebind(rawTagEditor, dispatch$$1, 'on');
61448 // This currently only works with the 'restrictions' field
61449 // It borrows some code from uiHelp
61451 function uiFieldHelp(context, fieldName) {
61452 var fieldHelp = {};
61453 var _inspector = d3_select(null);
61454 var _wrap = d3_select(null);
61455 var _body = d3_select(null);
61457 var fieldHelpKeys = {
61485 'indirect_example',
61491 var fieldHelpHeadings = {};
61493 var replacements = {
61494 distField: t('restriction.controls.distance'),
61495 viaField: t('restriction.controls.via'),
61496 fromShadow: icon('#turn-shadow', 'pre-text shadow from'),
61497 allowShadow: icon('#turn-shadow', 'pre-text shadow allow'),
61498 restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'),
61499 onlyShadow: icon('#turn-shadow', 'pre-text shadow only'),
61500 allowTurn: icon('#turn-yes', 'pre-text turn'),
61501 restrictTurn: icon('#turn-no', 'pre-text turn'),
61502 onlyTurn: icon('#turn-only', 'pre-text turn')
61506 // For each section, squash all the texts into a single markdown document
61507 var docs = fieldHelpKeys[fieldName].map(function(key) {
61508 var helpkey = 'help.field.' + fieldName + '.' + key[0];
61509 var text = key[1].reduce(function(all, part) {
61510 var subkey = helpkey + '.' + part;
61511 var depth = fieldHelpHeadings[subkey]; // is this subkey a heading?
61512 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
61513 return all + hhh + t(subkey, replacements) + '\n\n';
61518 title: t(helpkey + '.title'),
61519 html: marked(text.trim())
61528 .classed('hide', false)
61529 .style('opacity', '0')
61532 .style('opacity', '1');
61538 .classed('hide', true)
61541 .style('opacity', '0')
61542 .on('end', function () {
61543 _body.classed('hide', true);
61548 function clickHelp(index) {
61549 var d = docs[index];
61550 var tkeys = fieldHelpKeys[fieldName][index][1];
61552 _body.selectAll('.field-help-nav-item')
61553 .classed('active', function(d, i) { return i === index; });
61555 var content = _body.selectAll('.field-help-content')
61558 // class the paragraphs so we can find and style them
61559 content.selectAll('p')
61560 .attr('class', function(d, i) { return tkeys[i]; });
61562 // insert special content for certain help sections
61563 if (d.key === 'help.field.restrictions.inspecting') {
61565 .insert('img', 'p.from_shadow')
61566 .attr('class', 'field-help-image cf')
61567 .attr('src', context.imagePath('tr_inspect.gif'));
61569 } else if (d.key === 'help.field.restrictions.modifying') {
61571 .insert('img', 'p.allow_turn')
61572 .attr('class', 'field-help-image cf')
61573 .attr('src', context.imagePath('tr_modify.gif'));
61578 fieldHelp.button = function(selection$$1) {
61579 if (_body.empty()) return;
61581 var button = selection$$1.selectAll('.field-help-button')
61587 .attr('class', 'field-help-button')
61588 .attr('tabindex', -1)
61589 .call(svgIcon('#icon-help'))
61591 .on('click', function () {
61592 event.stopPropagation();
61593 event.preventDefault();
61594 if (_body.classed('hide')) {
61603 function updatePosition() {
61604 var wrap = _wrap.node();
61605 var inspector = _inspector.node();
61606 var wRect = wrap.getBoundingClientRect();
61607 var iRect = inspector.getBoundingClientRect();
61610 .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
61614 fieldHelp.body = function(selection$$1) {
61615 // This control expects the field to have a preset-input-wrap div
61616 _wrap = selection$$1.selectAll('.preset-input-wrap');
61617 if (_wrap.empty()) return;
61619 // absolute position relative to the inspector, so it "floats" above the fields
61620 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
61621 if (_inspector.empty()) return;
61623 _body = _inspector.selectAll('.field-help-body')
61626 var enter = _body.enter()
61628 .attr('class', 'field-help-body hide'); // initially hidden
61630 var titleEnter = enter
61632 .attr('class', 'field-help-title cf');
61636 .attr('class', 'fl')
61637 .text(t('help.field.' + fieldName + '.title'));
61641 .attr('class', 'fr close')
61642 .on('click', function() {
61643 event.stopPropagation();
61644 event.preventDefault();
61647 .call(svgIcon('#icon-close'));
61649 var navEnter = enter
61651 .attr('class', 'field-help-nav cf');
61653 var titles = docs.map(function(d) { return d.title; });
61654 navEnter.selectAll('.field-help-nav-item')
61658 .attr('class', 'field-help-nav-item')
61659 .text(function(d) { return d; })
61660 .on('click', function(d, i) {
61661 event.stopPropagation();
61662 event.preventDefault();
61668 .attr('class', 'field-help-content');
61680 function uiFieldCheck(field, context) {
61681 var dispatch$$1 = dispatch('change');
61682 var options = field.strings && field.strings.options;
61686 var input = d3_select(null);
61687 var text = d3_select(null);
61688 var label = d3_select(null);
61689 var reverser = d3_select(null);
61697 for (var k in options) {
61698 values.push(k === 'undefined' ? undefined : k);
61699 texts.push(field.t('options.' + k, { 'default': options[k] }));
61702 values = [undefined, 'yes'];
61703 texts = [t('inspector.unknown'), t('inspector.check.yes')];
61704 if (field.type !== 'defaultCheck') {
61706 texts.push(t('inspector.check.no'));
61711 // Checks tags to see whether an undefined value is "Assumed to be Yes"
61712 function checkImpliedYes() {
61713 _impliedYes = (field.id === 'oneway_yes');
61715 // hack: pretend `oneway` field is a `oneway_yes` field
61716 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
61717 if (field.id === 'oneway') {
61718 var entity = context.entity(_entityID);
61719 for (var key in entity.tags) {
61720 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
61721 _impliedYes = true;
61722 texts[0] = t('presets.fields.oneway_yes.options.undefined');
61730 function reverserHidden() {
61731 if (!d3_select('div.inspector-hover').empty()) return true;
61732 return !(_value === 'yes' || (_impliedYes && !_value));
61736 function reverserSetText(selection$$1) {
61737 var entity = context.hasEntity(_entityID);
61738 if (reverserHidden() || !entity) return selection$$1;
61740 var first = entity.first();
61741 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
61742 var pseudoDirection = first < last;
61743 var icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
61745 selection$$1.selectAll('.reverser-span')
61746 .text(t('inspector.check.reverser'))
61747 .call(svgIcon(icon, 'inline'));
61749 return selection$$1;
61753 var check = function(selection$$1) {
61755 selection$$1.classed('checkselect', 'true');
61757 label = selection$$1.selectAll('.preset-input-wrap')
61760 var enter = label.enter()
61762 .attr('class', 'preset-input-wrap');
61766 .property('indeterminate', field.type !== 'defaultCheck')
61767 .attr('type', 'checkbox')
61768 .attr('id', 'preset-input-' + field.id);
61773 .attr('class', 'value');
61775 if (field.type === 'onewayCheck') {
61778 .attr('id', 'preset-input-' + field.id + '-reverser')
61779 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
61782 .attr('class', 'reverser-span');
61785 label = label.merge(enter);
61786 input = label.selectAll('input');
61787 text = label.selectAll('span.value');
61790 .on('click', function() {
61792 t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
61793 dispatch$$1.call('change', this, t$$1);
61794 event.stopPropagation();
61797 if (field.type === 'onewayCheck') {
61798 reverser = label.selectAll('.reverser');
61801 .call(reverserSetText)
61802 .on('click', function() {
61803 event.preventDefault();
61804 event.stopPropagation();
61806 actionReverse(_entityID),
61807 t('operations.reverse.annotation')
61810 .call(reverserSetText);
61816 check.entity = function(_) {
61817 if (!arguments.length) return context.hasEntity(_entityID);
61823 check.tags = function(tags) {
61825 function isChecked(val) {
61826 return val !== 'no' && val !== '' && val !== undefined && val !== null;
61829 function textFor(val) {
61830 if (val === '') val = undefined;
61831 var index = values.indexOf(val);
61832 return (index !== -1 ? texts[index] : ('"' + val + '"'));
61836 _value = tags[field.key] && tags[field.key].toLowerCase();
61838 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
61843 .property('indeterminate', field.type !== 'defaultCheck' && !_value)
61844 .property('checked', isChecked(_value));
61847 .text(textFor(_value));
61850 .classed('set', !!_value);
61852 if (field.type === 'onewayCheck') {
61854 .classed('hide', reverserHidden())
61855 .call(reverserSetText);
61860 check.focus = function() {
61861 input.node().focus();
61864 return utilRebind(check, dispatch$$1, 'on');
61867 /** Used for built-in method references. */
61868 var arrayProto$1 = Array.prototype;
61870 /** Built-in value references. */
61871 var splice$1 = arrayProto$1.splice;
61874 * The base implementation of `_.pullAt` without support for individual
61875 * indexes or capturing the removed elements.
61878 * @param {Array} array The array to modify.
61879 * @param {number[]} indexes The indexes of elements to remove.
61880 * @returns {Array} Returns `array`.
61882 function basePullAt(array, indexes) {
61883 var length = array ? indexes.length : 0,
61884 lastIndex = length - 1;
61887 var index = indexes[length];
61888 if (length == lastIndex || index !== previous) {
61889 var previous = index;
61890 if (isIndex(index)) {
61891 splice$1.call(array, index, 1);
61893 baseUnset(array, index);
61901 * Removes all elements from `array` that `predicate` returns truthy for
61902 * and returns an array of the removed elements. The predicate is invoked
61903 * with three arguments: (value, index, array).
61905 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
61906 * to pull elements from an array by value.
61912 * @param {Array} array The array to modify.
61913 * @param {Function} [predicate=_.identity] The function invoked per iteration.
61914 * @returns {Array} Returns the new array of removed elements.
61917 * var array = [1, 2, 3, 4];
61918 * var evens = _.remove(array, function(n) {
61919 * return n % 2 == 0;
61922 * console.log(array);
61925 * console.log(evens);
61928 function remove$8(array, predicate) {
61930 if (!(array && array.length)) {
61935 length = array.length;
61937 predicate = baseIteratee(predicate, 3);
61938 while (++index < length) {
61939 var value = array[index];
61940 if (predicate(value, index, array)) {
61941 result.push(value);
61942 indexes.push(index);
61945 basePullAt(array, indexes);
61949 function uiFieldCombo(field, context) {
61950 var dispatch$$1 = dispatch('change'),
61951 nominatim = services.geocoder,
61952 taginfo = services.taginfo,
61953 isMulti = (field.type === 'multiCombo'),
61954 isNetwork = (field.type === 'networkCombo'),
61955 isSemi = (field.type === 'semiCombo'),
61956 optstrings = field.strings && field.strings.options,
61957 optarray = field.options,
61958 snake_case = (field.snake_case || (field.snake_case === undefined)),
61959 caseSensitive = field.caseSensitive,
61960 combobox = d3combobox()
61961 .container(context.container())
61962 .caseSensitive(caseSensitive)
61963 .minItems(isMulti || isSemi ? 1 : 2),
61971 // ensure multiCombo field.key ends with a ':'
61972 if (isMulti && field.key.match(/:$/) === null) {
61977 function snake(s) {
61978 return s.replace(/\s+/g, '_');
61981 function unsnake(s) {
61982 return s.replace(/_+/g, ' ');
61985 function clean(s) {
61986 return s.split(';')
61987 .map(function(s) { return s.trim(); })
61992 // returns the tag value for a display value
61993 // (for multiCombo, dval should be the key suffix, not the entire key)
61994 function tagValue(dval) {
61995 dval = clean(dval || '');
61998 var match = find$1(comboData, function(o) {
61999 return o.key && clean(o.value) === dval;
62006 if (field.type === 'typeCombo' && !dval) {
62010 return (snake_case ? snake(dval) : dval) || undefined;
62014 // returns the display value for a tag value
62015 // (for multiCombo, tval should be the key suffix, not the entire key)
62016 function displayValue(tval) {
62020 var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
62022 return match.value;
62026 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
62030 return snake_case ? unsnake(tval) : tval;
62034 function objectDifference(a, b) {
62035 return reject(a, function(d1) {
62036 return some(b, function(d2) { return d1.value === d2.value; });
62041 function initCombo(selection$$1, attachTo) {
62043 selection$$1.attr('readonly', 'readonly');
62044 selection$$1.call(combobox, attachTo);
62045 setStaticValues(setPlaceholder);
62047 } else if (optarray) {
62048 selection$$1.call(combobox, attachTo);
62049 setStaticValues(setPlaceholder);
62051 } else if (taginfo) {
62052 selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
62053 setTaginfoValues('', setPlaceholder);
62058 function setStaticValues(callback) {
62059 if (!(optstrings || optarray)) return;
62062 comboData = Object.keys(optstrings).map(function(k) {
62063 var v = field.t('options.' + k, { 'default': optstrings[k] });
62071 } else if (optarray) {
62072 comboData = optarray.map(function(k) {
62073 var v = snake_case ? unsnake(k) : k;
62082 combobox.data(objectDifference(comboData, multiData));
62083 if (callback) callback(comboData);
62087 function setTaginfoValues(q, callback) {
62088 var fn = isMulti ? 'multikeys' : 'values';
62089 var query = (isMulti ? field.key : '') + q;
62090 var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
62091 if (hasCountryPrefix) {
62092 query = country + ':';
62096 debounce: (q !== ''),
62102 params.geometry = context.geometry(entity.id);
62105 taginfo[fn](params, function(err, data) {
62107 if (hasCountryPrefix) {
62108 data = filter(data, function(d) {
62109 return d.value.toLowerCase().indexOf(country + ':') === 0;
62113 comboData = map$3(data, function(d) {
62115 if (isMulti) k = k.replace(field.key, '');
62116 var v = snake_case ? unsnake(k) : k;
62120 title: isMulti ? v : d.title
62124 comboData = objectDifference(comboData, multiData);
62125 if (callback) callback(comboData);
62130 function setPlaceholder(d) {
62133 if (isMulti || isSemi) {
62134 ph = field.placeholder() || t('inspector.add');
62136 var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
62137 placeholders = vals.length > 1 ? vals : map$3(d, 'key');
62138 ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
62141 if (ph.match(/(…|\.\.\.)$/) === null) {
62145 container.selectAll('input')
62146 .attr('placeholder', ph);
62150 function change() {
62151 var val = tagValue(utilGetSetValue(input)),
62154 if (isMulti || isSemi) {
62156 container.classed('active', false);
62157 utilGetSetValue(input, '');
62159 field.keys.push(field.key + val);
62160 t$$1[field.key + val] = 'yes';
62161 } else if (isSemi) {
62162 var arr = multiData.map(function(d) { return d.key; });
62164 t$$1[field.key] = compact(uniq(arr)).join(';');
62166 window.setTimeout(function() { input.node().focus(); }, 10);
62169 t$$1[field.key] = val;
62172 dispatch$$1.call('change', this, t$$1);
62176 function removeMultikey(d) {
62177 event.stopPropagation();
62180 t$$1[d.key] = undefined;
62181 } else if (isSemi) {
62182 remove$8(multiData, function(md) { return md.key === d.key; });
62183 var arr = multiData.map(function(md) { return md.key; });
62184 arr = compact(uniq(arr));
62185 t$$1[field.key] = arr.length ? arr.join(';') : undefined;
62187 dispatch$$1.call('change', this, t$$1);
62191 function combo(selection$$1) {
62192 if (isMulti || isSemi) {
62193 container = selection$$1.selectAll('ul').data([0]);
62195 container = container.enter()
62197 .attr('class', 'form-field-multicombo')
62198 .on('click', function() {
62199 window.setTimeout(function() { input.node().focus(); }, 10);
62204 container = selection$$1;
62207 input = container.selectAll('input')
62210 input = input.enter()
62212 .attr('type', 'text')
62213 .attr('id', 'preset-input-' + field.id)
62215 .call(initCombo, selection$$1)
62218 if (isNetwork && nominatim && entity) {
62219 var center = entity.extent(context.graph()).center();
62220 nominatim.countryCode(center, function (err, code) {
62226 .on('change', change)
62227 .on('blur', change);
62229 if (isMulti || isSemi) {
62231 .on('accept', function() {
62232 input.node().blur();
62233 input.node().focus();
62237 .on('focus', function() { container.classed('active', true); });
62242 combo.tags = function(tags) {
62243 if (isMulti || isSemi) {
62247 // Build multiData array containing keys already set..
62248 Object.keys(tags).forEach(function(key) {
62249 if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
62251 var suffix = key.substring(field.key.length);
62254 value: displayValue(suffix)
62258 // Set keys for form-field modified (needed for undo and reset buttons)..
62259 field.keys = map$3(multiData, 'key');
62261 } else if (isSemi) {
62262 var arr = compact(uniq((tags[field.key] || '').split(';')));
62263 multiData = arr.map(function(key) {
62266 value: displayValue(key)
62271 // Exclude existing multikeys from combo options..
62272 var available = objectDifference(comboData, multiData);
62273 combobox.data(available);
62275 // Hide 'Add' button if this field uses fixed set of
62276 // translateable optstrings and they're all currently used..
62277 container.selectAll('.combobox-input, .combobox-caret')
62278 .classed('hide', optstrings && !available.length);
62282 var chips = container.selectAll('.chips')
62288 var enter = chips.enter()
62289 .insert('li', 'input')
62290 .attr('class', 'chips');
62292 enter.append('span');
62295 chips = chips.merge(enter);
62297 chips.select('span')
62298 .text(function(d) { return d.value; });
62301 .on('click', removeMultikey)
62302 .attr('class', 'remove')
62306 utilGetSetValue(input, displayValue(tags[field.key]));
62311 combo.focus = function() {
62312 input.node().focus();
62316 combo.entity = function(_) {
62317 if (!arguments.length) return entity;
62323 return utilRebind(combo, dispatch$$1, 'on');
62326 function uiFieldText(field, context) {
62327 var dispatch$$1 = dispatch('change'),
62328 nominatim = services.geocoder,
62333 function i(selection$$1) {
62334 var fieldId = 'preset-input-' + field.id;
62336 input = selection$$1.selectAll('input')
62339 input = input.enter()
62341 .attr('type', field.type)
62342 .attr('id', fieldId)
62343 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
62348 .on('input', change(true))
62349 .on('blur', change())
62350 .on('change', change());
62352 if (field.type === 'tel' && nominatim && entity) {
62353 var center = entity.extent(context.graph()).center();
62354 nominatim.countryCode(center, function (err, countryCode) {
62355 if (err || !dataPhoneFormats[countryCode]) return;
62356 selection$$1.selectAll('#' + fieldId)
62357 .attr('placeholder', dataPhoneFormats[countryCode]);
62360 } else if (field.type === 'number') {
62361 var rtl = (textDirection === 'rtl');
62363 input.attr('type', 'text');
62365 var spinControl = selection$$1.selectAll('.spin-control')
62368 var enter = spinControl.enter()
62370 .attr('class', 'spin-control');
62374 .datum(rtl ? 1 : -1)
62375 .attr('class', rtl ? 'increment' : 'decrement')
62376 .attr('tabindex', -1);
62380 .datum(rtl ? -1 : 1)
62381 .attr('class', rtl ? 'decrement' : 'increment')
62382 .attr('tabindex', -1);
62384 spinControl = spinControl
62387 spinControl.selectAll('button')
62388 .on('click', function(d) {
62389 event.preventDefault();
62390 var num = parseInt(input.node().value || 0, 10);
62391 if (!isNaN(num)) input.node().value = num + d;
62398 function change(onInput) {
62399 return function() {
62401 t$$1[field.key] = utilGetSetValue(input) || undefined;
62402 dispatch$$1.call('change', this, t$$1, onInput);
62407 i.entity = function(_) {
62408 if (!arguments.length) return entity;
62414 i.tags = function(tags) {
62415 utilGetSetValue(input, tags[field.key] || '');
62419 i.focus = function() {
62420 var node = input.node();
62421 if (node) node.focus();
62424 return utilRebind(i, dispatch$$1, 'on');
62427 function uiFieldAccess(field, context) {
62428 var dispatch$$1 = dispatch('change'),
62431 function access(selection$$1) {
62432 var wrap = selection$$1.selectAll('.preset-input-wrap')
62435 wrap = wrap.enter()
62437 .attr('class', 'cf preset-input-wrap')
62441 var list = wrap.selectAll('ul')
62444 list = list.enter()
62449 items = list.selectAll('li')
62453 var enter = items.enter()
62455 .attr('class', function(d) { return 'cf preset-access-' + d; });
62459 .attr('class', 'col6 label preset-label-access')
62460 .attr('for', function(d) { return 'preset-input-access-' + d; })
62461 .text(function(d) { return field.t('types.' + d); });
62465 .attr('class', 'col6 preset-input-access-wrap')
62467 .attr('type', 'text')
62468 .attr('class', 'preset-input-access')
62469 .attr('id', function(d) { return 'preset-input-access-' + d; })
62471 .each(function(d) {
62474 .container(context.container())
62475 .data(access.options(d))
62481 items = items.merge(enter);
62483 wrap.selectAll('.preset-input-access')
62484 .on('change', change)
62485 .on('blur', change);
62489 function change(d) {
62491 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
62492 dispatch$$1.call('change', this, tag);
62496 access.options = function(type) {
62497 var options = ['no', 'permissive', 'private', 'destination'];
62499 if (type !== 'access') {
62500 options.unshift('yes');
62501 options.push('designated');
62503 if (type === 'bicycle') {
62504 options.push('dismount');
62508 return options.map(function(option) {
62510 title: field.t('options.' + option + '.description'),
62517 var placeholders = {
62519 foot: 'designated',
62520 motor_vehicle: 'no'
62524 motor_vehicle: 'no',
62530 motor_vehicle: 'no'
62533 motor_vehicle: 'no',
62534 bicycle: 'designated'
62537 motor_vehicle: 'no',
62538 horse: 'designated'
62542 motor_vehicle: 'no',
62548 motor_vehicle: 'yes',
62553 motor_vehicle: 'yes'
62557 motor_vehicle: 'yes',
62563 motor_vehicle: 'yes',
62569 motor_vehicle: 'yes',
62575 motor_vehicle: 'yes',
62581 motor_vehicle: 'yes',
62587 motor_vehicle: 'yes',
62593 motor_vehicle: 'yes',
62598 motor_vehicle: 'yes'
62602 motor_vehicle: 'yes',
62608 motor_vehicle: 'yes',
62614 motor_vehicle: 'yes',
62621 access.tags = function(tags) {
62622 utilGetSetValue(items.selectAll('.preset-input-access'),
62623 function(d) { return tags[d] || ''; })
62624 .attr('placeholder', function() {
62625 return tags.access ? tags.access : field.placeholder();
62628 items.selectAll('#preset-input-access-access')
62629 .attr('placeholder', 'yes');
62631 forEach(placeholders[tags.highway], function(v, k) {
62632 items.selectAll('#preset-input-access-' + k)
62633 .attr('placeholder', function() { return (tags.access || v); });
62638 access.focus = function() {
62639 items.selectAll('.preset-input-access')
62644 return utilRebind(access, dispatch$$1, 'on');
62647 function uiFieldAddress(field, context) {
62648 var dispatch$$1 = dispatch('init', 'change'),
62649 nominatim = services.geocoder,
62650 wrap = d3_select(null),
62651 isInitialized = false,
62654 function getNearStreets() {
62655 var extent = entity.extent(context.graph()),
62656 l = extent.center(),
62657 box = geoExtent$$1(l).padByMeters(200);
62659 var streets = context.intersects(box)
62660 .filter(isAddressable)
62662 var loc = context.projection([
62663 (extent[0][0] + extent[1][0]) / 2,
62664 (extent[0][1] + extent[1][1]) / 2]),
62665 choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
62667 title: d.tags.name,
62668 value: d.tags.name,
62669 dist: choice.distance
62672 .sort(function(a, b) {
62673 return a.dist - b.dist;
62676 return uniqBy(streets, 'value');
62678 function isAddressable(d) {
62679 return d.tags.highway && d.tags.name && d.type === 'way';
62684 function getNearCities() {
62685 var extent = entity.extent(context.graph()),
62686 l = extent.center(),
62687 box = geoExtent$$1(l).padByMeters(200);
62689 var cities = context.intersects(box)
62690 .filter(isAddressable)
62693 title: d.tags['addr:city'] || d.tags.name,
62694 value: d.tags['addr:city'] || d.tags.name,
62695 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62698 .sort(function(a, b) {
62699 return a.dist - b.dist;
62702 return uniqBy(cities, 'value');
62705 function isAddressable(d) {
62707 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
62710 if (d.tags.place && d.tags.name && (
62711 d.tags.place === 'city' ||
62712 d.tags.place === 'town' ||
62713 d.tags.place === 'village'))
62716 if (d.tags['addr:city']) return true;
62722 function getNearValues(key) {
62723 var extent = entity.extent(context.graph()),
62724 l = extent.center(),
62725 box = geoExtent$$1(l).padByMeters(200);
62727 var results = context.intersects(box)
62728 .filter(function hasTag(d) {
62729 return d.tags[key];
62733 title: d.tags[key],
62734 value: d.tags[key],
62735 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
62738 .sort(function(a, b) {
62739 return a.dist - b.dist;
62742 return uniqBy(results, 'value');
62746 function initCallback(err, countryCode) {
62749 var addressFormat = find$1(dataAddressFormats, function (a) {
62750 return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
62751 }) || dataAddressFormats[0];
62753 var widths = addressFormat.widths || {
62754 housenumber: 1/3, street: 2/3,
62755 city: 2/3, state: 1/4, postcode: 1/3
62759 // Normalize widths.
62760 var total = reduce(r, function(sum, field) {
62761 return sum + (widths[field] || 0.5);
62764 return r.map(function (field) {
62767 width: (widths[field] || 0.5) / total
62772 wrap.selectAll('div.addr-row')
62773 .data(addressFormat.format)
62776 .attr('class', 'addr-row')
62777 .selectAll('input')
62781 .property('type', 'text')
62782 .attr('placeholder', function (d) {
62783 var localkey = d.id + '!' + countryCode.toLowerCase(),
62784 tkey = field.strings.placeholders[localkey] ? localkey : d.id;
62785 return field.t('placeholders.' + tkey);
62787 .attr('class', function (d) { return 'addr-' + d.id; })
62789 .style('width', function (d) { return d.width * 100 + '%'; });
62793 // setup dropdowns for common address tags
62794 var dropdowns = addressFormat.dropdowns || [
62795 'city', 'county', 'country', 'district', 'hamlet',
62796 'neighbourhood', 'place', 'postcode', 'province',
62797 'quarter', 'state', 'street', 'subdistrict', 'suburb'
62800 // If fields exist for any of these tags, create dropdowns to pick nearby values..
62801 dropdowns.forEach(function(tag) {
62802 var nearValues = (tag === 'street') ? getNearStreets
62803 : (tag === 'city') ? getNearCities
62806 wrap.selectAll('input.addr-' + tag)
62808 .container(context.container())
62810 .fetcher(function(value, callback) {
62811 callback(nearValues('addr:' + tag));
62816 wrap.selectAll('input')
62817 .on('blur', change())
62818 .on('change', change());
62820 wrap.selectAll('input:not(.combobox-input)')
62821 .on('input', change(true));
62823 dispatch$$1.call('init');
62824 isInitialized = true;
62828 function address(selection$$1) {
62829 isInitialized = false;
62831 wrap = selection$$1.selectAll('.preset-input-wrap')
62834 wrap = wrap.enter()
62836 .attr('class', 'preset-input-wrap')
62839 if (nominatim && entity) {
62840 var center = entity.extent(context.graph()).center();
62841 nominatim.countryCode(center, initCallback);
62846 function change(onInput) {
62847 return function() {
62850 wrap.selectAll('input')
62851 .each(function (field) {
62852 tags['addr:' + field.id] = this.value || undefined;
62855 dispatch$$1.call('change', this, tags, onInput);
62860 function updateTags(tags) {
62861 utilGetSetValue(wrap.selectAll('input'), function (field) {
62862 return tags['addr:' + field.id] || '';
62867 address.entity = function(_) {
62868 if (!arguments.length) return entity;
62874 address.tags = function(tags) {
62875 if (isInitialized) {
62878 dispatch$$1.on('init', function () {
62879 dispatch$$1.on('init', null);
62886 address.focus = function() {
62887 var node = wrap.selectAll('input').node();
62888 if (node) node.focus();
62892 return utilRebind(address, dispatch$$1, 'on');
62895 function uiFieldCycleway(field, context) {
62896 var dispatch$$1 = dispatch('change'),
62897 items = d3_select(null);
62900 function cycleway(selection$$1) {
62902 function stripcolon(s) {
62903 return s.replace(':', '');
62907 var wrap = selection$$1.selectAll('.preset-input-wrap')
62910 wrap = wrap.enter()
62912 .attr('class', 'cf preset-input-wrap')
62916 var div = wrap.selectAll('ul')
62924 items = div.selectAll('li')
62927 var enter = items.enter()
62929 .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
62933 .attr('class', 'col6 label preset-label-cycleway')
62934 .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
62935 .text(function(d) { return field.t('types.' + d); });
62939 .attr('class', 'col6 preset-input-cycleway-wrap')
62941 .attr('type', 'text')
62942 .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
62944 .each(function(d) {
62947 .container(context.container())
62948 .data(cycleway.options(d))
62954 wrap.selectAll('.preset-input-cycleway')
62955 .on('change', change)
62956 .on('blur', change);
62960 function change() {
62961 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
62962 right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
62965 if (left === 'none' || left === '') { left = undefined; }
62966 if (right === 'none' || right === '') { right = undefined; }
62968 // Always set both left and right as changing one can affect the other
62970 cycleway: undefined,
62971 'cycleway:left': left,
62972 'cycleway:right': right
62975 // If the left and right tags match, use the cycleway tag to tag both
62976 // sides the same way
62977 if (left === right) {
62980 'cycleway:left': undefined,
62981 'cycleway:right': undefined
62985 dispatch$$1.call('change', this, tag);
62989 cycleway.options = function() {
62990 return keys$1(field.strings.options).map(function(option) {
62992 title: field.t('options.' + option + '.description'),
62999 cycleway.tags = function(tags) {
63000 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
63001 // If cycleway is set, always return that
63002 if (tags.cycleway) {
63003 return tags.cycleway;
63005 return tags[d] || '';
63007 .attr('placeholder', field.placeholder());
63011 cycleway.focus = function() {
63012 items.selectAll('.preset-input-cycleway')
63017 return utilRebind(cycleway, dispatch$$1, 'on');
63020 function uiFieldLanes(field, context) {
63021 var dispatch$$1 = dispatch('change'),
63027 function lanes(selection$$1) {
63028 lanesData = context.entity(wayID).lanes();
63030 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
63031 selection$$1.call(lanes.off);
63035 var wrap = selection$$1.selectAll('.preset-input-wrap')
63038 wrap = wrap.enter()
63040 .attr('class', 'preset-input-wrap')
63043 var surface = wrap.selectAll('.surface')
63046 var d = utilGetDimensions(wrap);
63047 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
63049 surface = surface.enter()
63051 .attr('width', d[0])
63052 .attr('height', 300)
63053 .attr('class', 'surface')
63057 var lanesSelection = surface.selectAll('.lanes')
63060 lanesSelection = lanesSelection.enter()
63062 .attr('class', 'lanes')
63063 .merge(lanesSelection);
63066 .attr('transform', function () {
63067 return 'translate(' + (freeSpace / 2) + ', 0)';
63071 var lane = lanesSelection.selectAll('.lane')
63072 .data(lanesData.lanes);
63077 var enter = lane.enter()
63079 .attr('class', 'lane');
63085 .attr('width', LANE_WIDTH)
63086 .attr('height', LANE_HEIGHT);
63090 .attr('class', 'forward')
63098 .attr('class', 'bothways')
63106 .attr('class', 'backward')
63117 .attr('transform', function(d) {
63118 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
63121 lane.select('.forward')
63122 .style('visibility', function(d) {
63123 return d.direction === 'forward' ? 'visible' : 'hidden';
63126 lane.select('.bothways')
63127 .style('visibility', function(d) {
63128 return d.direction === 'bothways' ? 'visible' : 'hidden';
63131 lane.select('.backward')
63132 .style('visibility', function(d) {
63133 return d.direction === 'backward' ? 'visible' : 'hidden';
63138 lanes.entity = function(_) {
63139 if (!wayID || wayID !== _.id) {
63144 lanes.tags = function() {};
63145 lanes.focus = function() {};
63146 lanes.off = function() {};
63148 return utilRebind(lanes, dispatch$$1, 'on');
63151 function uiFieldLocalized(field, context) {
63152 var dispatch$$1 = dispatch('change', 'input'),
63153 wikipedia = services.wikipedia,
63154 input = d3_select(null),
63155 localizedInputs = d3_select(null),
63160 function localized(selection$$1) {
63161 input = selection$$1.selectAll('.localized-main')
63164 input = input.enter()
63166 .attr('type', 'text')
63167 .attr('id', 'preset-input-' + field.id)
63168 .attr('class', 'localized-main')
63169 .attr('placeholder', field.placeholder())
63173 if (field.id === 'name') {
63174 var preset = context.presets().match(entity, context.graph());
63177 .container(context.container())
63178 .fetcher(utilSuggestNames(preset, dataSuggestions))
63183 .on('input', change(true))
63184 .on('blur', change())
63185 .on('change', change());
63188 var translateButton = selection$$1.selectAll('.localized-add')
63191 translateButton = translateButton.enter()
63193 .attr('class', 'button-input-action localized-add minor')
63194 .attr('tabindex', -1)
63195 .call(svgIcon('#icon-plus'))
63197 .title(t('translate.translate'))
63198 .placement('left'))
63199 .merge(translateButton);
63202 .on('click', addNew);
63205 localizedInputs = selection$$1.selectAll('.localized-wrap')
63208 localizedInputs = localizedInputs.enter().append('div')
63209 .attr('class', 'localized-wrap')
63210 .merge(localizedInputs);
63214 function addNew() {
63215 event.preventDefault();
63216 var data$$1 = localizedInputs.selectAll('div.entry').data();
63217 var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
63218 var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
63219 var isLangEn = defaultLang.indexOf('en') > -1;
63220 if (isLangEn || langExists) {
63223 data$$1.push({ lang: defaultLang, value: '' });
63224 localizedInputs.call(render, data$$1);
63228 function change(onInput) {
63229 return function() {
63231 t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
63232 dispatch$$1.call('change', this, t$$1, onInput);
63237 function key(lang) {
63238 return field.key + ':' + lang;
63242 function changeLang(d) {
63243 var lang = utilGetSetValue(d3_select(this)),
63245 language = find$1(wikipedia$2, function(d) {
63246 return d[0].toLowerCase() === lang.toLowerCase() ||
63247 d[1].toLowerCase() === lang.toLowerCase();
63250 if (language) lang = language[2];
63252 if (d.lang && d.lang !== lang) {
63253 t$$1[key(d.lang)] = undefined;
63256 var value = utilGetSetValue(d3_select(this.parentNode)
63257 .selectAll('.localized-value'));
63259 if (lang && value) {
63260 t$$1[key(lang)] = value;
63261 } else if (lang && wikiTitles && wikiTitles[d.lang]) {
63262 t$$1[key(lang)] = wikiTitles[d.lang];
63266 dispatch$$1.call('change', this, t$$1);
63270 function changeValue(d) {
63271 if (!d.lang) return;
63273 t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
63274 dispatch$$1.call('change', this, t$$1);
63278 function fetcher(value, cb) {
63279 var v = value.toLowerCase();
63281 cb(wikipedia$2.filter(function(d) {
63282 return d[0].toLowerCase().indexOf(v) >= 0 ||
63283 d[1].toLowerCase().indexOf(v) >= 0 ||
63284 d[2].toLowerCase().indexOf(v) >= 0;
63285 }).map(function(d) {
63286 return { value: d[1] };
63291 function render(selection$$1, data$$1) {
63292 var wraps = selection$$1.selectAll('div.entry').
63293 data(data$$1, function(d) { return d.lang; });
63298 .style('max-height','0px')
63299 .style('opacity', '0')
63300 .style('top','-10px')
63303 var innerWrap = wraps.enter()
63304 .insert('div', ':first-child');
63306 innerWrap.attr('class', 'entry')
63308 var wrap = d3_select(this);
63309 var langcombo = d3combobox()
63310 .container(context.container())
63316 .attr('class','form-label')
63317 .text(t('translate.localized_translation_label'))
63318 .attr('for','localized-lang');
63322 .attr('class', 'minor remove')
63323 .on('click', function(d){
63324 event.preventDefault();
63326 t$$1[key(d.lang)] = undefined;
63327 dispatch$$1.call('change', this, t$$1);
63328 d3_select(this.parentNode.parentNode)
63330 .style('max-height','240px')
63332 .style('opacity', '0')
63333 .style('max-height','0px')
63336 .call(svgIcon('#operation-delete'));
63340 .attr('class', 'localized-lang')
63341 .attr('type', 'text')
63342 .attr('placeholder',t('translate.localized_translation_language'))
63343 .on('blur', changeLang)
63344 .on('change', changeLang)
63349 .on('blur', changeValue)
63350 .on('change', changeValue)
63351 .attr('type', 'text')
63352 .attr('placeholder', t('translate.localized_translation_name'))
63353 .attr('class', 'localized-value');
63357 .style('margin-top', '0px')
63358 .style('max-height', '0px')
63359 .style('opacity', '0')
63362 .style('margin-top', '10px')
63363 .style('max-height', '240px')
63364 .style('opacity', '1')
63365 .on('end', function() {
63367 .style('max-height', '')
63368 .style('overflow', 'visible');
63372 var entry = selection$$1.selectAll('.entry');
63374 utilGetSetValue(entry.select('.localized-lang'), function(d) {
63375 var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
63376 return lang ? lang[1] : d.lang;
63379 utilGetSetValue(entry.select('.localized-value'),
63380 function(d) { return d.value; });
63384 localized.tags = function(tags) {
63385 // Fetch translations from wikipedia
63386 if (tags.wikipedia && !wikiTitles) {
63388 var wm = tags.wikipedia.match(/([^:]+):(.+)/);
63389 if (wm && wm[0] && wm[1]) {
63390 wikipedia.translations(wm[1], wm[2], function(d) {
63396 utilGetSetValue(input, tags[field.key] || '');
63398 var postfixed = [], k, m;
63400 m = k.match(/^(.*):([a-zA-Z_-]+)$/);
63401 if (m && m[1] === field.key && m[2]) {
63402 postfixed.push({ lang: m[2], value: tags[k] });
63406 localizedInputs.call(render, postfixed.reverse());
63410 localized.focus = function() {
63411 input.node().focus();
63415 localized.entity = function(_) {
63416 if (!arguments.length) return entity;
63421 return utilRebind(localized, dispatch$$1, 'on');
63424 function uiFieldMaxspeed(field, context) {
63425 var dispatch$$1 = dispatch('change'),
63428 unitInput = d3_select(null),
63429 input = d3_select(null),
63432 var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
63433 imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
63436 function maxspeed(selection$$1) {
63437 combobox = d3combobox()
63438 .container(context.container());
63440 var unitCombobox = d3combobox()
63441 .container(context.container())
63442 .data(['km/h', 'mph'].map(comboValues));
63444 input = selection$$1.selectAll('#preset-input-' + field.id)
63447 input = input.enter()
63449 .attr('type', 'text')
63450 .attr('id', 'preset-input-' + field.id)
63451 .attr('placeholder', field.placeholder())
63457 .on('change', change)
63458 .on('blur', change);
63460 var childNodes = context.graph().childNodes(context.entity(entity.id)),
63461 loc = childNodes[~~(childNodes.length/2)].loc;
63463 isImperial = some(dataImperial.features, function(f) {
63464 return some(f.geometry.coordinates, function(d) {
63465 return geoPointInPolygon(loc, d);
63469 unitInput = selection$$1.selectAll('input.maxspeed-unit')
63472 unitInput = unitInput.enter()
63474 .attr('type', 'text')
63475 .attr('class', 'maxspeed-unit')
63476 .call(unitCombobox)
63480 .on('blur', changeUnits)
63481 .on('change', changeUnits);
63484 function changeUnits() {
63485 isImperial = utilGetSetValue(unitInput) === 'mph';
63486 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63493 function setSuggestions() {
63494 combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
63495 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
63499 function comboValues(d) {
63501 value: d.toString(),
63502 title: d.toString()
63507 function change() {
63509 value = utilGetSetValue(input);
63512 tag[field.key] = undefined;
63513 } else if (isNaN(value) || !isImperial) {
63514 tag[field.key] = value;
63516 tag[field.key] = value + ' mph';
63519 dispatch$$1.call('change', this, tag);
63523 maxspeed.tags = function(tags) {
63524 var value = tags[field.key];
63526 if (value && value.indexOf('mph') >= 0) {
63527 value = parseInt(value, 10);
63529 } else if (value) {
63530 isImperial = false;
63534 utilGetSetValue(input, value || '');
63538 maxspeed.focus = function() {
63539 input.node().focus();
63543 maxspeed.entity = function(_) {
63548 return utilRebind(maxspeed, dispatch$$1, 'on');
63552 * This function is like `baseIndexOf` except that it accepts a comparator.
63555 * @param {Array} array The array to inspect.
63556 * @param {*} value The value to search for.
63557 * @param {number} fromIndex The index to search from.
63558 * @param {Function} comparator The comparator invoked per element.
63559 * @returns {number} Returns the index of the matched value, else `-1`.
63561 function baseIndexOfWith(array, value, fromIndex, comparator) {
63562 var index = fromIndex - 1,
63563 length = array.length;
63565 while (++index < length) {
63566 if (comparator(array[index], value)) {
63573 /** Used for built-in method references. */
63574 var arrayProto$2 = Array.prototype;
63576 /** Built-in value references. */
63577 var splice$2 = arrayProto$2.splice;
63580 * The base implementation of `_.pullAllBy` without support for iteratee
63584 * @param {Array} array The array to modify.
63585 * @param {Array} values The values to remove.
63586 * @param {Function} [iteratee] The iteratee invoked per element.
63587 * @param {Function} [comparator] The comparator invoked per element.
63588 * @returns {Array} Returns `array`.
63590 function basePullAll(array, values, iteratee, comparator) {
63591 var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
63593 length = values.length,
63596 if (array === values) {
63597 values = copyArray(values);
63600 seen = arrayMap(array, baseUnary(iteratee));
63602 while (++index < length) {
63604 value = values[index],
63605 computed = iteratee ? iteratee(value) : value;
63607 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
63608 if (seen !== array) {
63609 splice$2.call(seen, fromIndex, 1);
63611 splice$2.call(array, fromIndex, 1);
63618 * This method is like `_.pull` except that it accepts an array of values to remove.
63620 * **Note:** Unlike `_.difference`, this method mutates `array`.
63626 * @param {Array} array The array to modify.
63627 * @param {Array} values The values to remove.
63628 * @returns {Array} Returns `array`.
63631 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63633 * _.pullAll(array, ['a', 'c']);
63634 * console.log(array);
63637 function pullAll(array, values) {
63638 return (array && array.length && values && values.length)
63639 ? basePullAll(array, values)
63644 * Removes all given values from `array` using
63645 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
63646 * for equality comparisons.
63648 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
63649 * to remove elements from an array by predicate.
63655 * @param {Array} array The array to modify.
63656 * @param {...*} [values] The values to remove.
63657 * @returns {Array} Returns `array`.
63660 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
63662 * _.pull(array, 'a', 'c');
63663 * console.log(array);
63666 var pull = baseRest(pullAll);
63668 function uiFieldRadio(field, context) {
63669 var dispatch$$1 = dispatch('change'),
63670 placeholder = d3_select(null),
63671 wrap = d3_select(null),
63672 labels = d3_select(null),
63673 radios = d3_select(null),
63674 radioData = clone(field.options || field.keys),
63681 function selectedKey() {
63682 var node = wrap.selectAll('.toggle-list label.active input');
63683 return !node.empty() && node.datum();
63687 function radio(selection$$1) {
63688 selection$$1.classed('preset-radio', true);
63690 wrap = selection$$1.selectAll('.preset-input-wrap')
63693 var enter = wrap.enter()
63695 .attr('class', 'preset-input-wrap toggle-list');
63699 .attr('class', 'placeholder');
63705 placeholder = wrap.selectAll('.placeholder');
63707 labels = wrap.selectAll('label')
63710 enter = labels.enter()
63715 .attr('type', 'radio')
63716 .attr('name', field.id)
63717 .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
63718 .attr('checked', false);
63722 .text(function(d) { return field.t('options.' + d, { 'default': d }); });
63727 radios = labels.selectAll('input')
63728 .on('change', changeRadio);
63733 function structureExtras(selection$$1, tags) {
63734 var selected = selectedKey(),
63735 type = context.presets().field(selected),
63736 layer = context.presets().field('layer'),
63737 showLayer = (selected === 'bridge' || selected === 'tunnel');
63740 var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
63741 .data(selected ? [0] : []);
63746 extrasWrap = extrasWrap.enter()
63748 .attr('class', 'structure-extras-wrap')
63749 .merge(extrasWrap);
63751 var list = extrasWrap.selectAll('ul')
63754 list = list.enter()
63761 if (!typeField || typeField.id !== selected) {
63762 typeField = uiField(context, type, entity, { wrap: false })
63763 .on('change', changeType);
63765 typeField.tags(tags);
63770 var typeItem = list.selectAll('.structure-type-item')
63771 .data(typeField ? [typeField] : [], function(d) { return d.id; });
63778 var typeEnter = typeItem.enter()
63779 .insert('li', ':first-child')
63780 .attr('class', 'cf structure-type-item');
63784 .attr('class', 'col6 label structure-label-type')
63785 .attr('for', 'preset-input-' + selected)
63786 .text(t('inspector.radio.structure.type'));
63790 .attr('class', 'col6 structure-input-type-wrap');
63793 typeItem = typeItem
63797 typeItem.selectAll('.structure-input-type-wrap')
63798 .call(typeField.render);
63803 if (layer && showLayer) {
63805 layerField = uiField(context, layer, entity, { wrap: false })
63806 .on('change', changeLayer);
63808 layerField.tags(tags);
63809 field.keys = union(field.keys, ['layer']);
63812 pull(field.keys, 'layer');
63815 var layerItem = list.selectAll('.structure-layer-item')
63816 .data(layerField ? [layerField] : []);
63823 var layerEnter = layerItem.enter()
63825 .attr('class', 'cf structure-layer-item');
63829 .attr('class', 'col6 label structure-label-layer')
63830 .attr('for', 'preset-input-layer')
63831 .text(t('inspector.radio.structure.layer'));
63835 .attr('class', 'col6 structure-input-layer-wrap');
63838 layerItem = layerItem
63839 .merge(layerEnter);
63842 layerItem.selectAll('.structure-input-layer-wrap')
63843 .call(layerField.render);
63848 function changeType(t$$1, onInput) {
63849 var key = selectedKey();
63852 var val = t$$1[key];
63853 if (val !== 'no') {
63854 oldType[key] = val;
63857 if (field.type === 'structureRadio') {
63858 // remove layer if it should not be set
63859 if (val === 'no' ||
63860 (key !== 'bridge' && key !== 'tunnel') ||
63861 (key === 'tunnel' && val === 'building_passage')) {
63862 t$$1.layer = undefined;
63864 // add layer if it should be set
63865 if (t$$1.layer === undefined) {
63866 if (key === 'bridge' && val !== 'no') {
63869 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
63875 dispatch$$1.call('change', this, t$$1, onInput);
63879 function changeLayer(t$$1, onInput) {
63880 if (t$$1.layer === '0') {
63881 t$$1.layer = undefined;
63883 dispatch$$1.call('change', this, t$$1, onInput);
63887 function changeRadio() {
63892 t$$1[field.key] = undefined;
63895 radios.each(function(d) {
63896 var active = d3_select(this).property('checked');
63897 if (active) activeKey = d;
63900 if (active) t$$1[field.key] = d;
63902 var val = oldType[activeKey] || 'yes';
63903 t$$1[d] = active ? val : undefined;
63907 if (field.type === 'structureRadio') {
63908 if (activeKey === 'bridge') {
63910 } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
63913 t$$1.layer = undefined;
63917 dispatch$$1.call('change', this, t$$1);
63921 radio.tags = function(tags) {
63922 function checked(d) {
63924 return tags[field.key] === d;
63926 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
63930 labels.classed('active', checked);
63931 radios.property('checked', checked);
63933 var selection$$1 = radios.filter(function() { return this.checked; });
63935 if (selection$$1.empty()) {
63936 placeholder.text(t('inspector.none'));
63938 placeholder.text(selection$$1.attr('value'));
63939 oldType[selection$$1.datum()] = tags[selection$$1.datum()];
63942 if (field.type === 'structureRadio') {
63943 // For waterways without a tunnel tag, set 'culvert' as
63944 // the oldType to default to if the user picks 'tunnel'
63945 if (!!tags.waterway && !oldType.tunnel) {
63946 oldType.tunnel = 'culvert';
63949 wrap.call(structureExtras, tags);
63954 radio.focus = function() {
63955 radios.node().focus();
63959 radio.entity = function(_) {
63960 if (!arguments.length) return entity;
63967 return utilRebind(radio, dispatch$$1, 'on');
63970 function uiFieldRestrictions(field, context) {
63971 var dispatch$$1 = dispatch('change');
63972 var breathe = behaviorBreathe(context);
63973 var storedViaWay = context.storage('turn-restriction-via-way');
63974 var storedDistance = context.storage('turn-restriction-distance');
63976 var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
63977 var _maxDistance = storedDistance ? (+storedDistance) : 30;
63978 var _initialized = false;
63979 var _parent = d3_select(null); // the entire field
63980 var _container = d3_select(null); // just the map
63988 function restrictions(selection$$1) {
63989 _parent = selection$$1;
63991 // try to reuse the intersection, but always rebuild it if the graph has changed
63992 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
63993 _graph = context.graph();
63994 _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
63997 // It's possible for there to be no actual intersection here.
63998 // for example, a vertex of two `highway=path`
63999 // In this case, hide the field.
64000 var isOK = (_intersection && _intersection.vertices.length && _intersection.ways.length);
64001 d3_select(selection$$1.node().parentNode).classed('hide', !isOK);
64003 // if form field is hidden or has detached from dom, clean up.
64005 !d3_select('.inspector-wrap.inspector-hidden').empty() ||
64006 !selection$$1.node().parentNode ||
64007 !selection$$1.node().parentNode.parentNode) {
64008 selection$$1.call(restrictions.off);
64013 var wrap = selection$$1.selectAll('.preset-input-wrap')
64016 wrap = wrap.enter()
64018 .attr('class', 'preset-input-wrap')
64021 var container = wrap.selectAll('.restriction-container')
64025 var containerEnter = container.enter()
64027 .attr('class', 'restriction-container');
64031 .attr('class', 'restriction-help');
64034 _container = containerEnter
64036 .call(renderViewer);
64038 var controls = wrap.selectAll('.restriction-controls')
64044 .attr('class', 'restriction-controls-container')
64046 .attr('class', 'restriction-controls')
64048 .call(renderControls);
64052 function renderControls(selection$$1) {
64053 var distControl = selection$$1.selectAll('.restriction-distance')
64059 var distControlEnter = distControl.enter()
64061 .attr('class', 'restriction-control restriction-distance');
64065 .attr('class', 'restriction-control-label restriction-distance-label')
64066 .text(t('restriction.controls.distance') + ':');
64070 .attr('class', 'restriction-distance-input')
64071 .attr('type', 'range')
64074 .attr('step', '5');
64078 .attr('class', 'restriction-distance-text');
64081 selection$$1.selectAll('.restriction-distance-input')
64082 .property('value', _maxDistance)
64083 .on('input', function() {
64084 var val = d3_select(this).property('value');
64085 _maxDistance = +val;
64086 _intersection = null;
64087 _container.selectAll('.layer-osm .layer-turns *').remove();
64088 context.storage('turn-restriction-distance', _maxDistance);
64089 _parent.call(restrictions);
64092 selection$$1.selectAll('.restriction-distance-text')
64093 .text(displayMaxDistance(_maxDistance));
64096 var viaControl = selection$$1.selectAll('.restriction-via-way')
64102 var viaControlEnter = viaControl.enter()
64104 .attr('class', 'restriction-control restriction-via-way');
64108 .attr('class', 'restriction-control-label restriction-via-way-label')
64109 .text(t('restriction.controls.via') + ':');
64113 .attr('class', 'restriction-via-way-input')
64114 .attr('type', 'range')
64117 .attr('step', '1');
64121 .attr('class', 'restriction-via-way-text');
64124 selection$$1.selectAll('.restriction-via-way-input')
64125 .property('value', _maxViaWay)
64126 .on('input', function() {
64127 var val = d3_select(this).property('value');
64129 _container.selectAll('.layer-osm .layer-turns *').remove();
64130 context.storage('turn-restriction-via-way', _maxViaWay);
64131 _parent.call(restrictions);
64134 selection$$1.selectAll('.restriction-via-way-text')
64135 .text(displayMaxVia(_maxViaWay));
64139 function renderViewer(selection$$1) {
64140 if (!_intersection) return;
64142 var vgraph = _intersection.graph;
64143 var filter = utilFunctor(true);
64144 var projection = geoRawMercator();
64146 var d = utilGetDimensions(selection$$1);
64147 var c = geoVecScale(d, 0.5);
64150 projection.scale(geoZoomToScale(z));
64152 // Calculate extent of all key vertices
64153 var extent = geoExtent$$1();
64154 for (var i = 0; i < _intersection.vertices.length; i++) {
64155 extent._extend(_intersection.vertices[i].extent());
64158 // If this is a large intersection, adjust zoom to fit extent
64159 if (_intersection.vertices.length > 1) {
64160 var padding = 180; // in z22 pixels
64161 var tl = projection([extent[0][0], extent[1][1]]);
64162 var br = projection([extent[1][0], extent[0][1]]);
64163 var hFactor = (br[0] - tl[0]) / (d[0] - padding);
64164 var vFactor = (br[1] - tl[1]) / (d[1] - padding);
64165 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
64166 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
64167 z = z - Math.max(hZoomDiff, vZoomDiff);
64168 projection.scale(geoZoomToScale(z));
64171 var padTop = 35; // reserve top space for hint text
64172 var extentCenter = projection(extent.center());
64173 extentCenter[1] = extentCenter[1] - padTop;
64176 .translate(geoVecSubtract(c, extentCenter))
64177 .clipExtent([[0, 0], d]);
64179 var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
64180 var drawVertices = svgVertices$$1(projection, context);
64181 var drawLines = svgLines$$1(projection, context);
64182 var drawTurns = svgTurns(projection, context);
64184 var firstTime = selection$$1.selectAll('.surface').empty();
64189 var surface = selection$$1.selectAll('.surface')
64190 .classed('tr', true);
64193 _initialized = true;
64199 .on('resize.restrictions', function() {
64200 utilSetDimensions(_container, null);
64206 // This can happen if we've lowered the detail while a FROM way
64207 // is selected, and that way is no longer part of the intersection.
64208 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
64214 .call(utilSetDimensions, d)
64215 .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
64216 .call(drawLines, vgraph, _intersection.ways, filter)
64217 .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
64220 .on('click.restrictions', click)
64221 .on('mouseover.restrictions', mouseover);
64224 .selectAll('.selected')
64225 .classed('selected', false);
64228 .selectAll('.related')
64229 .classed('related', false);
64232 var way = vgraph.entity(_fromWayID);
64234 .selectAll('.' + _fromWayID)
64235 .classed('selected', true)
64236 .classed('related', true);
64247 var datum = event.target.__data__;
64248 var entity = datum && datum.properties && datum.properties.entity;
64253 if (datum instanceof osmWay && (datum.__from || datum.__via)) {
64254 _fromWayID = datum.id;
64258 } else if (datum instanceof osmTurn) {
64259 var actions, extraActions, turns, i;
64260 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64262 if (datum.restrictionID && !datum.direct) {
64265 } else if (datum.restrictionID && !datum.only) { // NO -> ONLY
64266 var datumOnly = cloneDeep(datum);
64267 datumOnly.only = true;
64268 restrictionType = restrictionType.replace(/^no/, 'only');
64270 // Adding an ONLY restriction should destroy all other direct restrictions from the FROM.
64271 // We will remember them in _oldTurns, and restore them if the user clicks again.
64272 turns = _intersection.turns(_fromWayID, 2);
64275 for (i = 0; i < turns.length; i++) {
64276 if (turns[i].direct) {
64277 turns[i].restrictionType = osmInferRestriction(vgraph, turns[i], projection);
64278 _oldTurns.push(turns[i]);
64279 extraActions.push(actionUnrestrictTurn(turns[i]));
64283 actions = _intersection.actions.concat(extraActions, [
64284 actionRestrictTurn(datumOnly, restrictionType),
64285 t('operations.restriction.annotation.create')
64288 } else if (datum.restrictionID) { // ONLY -> Allowed
64289 // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
64290 // This relies on the assumption that the intersection was already split up when we
64291 // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
64292 turns = _oldTurns || [];
64294 for (i = 0; i < turns.length; i++) {
64295 if (turns[i].key !== datum.key) {
64296 extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
64301 actions = _intersection.actions.concat(extraActions, [
64302 actionUnrestrictTurn(datum),
64303 t('operations.restriction.annotation.delete')
64306 } else { // Allowed -> NO
64307 actions = _intersection.actions.concat([
64308 actionRestrictTurn(datum, restrictionType),
64309 t('operations.restriction.annotation.create')
64313 context.perform.apply(context, actions);
64315 // At this point the datum will be changed, but will have same key..
64316 // Refresh it and update the help..
64317 var s = surface.selectAll('.' + datum.key);
64318 datum = s.empty() ? null : s.datum();
64319 updateHints(datum);
64329 function mouseover() {
64330 var datum = event.target.__data__;
64331 updateHints(datum);
64335 function redraw() {
64336 if (context.hasEntity(_vertexID)) {
64337 _container.call(renderViewer);
64342 function highlightPathsFrom(wayID) {
64343 surface.selectAll('.related')
64344 .classed('related', false)
64345 .classed('allow', false)
64346 .classed('restrict', false)
64347 .classed('only', false);
64349 surface.selectAll('.' + wayID)
64350 .classed('related', true);
64353 var turns = _intersection.turns(wayID, _maxViaWay);
64354 for (var i = 0; i < turns.length; i++) {
64355 var turn = turns[i];
64356 var ids = [turn.to.way];
64357 var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
64359 if (turn.only || turns.length === 1) {
64360 if (turn.via.ways) {
64361 ids = ids.concat(turn.via.ways);
64363 } else if (turn.to.way === wayID) {
64367 surface.selectAll(utilEntitySelector(ids))
64368 .classed('related', true)
64369 .classed('allow', (klass === 'allow'))
64370 .classed('restrict', (klass === 'restrict'))
64371 .classed('only', (klass === 'only'));
64377 function updateHints(datum) {
64378 var help = _container.selectAll('.restriction-help').html('');
64380 var placeholders = {};
64381 ['from', 'via', 'to'].forEach(function(k) {
64382 placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
64385 var entity = datum && datum.properties && datum.properties.entity;
64391 way = vgraph.entity(_fromWayID);
64393 .selectAll('.' + _fromWayID)
64394 .classed('selected', true)
64395 .classed('related', true);
64399 if (datum instanceof osmWay && datum.__from) {
64402 highlightPathsFrom(_fromWayID ? null : way.id);
64403 surface.selectAll('.' + way.id)
64404 .classed('related', true);
64406 var clickSelect = (!_fromWayID || _fromWayID !== way.id);
64408 .append('div') // "Click to select FROM {fromName}." / "FROM {fromName}"
64409 .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
64410 from: placeholders.from,
64411 fromName: displayName(way.id, vgraph)
64415 // Hovering a turn arrow
64416 } else if (datum instanceof osmTurn) {
64417 var restrictionType = osmInferRestriction(vgraph, datum, projection);
64418 var turnType = restrictionType.replace(/^(only|no)\_/, '');
64419 var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
64420 var klass, turnText, nextText;
64423 klass = 'restrict';
64424 turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
64425 nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
64426 } else if (datum.only) {
64428 turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
64429 nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
64432 turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
64433 nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
64437 .append('div') // "NO Right Turn (indirect)"
64438 .attr('class', 'qualifier ' + klass)
64442 .append('div') // "FROM {fromName} TO {toName}"
64443 .html(t('restriction.help.from_name_to_name', {
64444 from: placeholders.from,
64445 fromName: displayName(datum.from.way, vgraph),
64446 to: placeholders.to,
64447 toName: displayName(datum.to.way, vgraph)
64450 if (datum.via.ways && datum.via.ways.length) {
64452 for (var i = 0; i < datum.via.ways.length; i++) {
64453 var prev = names[names.length - 1];
64454 var curr = displayName(datum.via.ways[i], vgraph);
64455 if (!prev || curr !== prev) // collapse identical names
64460 .append('div') // "VIA {viaNames}"
64461 .html(t('restriction.help.via_names', {
64462 via: placeholders.via,
64463 viaNames: names.join(', ')
64469 .append('div') // Click for "No Right Turn"
64470 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
64473 highlightPathsFrom(null);
64474 var alongIDs = datum.path.slice();
64475 surface.selectAll(utilEntitySelector(alongIDs))
64476 .classed('related', true)
64477 .classed('allow', (klass === 'allow'))
64478 .classed('restrict', (klass === 'restrict'))
64479 .classed('only', (klass === 'only'));
64482 // Hovering empty surface
64484 highlightPathsFrom(null);
64487 .append('div') // "FROM {fromName}"
64488 .html(t('restriction.help.from_name', {
64489 from: placeholders.from,
64490 fromName: displayName(_fromWayID, vgraph)
64495 .append('div') // "Click to select a FROM segment."
64496 .html(t('restriction.help.select_from', {
64497 from: placeholders.from
64505 function displayMaxDistance(maxDist) {
64506 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
64510 var distToFeet = { // imprecise conversion for prettier display
64511 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
64513 opts = { distance: t('units.feet', { quantity: distToFeet }) };
64515 opts = { distance: t('units.meters', { quantity: maxDist }) };
64518 return t('restriction.controls.distance_up_to', opts);
64522 function displayMaxVia(maxVia) {
64523 return maxVia === 0 ? t('restriction.controls.via_node_only')
64524 : maxVia === 1 ? t('restriction.controls.via_up_to_one')
64525 : t('restriction.controls.via_up_to_two');
64529 function displayName(entityID, graph) {
64530 var entity = graph.entity(entityID);
64531 var name = utilDisplayName(entity) || '';
64532 var matched = context.presets().match(entity, graph);
64533 var type = (matched && matched.name()) || utilDisplayType(entity.id);
64534 return name || type;
64538 restrictions.entity = function(_) {
64539 _intersection = null;
64546 restrictions.tags = function() {};
64547 restrictions.focus = function() {};
64550 restrictions.off = function(selection$$1) {
64551 if (!_initialized) return;
64553 selection$$1.selectAll('.surface')
64555 .on('click.restrictions', null)
64556 .on('mouseover.restrictions', null);
64559 .on('resize.restrictions', null);
64563 return utilRebind(restrictions, dispatch$$1, 'on');
64566 function uiFieldTextarea(field) {
64567 var dispatch$$1 = dispatch('change'),
64568 input = d3_select(null);
64571 function textarea(selection$$1) {
64572 input = selection$$1.selectAll('textarea')
64575 input = input.enter()
64576 .append('textarea')
64577 .attr('id', 'preset-input-' + field.id)
64578 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
64579 .attr('maxlength', 255)
64581 .on('input', change(true))
64582 .on('blur', change())
64583 .on('change', change())
64588 function change(onInput) {
64589 return function() {
64591 t$$1[field.key] = utilGetSetValue(input) || undefined;
64592 dispatch$$1.call('change', this, t$$1, onInput);
64597 textarea.tags = function(tags) {
64598 utilGetSetValue(input, tags[field.key] || '');
64602 textarea.focus = function() {
64603 input.node().focus();
64607 return utilRebind(textarea, dispatch$$1, 'on');
64610 function uiFieldWikipedia(field, context) {
64611 var dispatch$$1 = dispatch('change'),
64612 wikipedia = services.wikipedia,
64613 wikidata = services.wikidata,
64614 link = d3_select(null),
64615 lang = d3_select(null),
64616 title = d3_select(null),
64621 function wiki(selection$$1) {
64622 var langcombo = d3combobox()
64623 .container(context.container())
64624 .fetcher(function(value, cb) {
64625 var v = value.toLowerCase();
64627 cb(wikipedia$2.filter(function(d) {
64628 return d[0].toLowerCase().indexOf(v) >= 0 ||
64629 d[1].toLowerCase().indexOf(v) >= 0 ||
64630 d[2].toLowerCase().indexOf(v) >= 0;
64631 }).map(function(d) {
64632 return { value: d[1] };
64636 var titlecombo = d3combobox()
64637 .container(context.container())
64638 .fetcher(function(value, cb) {
64640 value = context.entity(entity.id).tags.name || '';
64643 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
64644 searchfn(language()[2], value, function(query, data$$1) {
64645 cb(data$$1.map(function(d) {
64646 return { value: d };
64652 lang = selection$$1.selectAll('input.wiki-lang')
64655 lang = lang.enter()
64657 .attr('type', 'text')
64658 .attr('class', 'wiki-lang')
64659 .attr('placeholder', t('translate.localized_translation_language'))
64663 utilGetSetValue(lang, language()[1]);
64667 .on('blur', changeLang)
64668 .on('change', changeLang);
64671 title = selection$$1.selectAll('input.wiki-title')
64674 title = title.enter()
64676 .attr('type', 'text')
64677 .attr('class', 'wiki-title')
64678 .attr('id', 'preset-input-' + field.id)
64685 .on('change', change);
64688 link = selection$$1.selectAll('.wiki-link')
64691 link = link.enter()
64693 .attr('class', 'button-input-action wiki-link minor')
64694 .attr('tabindex', -1)
64695 .call(svgIcon('#icon-out-link'))
64699 .on('click', function() {
64700 event.preventDefault();
64701 if (wikiURL) window.open(wikiURL, '_blank');
64706 function language() {
64707 var value = utilGetSetValue(lang).toLowerCase();
64708 var locale = utilDetect().locale.toLowerCase();
64709 var localeLanguage;
64710 return find$1(wikipedia$2, function(d) {
64711 if (d[2] === locale) localeLanguage = d;
64712 return d[0].toLowerCase() === value ||
64713 d[1].toLowerCase() === value ||
64715 }) || localeLanguage || ['English', 'English', 'en'];
64719 function changeLang() {
64720 utilGetSetValue(lang, language()[1]);
64730 function change(skipWikidata) {
64731 var value = utilGetSetValue(title),
64732 m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
64733 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64737 // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
64738 value = decodeURIComponent(m[2]).replace(/_/g, ' ');
64742 // Best-effort `anchordecode:` implementation
64743 anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
64745 anchor = decodeURIComponent(m[3]);
64747 value += '#' + anchor.replace(/_/g, ' ');
64749 value = value.slice(0, 1).toUpperCase() + value.slice(1);
64750 utilGetSetValue(lang, l[1]);
64751 utilGetSetValue(title, value);
64755 syncTags.wikipedia = language()[2] + ':' + value;
64757 syncTags.wikipedia = undefined;
64758 syncTags.wikidata = undefined;
64761 dispatch$$1.call('change', this, syncTags);
64764 if (skipWikidata || !value || !language()[2]) return;
64766 // attempt asynchronous update of wikidata tag..
64767 var initGraph = context.graph(),
64768 initEntityId = entity.id;
64770 wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
64771 // If graph has changed, we can't apply this update.
64772 if (context.graph() !== initGraph) return;
64774 if (!data$$1 || !Object.keys(data$$1).length) return;
64776 var qids = Object.keys(data$$1);
64777 var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
64778 var currTags = clone(context.entity(initEntityId).tags);
64780 currTags.wikidata = value;
64782 // Coalesce the update of wikidata tag into the previous tag change
64784 actionChangeTags(initEntityId, currTags),
64785 context.history().undoAnnotation()
64788 // do not dispatch.call('change') here, because entity_editor
64789 // changeTags() is not intended to be called asynchronously
64794 wiki.tags = function(tags) {
64795 var value = tags[field.key] || '',
64796 m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
64797 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
64798 anchor = m && m[3];
64800 // value in correct format
64802 utilGetSetValue(lang, l[1]);
64803 utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
64806 // Best-effort `anchorencode:` implementation
64807 anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
64809 anchor = anchor.replace(/ /g, '_');
64812 wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
64813 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
64815 // unrecognized value format
64817 utilGetSetValue(title, value);
64818 if (value && value !== '') {
64819 utilGetSetValue(lang, '');
64820 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
64828 wiki.entity = function(_) {
64829 if (!arguments.length) return entity;
64835 wiki.focus = function() {
64836 title.node().focus();
64840 return utilRebind(wiki, dispatch$$1, 'on');
64844 access: uiFieldAccess,
64845 address: uiFieldAddress,
64846 check: uiFieldCheck,
64847 combo: uiFieldCombo,
64848 cycleway: uiFieldCycleway,
64849 defaultCheck: uiFieldCheck,
64850 email: uiFieldText,
64851 lanes: uiFieldLanes,
64852 localized: uiFieldLocalized,
64853 maxspeed: uiFieldMaxspeed,
64854 multiCombo: uiFieldCombo,
64855 networkCombo: uiFieldCombo,
64856 number: uiFieldText,
64857 onewayCheck: uiFieldCheck,
64858 radio: uiFieldRadio,
64859 restrictions: uiFieldRestrictions,
64860 semiCombo: uiFieldCombo,
64861 structureRadio: uiFieldRadio,
64864 textarea: uiFieldTextarea,
64865 typeCombo: uiFieldCombo,
64867 wikipedia: uiFieldWikipedia
64870 function uiField(context, presetField, entity, options) {
64871 options = assignIn({
64879 var dispatch$$1 = dispatch('change');
64880 var field = clone(presetField);
64881 var _show = options.show;
64886 field.impl = uiFields[field.type](field, context)
64887 .on('change', function(t$$1, onInput) {
64888 dispatch$$1.call('change', field, t$$1, onInput);
64891 if (entity && field.impl.entity) {
64892 field.impl.entity(entity);
64895 field.keys = field.keys || [field.key];
64898 function isModified() {
64899 if (!entity) return false;
64900 var original = context.graph().base().entities[entity.id];
64901 return some(field.keys, function(key) {
64902 return original ? _tags[key] !== original.tags[key] : _tags[key];
64907 function isPresent() {
64908 return some(field.keys, function(key) {
64914 function revert(d) {
64915 event.stopPropagation();
64916 event.preventDefault();
64917 if (!entity) return false;
64919 var original = context.graph().base().entities[entity.id];
64921 d.keys.forEach(function(key) {
64922 t$$1[key] = original ? original.tags[key] : undefined;
64925 dispatch$$1.call('change', d, t$$1);
64929 function remove(d) {
64930 event.stopPropagation();
64931 event.preventDefault();
64934 d.keys.forEach(function(key) {
64935 t$$1[key] = undefined;
64938 dispatch$$1.call('change', d, t$$1);
64942 field.render = function(selection$$1) {
64943 var container = selection$$1.selectAll('.form-field')
64947 var enter = container.enter()
64949 .attr('class', function(d) { return 'form-field form-field-' + d.id; })
64950 .classed('nowrap', !options.wrap);
64952 if (options.wrap) {
64955 .attr('class', 'form-label')
64956 .attr('for', function(d) { return 'preset-input-' + d.id; })
64957 .text(function(d) { return d.label(); });
64961 .attr('class', 'form-label-button-wrap');
64963 if (options.remove) {
64966 .attr('class', 'remove-icon')
64967 .attr('tabindex', -1)
64968 .call(svgIcon('#operation-delete'));
64971 if (options.revert) {
64974 .attr('class', 'modified-icon')
64975 .attr('tabindex', -1)
64977 (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
64984 container = container
64987 container.selectAll('.form-label-button-wrap .remove-icon')
64988 .on('click', remove);
64990 container.selectAll('.form-label-button-wrap .modified-icon')
64991 .on('click', revert);
64994 .classed('modified', isModified())
64995 .classed('present', isPresent())
64996 .each(function(d) {
64997 var reference, help;
64999 // instantiate field help
65000 if (options.wrap && field.type === 'restrictions') {
65001 help = uiFieldHelp(context, 'restrictions');
65004 // instantiate tag reference
65005 if (options.wrap && options.info) {
65006 var referenceKey = d.key;
65007 if (d.type === 'multiCombo') { // lookup key without the trailing ':'
65008 referenceKey = referenceKey.replace(/:$/, '');
65011 reference = uiTagReference(d.reference || { key: referenceKey }, context);
65012 if (_state === 'hover') {
65013 reference.showing(false);
65020 // add field help components
65024 .select('.form-label-button-wrap')
65025 .call(help.button);
65028 // add tag reference components
65031 .call(reference.body)
65032 .select('.form-label-button-wrap')
65033 .call(reference.button);
65036 d.impl.tags(_tags);
65041 field.state = function(_) {
65042 if (!arguments.length) return _state;
65048 field.tags = function(_) {
65049 if (!arguments.length) return _tags;
65055 field.show = function() {
65057 if (field.default && field.key && _tags[field.key] !== field.default) {
65059 t$$1[field.key] = field.default;
65060 dispatch$$1.call('change', this, t$$1);
65065 field.isShown = function() {
65066 return _show || some(field.keys, function(key) { return !!_tags[key]; });
65070 field.focus = function() {
65071 field.impl.focus();
65075 return utilRebind(field, dispatch$$1, 'on');
65078 function uiFormFields(context) {
65082 function formFields(selection$$1, klass) {
65083 render(selection$$1, klass);
65087 function render(selection$$1, klass) {
65089 var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
65090 notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
65092 var container = selection$$1.selectAll('.form-fields-container')
65095 container = container.enter()
65097 .attr('class', 'form-fields-container ' + (klass || ''))
65101 var fields = container.selectAll('.wrap-form-field')
65102 .data(shown, function(d) { return d.id; });
65108 var enter = fields.enter()
65110 .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
65118 .each(function(d) {
65124 notShown = notShown.map(function(field) {
65126 title: field.label(),
65127 value: field.label(),
65133 var more = selection$$1.selectAll('.more-fields')
65134 .data((notShown.length > 0) ? [0] : []);
65139 more = more.enter()
65141 .attr('class', 'more-fields')
65143 .text(t('inspector.add_fields'))
65147 var input = more.selectAll('.value')
65153 input = input.enter()
65155 .attr('class', 'value')
65156 .attr('type', 'text')
65161 .call(utilGetSetValue, '')
65162 .attr('placeholder', function() {
65163 var placeholder = [];
65164 for (var field in notShown) {
65165 placeholder.push(notShown[field].title);
65167 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
65170 .container(context.container())
65173 .on('accept', function (d) {
65174 var field = d.field;
65176 render(selection$$1);
65177 if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
65185 formFields.fieldsArr = function(_) {
65186 if (!arguments.length) return fieldsArr;
65195 function uiPresetEditor(context) {
65196 var dispatch$$1 = dispatch('change'),
65197 formFields = uiFormFields(context),
65205 function presetEditor(selection$$1) {
65206 selection$$1.call(uiDisclosure(context, 'preset_fields', true)
65207 .title(t('inspector.all_fields'))
65213 function render(selection$$1) {
65215 var entity = context.entity(entityId),
65216 geometry = context.geometry(entityId),
65217 presets = context.presets();
65221 preset.fields.forEach(function(field) {
65222 if (field.matchGeometry(geometry)) {
65224 uiField(context, field, entity)
65229 if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
65231 uiField(context, presets.field('restrictions'), entity)
65235 presets.universal().forEach(function(field) {
65236 if (preset.fields.indexOf(field) === -1) {
65238 uiField(context, field, entity, { show: false })
65243 fieldsArr.forEach(function(field) {
65245 .on('change', function(t$$1, onInput) {
65246 dispatch$$1.call('change', field, t$$1, onInput);
65251 fieldsArr.forEach(function(field) {
65259 .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
65262 selection$$1.selectAll('.wrap-form-field input')
65263 .on('keydown', function() {
65264 // if user presses enter, and combobox is not active, accept edits..
65265 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
65266 context.enter(modeBrowse(context));
65272 presetEditor.preset = function(_) {
65273 if (!arguments.length) return preset;
65274 if (preset && preset.id === _.id) return presetEditor;
65277 return presetEditor;
65281 presetEditor.state = function(_) {
65282 if (!arguments.length) return state;
65284 return presetEditor;
65288 presetEditor.tags = function(_) {
65289 if (!arguments.length) return tags;
65291 // Don't reset fieldsArr here.
65292 return presetEditor;
65296 presetEditor.entityID = function(_) {
65297 if (!arguments.length) return entityId;
65298 if (entityId === _) return presetEditor;
65301 return presetEditor;
65305 return utilRebind(presetEditor, dispatch$$1, 'on');
65308 function uiEntityEditor(context) {
65309 var dispatch$$1 = dispatch('choose'),
65311 coalesceChanges = false,
65318 var presetEditor = uiPresetEditor(context)
65319 .on('change', changeTags);
65320 var rawTagEditor = uiRawTagEditor(context)
65321 .on('change', changeTags);
65324 function entityEditor(selection$$1) {
65325 var entity = context.entity(entityId),
65326 tags = clone(entity.tags);
65329 var header = selection$$1.selectAll('.header')
65333 var enter = header.enter()
65335 .attr('class', 'header fillL cf');
65339 .attr('class', 'fl preset-reset preset-choose')
65340 .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
65344 .attr('class', 'fr preset-close')
65345 .on('click', function() { context.enter(modeBrowse(context)); })
65346 .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
65350 .text(t('inspector.edit'));
65356 header.selectAll('.preset-reset')
65357 .on('click', function() {
65358 dispatch$$1.call('choose', this, activePreset);
65363 var body = selection$$1.selectAll('.inspector-body')
65367 enter = body.enter()
65369 .attr('class', 'inspector-body');
65373 .attr('class', 'preset-list-item inspector-inner')
65375 .attr('class', 'preset-list-button-wrap')
65377 .attr('class', 'preset-list-button preset-reset')
65378 .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
65380 .attr('class', 'label');
65384 .attr('class', 'inspector-border preset-editor');
65388 .attr('class', 'inspector-border raw-tag-editor inspector-inner');
65392 .attr('class', 'inspector-border raw-member-editor inspector-inner');
65396 .attr('class', 'raw-membership-editor inspector-inner');
65400 .attr('type', 'text')
65401 .attr('class', 'key-trap');
65408 body.selectAll('.preset-list-button-wrap')
65409 .call(reference.button);
65411 body.selectAll('.preset-list-item')
65412 .call(reference.body);
65414 body.selectAll('.preset-reset')
65415 .on('click', function() {
65416 dispatch$$1.call('choose', this, activePreset);
65419 body.select('.preset-list-item button')
65420 .call(uiPresetIcon()
65421 .geometry(context.geometry(entityId))
65422 .preset(activePreset)
65425 body.select('.preset-list-item .label')
65426 .text(activePreset.name());
65428 body.select('.preset-editor')
65430 .preset(activePreset)
65431 .entityID(entityId)
65436 body.select('.raw-tag-editor')
65438 .preset(activePreset)
65439 .entityID(entityId)
65444 if (entity.type === 'relation') {
65445 body.select('.raw-member-editor')
65446 .style('display', 'block')
65447 .call(uiRawMemberEditor(context)
65448 .entityID(entityId)
65451 body.select('.raw-member-editor')
65452 .style('display', 'none');
65455 body.select('.raw-membership-editor')
65456 .call(uiRawMembershipEditor(context)
65457 .entityID(entityId)
65460 body.select('.key-trap')
65461 .on('keydown.key-trap', function() {
65462 // On tabbing, send focus back to the first field on the inspector-body
65463 // (probably the `name` field) #4159
65464 if (event.keyCode === 9 && !event.shiftKey) {
65465 event.preventDefault();
65466 body.select('input').node().focus();
65471 .on('change.entity-editor', historyChanged);
65474 function historyChanged() {
65475 if (state === 'hide') return;
65477 var entity = context.hasEntity(entityId);
65478 var graph = context.graph();
65479 if (!entity) return;
65481 var match = context.presets().match(entity, graph);
65482 var activePreset = entityEditor.preset();
65483 var weakPreset = activePreset && isEmpty(activePreset.addTags);
65485 // A "weak" preset doesn't set any tags. (e.g. "Address")
65486 // Don't replace a weak preset with a fallback preset (e.g. "Point")
65487 if (!(weakPreset && match.isFallback())) {
65488 entityEditor.preset(match);
65490 entityEditor.modified(base !== graph);
65491 entityEditor(selection$$1);
65496 function clean(o) {
65498 function cleanVal(k, v) {
65499 function keepSpaces(k) {
65500 return k.match(/_hours|_times/) !== null;
65503 var blacklist = ['description', 'note', 'fixme'];
65504 if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
65506 var cleaned = v.split(';')
65507 .map(function(s) { return s.trim(); })
65508 .join(keepSpaces(k) ? '; ' : ';');
65510 // The code below is not intended to validate websites and emails.
65511 // It is only intended to prevent obvious copy-paste errors. (#2323)
65512 // clean website- and email-like tags
65513 if (k.indexOf('website') !== -1 ||
65514 k.indexOf('email') !== -1 ||
65515 cleaned.indexOf('http') === 0) {
65517 .replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
65524 var out = {}, k, v;
65526 if (k && (v = o[k]) !== undefined) {
65527 out[k] = cleanVal(k, v);
65534 // Tag changes that fire on input can all get coalesced into a single
65535 // history operation when the user leaves the field. #2342
65536 function changeTags(changed, onInput) {
65537 var entity = context.entity(entityId),
65538 annotation = t('operations.change_tags.annotation'),
65539 tags = clone(entity.tags);
65541 forEach(changed, function(v, k) {
65542 if (v !== undefined || tags.hasOwnProperty(k)) {
65548 tags = clean(tags);
65551 if (!isEqual(entity.tags, tags)) {
65552 if (coalesceChanges) {
65553 context.overwrite(actionChangeTags(entityId, tags), annotation);
65555 context.perform(actionChangeTags(entityId, tags), annotation);
65556 coalesceChanges = !!onInput;
65562 entityEditor.modified = function(_) {
65563 if (!arguments.length) return modified;
65565 d3_selectAll('button.preset-close use')
65566 .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
65570 entityEditor.state = function(_) {
65571 if (!arguments.length) return state;
65573 return entityEditor;
65577 entityEditor.entityID = function(_) {
65578 if (!arguments.length) return entityId;
65580 base = context.graph();
65581 entityEditor.preset(context.presets().match(context.entity(entityId), base));
65582 entityEditor.modified(false);
65583 coalesceChanges = false;
65584 return entityEditor;
65588 entityEditor.preset = function(_) {
65589 if (!arguments.length) return activePreset;
65590 if (_ !== activePreset) {
65592 reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
65595 return entityEditor;
65599 return utilRebind(entityEditor, dispatch$$1, 'on');
65602 function uiPresetList(context) {
65603 var dispatch$$1 = dispatch('choose'),
65609 function presetList(selection$$1) {
65610 var entity = context.entity(id),
65611 geometry = context.geometry(id);
65613 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
65614 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
65615 geometry = 'point';
65618 var presets = context.presets().matchGeometry(geometry);
65620 selection$$1.html('');
65622 var messagewrap = selection$$1
65624 .attr('class', 'header fillL cf');
65626 var message = messagewrap
65628 .text(t('inspector.choose'));
65630 if (context.entity(id).isUsed(context.graph())) {
65633 .attr('class', 'preset-choose')
65634 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
65635 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
65639 .attr('class', 'close')
65640 .on('click', function() {
65641 context.enter(modeBrowse(context));
65643 .call(svgIcon('#icon-close'));
65646 function keydown() {
65647 // hack to let delete shortcut work when search is autofocused
65648 if (search.property('value').length === 0 &&
65649 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
65650 event.keyCode === d3keybinding.keyCodes['⌦'])) {
65651 event.preventDefault();
65652 event.stopPropagation();
65653 operationDelete([id], context)();
65654 } else if (search.property('value').length === 0 &&
65655 (event.ctrlKey || event.metaKey) &&
65656 event.keyCode === d3keybinding.keyCodes.z) {
65657 event.preventDefault();
65658 event.stopPropagation();
65660 } else if (!event.ctrlKey && !event.metaKey) {
65661 d3_select(this).on('keydown', null);
65665 function keypress() {
65667 var value = search.property('value');
65668 if (event.keyCode === 13 && value.length) {
65669 list.selectAll('.preset-list-item:first-child').datum().choose();
65673 function inputevent() {
65674 var value = search.property('value');
65675 list.classed('filtered', value.length);
65676 if (value.length) {
65677 var results = presets.search(value, geometry);
65678 message.text(t('inspector.results', {
65679 n: results.collection.length,
65682 list.call(drawList, results);
65684 list.call(drawList, context.presets().defaults(geometry, 36));
65685 message.text(t('inspector.choose'));
65689 var searchWrap = selection$$1
65691 .attr('class', 'search-header');
65693 var search = searchWrap
65695 .attr('class', 'preset-search-input')
65696 .attr('placeholder', t('inspector.search'))
65697 .attr('type', 'search')
65699 .on('keydown', keydown)
65700 .on('keypress', keypress)
65701 .on('input', inputevent);
65704 .call(svgIcon('#icon-search', 'pre-text'));
65707 search.node().focus();
65710 var listWrap = selection$$1
65712 .attr('class', 'inspector-body');
65714 var list = listWrap
65716 .attr('class', 'preset-list fillL cf')
65717 .call(drawList, context.presets().defaults(geometry, 36));
65721 function drawList(list, presets) {
65722 var collection = presets.collection.map(function(preset) {
65723 return preset.members ? CategoryItem(preset) : PresetItem(preset);
65726 var items = list.selectAll('.preset-list-item')
65727 .data(collection, function(d) { return d.preset.id; });
65736 .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
65737 .classed('current', function(item) { return item.preset === currentPreset; })
65738 .each(function(item) { d3_select(this).call(item); })
65739 .style('opacity', 0)
65741 .style('opacity', 1);
65745 function CategoryItem(preset) {
65746 var box, sublist, shown = false;
65748 function item(selection$$1) {
65749 var wrap = selection$$1.append('div')
65750 .attr('class', 'preset-list-button-wrap category col12');
65754 .attr('class', 'preset-list-button')
65755 .classed('expanded', false)
65756 .call(uiPresetIcon()
65757 .geometry(context.geometry(id))
65759 .on('click', function() {
65760 var isExpanded = d3_select(this).classed('expanded');
65761 var iconName = isExpanded ?
65762 (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
65764 .classed('expanded', !isExpanded);
65765 d3_select(this).selectAll('div.label svg.icon use')
65766 .attr('href', iconName);
65772 .attr('class', 'label');
65775 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
65777 .html(function() { return preset.name() + '…'; });
65779 box = selection$$1.append('div')
65780 .attr('class', 'subgrid col12')
65781 .style('max-height', '0px')
65782 .style('opacity', 0);
65785 .attr('class', 'arrow');
65787 sublist = box.append('div')
65788 .attr('class', 'preset-list fillL3 cf fl');
65792 item.choose = function() {
65793 if (!box || !sublist) return;
65799 .style('opacity', '0')
65800 .style('max-height', '0px')
65801 .style('padding-bottom', '0px');
65804 sublist.call(drawList, preset.members);
65807 .style('opacity', '1')
65808 .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
65809 .style('padding-bottom', '20px');
65813 item.preset = preset;
65819 function PresetItem(preset) {
65820 function item(selection$$1) {
65821 var wrap = selection$$1.append('div')
65822 .attr('class', 'preset-list-button-wrap col12');
65824 wrap.append('button')
65825 .attr('class', 'preset-list-button')
65826 .call(uiPresetIcon()
65827 .geometry(context.geometry(id))
65829 .on('click', item.choose)
65831 .attr('class', 'label')
65832 .text(preset.name());
65834 wrap.call(item.reference.button);
65835 selection$$1.call(item.reference.body);
65838 item.choose = function() {
65839 context.presets().choose(preset);
65842 actionChangePreset(id, currentPreset, preset),
65843 t('operations.change_tags.annotation')
65846 dispatch$$1.call('choose', this, preset);
65849 item.help = function() {
65850 event.stopPropagation();
65851 item.reference.toggle();
65854 item.preset = preset;
65855 item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
65861 presetList.autofocus = function(_) {
65862 if (!arguments.length) return autofocus;
65868 presetList.entityID = function(_) {
65869 if (!arguments.length) return id;
65871 presetList.preset(context.presets().match(context.entity(id), context.graph()));
65876 presetList.preset = function(_) {
65877 if (!arguments.length) return currentPreset;
65883 return utilRebind(presetList, dispatch$$1, 'on');
65886 function uiViewOnOSM(context) {
65889 function viewOnOSM(selection) {
65890 var entity = context.entity(id);
65892 selection.style('display', entity.isNew() ? 'none' : null);
65894 var link = selection.selectAll('.view-on-osm')
65897 var enter = link.enter()
65899 .attr('class', 'view-on-osm')
65900 .attr('target', '_blank')
65901 .call(svgIcon('#icon-out-link', 'inline'));
65905 .text(t('inspector.view_on_osm'));
65909 .attr('href', context.connection().entityURL(entity));
65913 viewOnOSM.entityID = function(_) {
65914 if (!arguments.length) return id;
65922 function uiInspector(context) {
65923 var presetList = uiPresetList(context);
65924 var entityEditor = uiEntityEditor(context);
65925 var _state = 'select';
65927 var _newFeature = false;
65930 function inspector(selection$$1) {
65932 .entityID(_entityID)
65933 .autofocus(_newFeature)
65934 .on('choose', setPreset);
65938 .entityID(_entityID)
65939 .on('choose', showList);
65941 var wrap = selection$$1.selectAll('.panewrap')
65944 var enter = wrap.enter()
65946 .attr('class', 'panewrap');
65950 .attr('class', 'preset-list-pane pane');
65954 .attr('class', 'entity-editor-pane pane');
65956 wrap = wrap.merge(enter);
65957 var presetPane = wrap.selectAll('.preset-list-pane');
65958 var editorPane = wrap.selectAll('.entity-editor-pane');
65960 var graph = context.graph(),
65961 entity = context.entity(_entityID),
65962 showEditor = _state === 'hover' ||
65963 entity.isUsed(graph) ||
65964 entity.isHighwayIntersection(graph);
65967 wrap.style('right', '0%');
65968 editorPane.call(entityEditor);
65970 wrap.style('right', '-100%');
65971 presetPane.call(presetList);
65974 var footer = selection$$1.selectAll('.footer')
65977 footer = footer.enter()
65979 .attr('class', 'footer')
65983 .call(uiViewOnOSM(context).entityID(_entityID));
65986 function showList(preset) {
65988 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
65991 .call(presetList.preset(preset).autofocus(true));
65995 function setPreset(preset) {
65997 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
66000 .call(entityEditor.preset(preset));
66005 inspector.state = function(_) {
66006 if (!arguments.length) return _state;
66008 entityEditor.state(_state);
66010 // remove any old field help overlay that might have gotten attached to the inspector
66011 d3_selectAll('.field-help-body').remove();
66017 inspector.entityID = function(_) {
66018 if (!arguments.length) return _entityID;
66024 inspector.newFeature = function(_) {
66025 if (!arguments.length) return _newFeature;
66034 function uiSidebar(context) {
66035 var inspector = uiInspector(context),
66039 function sidebar(selection) {
66040 var featureListWrap = selection
66042 .attr('class', 'feature-list-pane')
66043 .call(uiFeatureList(context));
66046 var inspectorWrap = selection
66048 .attr('class', 'inspector-hidden inspector-wrap fr');
66051 function hover(id) {
66052 if (!current && context.hasEntity(id)) {
66054 .classed('inspector-hidden', true);
66057 .classed('inspector-hidden', false)
66058 .classed('inspector-hover', true);
66060 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
66069 } else if (!current) {
66071 .classed('inspector-hidden', false);
66073 .classed('inspector-hidden', true);
66080 sidebar.hover = throttle(hover, 200);
66083 sidebar.select = function(id, newFeature) {
66084 if (!current && id) {
66086 .classed('inspector-hidden', true);
66089 .classed('inspector-hidden', false)
66090 .classed('inspector-hover', false);
66092 if (inspector.entityID() !== id || inspector.state() !== 'select') {
66096 .newFeature(newFeature);
66102 } else if (!current) {
66104 .classed('inspector-hidden', false);
66106 .classed('inspector-hidden', true);
66113 sidebar.show = function(component) {
66115 .classed('inspector-hidden', true);
66117 .classed('inspector-hidden', true);
66119 if (current) current.remove();
66120 current = selection
66122 .attr('class', 'sidebar-component')
66127 sidebar.hide = function() {
66129 .classed('inspector-hidden', false);
66131 .classed('inspector-hidden', true);
66133 if (current) current.remove();
66139 sidebar.hover = function() {};
66140 sidebar.hover.cancel = function() {};
66141 sidebar.select = function() {};
66142 sidebar.show = function() {};
66143 sidebar.hide = function() {};
66148 function uiSpinner(context) {
66149 var osm = context.connection();
66152 return function(selection) {
66153 var img = selection
66155 .attr('src', context.imagePath('loader-black.gif'))
66156 .style('opacity', 0);
66160 .on('loading.spinner', function() {
66162 .style('opacity', 1);
66164 .on('loaded.spinner', function() {
66166 .style('opacity', 0);
66172 function uiSplash(context) {
66174 return function(selection) {
66175 if (context.storage('sawSplash'))
66178 context.storage('sawSplash', true);
66180 var modalSelection = uiModal(selection);
66182 modalSelection.select('.modal')
66183 .attr('class', 'modal-splash modal col6');
66185 var introModal = modalSelection.select('.content')
66187 .attr('class', 'fillL');
66191 .attr('class','modal-section cf')
66192 .append('h3').text(t('splash.welcome'));
66196 .attr('class','modal-section')
66198 .html(t('splash.text', {
66199 version: context.version,
66200 website: '<a href="http://ideditor.com/">ideditor.com</a>',
66201 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
66204 var buttonWrap = introModal
66206 .attr('class', 'modal-actions cf');
66208 var walkthrough = buttonWrap
66210 .attr('class', 'walkthrough col6')
66211 .on('click', function() {
66212 context.container().call(uiIntro(context));
66213 modalSelection.close();
66218 .attr('class', 'logo logo-walkthrough')
66220 .attr('xlink:href', '#logo-walkthrough');
66224 .text(t('splash.walkthrough'));
66226 var startEditing = buttonWrap
66228 .attr('class', 'start-editing col6')
66229 .on('click', modalSelection.close);
66233 .attr('class', 'logo logo-features')
66235 .attr('xlink:href', '#logo-features');
66239 .text(t('splash.start'));
66242 modalSelection.select('button.close')
66243 .attr('class','hide');
66248 function uiStatus(context) {
66249 var osm = context.connection();
66252 return function(selection$$1) {
66255 function update() {
66256 osm.status(function(err, apiStatus) {
66257 selection$$1.html('');
66260 if (apiStatus === 'connectionSwitched') {
66261 // if the connection was just switched, we can't rely on
66262 // the status (we're getting the status of the previous api)
66265 } else if (apiStatus === 'rateLimited') {
66267 .text(t('status.rateLimit'))
66269 .attr('class', 'api-status-login')
66270 .attr('target', '_blank')
66271 .call(svgIcon('#icon-out-link', 'inline'))
66274 .on('click.login', function() {
66275 event.preventDefault();
66276 osm.authenticate();
66279 // eslint-disable-next-line no-warning-comments
66280 // TODO: nice messages for different error types
66281 selection$$1.text(t('status.error'));
66284 } else if (apiStatus === 'readonly') {
66285 selection$$1.text(t('status.readonly'));
66286 } else if (apiStatus === 'offline') {
66287 selection$$1.text(t('status.offline'));
66290 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
66294 osm.on('change', function() { update(selection$$1); });
66296 window.setInterval(update, 90000);
66297 update(selection$$1);
66301 function uiUndoRedo(context) {
66305 action: function() { if (editable()) context.undo(); },
66306 annotation: function() { return context.history().undoAnnotation(); }
66310 action: function() { if (editable()) context.redo(); },
66311 annotation: function() { return context.history().redoAnnotation(); }
66315 function editable() {
66316 var mode = context.mode();
66317 return context.editable() && mode && mode.id !== 'save';
66321 return function(selection$$1) {
66322 var tooltipBehavior = tooltip()
66323 .placement('bottom')
66325 .title(function (d) {
66326 return uiTooltipHtml(d.annotation() ?
66327 t(d.id + '.tooltip', {action: d.annotation()}) :
66328 t(d.id + '.nothing'), d.cmd);
66331 var buttons = selection$$1.selectAll('button')
66335 .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
66336 .on('click', function(d) { return d.action(); })
66337 .call(tooltipBehavior);
66339 buttons.each(function(d) {
66340 var iconName = d.id;
66341 if (textDirection === 'rtl') {
66342 if (iconName === 'undo') {
66344 } else if (iconName === 'redo') {
66349 .call(svgIcon('#icon-' + iconName));
66352 var keybinding = d3keybinding('undo')
66353 .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
66354 .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
66356 d3_select(document)
66360 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
66363 .on('move.undo_redo', debouncedUpdate)
66364 .on('drawn.undo_redo', debouncedUpdate);
66367 .on('change.undo_redo', update);
66370 .on('enter.undo_redo', update);
66373 function update() {
66375 .property('disabled', !editable())
66376 .classed('disabled', function(d) { return !d.annotation(); })
66378 var selection$$1 = d3_select(this);
66379 if (selection$$1.property('tooltipVisible')) {
66380 selection$$1.call(tooltipBehavior.show);
66387 // these are module variables so they are preserved through a ui.restart()
66388 var sawVersion = null,
66389 isNewVersion = false,
66393 function uiVersion(context) {
66395 var currVersion = context.version,
66396 matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
66398 if (sawVersion === null && matchedVersion !== null) {
66399 isNewVersion = (context.storage('sawVersion') !== currVersion);
66400 isNewUser = !context.storage('sawSplash');
66401 context.storage('sawVersion', currVersion);
66402 sawVersion = currVersion;
66405 return function(selection) {
66408 .attr('target', '_blank')
66409 .attr('tabindex', -1)
66410 .attr('href', 'https://github.com/openstreetmap/iD')
66411 .text(currVersion);
66413 // only show new version indicator to users that have used iD before
66414 if (isNewVersion && !isNewUser) {
66417 .attr('class', 'badge')
66419 .attr('target', '_blank')
66420 .attr('tabindex', -1)
66421 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
66422 .call(svgIcon('#gift-11'))
66424 .title(t('version.whats_new', { version: currVersion }))
66431 function uiZoom(context) {
66435 title: t('zoom.in'),
66436 action: context.zoomIn,
66441 title: t('zoom.out'),
66442 action: context.zoomOut,
66447 function zoomIn() {
66448 event.preventDefault();
66453 function zoomOut() {
66454 event.preventDefault();
66459 function zoomInFurther() {
66460 event.preventDefault();
66461 context.zoomInFurther();
66465 function zoomOutFurther() {
66466 event.preventDefault();
66467 context.zoomOutFurther();
66471 return function(selection$$1) {
66472 var button = selection$$1.selectAll('button')
66476 .attr('tabindex', -1)
66477 .attr('class', function(d) { return d.id; })
66478 .on('click.editor', function(d) { d.action(); })
66480 .placement((textDirection === 'rtl') ? 'right' : 'left')
66482 .title(function(d) {
66483 return uiTooltipHtml(d.title, d.key);
66487 button.each(function(d) {
66489 .call(svgIcon('#icon-' + d.icon, 'light'));
66492 var keybinding = d3keybinding('zoom');
66494 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
66495 keybinding.on([key], zoomIn);
66496 keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
66499 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
66500 keybinding.on([key], zoomOut);
66501 keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
66504 d3_select(document)
66509 function uiInit(context) {
66510 var uiInitCounter = 0;
66513 function render(container) {
66515 .attr('dir', textDirection);
66517 var map = context.map();
66519 var hash = behaviorHash(context);
66522 if (!hash.hadHash) {
66523 map.centerZoom([0, 0], 2);
66528 .attr('id', 'defs')
66529 .call(svgDefs(context));
66533 .attr('id', 'sidebar')
66534 .attr('class', 'col4')
66537 var content = container
66539 .attr('id', 'content')
66540 .attr('class', 'active');
66545 .attr('class', 'fillD');
66550 .attr('dir', 'ltr')
66554 .call(uiMapInMap(context))
66555 .call(uiInfo(context))
66556 .call(uiNotice(context));
66560 .attr('class', 'spacer col4');
66562 var limiter = bar.append('div')
66563 .attr('class', 'limiter');
66567 .attr('class', 'button-wrap joined col3')
66568 .call(uiModes(context), limiter);
66572 .attr('class', 'button-wrap joined col1')
66573 .call(uiUndoRedo(context));
66577 .attr('class', 'button-wrap col1')
66578 .call(uiSave(context));
66582 .attr('class', 'full-screen')
66583 .call(uiFullScreen(context));
66587 .attr('class', 'spinner')
66588 .call(uiSpinner(context));
66593 .attr('class', 'map-controls');
66597 .attr('class', 'map-control zoombuttons')
66598 .call(uiZoom(context));
66602 .attr('class', 'map-control geolocate-control')
66603 .call(uiGeolocate(context));
66607 .attr('class', 'map-control background-control')
66608 .call(uiBackground(context));
66612 .attr('class', 'map-control map-data-control')
66613 .call(uiMapData(context));
66617 .attr('class', 'map-control help-control')
66618 .call(uiHelp(context));
66621 var about = content
66623 .attr('id', 'about');
66627 .attr('id', 'attrib')
66628 .attr('dir', 'ltr')
66629 .call(uiAttribution(context));
66633 .attr('class', 'api-status')
66634 .call(uiStatus(context));
66639 .attr('id', 'footer')
66640 .attr('class', 'fillD');
66644 .attr('id', 'flash-wrap')
66645 .attr('class', 'footer-hide');
66647 var footerWrap = footer
66649 .attr('id', 'footer-wrap')
66650 .attr('class', 'footer-show');
66654 .attr('id', 'scale-block')
66655 .call(uiScale(context));
66657 var aboutList = footerWrap
66659 .attr('id', 'info-block')
66661 .attr('id', 'about-list');
66663 if (!context.embed()) {
66665 .call(uiAccount(context));
66670 .attr('class', 'version')
66671 .call(uiVersion(context));
66673 var issueLinks = aboutList
66678 .attr('target', '_blank')
66679 .attr('tabindex', -1)
66680 .attr('href', 'https://github.com/openstreetmap/iD/issues')
66681 .call(svgIcon('#icon-bug', 'light'))
66682 .call(tooltip().title(t('report_a_bug')).placement('top'));
66686 .attr('target', '_blank')
66687 .attr('tabindex', -1)
66688 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
66689 .call(svgIcon('#icon-translate', 'light'))
66690 .call(tooltip().title(t('help_translate')).placement('top'));
66694 .attr('class', 'feature-warning')
66695 .attr('tabindex', -1)
66696 .call(uiFeatureInfo(context));
66700 .attr('class', 'user-list')
66701 .attr('tabindex', -1)
66702 .call(uiContributors(context));
66705 var photoviewer = content
66707 .attr('id', 'photoviewer')
66708 .classed('al', true) // 'al'=left, 'ar'=right
66709 .classed('hide', true);
66713 .attr('class', 'thumb-hide')
66714 .on('click', function () {
66715 if (services.mapillary) { services.mapillary.hideViewer(); }
66716 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
66719 .call(svgIcon('#icon-close'));
66722 window.onbeforeunload = function() {
66723 return context.save();
66726 window.onunload = function() {
66727 context.history().unlock();
66730 var mapDimensions = map.dimensions();
66733 function onResize() {
66734 mapDimensions = utilGetDimensions(content, true);
66735 map.dimensions(mapDimensions);
66739 .on('resize.editor', onResize);
66744 return function() {
66745 event.preventDefault();
66746 context.pan(d, 100);
66754 var keybinding = d3keybinding('main')
66755 .on('⌫', function() { event.preventDefault(); })
66756 .on('←', pan([pa, 0]))
66757 .on('↑', pan([0, pa]))
66758 .on('→', pan([-pa, 0]))
66759 .on('↓', pan([0, -pa]))
66760 .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
66761 .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
66762 .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
66763 .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
66765 d3_select(document)
66768 context.enter(modeBrowse(context));
66770 if (!uiInitCounter++) {
66771 if (!hash.startWalkthrough) {
66772 context.container()
66773 .call(uiSplash(context))
66774 .call(uiRestore(context));
66777 context.container()
66778 .call(uiShortcuts(context));
66781 var osm = context.connection(),
66782 auth = uiLoading(context).message(t('loading_auth')).blocking(true);
66786 .on('authLoading.ui', function() {
66787 context.container()
66790 .on('authDone.ui', function() {
66797 if (hash.startWalkthrough) {
66798 hash.startWalkthrough = false;
66799 context.container().call(uiIntro(context));
66804 var renderCallback;
66806 function ui(node, callback) {
66807 renderCallback = callback;
66808 var container = d3_select(node);
66809 context.container(container);
66810 context.loadLocale(function(err) {
66821 ui.restart = function(arg) {
66822 context.locale(arg);
66823 context.loadLocale(function(err) {
66825 context.container().selectAll('*').remove();
66826 render(context.container());
66827 if (renderCallback) renderCallback();
66833 ui.sidebar = uiSidebar(context);
66838 function uiChangesetEditor(context) {
66839 var dispatch$$1 = dispatch('change'),
66840 formFields = uiFormFields(context),
66847 function changesetEditor(selection) {
66852 function render(selection) {
66853 var initial = false;
66857 var presets = context.presets();
66860 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
66861 uiField(context, presets.field('source'), null, { show: false, revert: false }),
66862 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
66865 fieldsArr.forEach(function(field) {
66867 .on('change', function(t$$1, onInput) {
66868 dispatch$$1.call('change', field, t$$1, onInput);
66873 fieldsArr.forEach(function(field) {
66880 .call(formFields.fieldsArr(fieldsArr));
66884 var commentField = selection.select('#preset-input-comment'),
66885 commentNode = commentField.node();
66888 commentNode.focus();
66889 commentNode.select();
66892 // trigger a 'blur' event so that comment field can be cleaned
66893 // and checked for hashtags, even if retrieved from localstorage
66894 utilTriggerEvent(commentField, 'blur');
66896 var osm = context.connection();
66898 osm.userChangesets(function (err, changesets) {
66901 var comments = changesets.map(function(changeset) {
66903 title: changeset.tags.comment,
66904 value: changeset.tags.comment
66910 .container(context.container())
66911 .caseSensitive(true)
66912 .data(uniqBy(comments, 'title'))
66918 // Add warning if comment mentions Google
66919 var hasGoogle = tags.comment.match(/google/i);
66920 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
66921 .data(hasGoogle ? [0] : []);
66923 commentWarning.exit()
66926 .style('opacity', 0)
66929 var commentEnter = commentWarning.enter()
66930 .insert('div', '.tag-reference-body')
66931 .attr('class', 'field-warning comment-warning')
66932 .style('opacity', 0);
66936 .attr('target', '_blank')
66937 .attr('tabindex', -1)
66938 .call(svgIcon('#icon-alert', 'inline'))
66939 .attr('href', t('commit.google_warning_link'))
66941 .text(t('commit.google_warning'));
66946 .style('opacity', 1);
66950 changesetEditor.tags = function(_) {
66951 if (!arguments.length) return tags;
66953 // Don't reset fieldsArr here.
66954 return changesetEditor;
66958 changesetEditor.changesetID = function(_) {
66959 if (!arguments.length) return changesetId;
66960 if (changesetId === _) return changesetEditor;
66963 return changesetEditor;
66967 return utilRebind(changesetEditor, dispatch$$1, 'on');
66971 * This method is like `_.union` except that it accepts `iteratee` which is
66972 * invoked for each element of each `arrays` to generate the criterion by
66973 * which uniqueness is computed. Result values are chosen from the first
66974 * array in which the value occurs. The iteratee is invoked with one argument:
66981 * @param {...Array} [arrays] The arrays to inspect.
66982 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
66983 * @returns {Array} Returns the new array of combined values.
66986 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
66989 * // The `_.property` iteratee shorthand.
66990 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
66991 * // => [{ 'x': 1 }, { 'x': 2 }]
66993 var unionBy = baseRest(function(arrays) {
66994 var iteratee = last(arrays);
66995 if (isArrayLikeObject(iteratee)) {
66996 iteratee = undefined;
66998 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
67001 function uiCommitChanges(context) {
67002 var detected = utilDetect();
67006 function commitChanges(selection$$1) {
67007 var history = context.history();
67008 var summary = history.difference().summary();
67010 var container = selection$$1.selectAll('.modal-section.commit-section')
67013 var containerEnter = container.enter()
67015 .attr('class', 'commit-section modal-section fillL2');
67019 .text(t('commit.changes', { count: summary.length }));
67023 .attr('class', 'changeset-list');
67025 container = containerEnter
67029 var items = container.select('ul').selectAll('li')
67032 var itemsEnter = items.enter()
67034 .attr('class', 'change-item');
67037 .each(function(d) {
67039 .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
67044 .attr('class', 'change-type')
67045 .text(function(d) { return t('commit.' + d.changeType) + ' '; });
67049 .attr('class', 'entity-type')
67050 .text(function(d) {
67051 var matched = context.presets().match(d.entity, d.graph);
67052 return (matched && matched.name()) || utilDisplayType(d.entity.id);
67057 .attr('class', 'entity-name')
67058 .text(function(d) {
67059 var name = utilDisplayName(d.entity) || '',
67064 return string += ' ' + name;
67068 .style('opacity', 0)
67070 .style('opacity', 1);
67076 .on('mouseover', mouseover)
67077 .on('mouseout', mouseout)
67078 .on('click', click);
67081 // Download changeset link
67082 var changeset = new osmChangeset().update({ id: undefined });
67083 var changes = history.changes(actionDiscardTags(history.difference()));
67085 delete changeset.id; // Export without chnageset_id
67087 var data = JXON.stringify(changeset.osmChangeJXON(changes));
67088 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
67089 var fileName = 'changes.osc';
67091 var linkEnter = container.selectAll('.download-changes')
67095 .attr('class', 'download-changes');
67097 if (detected.download) { // All except IE11 and Edge
67098 linkEnter // download the data as a file
67099 .attr('href', window.URL.createObjectURL(blob))
67100 .attr('download', fileName);
67102 } else { // IE11 and Edge
67103 linkEnter // open data uri in a new tab
67104 .attr('target', '_blank')
67105 .on('click.download', function() {
67106 navigator.msSaveBlob(blob, fileName);
67111 .call(svgIcon('#icon-load', 'inline'))
67113 .text(t('commit.download_changes'));
67116 function mouseover(d) {
67118 context.surface().selectAll(
67119 utilEntityOrMemberSelector([d.entity.id], context.graph())
67120 ).classed('hover', true);
67125 function mouseout() {
67126 context.surface().selectAll('.hover')
67127 .classed('hover', false);
67131 function click(change) {
67132 if (change.changeType === 'deleted') {
67135 var entity = change.entity;
67136 _entityID = change.entity.id;
67137 context.map().zoomTo(entity);
67138 context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
67139 .classed('hover', true);
67145 commitChanges.entityID = function(_) {
67146 if (!arguments.length) return _entityID;
67148 return commitChanges;
67152 return commitChanges;
67155 function uiCommitWarnings(context) {
67157 function commitWarnings(selection) {
67159 var changes = context.history().changes();
67160 var warnings = context.history().validate(changes);
67162 var container = selection.selectAll('.warning-section')
67163 .data(warnings.length ? [0] : []);
67168 var containerEnter = container.enter()
67170 .attr('class', 'modal-section warning-section fillL2');
67174 .text(t('commit.warnings'));
67178 .attr('class', 'changeset-list');
67180 container = containerEnter
67184 var items = container.select('ul').selectAll('li')
67190 var itemsEnter = items.enter()
67192 .attr('class', 'warning-item');
67195 .call(svgIcon('#icon-alert', 'pre-text'));
67199 .text(function(d) { return d.message; });
67201 itemsEnter.filter(function(d) { return d.tooltip; })
67203 .title(function(d) { return d.tooltip; })
67211 .on('mouseover', mouseover)
67212 .on('mouseout', mouseout)
67213 .on('click', warningClick);
67216 function mouseover(d) {
67218 context.surface().selectAll(
67219 utilEntityOrMemberSelector([d.entity.id], context.graph())
67220 ).classed('hover', true);
67225 function mouseout() {
67226 context.surface().selectAll('.hover')
67227 .classed('hover', false);
67231 function warningClick(d) {
67233 context.map().zoomTo(d.entity);
67234 context.enter(modeSelect(context, [d.entity.id]));
67241 return commitWarnings;
67245 var readOnlyTags = [
67246 /^_changesets_count$/,
67254 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
67255 // from https://stackoverflow.com/a/25575009
67256 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
67259 function uiCommit(context) {
67260 var dispatch$$1 = dispatch('cancel', 'save');
67264 var changesetEditor = uiChangesetEditor(context)
67265 .on('change', changeTags);
67266 var rawTagEditor = uiRawTagEditor(context)
67267 .on('change', changeTags);
67268 var commitChanges = uiCommitChanges(context);
67269 var commitWarnings = uiCommitWarnings(context);
67272 function commit(selection$$1) {
67273 _selection = selection$$1;
67275 var osm = context.connection();
67278 // expire stored comment and hashtags after cutoff datetime - #3947
67279 var commentDate = +context.storage('commentDate') || 0;
67280 var currDate = Date.now();
67281 var cutoff = 2 * 86400 * 1000; // 2 days
67282 if (commentDate > currDate || currDate - commentDate > cutoff) {
67283 context.storage('comment', null);
67284 context.storage('hashtags', null);
67288 if (!_changeset$1) {
67289 var detected = utilDetect();
67291 comment: context.storage('comment') || '',
67292 created_by: ('iD ' + context.version).substr(0, 255),
67293 host: detected.host.substr(0, 255),
67294 locale: detected.locale.substr(0, 255)
67297 // call findHashtags initially - this will remove stored
67298 // hashtags if any hashtags are found in the comment - #4304
67299 findHashtags(tags, true);
67301 var hashtags = context.storage('hashtags');
67303 tags.hashtags = hashtags;
67306 _changeset$1 = new osmChangeset({ tags: tags });
67309 tags = clone(_changeset$1.tags);
67310 tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
67311 _changeset$1 = _changeset$1.update({ tags: tags });
67313 var header = selection$$1.selectAll('.header')
67318 .attr('class', 'header fillL')
67320 .text(t('commit.title'));
67322 var body = selection$$1.selectAll('.body')
67325 body = body.enter()
67327 .attr('class', 'body')
67331 // Changeset Section
67332 var changesetSection = body.selectAll('.changeset-editor')
67335 changesetSection = changesetSection.enter()
67337 .attr('class', 'modal-section changeset-editor')
67338 .merge(changesetSection);
67341 .call(changesetEditor
67342 .changesetID(_changeset$1.id)
67348 body.call(commitWarnings);
67351 // Upload Explanation
67352 var saveSection = body.selectAll('.save-section')
67355 saveSection = saveSection.enter()
67357 .attr('class','modal-section save-section fillL cf')
67358 .merge(saveSection);
67360 var prose = saveSection.selectAll('.commit-info')
67363 prose = prose.enter()
67365 .attr('class', 'commit-info')
67366 .text(t('commit.upload_explanation'))
67369 osm.userDetails(function(err, user) {
67372 var userLink = d3_select(document.createElement('div'));
67374 _userDetails = user;
67376 if (user.image_url) {
67379 .attr('src', user.image_url)
67380 .attr('class', 'icon pre-text user-icon');
67385 .attr('class','user-info')
67386 .text(user.display_name)
67387 .attr('href', osm.userURL(user.display_name))
67388 .attr('tabindex', -1)
67389 .attr('target', '_blank');
67392 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
67397 var requestReview = saveSection.selectAll('.request-review')
67401 var requestReviewEnter = requestReview.enter()
67403 .attr('class', 'request-review');
67405 var labelEnter = requestReviewEnter
67407 .attr('for', 'commit-input-request-review');
67411 .attr('type', 'checkbox')
67412 .attr('id', 'commit-input-request-review');
67416 .text(t('commit.request_review'));
67419 requestReview = requestReview
67420 .merge(requestReviewEnter);
67422 var requestReviewInput = requestReview.selectAll('input')
67423 .property('checked', isReviewRequested(_changeset$1.tags))
67424 .on('change', toggleRequestReview);
67428 var buttonSection = saveSection.selectAll('.buttons')
67432 var buttonEnter = buttonSection.enter()
67434 .attr('class', 'buttons fillL cf');
67438 .attr('class', 'secondary-action col5 button cancel-button')
67440 .attr('class', 'label')
67441 .text(t('commit.cancel'));
67445 .attr('class', 'action col5 button save-button')
67447 .attr('class', 'label')
67448 .text(t('commit.save'));
67451 buttonSection = buttonSection
67452 .merge(buttonEnter);
67454 buttonSection.selectAll('.cancel-button')
67455 .on('click.cancel', function() {
67456 var selectedID = commitChanges.entityID();
67457 dispatch$$1.call('cancel', this, selectedID);
67460 buttonSection.selectAll('.save-button')
67461 .attr('disabled', function() {
67462 var n = d3_select('#preset-input-comment').node();
67463 return (n && n.value.length) ? null : true;
67465 .on('click.save', function() {
67466 this.blur(); // avoid keeping focus on the button - #4641
67467 dispatch$$1.call('save', this, _changeset$1);
67472 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
67475 tagSection = tagSection.enter()
67477 .attr('class', 'modal-section tag-section raw-tag-editor')
67478 .merge(tagSection);
67480 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67483 .expanded(expanded)
67484 .readOnlyTags(readOnlyTags)
67485 .tags(clone(_changeset$1.tags))
67490 body.call(commitChanges);
67493 function toggleRequestReview() {
67494 var rr = requestReviewInput.property('checked');
67495 updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
67497 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
67500 .expanded(expanded)
67501 .readOnlyTags(readOnlyTags)
67502 .tags(clone(_changeset$1.tags))
67508 function changeTags(changed, onInput) {
67509 if (changed.hasOwnProperty('comment')) {
67510 if (changed.comment === undefined) {
67511 changed.comment = '';
67514 context.storage('comment', changed.comment);
67515 context.storage('commentDate', Date.now());
67519 updateChangeset(changed, onInput);
67522 _selection.call(commit);
67527 function findHashtags(tags, commentOnly) {
67528 var inComment = commentTags();
67529 var inHashTags = hashTags();
67531 if (inComment !== null) { // when hashtags are detected in comment...
67532 context.storage('hashtags', null); // always remove stored hashtags - #4304
67533 if (commentOnly) { inHashTags = null; } // optionally override hashtags field
67535 return unionBy(inComment, inHashTags, function (s) {
67536 return s.toLowerCase();
67539 // Extract hashtags from `comment`
67540 function commentTags() {
67541 return tags.comment
67542 .replace(/http\S*/g, '') // drop anything that looks like a URL - #4289
67543 .match(hashtagRegex);
67546 // Extract and clean hashtags from `hashtags`
67547 function hashTags() {
67548 var t$$1 = tags.hashtags || '';
67551 .map(function (s) {
67552 if (s[0] !== '#') { s = '#' + s; } // prepend '#'
67553 var matched = s.match(hashtagRegex);
67554 return matched && matched[0];
67555 }).filter(Boolean); // exclude falsey
67560 function isReviewRequested(tags) {
67561 var rr = tags.review_requested;
67562 if (rr === undefined) return false;
67563 rr = rr.trim().toLowerCase();
67564 return !(rr === '' || rr === 'no');
67568 function updateChangeset(changed, onInput) {
67569 var tags = clone(_changeset$1.tags);
67571 forEach(changed, function(v, k) {
67572 k = k.trim().substr(0, 255);
67573 if (readOnlyTags.indexOf(k) !== -1) return;
67575 if (k !== '' && v !== undefined) {
67579 tags[k] = v.trim().substr(0, 255);
67587 // when changing the comment, override hashtags with any found in comment.
67588 var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
67589 var arr = findHashtags(tags, commentOnly);
67591 tags.hashtags = arr.join(';').substr(0, 255);
67592 context.storage('hashtags', tags.hashtags);
67594 delete tags.hashtags;
67595 context.storage('hashtags', null);
67599 // always update userdetails, just in case user reauthenticates as someone else
67600 if (_userDetails && _userDetails.changesets_count !== undefined) {
67601 var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1; // #4283
67602 tags.changesets_count = String(changesetsCount);
67604 // first 100 edits - new user
67605 if (changesetsCount <= 100) {
67607 s = context.storage('walkthrough_completed');
67609 tags['ideditor:walkthrough_completed'] = s;
67612 s = context.storage('walkthrough_progress');
67614 tags['ideditor:walkthrough_progress'] = s;
67617 s = context.storage('walkthrough_started');
67619 tags['ideditor:walkthrough_started'] = s;
67623 delete tags.changesets_count;
67626 if (!isEqual(_changeset$1.tags, tags)) {
67627 _changeset$1 = _changeset$1.update({ tags: tags });
67632 commit.reset = function() {
67633 _changeset$1 = null;
67637 return utilRebind(commit, dispatch$$1, 'on');
67640 function uiConfirm(selection) {
67641 var modalSelection = uiModal(selection);
67643 modalSelection.select('.modal')
67644 .classed('modal-alert', true);
67646 var section = modalSelection.select('.content');
67648 section.append('div')
67649 .attr('class', 'modal-section header');
67651 section.append('div')
67652 .attr('class', 'modal-section message-text');
67654 var buttons = section.append('div')
67655 .attr('class', 'modal-section buttons cf');
67658 modalSelection.okButton = function() {
67661 .attr('class', 'action col4')
67662 .on('click.confirm', function() {
67663 modalSelection.remove();
67665 .text(t('confirm.okay'))
67669 return modalSelection;
67673 return modalSelection;
67676 function uiConflicts(context) {
67677 var dispatch$$1 = dispatch('cancel', 'save');
67678 var keybinding = d3keybinding('conflicts');
67683 function keybindingOn() {
67684 d3_select(document)
67685 .call(keybinding.on('⎋', cancel, true));
67688 function keybindingOff() {
67689 d3_select(document)
67690 .call(keybinding.off);
67693 function tryAgain() {
67695 dispatch$$1.call('save');
67698 function cancel() {
67700 dispatch$$1.call('cancel');
67704 function conflicts(selection$$1) {
67707 var headerEnter = selection$$1.selectAll('.header')
67711 .attr('class', 'header fillL');
67715 .attr('class', 'fr')
67716 .on('click', cancel)
67717 .call(svgIcon('#icon-close'));
67721 .text(t('save.conflict.header'));
67723 var bodyEnter = selection$$1.selectAll('.body')
67727 .attr('class', 'body fillL');
67729 var conflictsHelpEnter = bodyEnter
67731 .attr('class', 'conflicts-help')
67732 .text(t('save.conflict.help'));
67735 // Download changes link
67736 var detected = utilDetect();
67737 var changeset = new osmChangeset();
67739 delete changeset.id; // Export without changeset_id
67741 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
67742 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
67743 var fileName = 'changes.osc';
67745 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
67747 .attr('class', 'download-changes');
67749 if (detected.download) { // All except IE11 and Edge
67750 linkEnter // download the data as a file
67751 .attr('href', window.URL.createObjectURL(blob))
67752 .attr('download', fileName);
67754 } else { // IE11 and Edge
67755 linkEnter // open data uri in a new tab
67756 .attr('target', '_blank')
67757 .on('click.download', function() {
67758 navigator.msSaveBlob(blob, fileName);
67763 .call(svgIcon('#icon-load', 'inline'))
67765 .text(t('save.conflict.download_changes'));
67770 .attr('class', 'conflict-container fillL3')
67771 .call(showConflict, 0);
67775 .attr('class', 'conflicts-done')
67776 .attr('opacity', 0)
67777 .style('display', 'none')
67778 .text(t('save.conflict.done'));
67780 var buttonsEnter = bodyEnter
67782 .attr('class','buttons col12 joined conflicts-buttons');
67786 .attr('disabled', _conflictList.length > 1)
67787 .attr('class', 'action conflicts-button col6')
67788 .text(t('save.title'))
67789 .on('click.try_again', tryAgain);
67793 .attr('class', 'secondary-action conflicts-button col6')
67794 .text(t('confirm.cancel'))
67795 .on('click.cancel', cancel);
67799 function showConflict(selection$$1, index) {
67800 index = utilWrap(index, _conflictList.length);
67802 var parent = d3_select(selection$$1.node().parentNode);
67804 // enable save button if this is the last conflict being reviewed..
67805 if (index === _conflictList.length - 1) {
67806 window.setTimeout(function() {
67807 parent.select('.conflicts-button')
67808 .attr('disabled', null);
67810 parent.select('.conflicts-done')
67812 .attr('opacity', 1)
67813 .style('display', 'block');
67817 var conflict = selection$$1
67818 .selectAll('.conflict')
67819 .data([_conflictList[index]]);
67824 var conflictEnter = conflict.enter()
67826 .attr('class', 'conflict');
67830 .attr('class', 'conflict-count')
67831 .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
67835 .attr('class', 'conflict-description')
67837 .text(function(d) { return d.name; })
67838 .on('click', function(d) {
67839 event.preventDefault();
67840 zoomToEntity(d.id);
67843 var details = conflictEnter
67845 .attr('class', 'conflict-detail-container');
67849 .attr('class', 'conflict-detail-list')
67851 .data(function(d) { return d.details || []; })
67854 .attr('class', 'conflict-detail-item')
67855 .html(function(d) { return d; });
67859 .attr('class', 'conflict-choices')
67864 .attr('class', 'conflict-nav-buttons joined cf')
67865 .selectAll('button')
67866 .data(['previous', 'next'])
67869 .text(function(d) { return t('save.conflict.' + d); })
67870 .attr('class', 'conflict-nav-button action col6')
67871 .attr('disabled', function(d, i) {
67872 return (i === 0 && index === 0) ||
67873 (i === 1 && index === _conflictList.length - 1) || null;
67875 .on('click', function(d, i) {
67876 event.preventDefault();
67878 var container = parent.selectAll('.conflict-container');
67879 var sign = (i === 0 ? -1 : 1);
67882 .selectAll('.conflict')
67886 .call(showConflict, index + sign);
67892 function addChoices(selection$$1) {
67893 var choices = selection$$1
67895 .attr('class', 'layer-list')
67897 .data(function(d) { return d.choices || []; });
67900 var choicesEnter = choices.enter()
67902 .attr('class', 'layer');
67904 var labelEnter = choicesEnter
67909 .attr('type', 'radio')
67910 .attr('name', function(d) { return d.id; })
67911 .on('change', function(d, i) {
67912 var ul = this.parentNode.parentNode.parentNode;
67913 ul.__data__.chosen = i;
67919 .text(function(d) { return d.text; });
67924 .each(function(d, i) {
67925 var ul = this.parentNode;
67926 if (ul.__data__.chosen === i) {
67933 function choose(ul, datum) {
67934 if (event) event.preventDefault();
67938 .classed('active', function(d) { return d === datum; })
67939 .selectAll('input')
67940 .property('checked', function(d) { return d === datum; });
67942 var extent = geoExtent$$1();
67945 entity = context.graph().hasEntity(datum.id);
67946 if (entity) extent._extend(entity.extent(context.graph()));
67950 entity = context.graph().hasEntity(datum.id);
67951 if (entity) extent._extend(entity.extent(context.graph()));
67953 zoomToEntity(datum.id, extent);
67957 function zoomToEntity(id, extent) {
67958 context.surface().selectAll('.hover')
67959 .classed('hover', false);
67961 var entity = context.graph().hasEntity(id);
67964 context.map().trimmedExtent(extent);
67966 context.map().zoomTo(entity);
67968 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
67969 .classed('hover', true);
67974 // The conflict list should be an array of objects like:
67977 // name: entityName(local),
67978 // details: merge.conflicts(),
67981 // choice(id, keepMine, forceLocal),
67982 // choice(id, keepTheirs, forceRemote)
67985 conflicts.conflictList = function(_) {
67986 if (!arguments.length) return _conflictList;
67992 conflicts.origChanges = function(_) {
67993 if (!arguments.length) return _origChanges;
67999 return utilRebind(conflicts, dispatch$$1, 'on');
68002 function uiEditMenu(context, operations) {
68008 var p = 8, // top padding
68009 m = 4, // top margin
68010 h = 15, // height of icon
68011 vpBottomMargin = 45, // viewport bottom margin
68012 vpSideMargin = 35, // viewport side margin
68014 buttonHeight = (2 * p + h),
68015 menuWidth = buttonWidth,
68016 menuHeight = (2 * m) + operations.length * buttonHeight,
68017 menuSideMargin = 10,
68018 tooltipWidth = 200,
68019 tooltipHeight = 200; // a reasonable guess, real height depends on tooltip contents
68022 var editMenu = function (selection$$1) {
68023 if (!operations.length) return;
68025 selection$$1.node().parentNode.focus();
68027 var isRTL = textDirection === 'rtl',
68028 viewport = context.surfaceRect();
68030 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
68031 // menu is going left-to-right and near right viewport edge, go left instead
68033 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
68034 // menu is going right-to-left and near left viewport edge, go right instead
68038 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
68040 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
68041 // menu is near bottom viewport edge, shift upwards
68042 offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
68045 var origin = [ center[0] + offset[0], center[1] + offset[1] ];
68047 menu = selection$$1
68049 .attr('class', 'edit-menu')
68050 .attr('transform', 'translate(' + origin + ')')
68051 .attr('opacity', 0);
68055 .attr('opacity', 1);
68059 .attr('class', 'edit-menu-background')
68063 .attr('width', menuWidth)
68064 .attr('height', menuHeight)
68065 .attr('stroke-linecap', 'round');
68068 var button = menu.selectAll('.edit-menu-item')
68072 .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
68073 .classed('disabled', function (d) { return d.disabled(); })
68074 .attr('transform', function (d, i) {
68075 return 'translate(' + geoVecFloor([
68077 m + i * buttonHeight
68078 ]).join(',') + ')';
68084 .attr('width', buttonWidth)
68085 .attr('height', buttonHeight)
68086 .on('click', click)
68087 .on('mousedown', mousedown)
68088 .on('mouseover', mouseover)
68089 .on('mouseout', mouseout);
68093 .attr('width', '20')
68094 .attr('height', '20')
68095 .attr('transform', function () {
68096 return 'translate(' + [2 * p, 5] + ')';
68098 .attr('xlink:href', function (d) { return '#operation-' + d.id; });
68100 tooltip = d3_select(document.body)
68102 .attr('class', 'tooltip-inner edit-menu-tooltip');
68105 function click(operation) {
68106 event.stopPropagation();
68107 if (operation.disabled()) return;
68112 function mousedown() {
68113 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
68116 function mouseover(d, i) {
68120 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68122 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68125 if (tipX + tooltipWidth > viewport.right) {
68126 // tip is going left-to-right and near right viewport edge, go left instead
68127 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
68128 } else if (tipX < viewport.left) {
68129 // tip is going right-to-left and near left viewport edge, go right instead
68130 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
68133 tipY = viewport.top + origin[1] + (i * buttonHeight);
68134 if (tipY + tooltipHeight > viewport.bottom) {
68135 // tip is near bottom viewport edge, shift upwards
68136 tipY -= tipY + tooltipHeight - viewport.bottom;
68140 .style('left', tipX + 'px')
68141 .style('top', tipY + 'px')
68142 .style('display', 'block')
68143 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
68146 function mouseout() {
68147 tooltip.style('display', 'none');
68152 editMenu.close = function () {
68155 .style('pointer-events', 'none')
68157 .attr('opacity', 0)
68167 editMenu.center = function (_) {
68168 if (!arguments.length) return center;
68180 function uiFlash() {
68181 var _duration = 2000;
68182 var _iconName = '#icon-no';
68183 var _iconClass = 'disabled';
68190 _flashTimer.stop();
68193 d3_select('#footer-wrap')
68194 .attr('class', 'footer-hide');
68195 d3_select('#flash-wrap')
68196 .attr('class', 'footer-show');
68198 var content = d3_select('#flash-wrap').selectAll('.flash-content')
68202 var contentEnter = content.enter()
68204 .attr('class', 'flash-content');
68206 var iconEnter = contentEnter
68208 .attr('class', 'flash-icon')
68210 .attr('transform', 'translate(10,10)');
68218 .attr('transform', 'translate(-7,-7)')
68219 .attr('width', '14')
68220 .attr('height', '14');
68224 .attr('class', 'flash-text');
68229 .merge(contentEnter);
68232 .selectAll('.flash-icon')
68233 .attr('class', 'flash-icon ' + (_iconClass || ''));
68236 .selectAll('.flash-icon use')
68237 .attr('xlink:href', _iconName);
68240 .selectAll('.flash-text')
68241 .attr('class', 'flash-text ' + (_textClass || ''))
68245 _flashTimer = d3_timeout(function() {
68246 _flashTimer = null;
68247 d3_select('#footer-wrap')
68248 .attr('class', 'footer-show');
68249 d3_select('#flash-wrap')
68250 .attr('class', 'footer-hide');
68257 flash.duration = function(_) {
68258 if (!arguments.length) return _duration;
68263 flash.text = function(_) {
68264 if (!arguments.length) return _text;
68269 flash.textClass = function(_) {
68270 if (!arguments.length) return _textClass;
68275 flash.iconName = function(_) {
68276 if (!arguments.length) return _iconName;
68281 flash.iconClass = function(_) {
68282 if (!arguments.length) return _iconClass;
68290 function uiLasso(context) {
68291 var group, polygon;
68293 lasso.coordinates = [];
68295 function lasso(selection$$1) {
68296 context.container()
68297 .classed('lasso', true);
68299 group = selection$$1
68301 .attr('class', 'lasso hide');
68305 .attr('class', 'lasso-path');
68308 .call(uiToggle(true));
68314 polygon.data([lasso.coordinates])
68315 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
68320 lasso.extent = function () {
68321 return lasso.coordinates.reduce(function(extent, point$$1) {
68322 return extent.extend(geoExtent$$1(point$$1));
68323 }, geoExtent$$1());
68327 lasso.p = function(_) {
68328 if (!arguments.length) return lasso;
68329 lasso.coordinates.push(_);
68335 lasso.close = function() {
68337 group.call(uiToggle(false, function() {
68338 d3_select(this).remove();
68341 context.container().classed('lasso', false);
68348 function uiRadialMenu(context, operations) {
68354 var radialMenu = function(selection$$1) {
68355 if (!operations.length) return;
68357 selection$$1.node().parentNode.focus();
68359 function click(operation) {
68360 event.stopPropagation();
68361 if (operation.disabled()) return;
68363 radialMenu.close();
68366 menu = selection$$1
68368 .attr('class', 'radial-menu')
68369 .attr('transform', 'translate(' + center + ')')
68370 .attr('opacity', 0);
68374 .attr('opacity', 1);
68379 a1 = a0 + (operations.length - 1) * a;
68383 .attr('class', 'radial-menu-background')
68384 .attr('d', 'M' + r * Math.sin(a0) + ',' +
68386 ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
68387 (r * Math.sin(a1) + 1e-3) + ',' +
68388 (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
68389 .attr('stroke-width', 50)
68390 .attr('stroke-linecap', 'round');
68392 var button = menu.selectAll()
68396 .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
68397 .classed('disabled', function(d) { return d.disabled(); })
68398 .attr('transform', function(d, i) {
68399 return 'translate(' + geoVecFloor([
68400 r * Math.sin(a0 + i * a),
68401 r * Math.cos(a0 + i * a)]).join(',') + ')';
68407 .on('click', click)
68408 .on('mousedown', mousedown)
68409 .on('mouseover', mouseover)
68410 .on('mouseout', mouseout);
68414 .attr('transform', 'translate(-10,-10)')
68415 .attr('width', '20')
68416 .attr('height', '20')
68417 .attr('xlink:href', function(d) { return '#operation-' + d.id; });
68419 tooltip = d3_select(document.body)
68421 .attr('class', 'tooltip-inner radial-menu-tooltip');
68423 function mousedown() {
68424 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
68427 function mouseover(d, i) {
68428 var rect = context.surfaceRect(),
68429 angle = a0 + i * a,
68430 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
68431 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
68432 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
68433 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
68436 .style('top', null)
68437 .style('left', null)
68438 .style('bottom', null)
68439 .style('right', null)
68440 .style('display', 'block')
68441 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
68445 .style('right', right)
68446 .style('top', top);
68447 } else if (i >= 4) {
68449 .style('left', left)
68450 .style('bottom', bottom);
68453 .style('left', left)
68454 .style('top', top);
68458 function mouseout() {
68459 tooltip.style('display', 'none');
68464 radialMenu.close = function() {
68467 .style('pointer-events', 'none')
68469 .attr('opacity', 0)
68479 radialMenu.center = function(_) {
68480 if (!arguments.length) return center;
68489 function uiSelectionList(context, selectedIDs) {
68491 function selectEntity(entity) {
68492 context.enter(modeSelect(context, [entity.id]));
68496 function deselectEntity(entity) {
68497 event.stopPropagation();
68498 var index = selectedIDs.indexOf(entity.id);
68500 selectedIDs.splice(index, 1);
68502 context.enter(modeSelect(context, selectedIDs));
68506 function selectionList(selection$$1) {
68507 selection$$1.classed('selection-list-pane', true);
68509 var header = selection$$1
68511 .attr('class', 'header fillL cf');
68515 .text(t('inspector.multiselect'));
68517 var listWrap = selection$$1
68519 .attr('class', 'inspector-body');
68521 var list = listWrap
68523 .attr('class', 'feature-list cf');
68525 context.history().on('change.selection-list', drawList);
68529 function drawList() {
68530 var entities = selectedIDs
68531 .map(function(id) { return context.hasEntity(id); })
68532 .filter(function(entity) { return entity; });
68534 var items = list.selectAll('.feature-list-item')
68535 .data(entities, osmEntity$$1.key);
68541 var enter = items.enter()
68543 .attr('class', 'feature-list-item')
68544 .on('click', selectEntity);
68548 .attr('class', 'label');
68552 .attr('class', 'close')
68553 .on('click', deselectEntity)
68554 .call(svgIcon('#icon-close'));
68558 .attr('class', 'entity-geom-icon')
68559 .call(svgIcon('', 'pre-text'));
68563 .attr('class', 'entity-type');
68567 .attr('class', 'entity-name');
68570 items = items.merge(enter);
68572 items.selectAll('.entity-geom-icon use')
68573 .attr('href', function() {
68574 var entity = this.parentNode.parentNode.__data__;
68575 return '#icon-' + context.geometry(entity.id);
68578 items.selectAll('.entity-type')
68579 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
68581 items.selectAll('.entity-name')
68582 .text(function(entity) { return utilDisplayName(entity); });
68586 return selectionList;
68589 function uiSourceSwitch(context) {
68594 event.preventDefault();
68596 var osm = context.connection();
68599 if (context.inIntro()) return;
68601 if (context.history().hasChanges() &&
68602 !window.confirm(t('source_switch.lose_changes'))) return;
68604 var isLive = d3_select(this)
68608 context.enter(modeBrowse(context));
68609 context.history().clearSaved(); // remove saved history
68610 context.flush(); // remove stored data
68613 .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
68614 .classed('live', isLive);
68616 osm.switch(isLive ? keys[0] : keys[1]); // switch connection (warning: dispatches 'change' event)
68619 var sourceSwitch = function(selection$$1) {
68623 .text(t('source_switch.live'))
68624 .classed('live', true)
68625 .attr('tabindex', -1)
68626 .on('click', click);
68630 sourceSwitch.keys = function(_) {
68631 if (!arguments.length) return keys;
68633 return sourceSwitch;
68637 return sourceSwitch;
68640 function uiSuccess(context) {
68641 var dispatch$$1 = dispatch('cancel'),
68645 function success(selection$$1) {
68646 var header = selection$$1
68648 .attr('class', 'header fillL');
68652 .attr('class', 'fr')
68653 .on('click', function() { dispatch$$1.call('cancel'); })
68654 .call(svgIcon('#icon-close'));
68658 .text(t('success.just_edited'));
68660 var body = selection$$1
68662 .attr('class', 'body save-success fillL');
68666 .html(t('success.help_html'));
68670 .attr('class', 'details')
68671 .attr('target', '_blank')
68672 .attr('tabindex', -1)
68673 .call(svgIcon('#icon-out-link', 'inline'))
68674 .attr('href', t('success.help_link_url'))
68676 .text(t('success.help_link_text'));
68678 var osm = context.connection();
68681 var changesetURL = osm.changesetURL(changeset.id);
68683 var viewOnOsm = body
68685 .attr('class', 'button col12 osm')
68686 .attr('target', '_blank')
68687 .attr('href', changesetURL);
68691 .attr('class', 'logo logo-osm')
68693 .attr('xlink:href', '#logo-osm');
68697 .text(t('success.view_on_osm'));
68699 var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
68700 ' ' + changesetURL;
68703 { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
68704 { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
68705 { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
68708 body.selectAll('.button.social')
68712 .attr('class', 'button social col4')
68713 .attr('target', '_blank')
68714 .attr('href', function(d) { return d.value; })
68716 .title(function(d) { return t('success.' + d.key); })
68717 .placement('bottom'))
68718 .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
68722 success.changeset = function(_) {
68723 if (!arguments.length) return changeset;
68729 return utilRebind(success, dispatch$$1, 'on');
68732 function coreHistory(context) {
68733 var imageryUsed = ['Bing'];
68734 var dispatch$$1 = dispatch('change', 'undone', 'redone');
68735 var lock = utilSessionMutex('lock');
68736 var duration = 150;
68737 var _checkpoints = {};
68743 // internal _act, accepts list of actions and eased time
68744 function _act(actions, t) {
68745 actions = Array.prototype.slice.call(actions);
68748 if (!isFunction(actions[actions.length - 1])) {
68749 annotation = actions.pop();
68752 _stack[_index].transform = context.projection.transform();
68753 _stack[_index].selectedIDs = context.selectedIDs();
68755 var graph = _stack[_index].graph;
68756 for (var i = 0; i < actions.length; i++) {
68757 graph = actions[i](graph, t);
68762 annotation: annotation,
68763 imageryUsed: imageryUsed
68768 // internal _perform with eased time
68769 function _perform(args, t) {
68770 var previous = _stack[_index].graph;
68771 _stack = _stack.slice(0, _index + 1);
68772 _stack.push(_act(args, t));
68774 return change(previous);
68778 // internal _replace with eased time
68779 function _replace(args, t) {
68780 var previous = _stack[_index].graph;
68781 // assert(_index == _stack.length - 1)
68782 _stack[_index] = _act(args, t);
68783 return change(previous);
68787 // internal _overwrite with eased time
68788 function _overwrite(args, t) {
68789 var previous = _stack[_index].graph;
68794 _stack = _stack.slice(0, _index + 1);
68795 _stack.push(_act(args, t));
68797 return change(previous);
68801 // determine diffrence and dispatch a change event
68802 function change(previous) {
68803 var difference$$1 = coreDifference(previous, history.graph());
68804 dispatch$$1.call('change', this, difference$$1);
68805 return difference$$1;
68809 // iD uses namespaced keys so multiple installations do not conflict
68810 function getKey(n) {
68811 return 'iD_' + window.location.origin + '_' + n;
68817 graph: function() {
68818 return _stack[_index].graph;
68823 return _stack[0].graph;
68827 merge: function(entities, extent) {
68828 _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
68829 _tree.rebase(entities, false);
68831 dispatch$$1.call('change', this, undefined, extent);
68835 perform: function() {
68836 // complete any transition already in progress
68837 d3_select(document).interrupt('history.perform');
68839 var transitionable = false;
68840 var action0 = arguments[0];
68842 if (arguments.length === 1 ||
68843 arguments.length === 2 && !isFunction(arguments[1])) {
68844 transitionable = !!action0.transitionable;
68847 if (transitionable) {
68848 var origArguments = arguments;
68849 d3_select(document)
68850 .transition('history.perform')
68851 .duration(duration)
68853 .tween('history.tween', function() {
68854 return function(t) {
68855 if (t < 1) _overwrite([action0], t);
68858 .on('start', function() {
68859 _perform([action0], 0);
68861 .on('end interrupt', function() {
68862 _overwrite(origArguments, 1);
68866 return _perform(arguments);
68871 replace: function() {
68872 d3_select(document).interrupt('history.perform');
68873 return _replace(arguments, 1);
68877 // Same as calling pop and then perform
68878 overwrite: function() {
68879 d3_select(document).interrupt('history.perform');
68880 return _overwrite(arguments, 1);
68885 d3_select(document).interrupt('history.perform');
68887 var previous = _stack[_index].graph;
68888 if (isNaN(+n) || +n < 0) {
68891 while (n-- > 0 && _index > 0) {
68895 return change(previous);
68899 // Back to the previous annotated state or _index = 0.
68901 d3_select(document).interrupt('history.perform');
68903 var previous = _stack[_index].graph;
68904 while (_index > 0) {
68906 if (_stack[_index].annotation) break;
68909 dispatch$$1.call('undone', this, _stack[_index]);
68910 return change(previous);
68914 // Forward to the next annotated state.
68916 d3_select(document).interrupt('history.perform');
68918 var previous = _stack[_index].graph;
68919 var tryIndex = _index;
68920 while (tryIndex < _stack.length - 1) {
68922 if (_stack[tryIndex].annotation) {
68924 dispatch$$1.call('redone', this, _stack[_index]);
68929 return change(previous);
68933 undoAnnotation: function() {
68936 if (_stack[i].annotation) return _stack[i].annotation;
68942 redoAnnotation: function() {
68943 var i = _index + 1;
68944 while (i <= _stack.length - 1) {
68945 if (_stack[i].annotation) return _stack[i].annotation;
68951 intersects: function(extent) {
68952 return _tree.intersects(extent, _stack[_index].graph);
68956 difference: function() {
68957 var base = _stack[0].graph;
68958 var head = _stack[_index].graph;
68959 return coreDifference(base, head);
68963 changes: function(action) {
68964 var base = _stack[0].graph;
68965 var head = _stack[_index].graph;
68968 head = action(head);
68971 var difference$$1 = coreDifference(base, head);
68974 modified: difference$$1.modified(),
68975 created: difference$$1.created(),
68976 deleted: difference$$1.deleted()
68981 validate: function(changes) {
68983 map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
68988 hasChanges: function() {
68989 return this.difference().length() > 0;
68993 imageryUsed: function(sources) {
68995 imageryUsed = sources;
68998 var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
68999 return without(uniq(flatten(arr)), 'Custom');
69004 // save the current history state
69005 checkpoint: function(key) {
69006 _checkpoints[key] = {
69007 stack: cloneDeep(_stack),
69014 // restore history state to a given checkpoint or reset completely
69015 reset: function(key) {
69016 if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
69017 _stack = cloneDeep(_checkpoints[key].stack);
69018 _index = _checkpoints[key].index;
69020 _stack = [{graph: coreGraph$$1()}];
69022 _tree = coreTree(_stack[0].graph);
69025 dispatch$$1.call('change');
69030 toIntroGraph: function() {
69031 var nextId = { n: 0, r: 0, w: 0 };
69033 var graph = this.graph();
69034 var baseEntities = {};
69036 // clone base entities..
69037 forEach(graph.base().entities, function(entity) {
69038 var copy = cloneDeepWith(entity, customizer);
69039 baseEntities[copy.id] = copy;
69042 // replace base entities with head entities..
69043 forEach(graph.entities, function(entity, id) {
69045 var copy = cloneDeepWith(entity, customizer);
69046 baseEntities[copy.id] = copy;
69048 delete baseEntities[id];
69052 // swap temporary for permanent ids..
69053 forEach(baseEntities, function(entity) {
69054 if (Array.isArray(entity.nodes)) {
69055 entity.nodes = entity.nodes.map(function(node) {
69056 return permIds[node] || node;
69059 if (Array.isArray(entity.members)) {
69060 entity.members = entity.members.map(function(member) {
69061 member.id = permIds[member.id] || member.id;
69067 return JSON.stringify({ dataIntroGraph: baseEntities });
69070 function customizer(src) {
69071 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
69072 if (isEmpty(copy.tags)) {
69076 if (Array.isArray(copy.loc)) {
69077 copy.loc[0] = +copy.loc[0].toFixed(6);
69078 copy.loc[1] = +copy.loc[1].toFixed(6);
69081 var match = src.id.match(/([nrw])-\d*/); // temporary id
69082 if (match !== null) {
69083 var nrw = match[1], permId;
69084 do { permId = nrw + (++nextId[nrw]); }
69085 while (baseEntities.hasOwnProperty(permId));
69087 copy.id = permIds[src.id] = permId;
69094 toJSON: function() {
69095 if (!this.hasChanges()) return;
69097 var allEntities = {};
69098 var baseEntities = {};
69099 var base = _stack[0];
69101 var s = _stack.map(function(i) {
69102 var modified = [], deleted = [];
69104 forEach(i.graph.entities, function(entity, id) {
69106 var key = osmEntity$$1.key(entity);
69107 allEntities[key] = entity;
69108 modified.push(key);
69113 // make sure that the originals of changed or deleted entities get merged
69114 // into the base of the _stack after restoring the data from JSON.
69115 if (id in base.graph.entities) {
69116 baseEntities[id] = base.graph.entities[id];
69118 // get originals of parent entities too
69119 forEach(base.graph._parentWays[id], function(parentId) {
69120 if (parentId in base.graph.entities) {
69121 baseEntities[parentId] = base.graph.entities[parentId];
69128 if (modified.length) x.modified = modified;
69129 if (deleted.length) x.deleted = deleted;
69130 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
69131 if (i.annotation) x.annotation = i.annotation;
69136 return JSON.stringify({
69138 entities: values$1(allEntities),
69139 baseEntities: values$1(baseEntities),
69141 nextIDs: osmEntity$$1.id.next,
69147 fromJSON: function(json, loadChildNodes) {
69148 var h = JSON.parse(json);
69149 var loadComplete = true;
69151 osmEntity$$1.id.next = h.nextIDs;
69154 if (h.version === 2 || h.version === 3) {
69155 var allEntities = {};
69157 h.entities.forEach(function(entity) {
69158 allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
69161 if (h.version === 3) {
69162 // This merges originals for changed entities into the base of
69163 // the _stack even if the current _stack doesn't have them (for
69164 // example when iD has been restarted in a different region)
69165 var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
69166 _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
69167 _tree.rebase(baseEntities, true);
69169 // When we restore a modified way, we also need to fetch any missing
69170 // childnodes that would normally have been downloaded with it.. #2142
69171 if (loadChildNodes) {
69172 var osm = context.connection();
69173 var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
69174 var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
69176 if (!isEmpty(missing) && osm) {
69177 loadComplete = false;
69178 context.redrawEnable(false);
69180 var loading = uiLoading(context).blocking(true);
69181 context.container().call(loading);
69183 var childNodesLoaded = function(err, result) {
69185 var visible = groupBy(result.data, 'visible');
69186 if (!isEmpty(visible.true)) {
69187 missing = difference(missing, map$3(visible.true, 'id'));
69188 _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
69189 _tree.rebase(visible.true, true);
69192 // fetch older versions of nodes that were deleted..
69193 forEach(visible.false, function(entity) {
69194 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
69198 if (err || isEmpty(missing)) {
69200 context.redrawEnable(true);
69201 dispatch$$1.call('change');
69205 osm.loadMultiple(missing, childNodesLoaded);
69210 _stack = h.stack.map(function(d) {
69211 var entities = {}, entity;
69214 d.modified.forEach(function(key) {
69215 entity = allEntities[key];
69216 entities[entity.id] = entity;
69221 d.deleted.forEach(function(id) {
69222 entities[id] = undefined;
69227 graph: coreGraph$$1(_stack[0].graph).load(entities),
69228 annotation: d.annotation,
69229 imageryUsed: d.imageryUsed
69233 } else { // original version
69234 _stack = h.stack.map(function(d) {
69237 for (var i in d.entities) {
69238 var entity = d.entities[i];
69239 entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
69242 d.graph = coreGraph$$1(_stack[0].graph).load(entities);
69247 if (loadComplete) {
69248 dispatch$$1.call('change');
69256 if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
69261 clearSaved: function() {
69262 context.debouncedSave.cancel();
69263 if (lock.locked()) context.storage(getKey('saved_history'), null);
69269 return lock.lock();
69273 unlock: function() {
69278 // is iD not open in another window and it detects that
69279 // there's a history stored in localStorage that's recoverable?
69280 restorableChanges: function() {
69281 return lock.locked() && !!context.storage(getKey('saved_history'));
69285 // load history from a version stored in localStorage
69286 restore: function() {
69287 if (!lock.locked()) return;
69289 var json = context.storage(getKey('saved_history'));
69290 if (json) history.fromJSON(json, true);
69301 return utilRebind(history, dispatch$$1, 'on');
69304 /** Used to store function metadata. */
69305 var metaMap = WeakMap && new WeakMap;
69308 * The base implementation of `setData` without support for hot loop shorting.
69311 * @param {Function} func The function to associate metadata with.
69312 * @param {*} data The metadata.
69313 * @returns {Function} Returns `func`.
69315 var baseSetData = !metaMap ? identity$8 : function(func, data) {
69316 metaMap.set(func, data);
69321 * Creates a function that produces an instance of `Ctor` regardless of
69322 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
69325 * @param {Function} Ctor The constructor to wrap.
69326 * @returns {Function} Returns the new wrapped function.
69328 function createCtor(Ctor) {
69329 return function() {
69330 // Use a `switch` statement to work with class constructors. See
69331 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
69332 // for more details.
69333 var args = arguments;
69334 switch (args.length) {
69335 case 0: return new Ctor;
69336 case 1: return new Ctor(args[0]);
69337 case 2: return new Ctor(args[0], args[1]);
69338 case 3: return new Ctor(args[0], args[1], args[2]);
69339 case 4: return new Ctor(args[0], args[1], args[2], args[3]);
69340 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
69341 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
69342 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
69344 var thisBinding = baseCreate(Ctor.prototype),
69345 result = Ctor.apply(thisBinding, args);
69347 // Mimic the constructor's `return` behavior.
69348 // See https://es5.github.io/#x13.2.2 for more details.
69349 return isObject(result) ? result : thisBinding;
69353 /** Used to compose bitmasks for function metadata. */
69354 var WRAP_BIND_FLAG = 1;
69357 * Creates a function that wraps `func` to invoke it with the optional `this`
69358 * binding of `thisArg`.
69361 * @param {Function} func The function to wrap.
69362 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69363 * @param {*} [thisArg] The `this` binding of `func`.
69364 * @returns {Function} Returns the new wrapped function.
69366 function createBind(func, bitmask, thisArg) {
69367 var isBind = bitmask & WRAP_BIND_FLAG,
69368 Ctor = createCtor(func);
69370 function wrapper() {
69371 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
69372 return fn.apply(isBind ? thisArg : this, arguments);
69377 /* Built-in method references for those with the same name as other `lodash` methods. */
69378 var nativeMax$5 = Math.max;
69381 * Creates an array that is the composition of partially applied arguments,
69382 * placeholders, and provided arguments into a single array of arguments.
69385 * @param {Array} args The provided arguments.
69386 * @param {Array} partials The arguments to prepend to those provided.
69387 * @param {Array} holders The `partials` placeholder indexes.
69388 * @params {boolean} [isCurried] Specify composing for a curried function.
69389 * @returns {Array} Returns the new array of composed arguments.
69391 function composeArgs(args, partials, holders, isCurried) {
69392 var argsIndex = -1,
69393 argsLength = args.length,
69394 holdersLength = holders.length,
69396 leftLength = partials.length,
69397 rangeLength = nativeMax$5(argsLength - holdersLength, 0),
69398 result = Array(leftLength + rangeLength),
69399 isUncurried = !isCurried;
69401 while (++leftIndex < leftLength) {
69402 result[leftIndex] = partials[leftIndex];
69404 while (++argsIndex < holdersLength) {
69405 if (isUncurried || argsIndex < argsLength) {
69406 result[holders[argsIndex]] = args[argsIndex];
69409 while (rangeLength--) {
69410 result[leftIndex++] = args[argsIndex++];
69415 /* Built-in method references for those with the same name as other `lodash` methods. */
69416 var nativeMax$6 = Math.max;
69419 * This function is like `composeArgs` except that the arguments composition
69420 * is tailored for `_.partialRight`.
69423 * @param {Array} args The provided arguments.
69424 * @param {Array} partials The arguments to append to those provided.
69425 * @param {Array} holders The `partials` placeholder indexes.
69426 * @params {boolean} [isCurried] Specify composing for a curried function.
69427 * @returns {Array} Returns the new array of composed arguments.
69429 function composeArgsRight(args, partials, holders, isCurried) {
69430 var argsIndex = -1,
69431 argsLength = args.length,
69433 holdersLength = holders.length,
69435 rightLength = partials.length,
69436 rangeLength = nativeMax$6(argsLength - holdersLength, 0),
69437 result = Array(rangeLength + rightLength),
69438 isUncurried = !isCurried;
69440 while (++argsIndex < rangeLength) {
69441 result[argsIndex] = args[argsIndex];
69443 var offset = argsIndex;
69444 while (++rightIndex < rightLength) {
69445 result[offset + rightIndex] = partials[rightIndex];
69447 while (++holdersIndex < holdersLength) {
69448 if (isUncurried || argsIndex < argsLength) {
69449 result[offset + holders[holdersIndex]] = args[argsIndex++];
69456 * Gets the number of `placeholder` occurrences in `array`.
69459 * @param {Array} array The array to inspect.
69460 * @param {*} placeholder The placeholder to search for.
69461 * @returns {number} Returns the placeholder count.
69463 function countHolders(array, placeholder) {
69464 var length = array.length,
69468 if (array[length] === placeholder) {
69476 * The function whose prototype chain sequence wrappers inherit from.
69480 function baseLodash() {
69481 // No operation performed.
69484 /** Used as references for the maximum length and index of an array. */
69485 var MAX_ARRAY_LENGTH = 4294967295;
69488 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
69492 * @param {*} value The value to wrap.
69494 function LazyWrapper(value) {
69495 this.__wrapped__ = value;
69496 this.__actions__ = [];
69498 this.__filtered__ = false;
69499 this.__iteratees__ = [];
69500 this.__takeCount__ = MAX_ARRAY_LENGTH;
69501 this.__views__ = [];
69504 // Ensure `LazyWrapper` is an instance of `baseLodash`.
69505 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
69506 LazyWrapper.prototype.constructor = LazyWrapper;
69509 * Gets metadata for `func`.
69512 * @param {Function} func The function to query.
69513 * @returns {*} Returns the metadata for `func`.
69515 var getData = !metaMap ? noop$3 : function(func) {
69516 return metaMap.get(func);
69519 /** Used to lookup unminified function names. */
69520 var realNames = {};
69522 /** Used for built-in method references. */
69523 var objectProto$20 = Object.prototype;
69525 /** Used to check objects for own properties. */
69526 var hasOwnProperty$17 = objectProto$20.hasOwnProperty;
69529 * Gets the name of `func`.
69532 * @param {Function} func The function to query.
69533 * @returns {string} Returns the function name.
69535 function getFuncName(func) {
69536 var result = (func.name + ''),
69537 array = realNames[result],
69538 length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
69541 var data = array[length],
69542 otherFunc = data.func;
69543 if (otherFunc == null || otherFunc == func) {
69551 * The base constructor for creating `lodash` wrapper objects.
69554 * @param {*} value The value to wrap.
69555 * @param {boolean} [chainAll] Enable explicit method chain sequences.
69557 function LodashWrapper(value, chainAll) {
69558 this.__wrapped__ = value;
69559 this.__actions__ = [];
69560 this.__chain__ = !!chainAll;
69561 this.__index__ = 0;
69562 this.__values__ = undefined;
69565 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
69566 LodashWrapper.prototype.constructor = LodashWrapper;
69569 * Creates a clone of `wrapper`.
69572 * @param {Object} wrapper The wrapper to clone.
69573 * @returns {Object} Returns the cloned wrapper.
69575 function wrapperClone(wrapper) {
69576 if (wrapper instanceof LazyWrapper) {
69577 return wrapper.clone();
69579 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
69580 result.__actions__ = copyArray(wrapper.__actions__);
69581 result.__index__ = wrapper.__index__;
69582 result.__values__ = wrapper.__values__;
69586 /** Used for built-in method references. */
69587 var objectProto$21 = Object.prototype;
69589 /** Used to check objects for own properties. */
69590 var hasOwnProperty$18 = objectProto$21.hasOwnProperty;
69593 * Creates a `lodash` object which wraps `value` to enable implicit method
69594 * chain sequences. Methods that operate on and return arrays, collections,
69595 * and functions can be chained together. Methods that retrieve a single value
69596 * or may return a primitive value will automatically end the chain sequence
69597 * and return the unwrapped value. Otherwise, the value must be unwrapped
69600 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
69601 * enabled using `_.chain`.
69603 * The execution of chained methods is lazy, that is, it's deferred until
69604 * `_#value` is implicitly or explicitly called.
69606 * Lazy evaluation allows several methods to support shortcut fusion.
69607 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
69608 * the creation of intermediate arrays and can greatly reduce the number of
69609 * iteratee executions. Sections of a chain sequence qualify for shortcut
69610 * fusion if the section is applied to an array and iteratees accept only
69611 * one argument. The heuristic for whether a section qualifies for shortcut
69612 * fusion is subject to change.
69614 * Chaining is supported in custom builds as long as the `_#value` method is
69615 * directly or indirectly included in the build.
69617 * In addition to lodash methods, wrappers have `Array` and `String` methods.
69619 * The wrapper `Array` methods are:
69620 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
69622 * The wrapper `String` methods are:
69623 * `replace` and `split`
69625 * The wrapper methods that support shortcut fusion are:
69626 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
69627 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
69628 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
69630 * The chainable wrapper methods are:
69631 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
69632 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
69633 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
69634 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
69635 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
69636 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
69637 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
69638 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
69639 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
69640 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
69641 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
69642 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
69643 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
69644 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
69645 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
69646 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
69647 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
69648 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
69649 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
69650 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
69651 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
69652 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
69653 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
69654 * `zipObject`, `zipObjectDeep`, and `zipWith`
69656 * The wrapper methods that are **not** chainable by default are:
69657 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
69658 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
69659 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
69660 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
69661 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
69662 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
69663 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
69664 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
69665 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
69666 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
69667 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
69668 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
69669 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
69670 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
69671 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
69672 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
69673 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
69674 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
69675 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
69676 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
69677 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
69678 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
69679 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
69680 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
69681 * `upperFirst`, `value`, and `words`
69686 * @param {*} value The value to wrap in a `lodash` instance.
69687 * @returns {Object} Returns the new `lodash` wrapper instance.
69690 * function square(n) {
69694 * var wrapped = _([1, 2, 3]);
69696 * // Returns an unwrapped value.
69697 * wrapped.reduce(_.add);
69700 * // Returns a wrapped value.
69701 * var squares = wrapped.map(square);
69703 * _.isArray(squares);
69706 * _.isArray(squares.value());
69709 function lodash(value) {
69710 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
69711 if (value instanceof LodashWrapper) {
69714 if (hasOwnProperty$18.call(value, '__wrapped__')) {
69715 return wrapperClone(value);
69718 return new LodashWrapper(value);
69721 // Ensure wrappers are instances of `baseLodash`.
69722 lodash.prototype = baseLodash.prototype;
69723 lodash.prototype.constructor = lodash;
69726 * Checks if `func` has a lazy counterpart.
69729 * @param {Function} func The function to check.
69730 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
69733 function isLaziable(func) {
69734 var funcName = getFuncName(func),
69735 other = lodash[funcName];
69737 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
69740 if (func === other) {
69743 var data = getData(other);
69744 return !!data && func === data[0];
69748 * Sets metadata for `func`.
69750 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
69751 * period of time, it will trip its breaker and transition to an identity
69752 * function to avoid garbage collection pauses in V8. See
69753 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
69754 * for more details.
69757 * @param {Function} func The function to associate metadata with.
69758 * @param {*} data The metadata.
69759 * @returns {Function} Returns `func`.
69761 var setData = shortOut(baseSetData);
69763 /** Used to match wrap detail comments. */
69764 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
69765 reSplitDetails = /,? & /;
69768 * Extracts wrapper details from the `source` body comment.
69771 * @param {string} source The source to inspect.
69772 * @returns {Array} Returns the wrapper details.
69774 function getWrapDetails(source) {
69775 var match = source.match(reWrapDetails);
69776 return match ? match[1].split(reSplitDetails) : [];
69779 /** Used to match wrap detail comments. */
69780 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
69783 * Inserts wrapper `details` in a comment at the top of the `source` body.
69786 * @param {string} source The source to modify.
69787 * @returns {Array} details The details to insert.
69788 * @returns {string} Returns the modified source.
69790 function insertWrapDetails(source, details) {
69791 var length = details.length;
69795 var lastIndex = length - 1;
69796 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
69797 details = details.join(length > 2 ? ', ' : ' ');
69798 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
69801 /** Used to compose bitmasks for function metadata. */
69802 var WRAP_BIND_FLAG$1 = 1,
69803 WRAP_BIND_KEY_FLAG = 2,
69804 WRAP_CURRY_FLAG = 8,
69805 WRAP_CURRY_RIGHT_FLAG = 16,
69806 WRAP_PARTIAL_FLAG = 32,
69807 WRAP_PARTIAL_RIGHT_FLAG = 64,
69808 WRAP_ARY_FLAG = 128,
69809 WRAP_REARG_FLAG = 256,
69810 WRAP_FLIP_FLAG = 512;
69812 /** Used to associate wrap methods with their bit flags. */
69814 ['ary', WRAP_ARY_FLAG],
69815 ['bind', WRAP_BIND_FLAG$1],
69816 ['bindKey', WRAP_BIND_KEY_FLAG],
69817 ['curry', WRAP_CURRY_FLAG],
69818 ['curryRight', WRAP_CURRY_RIGHT_FLAG],
69819 ['flip', WRAP_FLIP_FLAG],
69820 ['partial', WRAP_PARTIAL_FLAG],
69821 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
69822 ['rearg', WRAP_REARG_FLAG]
69826 * Updates wrapper `details` based on `bitmask` flags.
69829 * @returns {Array} details The details to modify.
69830 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69831 * @returns {Array} Returns `details`.
69833 function updateWrapDetails(details, bitmask) {
69834 arrayEach(wrapFlags, function(pair) {
69835 var value = '_.' + pair[0];
69836 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
69837 details.push(value);
69840 return details.sort();
69844 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
69845 * with wrapper details in a comment at the top of the source body.
69848 * @param {Function} wrapper The function to modify.
69849 * @param {Function} reference The reference function.
69850 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69851 * @returns {Function} Returns `wrapper`.
69853 function setWrapToString(wrapper, reference, bitmask) {
69854 var source = (reference + '');
69855 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
69858 /** Used to compose bitmasks for function metadata. */
69859 var WRAP_BIND_FLAG$2 = 1,
69860 WRAP_BIND_KEY_FLAG$1 = 2,
69861 WRAP_CURRY_BOUND_FLAG = 4,
69862 WRAP_CURRY_FLAG$1 = 8,
69863 WRAP_PARTIAL_FLAG$1 = 32,
69864 WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
69867 * Creates a function that wraps `func` to continue currying.
69870 * @param {Function} func The function to wrap.
69871 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69872 * @param {Function} wrapFunc The function to create the `func` wrapper.
69873 * @param {*} placeholder The placeholder value.
69874 * @param {*} [thisArg] The `this` binding of `func`.
69875 * @param {Array} [partials] The arguments to prepend to those provided to
69876 * the new function.
69877 * @param {Array} [holders] The `partials` placeholder indexes.
69878 * @param {Array} [argPos] The argument positions of the new function.
69879 * @param {number} [ary] The arity cap of `func`.
69880 * @param {number} [arity] The arity of `func`.
69881 * @returns {Function} Returns the new wrapped function.
69883 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
69884 var isCurry = bitmask & WRAP_CURRY_FLAG$1,
69885 newHolders = isCurry ? holders : undefined,
69886 newHoldersRight = isCurry ? undefined : holders,
69887 newPartials = isCurry ? partials : undefined,
69888 newPartialsRight = isCurry ? undefined : partials;
69890 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
69891 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
69893 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
69894 bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
69897 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
69898 newHoldersRight, argPos, ary, arity
69901 var result = wrapFunc.apply(undefined, newData);
69902 if (isLaziable(func)) {
69903 setData(result, newData);
69905 result.placeholder = placeholder;
69906 return setWrapToString(result, func, bitmask);
69910 * Gets the argument placeholder value for `func`.
69913 * @param {Function} func The function to inspect.
69914 * @returns {*} Returns the placeholder value.
69916 function getHolder(func) {
69918 return object.placeholder;
69921 /* Built-in method references for those with the same name as other `lodash` methods. */
69922 var nativeMin$2 = Math.min;
69925 * Reorder `array` according to the specified indexes where the element at
69926 * the first index is assigned as the first element, the element at
69927 * the second index is assigned as the second element, and so on.
69930 * @param {Array} array The array to reorder.
69931 * @param {Array} indexes The arranged array indexes.
69932 * @returns {Array} Returns `array`.
69934 function reorder(array, indexes) {
69935 var arrLength = array.length,
69936 length = nativeMin$2(indexes.length, arrLength),
69937 oldArray = copyArray(array);
69940 var index = indexes[length];
69941 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
69946 /** Used as the internal argument placeholder. */
69947 var PLACEHOLDER = '__lodash_placeholder__';
69950 * Replaces all `placeholder` elements in `array` with an internal placeholder
69951 * and returns an array of their indexes.
69954 * @param {Array} array The array to modify.
69955 * @param {*} placeholder The placeholder to replace.
69956 * @returns {Array} Returns the new array of placeholder indexes.
69958 function replaceHolders(array, placeholder) {
69960 length = array.length,
69964 while (++index < length) {
69965 var value = array[index];
69966 if (value === placeholder || value === PLACEHOLDER) {
69967 array[index] = PLACEHOLDER;
69968 result[resIndex++] = index;
69974 /** Used to compose bitmasks for function metadata. */
69975 var WRAP_BIND_FLAG$3 = 1,
69976 WRAP_BIND_KEY_FLAG$2 = 2,
69977 WRAP_CURRY_FLAG$2 = 8,
69978 WRAP_CURRY_RIGHT_FLAG$1 = 16,
69979 WRAP_ARY_FLAG$1 = 128,
69980 WRAP_FLIP_FLAG$1 = 512;
69983 * Creates a function that wraps `func` to invoke it with optional `this`
69984 * binding of `thisArg`, partial application, and currying.
69987 * @param {Function|string} func The function or method name to wrap.
69988 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
69989 * @param {*} [thisArg] The `this` binding of `func`.
69990 * @param {Array} [partials] The arguments to prepend to those provided to
69991 * the new function.
69992 * @param {Array} [holders] The `partials` placeholder indexes.
69993 * @param {Array} [partialsRight] The arguments to append to those provided
69994 * to the new function.
69995 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
69996 * @param {Array} [argPos] The argument positions of the new function.
69997 * @param {number} [ary] The arity cap of `func`.
69998 * @param {number} [arity] The arity of `func`.
69999 * @returns {Function} Returns the new wrapped function.
70001 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
70002 var isAry = bitmask & WRAP_ARY_FLAG$1,
70003 isBind = bitmask & WRAP_BIND_FLAG$3,
70004 isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
70005 isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
70006 isFlip = bitmask & WRAP_FLIP_FLAG$1,
70007 Ctor = isBindKey ? undefined : createCtor(func);
70009 function wrapper() {
70010 var length = arguments.length,
70011 args = Array(length),
70015 args[index] = arguments[index];
70018 var placeholder = getHolder(wrapper),
70019 holdersCount = countHolders(args, placeholder);
70022 args = composeArgs(args, partials, holders, isCurried);
70024 if (partialsRight) {
70025 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
70027 length -= holdersCount;
70028 if (isCurried && length < arity) {
70029 var newHolders = replaceHolders(args, placeholder);
70030 return createRecurry(
70031 func, bitmask, createHybrid, wrapper.placeholder, thisArg,
70032 args, newHolders, argPos, ary, arity - length
70035 var thisBinding = isBind ? thisArg : this,
70036 fn = isBindKey ? thisBinding[func] : func;
70038 length = args.length;
70040 args = reorder(args, argPos);
70041 } else if (isFlip && length > 1) {
70044 if (isAry && ary < length) {
70047 if (this && this !== root$2 && this instanceof wrapper) {
70048 fn = Ctor || createCtor(fn);
70050 return fn.apply(thisBinding, args);
70056 * Creates a function that wraps `func` to enable currying.
70059 * @param {Function} func The function to wrap.
70060 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70061 * @param {number} arity The arity of `func`.
70062 * @returns {Function} Returns the new wrapped function.
70064 function createCurry(func, bitmask, arity) {
70065 var Ctor = createCtor(func);
70067 function wrapper() {
70068 var length = arguments.length,
70069 args = Array(length),
70071 placeholder = getHolder(wrapper);
70074 args[index] = arguments[index];
70076 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
70078 : replaceHolders(args, placeholder);
70080 length -= holders.length;
70081 if (length < arity) {
70082 return createRecurry(
70083 func, bitmask, createHybrid, wrapper.placeholder, undefined,
70084 args, holders, undefined, undefined, arity - length);
70086 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70087 return apply(fn, this, args);
70092 /** Used to compose bitmasks for function metadata. */
70093 var WRAP_BIND_FLAG$4 = 1;
70096 * Creates a function that wraps `func` to invoke it with the `this` binding
70097 * of `thisArg` and `partials` prepended to the arguments it receives.
70100 * @param {Function} func The function to wrap.
70101 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
70102 * @param {*} thisArg The `this` binding of `func`.
70103 * @param {Array} partials The arguments to prepend to those provided to
70104 * the new function.
70105 * @returns {Function} Returns the new wrapped function.
70107 function createPartial(func, bitmask, thisArg, partials) {
70108 var isBind = bitmask & WRAP_BIND_FLAG$4,
70109 Ctor = createCtor(func);
70111 function wrapper() {
70112 var argsIndex = -1,
70113 argsLength = arguments.length,
70115 leftLength = partials.length,
70116 args = Array(leftLength + argsLength),
70117 fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
70119 while (++leftIndex < leftLength) {
70120 args[leftIndex] = partials[leftIndex];
70122 while (argsLength--) {
70123 args[leftIndex++] = arguments[++argsIndex];
70125 return apply(fn, isBind ? thisArg : this, args);
70130 /** Used as the internal argument placeholder. */
70131 var PLACEHOLDER$1 = '__lodash_placeholder__';
70133 /** Used to compose bitmasks for function metadata. */
70134 var WRAP_BIND_FLAG$5 = 1,
70135 WRAP_BIND_KEY_FLAG$3 = 2,
70136 WRAP_CURRY_BOUND_FLAG$1 = 4,
70137 WRAP_CURRY_FLAG$3 = 8,
70138 WRAP_ARY_FLAG$2 = 128,
70139 WRAP_REARG_FLAG$1 = 256;
70141 /* Built-in method references for those with the same name as other `lodash` methods. */
70142 var nativeMin$3 = Math.min;
70145 * Merges the function metadata of `source` into `data`.
70147 * Merging metadata reduces the number of wrappers used to invoke a function.
70148 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
70149 * may be applied regardless of execution order. Methods like `_.ary` and
70150 * `_.rearg` modify function arguments, making the order in which they are
70151 * executed important, preventing the merging of metadata. However, we make
70152 * an exception for a safe combined case where curried functions have `_.ary`
70153 * and or `_.rearg` applied.
70156 * @param {Array} data The destination metadata.
70157 * @param {Array} source The source metadata.
70158 * @returns {Array} Returns `data`.
70160 function mergeData(data, source) {
70161 var bitmask = data[1],
70162 srcBitmask = source[1],
70163 newBitmask = bitmask | srcBitmask,
70164 isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
70167 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
70168 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
70169 ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
70171 // Exit early if metadata can't be merged.
70172 if (!(isCommon || isCombo)) {
70175 // Use source `thisArg` if available.
70176 if (srcBitmask & WRAP_BIND_FLAG$5) {
70177 data[2] = source[2];
70178 // Set when currying a bound function.
70179 newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
70181 // Compose partial arguments.
70182 var value = source[3];
70184 var partials = data[3];
70185 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
70186 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
70188 // Compose partial right arguments.
70191 partials = data[5];
70192 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
70193 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
70195 // Use source `argPos` if available.
70200 // Use source `ary` if it's smaller.
70201 if (srcBitmask & WRAP_ARY_FLAG$2) {
70202 data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
70204 // Use source `arity` if one is not provided.
70205 if (data[9] == null) {
70206 data[9] = source[9];
70208 // Use source `func` and merge bitmasks.
70209 data[0] = source[0];
70210 data[1] = newBitmask;
70215 /** Error message constants. */
70216 var FUNC_ERROR_TEXT$4 = 'Expected a function';
70218 /** Used to compose bitmasks for function metadata. */
70219 var WRAP_BIND_FLAG$6 = 1,
70220 WRAP_BIND_KEY_FLAG$4 = 2,
70221 WRAP_CURRY_FLAG$4 = 8,
70222 WRAP_CURRY_RIGHT_FLAG$2 = 16,
70223 WRAP_PARTIAL_FLAG$2 = 32,
70224 WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
70226 /* Built-in method references for those with the same name as other `lodash` methods. */
70227 var nativeMax$7 = Math.max;
70230 * Creates a function that either curries or invokes `func` with optional
70231 * `this` binding and partially applied arguments.
70234 * @param {Function|string} func The function or method name to wrap.
70235 * @param {number} bitmask The bitmask flags.
70238 * 4 - `_.curry` or `_.curryRight` of a bound function
70240 * 16 - `_.curryRight`
70242 * 64 - `_.partialRight`
70246 * @param {*} [thisArg] The `this` binding of `func`.
70247 * @param {Array} [partials] The arguments to be partially applied.
70248 * @param {Array} [holders] The `partials` placeholder indexes.
70249 * @param {Array} [argPos] The argument positions of the new function.
70250 * @param {number} [ary] The arity cap of `func`.
70251 * @param {number} [arity] The arity of `func`.
70252 * @returns {Function} Returns the new wrapped function.
70254 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
70255 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
70256 if (!isBindKey && typeof func != 'function') {
70257 throw new TypeError(FUNC_ERROR_TEXT$4);
70259 var length = partials ? partials.length : 0;
70261 bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
70262 partials = holders = undefined;
70264 ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
70265 arity = arity === undefined ? arity : toInteger(arity);
70266 length -= holders ? holders.length : 0;
70268 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
70269 var partialsRight = partials,
70270 holdersRight = holders;
70272 partials = holders = undefined;
70274 var data = isBindKey ? undefined : getData(func);
70277 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
70282 mergeData(newData, data);
70285 bitmask = newData[1];
70286 thisArg = newData[2];
70287 partials = newData[3];
70288 holders = newData[4];
70289 arity = newData[9] = newData[9] === undefined
70290 ? (isBindKey ? 0 : func.length)
70291 : nativeMax$7(newData[9] - length, 0);
70293 if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
70294 bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
70296 if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
70297 var result = createBind(func, bitmask, thisArg);
70298 } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
70299 result = createCurry(func, bitmask, arity);
70300 } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
70301 result = createPartial(func, bitmask, thisArg, partials);
70303 result = createHybrid.apply(undefined, newData);
70305 var setter = data ? baseSetData : setData;
70306 return setWrapToString(setter(result, newData), func, bitmask);
70309 /** Used to compose bitmasks for function metadata. */
70310 var WRAP_BIND_FLAG$7 = 1,
70311 WRAP_PARTIAL_FLAG$3 = 32;
70314 * Creates a function that invokes `func` with the `this` binding of `thisArg`
70315 * and `partials` prepended to the arguments it receives.
70317 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
70318 * may be used as a placeholder for partially applied arguments.
70320 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
70321 * property of bound functions.
70326 * @category Function
70327 * @param {Function} func The function to bind.
70328 * @param {*} thisArg The `this` binding of `func`.
70329 * @param {...*} [partials] The arguments to be partially applied.
70330 * @returns {Function} Returns the new bound function.
70333 * function greet(greeting, punctuation) {
70334 * return greeting + ' ' + this.user + punctuation;
70337 * var object = { 'user': 'fred' };
70339 * var bound = _.bind(greet, object, 'hi');
70343 * // Bound with placeholders.
70344 * var bound = _.bind(greet, object, _, '!');
70348 var bind$2 = baseRest(function(func, thisArg, partials) {
70349 var bitmask = WRAP_BIND_FLAG$7;
70350 if (partials.length) {
70351 var holders = replaceHolders(partials, getHolder(bind$2));
70352 bitmask |= WRAP_PARTIAL_FLAG$3;
70354 return createWrap(func, bitmask, thisArg, partials, holders);
70357 // Assign default placeholders.
70358 bind$2.placeholder = {};
70360 function presetCollection(collection) {
70361 var maxSearchResults = 50,
70362 maxSuggestionResults = 10;
70366 collection: collection,
70369 item: function(id) {
70370 return find$1(this.collection, function(d) {
70371 return d.id === id;
70376 matchGeometry: function(geometry) {
70377 return presetCollection(this.collection.filter(function(d) {
70378 return d.matchGeometry(geometry);
70383 search: function(value, geometry) {
70384 if (!value) return this;
70386 function leading(a) {
70387 var index = a.indexOf(value);
70388 return index === 0 || a[index - 1] === ' ';
70391 function suggestionName(name) {
70392 var nameArray = name.split(' - ');
70393 if (nameArray.length > 1) {
70394 name = nameArray.slice(0, nameArray.length - 1).join(' - ');
70396 return name.toLowerCase();
70400 value = value.toLowerCase();
70402 var searchable = filter(this.collection, function(a) {
70403 return a.searchable !== false && a.suggestion !== true;
70405 suggestions = filter(this.collection, function(a) {
70406 return a.suggestion === true;
70410 // matches value to preset.name
70411 var leading_name = filter(searchable, function(a) {
70412 return leading(a.name().toLowerCase());
70413 }).sort(function(a, b) {
70414 var aCompare = a.name().toLowerCase(),
70415 bCompare = b.name().toLowerCase(),
70418 // priority if search string matches preset name exactly - #4325
70419 if (value === aCompare) return -1;
70420 if (value === bCompare) return 1;
70422 // priority for higher matchScore
70423 i = b.originalScore - a.originalScore;
70424 if (i !== 0) return i;
70426 // priority if search string appears earlier in preset name
70427 i = aCompare.indexOf(value) - bCompare.indexOf(value);
70428 if (i !== 0) return i;
70430 // priority for shorter preset names
70431 return a.name().length - b.name().length;
70434 // matches value to preset.terms values
70435 var leading_terms = filter(searchable, function(a) {
70436 return some(a.terms() || [], leading);
70439 // matches value to preset.tags values
70440 var leading_tag_values = filter(searchable, function(a) {
70441 return some(without(values$1(a.tags || {}), '*'), leading);
70445 // finds close matches to value in preset.name
70446 var similar_name = searchable.map(function(a) {
70449 dist: utilEditDistance(value, a.name())
70451 }).filter(function(a) {
70452 return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
70453 }).sort(function(a, b) {
70454 return a.dist - b.dist;
70455 }).map(function(a) {
70459 // finds close matches to value in preset.terms
70460 var similar_terms = filter(searchable, function(a) {
70461 return some(a.terms() || [], function(b) {
70462 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
70466 var leading_suggestions = filter(suggestions, function(a) {
70467 return leading(suggestionName(a.name()));
70468 }).sort(function(a, b) {
70469 a = suggestionName(a.name());
70470 b = suggestionName(b.name());
70471 var i = a.indexOf(value) - b.indexOf(value);
70472 if (i === 0) return a.length - b.length;
70476 var similar_suggestions = suggestions.map(function(a) {
70479 dist: utilEditDistance(value, suggestionName(a.name()))
70481 }).filter(function(a) {
70482 return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
70483 }).sort(function(a, b) {
70484 return a.dist - b.dist;
70485 }).map(function(a) {
70489 var other = presets.item(geometry);
70491 var results = leading_name.concat(
70493 leading_tag_values,
70494 leading_suggestions.slice(0, maxSuggestionResults + 5),
70497 similar_suggestions.slice(0, maxSuggestionResults)
70498 ).slice(0, maxSearchResults - 1);
70500 return presetCollection(uniq(results.concat(other)));
70508 function presetCategory(id, category, all) {
70509 category = clone(category);
70514 category.members = presetCollection(category.members.map(function(id) {
70515 return all.item(id);
70519 category.matchGeometry = function(geometry) {
70520 return category.geometry.indexOf(geometry) >= 0;
70524 category.matchScore = function() {
70529 category.name = function() {
70530 return t('presets.categories.' + id + '.name', {'default': id});
70534 category.terms = function() {
70542 function presetField(id, field) {
70543 field = clone(field);
70548 field.matchGeometry = function(geometry) {
70549 return !field.geometry || field.geometry === geometry;
70553 field.t = function(scope, options) {
70554 return t('presets.fields.' + id + '.' + scope, options);
70558 field.label = function() {
70559 return field.t('label', {'default': id});
70563 var placeholder = field.placeholder;
70564 field.placeholder = function() {
70565 return field.t('placeholder', {'default': placeholder});
70572 function presetPreset(id, preset, fields) {
70573 preset = clone(preset);
70576 preset.fields = (preset.fields || []).map(getFields);
70577 preset.geometry = (preset.geometry || []);
70580 function getFields(f) {
70585 preset.matchGeometry = function(geometry) {
70586 return preset.geometry.indexOf(geometry) >= 0;
70590 preset.originalScore = preset.matchScore || 1;
70593 preset.matchScore = function(entity) {
70594 var tags = preset.tags,
70597 for (var t$$1 in tags) {
70598 if (entity.tags[t$$1] === tags[t$$1]) {
70599 score += preset.originalScore;
70600 } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
70601 score += preset.originalScore / 2;
70611 preset.t = function(scope, options) {
70612 return t('presets.presets.' + id + '.' + scope, options);
70616 var origName = preset.name || '';
70617 preset.name = function() {
70618 if (preset.suggestion) {
70619 id = id.split('/');
70620 id = id[0] + '/' + id[1];
70621 return origName + ' - ' + t('presets.presets.' + id + '.name');
70623 return preset.t('name', { 'default': origName });
70626 var origTerms = (preset.terms || []).join();
70627 preset.terms = function() {
70628 return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
70632 preset.isFallback = function() {
70633 var tagCount = Object.keys(preset.tags).length;
70634 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
70638 var reference = preset.reference || {};
70639 preset.reference = function(geometry) {
70640 var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
70641 value = reference.value || preset.tags[key];
70643 if (geometry === 'relation' && key === 'type') {
70644 if (value in preset.tags) {
70646 value = preset.tags[key];
70648 return { rtype: value };
70652 if (value === '*') {
70653 return { key: key };
70655 return { key: key, value: value };
70660 var removeTags = preset.removeTags || preset.tags || {};
70661 preset.removeTags = function(tags, geometry) {
70662 tags = omit(tags, keys$1(removeTags));
70664 for (var f in preset.fields) {
70665 var field = preset.fields[f];
70666 if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
70667 delete tags[field.key];
70676 var applyTags = preset.addTags || preset.tags || {};
70677 preset.applyTags = function(tags, geometry) {
70680 tags = clone(tags);
70682 for (k in applyTags) {
70683 if (applyTags[k] === '*') {
70686 tags[k] = applyTags[k];
70690 // Add area=yes if necessary.
70691 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
70692 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
70693 // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
70694 if (!applyTags.hasOwnProperty('area')) {
70696 if (geometry === 'area') {
70697 var needsAreaTag = true;
70698 if (preset.geometry.indexOf('line') === -1) {
70699 for (k in applyTags) {
70700 if (k in areaKeys) {
70701 needsAreaTag = false;
70706 if (needsAreaTag) {
70712 for (var f in preset.fields) {
70713 var field = preset.fields[f];
70714 if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
70715 tags[field.key] = field.default;
70726 function presetIndex() {
70727 // a presetCollection with methods for
70728 // loading new data and returning defaults
70730 var all = presetCollection([]);
70731 var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
70733 var _universal = [];
70734 var _recent = presetCollection([]);
70736 // Index of presets by (geometry, tag key).
70745 all.match = function(entity, resolver) {
70746 var geometry = entity.geometry(resolver);
70749 // Treat entities on addr:interpolation lines as points, not vertices - #3241
70750 if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
70751 geometry = 'point';
70754 var geometryMatches = _index[geometry];
70758 for (var k in entity.tags) {
70759 // If any part of an address is present,
70760 // allow fallback to "Address" preset - #4353
70761 if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
70762 address = geometryMatches['addr:*'][0];
70765 var keyMatches = geometryMatches[k];
70766 if (!keyMatches) continue;
70768 for (var i = 0; i < keyMatches.length; i++) {
70769 var score = keyMatches[i].matchScore(entity);
70770 if (score > best) {
70772 match = keyMatches[i];
70777 if (address && (!match || match.isFallback())) {
70781 return match || all.item(geometry);
70785 // Because of the open nature of tagging, iD will never have a complete
70786 // list of tags used in OSM, so we want it to have logic like "assume
70787 // that a closed way with an amenity tag is an area, unless the amenity
70788 // is one of these specific types". This function computes a structure
70789 // that allows testing of such conditions, based on the presets designated
70790 // as as supporting (or not supporting) the area geometry.
70792 // The returned object L is a whitelist/blacklist of tags. A closed way
70793 // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
70794 // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
70795 // and the subkeys form the blacklist.
70796 all.areaKeys = function() {
70798 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type']; // probably a line..
70799 var presets = reject(all.collection, 'suggestion');
70802 presets.forEach(function(d) {
70803 for (var key in d.tags) break;
70805 if (ignore.indexOf(key) !== -1) return;
70807 if (d.geometry.indexOf('area') !== -1) { // probably an area..
70808 areaKeys[key] = areaKeys[key] || {};
70813 presets.forEach(function(d) {
70814 for (var key in d.tags) break;
70816 if (ignore.indexOf(key) !== -1) return;
70818 var value = d.tags[key];
70819 if (key in areaKeys && // probably an area...
70820 d.geometry.indexOf('line') !== -1 && // but sometimes a line
70822 areaKeys[key][value] = true;
70830 all.init = function() {
70831 var d = data.presets;
70833 all.collection = [];
70834 _recent.collection = [];
70837 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
70840 forEach(d.fields, function(d, id) {
70841 _fields[id] = presetField(id, d);
70843 _universal.push(_fields[id]);
70849 forEach(d.presets, function(d, id) {
70850 all.collection.push(presetPreset(id, d, _fields));
70854 if (d.categories) {
70855 forEach(d.categories, function(d, id) {
70856 all.collection.push(presetCategory(id, d, all));
70861 var getItem = bind$2(all.item, all);
70863 area: presetCollection(d.defaults.area.map(getItem)),
70864 line: presetCollection(d.defaults.line.map(getItem)),
70865 point: presetCollection(d.defaults.point.map(getItem)),
70866 vertex: presetCollection(d.defaults.vertex.map(getItem)),
70867 relation: presetCollection(d.defaults.relation.map(getItem))
70871 for (var i = 0; i < all.collection.length; i++) {
70872 var preset = all.collection[i];
70873 var geometry = preset.geometry;
70875 for (var j = 0; j < geometry.length; j++) {
70876 var g = _index[geometry[j]];
70877 for (var k in preset.tags) {
70878 (g[k] = g[k] || []).push(preset);
70886 all.field = function(id) {
70887 return _fields[id];
70890 all.universal = function() {
70894 all.defaults = function(geometry, n) {
70895 var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
70896 var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
70897 return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
70900 all.choose = function(preset) {
70901 _recent = presetCollection(uniq([preset].concat(_recent.collection)));
70910 function setAreaKeys(value) {
70915 function coreContext() {
70917 context.version = '2.7.1';
70919 // create a special translation that contains the keys in place of the strings
70920 var tkeys = cloneDeep(en);
70923 function traverser(v, k, obj) {
70926 forOwn(v, traverser);
70927 } else if (isString(v)) {
70928 obj[k] = parents.join('.');
70933 forOwn(tkeys, traverser);
70934 addTranslation('_tkeys_', tkeys);
70936 addTranslation('en', en);
70939 var dispatch$$1 = dispatch('enter', 'exit', 'change');
70941 // https://github.com/openstreetmap/iD/issues/772
70942 // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
70944 try { storage = localStorage; } catch (e) {} // eslint-disable-line no-empty
70945 storage = storage || (function() {
70948 getItem: function(k) { return s[k]; },
70949 setItem: function(k, v) { s[k] = v; },
70950 removeItem: function(k) { delete s[k]; }
70954 context.storage = function(k, v) {
70956 if (arguments.length === 1) return storage.getItem(k);
70957 else if (v === null) storage.removeItem(k);
70958 else storage.setItem(k, v);
70960 // localstorage quota exceeded
70961 /* eslint-disable no-console */
70962 if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
70963 /* eslint-enable no-console */
70968 /* Straight accessors. Avoid using these if you can. */
70969 var ui, connection, history;
70970 context.ui = function() { return ui; };
70971 context.connection = function() { return connection; };
70972 context.history = function() { return history; };
70976 context.preauth = function(options) {
70978 connection.switch(options);
70983 context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
70985 function done(err, result) {
70986 if (connection.getConnectionId() !== cid) {
70987 if (callback) callback({ message: 'Connection Switched', status: -1 });
70990 if (!err) history.merge(result.data, result.extent);
70991 if (callback) callback(err, result);
70993 if (connection && context.editable()) {
70994 cid = connection.getConnectionId();
70995 connection.loadTiles(projection, dimensions, done);
70999 context.loadEntity = function(entityId, callback) {
71001 function done(err, result) {
71002 if (connection.getConnectionId() !== cid) {
71003 if (callback) callback({ message: 'Connection Switched', status: -1 });
71006 if (!err) history.merge(result.data, result.extent);
71007 if (callback) callback(err, result);
71010 cid = connection.getConnectionId();
71011 connection.loadEntity(entityId, done);
71015 context.zoomToEntity = function(entityId, zoomTo) {
71016 if (zoomTo !== false) {
71017 this.loadEntity(entityId, function(err, result) {
71019 var entity = find$1(result.data, function(e) { return e.id === entityId; });
71020 if (entity) { map.zoomTo(entity); }
71024 map.on('drawn.zoomToEntity', function() {
71025 if (!context.hasEntity(entityId)) return;
71026 map.on('drawn.zoomToEntity', null);
71027 context.on('enter.zoomToEntity', null);
71028 context.enter(modeSelect(context, [entityId]));
71031 context.on('enter.zoomToEntity', function() {
71032 if (mode.id !== 'browse') {
71033 map.on('drawn.zoomToEntity', null);
71034 context.on('enter.zoomToEntity', null);
71039 var minEditableZoom = 16;
71040 context.minEditableZoom = function(_) {
71041 if (!arguments.length) return minEditableZoom;
71042 minEditableZoom = _;
71044 connection.tileZoom(_);
71051 var inIntro = false;
71052 context.inIntro = function(_) {
71053 if (!arguments.length) return inIntro;
71058 context.save = function() {
71059 // no history save, no message onbeforeunload
71060 if (inIntro || d3_select('.modal').size()) return;
71063 if (mode && mode.id === 'save') {
71066 canSave = context.selectedIDs().every(function(id) {
71067 var entity = context.hasEntity(id);
71068 return entity && !entity.isDegenerate();
71075 if (history.hasChanges()) {
71076 return t('save.unsaved_changes');
71082 context.hasEntity = function(id) {
71083 return history.graph().hasEntity(id);
71085 context.entity = function(id) {
71086 return history.graph().entity(id);
71088 context.childNodes = function(way) {
71089 return history.graph().childNodes(way);
71091 context.geometry = function(id) {
71092 return context.entity(id).geometry(history.graph());
71098 context.mode = function() {
71101 context.enter = function(newMode) {
71104 dispatch$$1.call('exit', this, mode);
71109 dispatch$$1.call('enter', this, mode);
71112 context.selectedIDs = function() {
71113 if (mode && mode.selectedIDs) {
71114 return mode.selectedIDs();
71119 context.activeID = function() {
71120 return mode && mode.activeID && mode.activeID();
71125 context.install = function(behavior) {
71126 context.surface().call(behavior);
71128 context.uninstall = function(behavior) {
71129 context.surface().call(behavior.off);
71134 var copyIDs = [], copyGraph;
71135 context.copyGraph = function() { return copyGraph; };
71136 context.copyIDs = function(_) {
71137 if (!arguments.length) return copyIDs;
71139 copyGraph = history.graph();
71146 context.background = function() { return background; };
71151 context.features = function() { return features; };
71152 context.hasHiddenConnections = function(id) {
71153 var graph = history.graph(),
71154 entity = graph.entity(id);
71155 return features.hasHiddenConnections(entity, graph);
71161 context.presets = function() { return presets; };
71166 context.map = function() { return map; };
71167 context.layers = function() { return map.layers; };
71168 context.surface = function() { return map.surface; };
71169 context.editable = function() { return map.editable(); };
71170 context.surfaceRect = function() {
71171 return map.surface.node().getBoundingClientRect();
71177 tile: false, // tile boundaries
71178 collision: false, // label collision bounding boxes
71179 imagery: false, // imagery bounding polygons
71180 imperial: false, // imperial (not metric) bounding polygons
71181 driveLeft: false, // driveLeft bounding polygons
71182 target: false // touch targets
71184 context.debugFlags = function() {
71187 context.setDebug = function(flag, val) {
71188 if (arguments.length === 1) val = true;
71189 debugFlags[flag] = val;
71190 dispatch$$1.call('change');
71193 context.getDebug = function(flag) {
71194 return flag && debugFlags[flag];
71199 var container = d3_select(document.body);
71200 context.container = function(_) {
71201 if (!arguments.length) return container;
71203 container.classed('id-container', true);
71207 context.embed = function(_) {
71208 if (!arguments.length) return embed;
71215 var assetPath = '';
71216 context.assetPath = function(_) {
71217 if (!arguments.length) return assetPath;
71223 context.assetMap = function(_) {
71224 if (!arguments.length) return assetMap;
71229 context.asset = function(_) {
71230 var filename = assetPath + _;
71231 return assetMap[filename] || filename;
71234 context.imagePath = function(_) {
71235 return context.asset('img/' + _);
71240 // `locale` variable contains a "requested locale".
71241 // It won't become the `currentLocale` until after loadLocale() is called.
71242 var locale, localePath;
71244 context.locale = function(loc, path) {
71245 if (!arguments.length) return currentLocale;
71251 context.loadLocale = function(callback) {
71252 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
71253 localePath = localePath || context.asset('locales/' + locale + '.json');
71254 d3_json(localePath, function(err, result) {
71256 addTranslation(locale, result[locale]);
71276 /* reset (aka flush) */
71277 context.reset = context.flush = function() {
71278 context.debouncedSave.cancel();
71279 forEach(services, function(service) {
71280 if (service && typeof service.reset === 'function') {
71281 service.reset(context);
71292 context.projection = geoRawMercator();
71293 context.curtainProjection = geoRawMercator();
71295 locale = utilDetect().locale;
71296 if (locale && !dataLocales.hasOwnProperty(locale)) {
71297 locale = locale.split('-')[0];
71300 history = coreHistory(context);
71301 context.graph = history.graph;
71302 context.changes = history.changes;
71303 context.intersects = history.intersects;
71305 // Debounce save, since it's a synchronous localStorage write,
71306 // and history changes can happen frequently (e.g. when dragging).
71307 context.debouncedSave = debounce(context.save, 350);
71308 function withDebouncedSave(fn) {
71309 return function() {
71310 var result = fn.apply(history, arguments);
71311 context.debouncedSave();
71316 context.perform = withDebouncedSave(history.perform);
71317 context.replace = withDebouncedSave(history.replace);
71318 context.pop = withDebouncedSave(history.pop);
71319 context.overwrite = withDebouncedSave(history.overwrite);
71320 context.undo = withDebouncedSave(history.undo);
71321 context.redo = withDebouncedSave(history.redo);
71323 ui = uiInit(context);
71325 connection = services.osm;
71326 background = rendererBackground(context);
71327 features = rendererFeatures(context);
71328 presets = presetIndex();
71330 map = rendererMap(context);
71331 context.mouse = map.mouse;
71332 context.extent = map.extent;
71333 context.pan = map.pan;
71334 context.zoomIn = map.zoomIn;
71335 context.zoomOut = map.zoomOut;
71336 context.zoomInFurther = map.zoomInFurther;
71337 context.zoomOutFurther = map.zoomOutFurther;
71338 context.redrawEnable = map.redrawEnable;
71340 forEach(services, function(service) {
71341 if (service && typeof service.init === 'function') {
71342 service.init(context);
71349 areaKeys = presets.areaKeys();
71352 return utilRebind(context, dispatch$$1, 'on');
71355 function osmWay() {
71356 if (!(this instanceof osmWay)) {
71357 return (new osmWay()).initialize(arguments);
71358 } else if (arguments.length) {
71359 this.initialize(arguments);
71364 osmEntity$$1.way = osmWay;
71366 osmWay.prototype = Object.create(osmEntity$$1.prototype);
71369 assignIn(osmWay.prototype, {
71374 copy: function(resolver, copies) {
71375 if (copies[this.id])
71376 return copies[this.id];
71378 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
71380 var nodes = this.nodes.map(function(id) {
71381 return resolver.entity(id).copy(resolver, copies).id;
71384 copy = copy.update({ nodes: nodes });
71385 copies[this.id] = copy;
71391 extent: function(resolver) {
71392 return resolver.transient(this, 'extent', function() {
71393 var extent = geoExtent$$1();
71394 for (var i = 0; i < this.nodes.length; i++) {
71395 var node = resolver.hasEntity(this.nodes[i]);
71397 extent._extend(node.extent());
71405 first: function() {
71406 return this.nodes[0];
71411 return this.nodes[this.nodes.length - 1];
71415 contains: function(node) {
71416 return this.nodes.indexOf(node) >= 0;
71420 affix: function(node) {
71421 if (this.nodes[0] === node) return 'prefix';
71422 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
71426 layer: function() {
71427 // explicit layer tag, clamp between -10, 10..
71428 if (isFinite(this.tags.layer)) {
71429 return Math.max(-10, Math.min(+(this.tags.layer), 10));
71432 // implied layer tag..
71433 if (this.tags.covered === 'yes') return -1;
71434 if (this.tags.location === 'overground') return 1;
71435 if (this.tags.location === 'underground') return -1;
71436 if (this.tags.location === 'underwater') return -10;
71438 if (this.tags.power === 'line') return 10;
71439 if (this.tags.power === 'minor_line') return 10;
71440 if (this.tags.aerialway) return 10;
71441 if (this.tags.bridge) return 1;
71442 if (this.tags.cutting) return -1;
71443 if (this.tags.tunnel) return -1;
71444 if (this.tags.waterway) return -1;
71445 if (this.tags.man_made === 'pipeline') return -10;
71446 if (this.tags.boundary) return -10;
71451 isOneWay: function() {
71452 // explicit oneway tag..
71457 'reversible': true,
71458 'alternating': true,
71462 if (values[this.tags.oneway] !== undefined) {
71463 return values[this.tags.oneway];
71466 // implied oneway tag..
71467 for (var key in this.tags) {
71468 if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
71475 lanes: function() {
71476 return osmLanes(this);
71480 isClosed: function() {
71481 return this.nodes.length > 1 && this.first() === this.last();
71485 isConvex: function(resolver) {
71486 if (!this.isClosed() || this.isDegenerate()) return null;
71488 var nodes = uniq(resolver.childNodes(this));
71489 var coords = map$3(nodes, 'loc');
71493 for (var i = 0; i < coords.length; i++) {
71494 var o = coords[(i+1) % coords.length];
71496 var b = coords[(i+2) % coords.length];
71497 var res = geoVecCross(a, b, o);
71499 curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
71502 } else if (prev && curr !== prev) {
71511 isArea: function() {
71512 // `highway` and `railway` are typically linear features, but there
71513 // are a few exceptions that should be treated as areas, even in the
71514 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
71529 if (this.tags.area === 'yes')
71531 if (!this.isClosed() || this.tags.area === 'no')
71533 for (var key in this.tags) {
71534 if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
71537 if (key in lineKeys && this.tags[key] in lineKeys[key]) {
71545 isDegenerate: function() {
71546 return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
71550 areAdjacent: function(n1, n2) {
71551 for (var i = 0; i < this.nodes.length; i++) {
71552 if (this.nodes[i] === n1) {
71553 if (this.nodes[i - 1] === n2) return true;
71554 if (this.nodes[i + 1] === n2) return true;
71561 geometry: function(graph) {
71562 return graph.transient(this, 'geometry', function() {
71563 return this.isArea() ? 'area' : 'line';
71568 // If this way is not closed, append the beginning node to the end of the nodelist to close it.
71569 close: function() {
71570 if (this.isClosed() || !this.nodes.length) return this;
71572 var nodes = this.nodes.slice();
71573 nodes = nodes.filter(noRepeatNodes);
71574 nodes.push(nodes[0]);
71575 return this.update({ nodes: nodes });
71579 // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
71580 unclose: function() {
71581 if (!this.isClosed()) return this;
71583 var nodes = this.nodes.slice(),
71584 connector = this.first(),
71585 i = nodes.length - 1;
71587 // remove trailing connectors..
71588 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71589 nodes.splice(i, 1);
71590 i = nodes.length - 1;
71593 nodes = nodes.filter(noRepeatNodes);
71594 return this.update({ nodes: nodes });
71598 // Adds a node (id) in front of the node which is currently at position index.
71599 // If index is undefined, the node will be added to the end of the way for linear ways,
71600 // or just before the final connecting node for circular ways.
71601 // Consecutive duplicates are eliminated including existing ones.
71602 // Circularity is always preserved when adding a node.
71603 addNode: function(id, index) {
71604 var nodes = this.nodes.slice(),
71605 isClosed = this.isClosed(),
71606 max = isClosed ? nodes.length - 1 : nodes.length;
71608 if (index === undefined) {
71612 if (index < 0 || index > max) {
71613 throw new RangeError('index ' + index + ' out of range 0..' + max);
71616 // If this is a closed way, remove all connector nodes except the first one
71617 // (there may be duplicates) and adjust index if necessary..
71619 var connector = this.first();
71621 // leading connectors..
71623 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71624 nodes.splice(i, 1);
71625 if (index > i) index--;
71628 // trailing connectors..
71629 i = nodes.length - 1;
71630 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71631 nodes.splice(i, 1);
71632 if (index > i) index--;
71633 i = nodes.length - 1;
71637 nodes.splice(index, 0, id);
71638 nodes = nodes.filter(noRepeatNodes);
71640 // If the way was closed before, append a connector node to keep it closed..
71641 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71642 nodes.push(nodes[0]);
71645 return this.update({ nodes: nodes });
71649 // Replaces the node which is currently at position index with the given node (id).
71650 // Consecutive duplicates are eliminated including existing ones.
71651 // Circularity is preserved when updating a node.
71652 updateNode: function(id, index) {
71653 var nodes = this.nodes.slice(),
71654 isClosed = this.isClosed(),
71655 max = nodes.length - 1;
71657 if (index === undefined || index < 0 || index > max) {
71658 throw new RangeError('index ' + index + ' out of range 0..' + max);
71661 // If this is a closed way, remove all connector nodes except the first one
71662 // (there may be duplicates) and adjust index if necessary..
71664 var connector = this.first();
71666 // leading connectors..
71668 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
71669 nodes.splice(i, 1);
71670 if (index > i) index--;
71673 // trailing connectors..
71674 i = nodes.length - 1;
71675 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
71676 nodes.splice(i, 1);
71677 if (index === i) index = 0; // update leading connector instead
71678 i = nodes.length - 1;
71682 nodes.splice(index, 1, id);
71683 nodes = nodes.filter(noRepeatNodes);
71685 // If the way was closed before, append a connector node to keep it closed..
71686 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71687 nodes.push(nodes[0]);
71690 return this.update({nodes: nodes});
71694 // Replaces each occurrence of node id needle with replacement.
71695 // Consecutive duplicates are eliminated including existing ones.
71696 // Circularity is preserved.
71697 replaceNode: function(needle, replacement) {
71698 var nodes = this.nodes.slice(),
71699 isClosed = this.isClosed();
71701 for (var i = 0; i < nodes.length; i++) {
71702 if (nodes[i] === needle) {
71703 nodes[i] = replacement;
71707 nodes = nodes.filter(noRepeatNodes);
71709 // If the way was closed before, append a connector node to keep it closed..
71710 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71711 nodes.push(nodes[0]);
71714 return this.update({nodes: nodes});
71718 // Removes each occurrence of node id needle with replacement.
71719 // Consecutive duplicates are eliminated including existing ones.
71720 // Circularity is preserved.
71721 removeNode: function(id) {
71722 var nodes = this.nodes.slice(),
71723 isClosed = this.isClosed();
71726 .filter(function(node) { return node !== id; })
71727 .filter(noRepeatNodes);
71729 // If the way was closed before, append a connector node to keep it closed..
71730 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
71731 nodes.push(nodes[0]);
71734 return this.update({nodes: nodes});
71738 asJXON: function(changeset_id) {
71741 '@id': this.osmId(),
71742 '@version': this.version || 0,
71743 nd: map$3(this.nodes, function(id) {
71744 return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
71746 tag: map$3(this.tags, function(v, k) {
71747 return { keyAttributes: { k: k, v: v } };
71751 if (changeset_id) {
71752 r.way['@changeset'] = changeset_id;
71758 asGeoJSON: function(resolver) {
71759 return resolver.transient(this, 'GeoJSON', function() {
71760 var coordinates = map$3(resolver.childNodes(this), 'loc');
71761 if (this.isArea() && this.isClosed()) {
71764 coordinates: [coordinates]
71768 type: 'LineString',
71769 coordinates: coordinates
71776 area: function(resolver) {
71777 return resolver.transient(this, 'area', function() {
71778 var nodes = resolver.childNodes(this);
71782 coordinates: [map$3(nodes, 'loc')]
71785 if (!this.isClosed() && nodes.length) {
71786 json.coordinates[0].push(nodes[0].loc);
71789 var area = d3_geoArea(json);
71791 // Heuristic for detecting counterclockwise winding order. Assumes
71792 // that OpenStreetMap polygons are not hemisphere-spanning.
71793 if (area > 2 * Math.PI) {
71794 json.coordinates[0] = json.coordinates[0].reverse();
71795 area = d3_geoArea(json);
71798 return isNaN(area) ? 0 : area;
71804 // Filter function to eliminate consecutive duplicates.
71805 function noRepeatNodes(node, i, arr) {
71806 return i === 0 || node !== arr[i - 1];
71809 // For fixing up rendering of multipolygons with tags on the outer member.
71810 // https://github.com/openstreetmap/iD/issues/613
71811 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
71812 if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
71815 var parents = graph.parentRelations(entity);
71816 if (parents.length !== 1)
71819 var parent = parents[0];
71820 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71823 var members = parent.members, member;
71824 for (var i = 0; i < members.length; i++) {
71825 member = members[i];
71826 if (member.id === entity.id && member.role && member.role !== 'outer')
71827 return false; // Not outer member
71828 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
71829 return false; // Not a simple multipolygon
71836 function osmSimpleMultipolygonOuterMember(entity, graph) {
71837 if (entity.type !== 'way')
71840 var parents = graph.parentRelations(entity);
71841 if (parents.length !== 1)
71844 var parent = parents[0];
71845 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
71848 var members = parent.members, member, outerMember;
71849 for (var i = 0; i < members.length; i++) {
71850 member = members[i];
71851 if (!member.role || member.role === 'outer') {
71853 return false; // Not a simple multipolygon
71854 outerMember = member;
71861 var outerEntity = graph.hasEntity(outerMember.id);
71862 if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
71865 return outerEntity;
71869 // Join `toJoin` array into sequences of connecting ways.
71871 // Segments which share identical start/end nodes will, as much as possible,
71872 // be connected with each other.
71874 // The return value is a nested array. Each constituent array contains elements
71875 // of `toJoin` which have been determined to connect.
71877 // Each consitituent array also has a `nodes` property whose value is an
71878 // ordered array of member nodes, with appropriate order reversal and
71879 // start/end coordinate de-duplication.
71881 // Members of `toJoin` must have, at minimum, `type` and `id` properties.
71882 // Thus either an array of `osmWay`s or a relation member array may be used.
71884 // If an member is an `osmWay`, its tags and childnodes may be reversed via
71885 // `actionReverse` in the output.
71887 // The returned sequences array also has an `actions` array property, containing
71888 // any reversal actions that should be applied to the graph, should the calling
71889 // code attempt to actually join the given ways.
71891 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
71892 // false) and non-way members are ignored.
71894 function osmJoinWays(toJoin, graph) {
71895 function resolve(member) {
71896 return graph.childNodes(graph.entity(member.id));
71899 function reverse(item) {
71900 var action = actionReverse(item.id, { reverseOneway: true });
71901 sequences.actions.push(action);
71902 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
71905 // make a copy containing only the items to join
71906 toJoin = toJoin.filter(function(member) {
71907 return member.type === 'way' && graph.hasEntity(member.id);
71911 var sequences = [];
71912 sequences.actions = [];
71914 while (toJoin.length) {
71915 // start a new sequence
71916 var item = toJoin.shift();
71917 var currWays = [item];
71918 var currNodes = resolve(item).slice();
71919 var doneSequence = false;
71922 while (toJoin.length && !doneSequence) {
71923 var start = currNodes[0];
71924 var end = currNodes[currNodes.length - 1];
71929 // Find the next way/member to join.
71930 for (i = 0; i < toJoin.length; i++) {
71932 nodes = resolve(item);
71934 // Strongly prefer to generate a forward path that preserves the order
71935 // of the members array. For multipolygons and most relations, member
71936 // order does not matter - but for routes, it does. If we started this
71937 // sequence backwards (i.e. next member way attaches to the start node
71938 // and not the end node), reverse the initial way before continuing.
71939 if (currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
71940 (nodes[nodes.length - 1] === start || nodes[0] === start)
71942 currWays[0] = reverse(currWays[0]);
71943 currNodes.reverse();
71944 start = currNodes[0];
71945 end = currNodes[currNodes.length - 1];
71948 if (nodes[0] === end) {
71949 fn = currNodes.push; // join to end
71950 nodes = nodes.slice(1);
71952 } else if (nodes[nodes.length - 1] === end) {
71953 fn = currNodes.push; // join to end
71954 nodes = nodes.slice(0, -1).reverse();
71955 item = reverse(item);
71957 } else if (nodes[nodes.length - 1] === start) {
71958 fn = currNodes.unshift; // join to beginning
71959 nodes = nodes.slice(0, -1);
71961 } else if (nodes[0] === start) {
71962 fn = currNodes.unshift; // join to beginning
71963 nodes = nodes.slice(1).reverse();
71964 item = reverse(item);
71971 if (!nodes) { // couldn't find a joinable way/member
71972 doneSequence = true;
71976 fn.apply(currWays, [item]);
71977 fn.apply(currNodes, nodes);
71979 toJoin.splice(i, 1);
71982 currWays.nodes = currNodes;
71983 sequences.push(currWays);
71989 function osmRelation() {
71990 if (!(this instanceof osmRelation)) {
71991 return (new osmRelation()).initialize(arguments);
71992 } else if (arguments.length) {
71993 this.initialize(arguments);
71998 osmEntity$$1.relation = osmRelation;
72000 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
72003 osmRelation.creationOrder = function(a, b) {
72004 var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
72005 var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
72007 if (aId < 0 || bId < 0) return aId - bId;
72012 assignIn(osmRelation.prototype, {
72017 copy: function(resolver, copies) {
72018 if (copies[this.id])
72019 return copies[this.id];
72021 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
72023 var members = this.members.map(function(member) {
72024 return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
72027 copy = copy.update({members: members});
72028 copies[this.id] = copy;
72034 extent: function(resolver, memo) {
72035 return resolver.transient(this, 'extent', function() {
72036 if (memo && memo[this.id]) return geoExtent$$1();
72038 memo[this.id] = true;
72040 var extent = geoExtent$$1();
72041 for (var i = 0; i < this.members.length; i++) {
72042 var member = resolver.hasEntity(this.members[i].id);
72044 extent._extend(member.extent(resolver, memo));
72052 geometry: function(graph) {
72053 return graph.transient(this, 'geometry', function() {
72054 return this.isMultipolygon() ? 'area' : 'relation';
72059 isDegenerate: function() {
72060 return this.members.length === 0;
72064 // Return an array of members, each extended with an 'index' property whose value
72065 // is the member index.
72066 indexedMembers: function() {
72067 var result = new Array(this.members.length);
72068 for (var i = 0; i < this.members.length; i++) {
72069 result[i] = assignIn({}, this.members[i], {index: i});
72075 // Return the first member with the given role. A copy of the member object
72076 // is returned, extended with an 'index' property whose value is the member index.
72077 memberByRole: function(role) {
72078 for (var i = 0; i < this.members.length; i++) {
72079 if (this.members[i].role === role) {
72080 return assignIn({}, this.members[i], {index: i});
72085 // Same as memberByRole, but returns all members with the given role
72086 membersByRole: function(role) {
72088 for (var i = 0; i < this.members.length; i++) {
72089 if (this.members[i].role === role) {
72090 result.push(assignIn({}, this.members[i], {index: i}));
72096 // Return the first member with the given id. A copy of the member object
72097 // is returned, extended with an 'index' property whose value is the member index.
72098 memberById: function(id) {
72099 for (var i = 0; i < this.members.length; i++) {
72100 if (this.members[i].id === id) {
72101 return assignIn({}, this.members[i], {index: i});
72107 // Return the first member with the given id and role. A copy of the member object
72108 // is returned, extended with an 'index' property whose value is the member index.
72109 memberByIdAndRole: function(id, role) {
72110 for (var i = 0; i < this.members.length; i++) {
72111 if (this.members[i].id === id && this.members[i].role === role) {
72112 return assignIn({}, this.members[i], {index: i});
72118 addMember: function(member, index) {
72119 var members = this.members.slice();
72120 members.splice(index === undefined ? members.length : index, 0, member);
72121 return this.update({members: members});
72125 updateMember: function(member, index) {
72126 var members = this.members.slice();
72127 members.splice(index, 1, assignIn({}, members[index], member));
72128 return this.update({members: members});
72132 removeMember: function(index) {
72133 var members = this.members.slice();
72134 members.splice(index, 1);
72135 return this.update({members: members});
72139 removeMembersWithID: function(id) {
72140 var members = reject(this.members, function(m) { return m.id === id; });
72141 return this.update({members: members});
72145 // Wherever a member appears with id `needle.id`, replace it with a member
72146 // with id `replacement.id`, type `replacement.type`, and the original role,
72147 // By default, adding a duplicate member (by id and role) is prevented.
72148 // Return an updated relation.
72149 replaceMember: function(needle, replacement, keepDuplicates) {
72150 if (!this.memberById(needle.id))
72155 for (var i = 0; i < this.members.length; i++) {
72156 var member = this.members[i];
72157 if (member.id !== needle.id) {
72158 members.push(member);
72159 } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
72160 members.push({id: replacement.id, type: replacement.type, role: member.role});
72164 return this.update({members: members});
72168 asJXON: function(changeset_id) {
72171 '@id': this.osmId(),
72172 '@version': this.version || 0,
72173 member: map$3(this.members, function(member) {
72178 ref: osmEntity$$1.id.toOSM(member.id)
72182 tag: map$3(this.tags, function(v, k) {
72183 return { keyAttributes: { k: k, v: v } };
72187 if (changeset_id) r.relation['@changeset'] = changeset_id;
72192 asGeoJSON: function(resolver) {
72193 return resolver.transient(this, 'GeoJSON', function () {
72194 if (this.isMultipolygon()) {
72196 type: 'MultiPolygon',
72197 coordinates: this.multipolygon(resolver)
72201 type: 'FeatureCollection',
72202 properties: this.tags,
72203 features: this.members.map(function (member) {
72204 return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
72212 area: function(resolver) {
72213 return resolver.transient(this, 'area', function() {
72214 return d3_geoArea(this.asGeoJSON(resolver));
72219 isMultipolygon: function() {
72220 return this.tags.type === 'multipolygon';
72224 isComplete: function(resolver) {
72225 for (var i = 0; i < this.members.length; i++) {
72226 if (!resolver.hasEntity(this.members[i].id)) {
72234 isRestriction: function() {
72235 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
72239 isValidRestriction: function() {
72240 if (!this.isRestriction()) return false;
72242 var froms = this.members.filter(function(m) { return m.role === 'from'; });
72243 var vias = this.members.filter(function(m) { return m.role === 'via'; });
72244 var tos = this.members.filter(function(m) { return m.role === 'to'; });
72246 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
72247 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
72249 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
72250 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
72252 if (vias.length === 0) return false;
72253 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
72259 // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
72260 // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
72262 // This corresponds to the structure needed for rendering a multipolygon path using a
72263 // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
72265 // In the case of invalid geometries, this function will still return a result which
72266 // includes the nodes of all way members, but some Nds may be unclosed and some inner
72267 // rings not matched with the intended outer ring.
72269 multipolygon: function(resolver) {
72270 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
72271 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
72273 outers = osmJoinWays(outers, resolver);
72274 inners = osmJoinWays(inners, resolver);
72276 outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
72277 inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
72279 var result = outers.map(function(o) {
72280 // Heuristic for detecting counterclockwise winding order. Assumes
72281 // that OpenStreetMap polygons are not hemisphere-spanning.
72282 return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
72285 function findOuter(inner) {
72288 for (o = 0; o < outers.length; o++) {
72290 if (geoPolygonContainsPolygon(outer, inner))
72294 for (o = 0; o < outers.length; o++) {
72296 if (geoPolygonIntersectsPolygon(outer, inner, false))
72301 for (var i = 0; i < inners.length; i++) {
72302 var inner = inners[i];
72304 if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
72305 inner = inner.reverse();
72308 var o = findOuter(inners[i]);
72309 if (o !== undefined)
72310 result[o].push(inners[i]);
72312 result.push([inners[i]]); // Invalid geometry
72319 function osmTurn(turn) {
72320 if (!(this instanceof osmTurn)) {
72321 return new osmTurn(turn);
72323 assignIn(this, turn);
72327 function osmIntersection(graph, startVertexId, maxDistance) {
72328 maxDistance = maxDistance || 30; // in meters
72329 var vgraph = coreGraph$$1(); // virtual graph
72333 function memberOfRestriction(entity) {
72334 return graph.parentRelations(entity)
72335 .some(function(r) { return r.isRestriction(); });
72338 function isRoad(way) {
72339 if (way.isArea() || way.isDegenerate()) return false;
72342 'motorway_link': true,
72344 'trunk_link': true,
72346 'primary_link': true,
72348 'secondary_link': true,
72350 'tertiary_link': true,
72351 'residential': true,
72352 'unclassified': true,
72353 'living_street': true,
72358 return roads[way.tags.highway];
72362 var startNode = graph.entity(startVertexId);
72363 var checkVertices = [startNode];
72366 var vertexIds = [];
72376 // `actions` will store whatever actions must be performed to satisfy
72377 // preconditions for adding a turn restriction to this intersection.
72378 // - Remove any existing degenerate turn restrictions (missing from/to, etc)
72379 // - Reverse oneways so that they are drawn in the forward direction
72380 // - Split ways on key vertices
72384 // STEP 1: walk the graph outwards from starting vertex to search
72385 // for more key vertices and ways to include in the intersection..
72387 while (checkVertices.length) {
72388 vertex = checkVertices.pop();
72390 // check this vertex for parent ways that are roads
72391 checkWays = graph.parentWays(vertex);
72392 var hasWays = false;
72393 for (i = 0; i < checkWays.length; i++) {
72394 way = checkWays[i];
72395 if (!isRoad(way) && !memberOfRestriction(way)) continue;
72397 ways.push(way); // it's a road, or it's already in a turn restriction
72400 // check the way's children for more key vertices
72401 nodes = uniq(graph.childNodes(way));
72402 for (j = 0; j < nodes.length; j++) {
72404 if (node === vertex) continue; // same thing
72405 if (vertices.indexOf(node) !== -1) continue; // seen it already
72406 if (node.loc && startNode.loc &&
72407 geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
72409 // a key vertex will have parents that are also roads
72410 var hasParents = false;
72411 parents = graph.parentWays(node);
72412 for (k = 0; k < parents.length; k++) {
72413 parent = parents[k];
72414 if (parent === way) continue; // same thing
72415 if (ways.indexOf(parent) !== -1) continue; // seen it already
72416 if (!isRoad(parent)) continue; // not a road
72422 checkVertices.push(node);
72428 vertices.push(vertex);
72432 vertices = uniq(vertices);
72436 // STEP 2: Build a virtual graph containing only the entities in the intersection..
72437 // Everything done after this step should act on the virtual graph
72438 // Any actions that must be performed later to the main graph go in `actions` array
72439 ways.forEach(function(way) {
72440 graph.childNodes(way).forEach(function(node) {
72441 vgraph = vgraph.replace(node);
72444 vgraph = vgraph.replace(way);
72446 graph.parentRelations(way).forEach(function(relation) {
72447 if (relation.isRestriction()) {
72448 if (relation.isValidRestriction(graph)) {
72449 vgraph = vgraph.replace(relation);
72450 } else if (relation.isComplete(graph)) {
72451 actions.push(actionDeleteRelation(relation.id));
72458 // STEP 3: Force all oneways to be drawn in the forward direction
72459 ways.forEach(function(w) {
72460 var way = vgraph.entity(w.id);
72461 if (way.tags.oneway === '-1') {
72462 var action = actionReverse(way.id, { reverseOneway: true });
72463 actions.push(action);
72464 vgraph = action(vgraph);
72469 // STEP 4: Split ways on key vertices
72470 var origCount = osmEntity$$1.id.next.way;
72471 vertices.forEach(function(v) {
72472 // This is an odd way to do it, but we need to find all the ways that
72473 // will be split here, then split them one at a time to ensure that these
72474 // actions can be replayed on the main graph exactly in the same order.
72475 // (It is unintuitive, but the order of ways returned from graph.parentWays()
72476 // is arbitrary, depending on how the main graph and vgraph were built)
72477 var splitAll = actionSplit(v.id);
72478 if (!splitAll.disabled(vgraph)) {
72479 splitAll.ways(vgraph).forEach(function(way) {
72480 var splitOne = actionSplit(v.id).limitWays([way.id]);
72481 actions.push(splitOne);
72482 vgraph = splitOne(vgraph);
72487 // In here is where we should also split the intersection at nearby junction.
72488 // for https://github.com/mapbox/iD-internal/issues/31
72489 // nearbyVertices.forEach(function(v) {
72492 // Reasons why we reset the way id count here:
72493 // 1. Continuity with way ids created by the splits so that we can replay
72494 // these actions later if the user decides to create a turn restriction
72495 // 2. Avoids churning way ids just by hovering over a vertex
72496 // and displaying the turn restriction editor
72497 osmEntity$$1.id.next.way = origCount;
72500 // STEP 5: Update arrays to point to vgraph entities
72501 vertexIds = vertices.map(function(v) { return v.id; });
72505 vertexIds.forEach(function(id) {
72506 var vertex = vgraph.entity(id);
72507 var parents = vgraph.parentWays(vertex);
72508 vertices.push(vertex);
72509 ways = ways.concat(parents);
72512 vertices = uniq(vertices);
72515 vertexIds = vertices.map(function(v) { return v.id; });
72516 wayIds = ways.map(function(w) { return w.id; });
72519 // STEP 6: Update the ways with some metadata that will be useful for
72520 // walking the intersection graph later and rendering turn arrows.
72522 function withMetadata(way, vertexIds) {
72523 var __oneWay = way.isOneWay();
72525 // which affixes are key vertices?
72526 var __first = (vertexIds.indexOf(way.first()) !== -1);
72527 var __last = (vertexIds.indexOf(way.last()) !== -1);
72529 // what roles is this way eligible for?
72530 var __via = (__first && __last);
72531 var __from = ((__first && !__oneWay) || __last);
72532 var __to = (__first || (__last && !__oneWay));
72534 return way.update({
72545 wayIds.forEach(function(id) {
72546 var way = withMetadata(vgraph.entity(id), vertexIds);
72547 vgraph = vgraph.replace(way);
72552 // STEP 7: Simplify - This is an iterative process where we:
72553 // 1. Find trivial vertices with only 2 parents
72554 // 2. trim off the leaf way from those vertices and remove from vgraph
72557 var removeWayIds = [];
72558 var removeVertexIds = [];
72562 checkVertices = vertexIds.slice();
72564 for (i = 0; i < checkVertices.length; i++) {
72565 var vertexId = checkVertices[i];
72566 vertex = vgraph.hasEntity(vertexId);
72569 if (vertexIds.indexOf(vertexId) !== -1) {
72570 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
72572 removeVertexIds.push(vertexId);
72576 parents = vgraph.parentWays(vertex);
72577 if (parents.length < 3) {
72578 if (vertexIds.indexOf(vertexId) !== -1) {
72579 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
72583 if (parents.length === 2) { // vertex with 2 parents is trivial
72584 var a = parents[0];
72585 var b = parents[1];
72586 var aIsLeaf = a && !a.__via;
72587 var bIsLeaf = b && !b.__via;
72588 var leaf, survivor;
72590 if (aIsLeaf && !bIsLeaf) {
72593 } else if (!aIsLeaf && bIsLeaf) {
72598 if (leaf && survivor) {
72599 survivor = withMetadata(survivor, vertexIds); // update survivor way
72600 vgraph = vgraph.replace(survivor).remove(leaf); // update graph
72601 removeWayIds.push(leaf.id);
72606 parents = vgraph.parentWays(vertex);
72608 if (parents.length < 2) { // vertex is no longer a key vertex
72609 if (vertexIds.indexOf(vertexId) !== -1) {
72610 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
72612 removeVertexIds.push(vertexId);
72616 if (parents.length < 1) { // vertex is no longer attached to anything
72617 vgraph = vgraph.remove(vertex);
72621 } while (keepGoing);
72624 vertices = vertices
72625 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
72626 .map(function(vertex) { return vgraph.entity(vertex.id); });
72628 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
72629 .map(function(way) { return vgraph.entity(way.id); });
72632 // OK! Here is our intersection..
72633 var intersection = {
72636 vertices: vertices,
72642 // Get all the valid turns through this intersection given a starting way id.
72643 // This operates on the virtual graph for everything.
72645 // Basically, walk through all possible paths from starting way,
72646 // honoring the existing turn restrictions as we go (watch out for loops!)
72648 // For each path found, generate and return a `osmTurn` datastructure.
72650 intersection.turns = function(fromWayId, maxViaWay) {
72651 if (!fromWayId) return [];
72652 if (!maxViaWay) maxViaWay = 0;
72654 var vgraph = intersection.graph;
72655 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
72657 var start = vgraph.entity(fromWayId);
72658 if (!start || !(start.__from || start.__via)) return [];
72660 // maxViaWay=0 from-*-to (0 vias)
72661 // maxViaWay=1 from-*-via-*-to (1 via max)
72662 // maxViaWay=2 from-*-via-*-via-*-to (2 vias max)
72663 var maxPathLength = (maxViaWay * 2) + 3;
72670 // traverse the intersection graph and find all the valid paths
72671 function step(entity, currPath, currRestrictions, matchedRestriction) {
72672 currPath = clone(currPath || []);
72673 if (currPath.length >= maxPathLength) return;
72674 currPath.push(entity.id);
72675 currRestrictions = clone(currRestrictions || []);
72678 if (entity.type === 'node') {
72679 var parents = vgraph.parentWays(entity);
72682 // which ways can we step into?
72683 for (i = 0; i < parents.length; i++) {
72684 var way = parents[i];
72686 // if next way is a oneway incoming to this vertex, skip
72687 if (way.__oneWay && way.nodes[0] !== entity.id) continue;
72689 // if we have seen it before (allowing for an initial u-turn), skip
72690 if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
72692 // Check all "current" restrictions (where we've already walked the `FROM`)
72693 var restrict = undefined;
72694 for (j = 0; j < currRestrictions.length; j++) {
72695 var restriction = currRestrictions[j];
72696 var f = restriction.memberByRole('from');
72697 var v = restriction.membersByRole('via');
72698 var t = restriction.memberByRole('to');
72699 var isOnly = /^only_/.test(restriction.tags.restriction);
72701 // Does the current path match this turn restriction?
72702 var matchesFrom = (f.id === fromWayId);
72703 var matchesViaTo = false;
72704 var isAlongOnlyPath = false;
72706 if (t.id === way.id) { // match VIA, TO
72707 if (v.length === 1 && v[0].type === 'node' && v[0].id === entity.id) {
72708 matchesViaTo = true; // match VIA node
72709 } else if (every(v, function(via) { return currPath.indexOf(via.id) !== -1; })) {
72710 matchesViaTo = true; // match all VIA ways
72713 } else if (isOnly) {
72714 for (k = 0; k < v.length; k++) {
72715 // way doesn't match TO, but is one of the via ways along the path of an "only"
72716 if (v[k].type === 'way' && v[k].id === way.id) {
72717 isAlongOnlyPath = true;
72723 if (matchesViaTo) {
72725 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
72727 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
72729 } else { // indirect - caused by a different nearby restriction
72730 if (isAlongOnlyPath) {
72731 restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
72732 } else if (isOnly) {
72733 restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
72737 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
72738 if (restrict && restrict.direct)
72742 nextWays.push({ way: way, restrict: restrict });
72745 nextWays.forEach(function(nextWay) {
72746 step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
72750 } else { // entity.type === 'way'
72751 if (currPath.length >= 3) { // this is a "complete" path..
72752 var turnPath = clone(currPath);
72754 // an indirect restriction - only include the partial path (starting at FROM)
72755 if (matchedRestriction && matchedRestriction.direct === false) {
72756 for (i = 0; i < turnPath.length; i++) {
72757 if (turnPath[i] === matchedRestriction.from) {
72758 turnPath = turnPath.slice(i);
72764 var turn = pathToTurn(turnPath);
72766 if (matchedRestriction) {
72767 turn.restrictionID = matchedRestriction.id;
72768 turn.no = matchedRestriction.no;
72769 turn.only = matchedRestriction.only;
72770 turn.direct = matchedRestriction.direct;
72772 turns.push(osmTurn(turn));
72775 if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
72778 if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
72780 // which nodes can we step into?
72781 var n1 = vgraph.entity(entity.first());
72782 var n2 = vgraph.entity(entity.last());
72783 var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
72784 var nextNodes = [];
72786 if (currPath.length > 1) {
72787 if (dist > maxDistance) return; // the next node is too far
72788 if (!entity.__via) return; // this way is a leaf / can't be a via
72791 if (!entity.__oneWay && // bidirectional..
72792 keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
72793 currPath.indexOf(n1.id) === -1) { // haven't seen it yet..
72794 nextNodes.push(n1); // can advance to first node
72796 if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
72797 currPath.indexOf(n2.id) === -1) { // haven't seen it yet..
72798 nextNodes.push(n2); // can advance to last node
72801 nextNodes.forEach(function(nextNode) {
72802 // gather restrictions FROM this way
72803 var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
72804 if (!r.isRestriction()) return false;
72806 var f = r.memberByRole('from');
72807 if (!f || f.id !== entity.id) return false;
72809 var isOnly = /^only_/.test(r.tags.restriction);
72810 if (!isOnly) return true;
72812 // `only_` restrictions only matter along the direction of the VIA - #4849
72813 var isOnlyVia = false;
72814 var v = r.membersByRole('via');
72815 if (v.length === 1 && v[0].type === 'node') { // via node
72816 isOnlyVia = (v[0].id === nextNode.id);
72817 } else { // via way(s)
72818 for (k = 0; k < v.length; k++) {
72819 if (v[k].type === 'way' && vgraph.entity(v[k].id).first() === nextNode.id) {
72828 step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
72834 // assumes path is alternating way-node-way of odd length
72835 function pathToTurn(path) {
72836 if (path.length < 3) return;
72837 var fromWayId, fromNodeId, fromVertexId;
72838 var toWayId, toNodeId, toVertexId;
72839 var viaWayIds, viaNodeId, isUturn;
72841 fromWayId = path[0];
72842 toWayId = path[path.length - 1];
72844 if (path.length === 3 && fromWayId === toWayId) { // u turn
72845 var way = vgraph.entity(fromWayId);
72846 if (way.__oneWay) return null;
72849 viaNodeId = fromVertexId = toVertexId = path[1];
72850 fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
72854 fromVertexId = path[1];
72855 fromNodeId = adjacentNode(fromWayId, fromVertexId);
72856 toVertexId = path[path.length - 2];
72857 toNodeId = adjacentNode(toWayId, toVertexId);
72859 if (path.length === 3) {
72860 viaNodeId = path[1];
72862 viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
72863 viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
72868 key: path.join('_'),
72870 from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId },
72871 via: { node: viaNodeId, ways: viaWayIds },
72872 to: { node: toNodeId, way: toWayId, vertex: toVertexId },
72877 function adjacentNode(wayId, affixId) {
72878 var nodes = vgraph.entity(wayId).nodes;
72879 return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
72885 return intersection;
72889 function osmInferRestriction(graph, turn, projection) {
72890 var fromWay = graph.entity(turn.from.way);
72891 var fromNode = graph.entity(turn.from.node);
72892 var fromVertex = graph.entity(turn.from.vertex);
72893 var toWay = graph.entity(turn.to.way);
72894 var toNode = graph.entity(turn.to.node);
72895 var toVertex = graph.entity(turn.to.vertex);
72897 var fromOneWay = (fromWay.tags.oneway === 'yes');
72898 var toOneWay = (toWay.tags.oneway === 'yes');
72899 var angle = (geoAngle(fromVertex, fromNode, projection) -
72900 geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
72905 if (fromNode === toNode)
72906 return 'no_u_turn';
72907 if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
72908 return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
72909 if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
72910 return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
72912 return 'no_right_turn';
72914 return 'no_left_turn';
72916 return 'no_straight_on';
72919 function actionAddMember(relationId, member, memberIndex, insertPair) {
72921 return function action(graph) {
72922 var relation = graph.entity(relationId);
72924 // There are some special rules for Public Transport v2 routes.
72925 var isPTv2 = (member.role === 'stop' || member.role === 'platform');
72927 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
72928 // Try to perform sensible inserts based on how the ways join together
72929 graph = addWayMember(relation, graph);
72931 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
72932 // Stops and Platforms for PTv2 should be ordered first.
72933 // hack: We do not currently have the ability to place them in the exactly correct order.
72934 if (isPTv2 && isNaN(memberIndex)) {
72938 graph = graph.replace(relation.addMember(member, memberIndex));
72945 // Add a way member into the relation "wherever it makes sense".
72946 // In this situation we were not supplied a memberIndex.
72947 function addWayMember(relation, graph) {
72948 var groups, tempWay, item, i, j, k;
72950 // remove PTv2 stops and platforms before doing anything.
72951 var PTv2members = [];
72953 for (i = 0; i < relation.members.length; i++) {
72954 var m = relation.members[i];
72955 if (m.role === 'stop' || m.role === 'platform') {
72956 PTv2members.push(m);
72961 relation = relation.update({ members: members });
72965 // We're adding a member that must stay paired with an existing member.
72966 // (This feature is used by `actionSplit`)
72968 // This is tricky because the members may exist multiple times in the
72969 // member list, and with different A-B/B-A ordering and different roles.
72970 // (e.g. a bus route that loops out and back - #4589).
72972 // Replace the existing member with a temporary way,
72973 // so that `osmJoinWays` can treat the pair like a single way.
72974 tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
72975 graph = graph.replace(tempWay);
72976 var tempMember = { id: tempWay.id, type: 'way', role: member.role };
72977 var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
72978 groups = groupBy(tempRelation.members, function(m) { return m.type; });
72979 groups.way = groups.way || [];
72982 // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
72983 groups = groupBy(relation.members, function(m) { return m.type; });
72984 groups.way = groups.way || [];
72985 groups.way.push(member);
72988 members = withIndex(groups.way);
72989 var joined = osmJoinWays(members, graph);
72991 // `joined` might not contain all of the way members,
72992 // But will contain only the completed (downloaded) members
72993 for (i = 0; i < joined.length; i++) {
72994 var segment = joined[i];
72995 var nodes = segment.nodes.slice();
72996 var startIndex = segment[0].index;
72998 // j = array index in `members` where this segment starts
72999 for (j = 0; j < members.length; j++) {
73000 if (members[j].index === startIndex) {
73005 // k = each member in segment
73006 for (k = 0; k < segment.length; k++) {
73008 var way = graph.entity(item.id);
73010 // If this is a paired item, generate members in correct order and role
73011 if (tempWay && item.id === tempWay.id) {
73012 if (nodes[0].id === insertPair.nodes[0]) {
73014 { id: insertPair.originalID, type: 'way', role: item.role },
73015 { id: insertPair.insertedID, type: 'way', role: item.role }
73019 { id: insertPair.insertedID, type: 'way', role: item.role },
73020 { id: insertPair.originalID, type: 'way', role: item.role }
73025 // reorder `members` if necessary
73027 if (j+k >= members.length || item.index !== members[j+k].index) {
73028 moveMember(members, item.index, j+k);
73032 nodes.splice(0, way.nodes.length - 1);
73037 graph = graph.remove(tempWay);
73040 // Final pass: skip dead items, split pairs, remove index properties
73041 var wayMembers = [];
73042 for (i = 0; i < members.length; i++) {
73044 if (item.index === -1) continue;
73047 wayMembers.push(item.pair[0]);
73048 wayMembers.push(item.pair[1]);
73050 wayMembers.push(omit(item, 'index'));
73054 // Put stops and platforms first, then nodes, ways, relations
73055 // This is recommended for Public Transport v2 routes:
73056 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
73057 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
73059 return graph.replace(relation.update({members: newMembers}));
73062 // `moveMember()` changes the `members` array in place by splicing
73063 // the item with `.index = findIndex` to where it belongs,
73064 // and marking the old position as "dead" with `.index = -1`
73068 // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k
73072 // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k
73073 // members 0 1 2 3 x 5 4 6 7 8 9 moved
73077 // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k
73078 // members 0 1 2 3 x 5 4 7 6 x 8 9 moved
73082 // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k
73084 function moveMember(arr, findIndex, toIndex) {
73085 for (var i = 0; i < arr.length; i++) {
73086 if (arr[i].index === findIndex) {
73091 var item = clone(arr[i]);
73092 arr[i].index = -1; // mark as dead
73093 item.index = toIndex;
73094 arr.splice(toIndex, 0, item);
73098 // This is the same as `Relation.indexedMembers`,
73099 // Except we don't want to index all the members, only the ways
73100 function withIndex(arr) {
73101 var result = new Array(arr.length);
73102 for (var i = 0; i < arr.length; i++) {
73103 result[i] = arr[i];
73104 result[i].index = i;
73112 function actionAddMidpoint(midpoint, node) {
73113 return function(graph) {
73114 graph = graph.replace(node.move(midpoint.loc));
73116 var parents = intersection(
73117 graph.parentWays(graph.entity(midpoint.edge[0])),
73118 graph.parentWays(graph.entity(midpoint.edge[1])));
73120 parents.forEach(function(way) {
73121 for (var i = 0; i < way.nodes.length - 1; i++) {
73122 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
73123 graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
73125 // Add only one midpoint on doubled-back segments,
73126 // turning them into self-intersections.
73136 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
73137 function actionAddVertex(wayId, nodeId, index) {
73138 return function(graph) {
73139 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
73143 function actionChangeMember(relationId, member, memberIndex) {
73144 return function(graph) {
73145 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
73149 function actionChangePreset(entityId, oldPreset, newPreset) {
73150 return function(graph) {
73151 var entity = graph.entity(entityId),
73152 geometry = entity.geometry(graph),
73153 tags = entity.tags;
73155 if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
73156 if (newPreset) tags = newPreset.applyTags(tags, geometry);
73158 return graph.replace(entity.update({tags: tags}));
73162 function actionChangeTags(entityId, tags) {
73163 return function(graph) {
73164 var entity = graph.entity(entityId);
73165 return graph.replace(entity.update({tags: tags}));
73169 function actionCircularize(wayId, projection, maxAngle) {
73170 maxAngle = (maxAngle || 20) * Math.PI / 180;
73173 var action = function(graph, t) {
73174 if (t === null || !isFinite(t)) t = 1;
73175 t = Math.min(Math.max(+t, 0), 1);
73177 var way = graph.entity(wayId),
73180 graph.childNodes(way).forEach(function(node) {
73181 if (!origNodes[node.id]) origNodes[node.id] = node;
73184 if (!way.isConvex(graph)) {
73185 graph = action.makeConvex(graph);
73188 var nodes = uniq(graph.childNodes(way)),
73189 keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
73190 points = nodes.map(function(n) { return projection(n.loc); }),
73191 keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
73192 centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
73193 radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
73194 sign = d3_polygonArea(points) > 0 ? 1 : -1,
73197 // we need atleast two key nodes for the algorithm to work
73198 if (!keyNodes.length) {
73199 keyNodes = [nodes[0]];
73200 keyPoints = [points[0]];
73203 if (keyNodes.length === 1) {
73204 var index = nodes.indexOf(keyNodes[0]),
73205 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
73207 keyNodes.push(nodes[oppositeIndex]);
73208 keyPoints.push(points[oppositeIndex]);
73211 // key points and nodes are those connected to the ways,
73212 // they are projected onto the circle, inbetween nodes are moved
73213 // to constant intervals between key nodes, extra inbetween nodes are
73214 // added if necessary.
73215 for (var i = 0; i < keyPoints.length; i++) {
73216 var nextKeyNodeIndex = (i + 1) % keyNodes.length,
73217 startNode = keyNodes[i],
73218 endNode = keyNodes[nextKeyNodeIndex],
73219 startNodeIndex = nodes.indexOf(startNode),
73220 endNodeIndex = nodes.indexOf(endNode),
73221 numberNewPoints = -1,
73222 indexRange = endNodeIndex - startNodeIndex,
73224 inBetweenNodes = [],
73225 startAngle, endAngle, totalAngle, eachAngle,
73226 angle, loc, node, origNode, j;
73228 if (indexRange < 0) {
73229 indexRange += nodes.length;
73232 // position this key node
73233 var distance = geoVecLength(centroid, keyPoints[i]);
73234 if (distance === 0) { distance = 1e-4; }
73236 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
73237 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
73239 loc = projection.invert(keyPoints[i]);
73240 node = keyNodes[i];
73241 origNode = origNodes[node.id];
73242 node = node.move(geoVecInterp(origNode.loc, loc, t));
73243 graph = graph.replace(node);
73245 // figure out the between delta angle we want to match to
73246 startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
73247 endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
73248 totalAngle = endAngle - startAngle;
73250 // detects looping around -pi/pi
73251 if (totalAngle * sign > 0) {
73252 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
73257 eachAngle = totalAngle / (indexRange + numberNewPoints);
73258 } while (Math.abs(eachAngle) > maxAngle);
73261 // move existing nodes
73262 for (j = 1; j < indexRange; j++) {
73263 angle = startAngle + j * eachAngle;
73264 loc = projection.invert([
73265 centroid[0] + Math.cos(angle) * radius,
73266 centroid[1] + Math.sin(angle) * radius
73269 node = nodes[(j + startNodeIndex) % nodes.length];
73270 origNode = origNodes[node.id];
73271 nearNodes[node.id] = angle;
73273 node = node.move(geoVecInterp(origNode.loc, loc, t));
73274 graph = graph.replace(node);
73277 // add new inbetween nodes if necessary
73278 for (j = 0; j < numberNewPoints; j++) {
73279 angle = startAngle + (indexRange + j) * eachAngle;
73280 loc = projection.invert([
73281 centroid[0] + Math.cos(angle) * radius,
73282 centroid[1] + Math.sin(angle) * radius
73285 // choose a nearnode to use as the original
73286 var min$$1 = Infinity;
73287 for (var nodeId in nearNodes) {
73288 var nearAngle = nearNodes[nodeId],
73289 dist = Math.abs(nearAngle - angle);
73290 if (dist < min$$1) {
73292 origNode = origNodes[nodeId];
73296 node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
73297 graph = graph.replace(node);
73299 nodes.splice(endNodeIndex + j, 0, node);
73300 inBetweenNodes.push(node.id);
73303 // Check for other ways that share these keyNodes..
73304 // If keyNodes are adjacent in both ways,
73305 // we can add inBetween nodes to that shared way too..
73306 if (indexRange === 1 && inBetweenNodes.length) {
73307 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
73308 endIndex1 = way.nodes.lastIndexOf(endNode.id),
73309 wayDirection1 = (endIndex1 - startIndex1);
73310 if (wayDirection1 < -1) { wayDirection1 = 1; }
73312 /* eslint-disable no-loop-func */
73313 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
73314 if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
73315 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
73316 endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
73317 wayDirection2 = (endIndex2 - startIndex2),
73318 insertAt = endIndex2;
73319 if (wayDirection2 < -1) { wayDirection2 = 1; }
73321 if (wayDirection1 !== wayDirection2) {
73322 inBetweenNodes.reverse();
73323 insertAt = startIndex2;
73325 for (j = 0; j < inBetweenNodes.length; j++) {
73326 sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
73328 graph = graph.replace(sharedWay);
73331 /* eslint-enable no-loop-func */
73336 // update the way to have all the new nodes
73337 ids = nodes.map(function(n) { return n.id; });
73340 way = way.update({nodes: ids});
73341 graph = graph.replace(way);
73347 action.makeConvex = function(graph) {
73348 var way = graph.entity(wayId),
73349 nodes = uniq(graph.childNodes(way)),
73350 points = nodes.map(function(n) { return projection(n.loc); }),
73351 sign = d3_polygonArea(points) > 0 ? 1 : -1,
73352 hull = d3_polygonHull(points);
73354 // D3 convex hulls go counterclockwise..
73360 for (var i = 0; i < hull.length - 1; i++) {
73361 var startIndex = points.indexOf(hull[i]),
73362 endIndex = points.indexOf(hull[i+1]),
73363 indexRange = (endIndex - startIndex);
73365 if (indexRange < 0) {
73366 indexRange += nodes.length;
73369 // move interior nodes to the surface of the convex hull..
73370 for (var j = 1; j < indexRange; j++) {
73371 var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
73372 node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
73373 graph = graph.replace(node);
73380 action.disabled = function(graph) {
73381 if (!graph.entity(wayId).isClosed())
73382 return 'not_closed';
73386 action.transitionable = true;
73392 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
73393 function actionDeleteWay(wayId) {
73396 function canDeleteNode(node, graph) {
73397 return !graph.parentWays(node).length &&
73398 !graph.parentRelations(node).length &&
73399 !node.hasInterestingTags();
73403 var action = function(graph) {
73404 var way = graph.entity(wayId);
73406 graph.parentRelations(way)
73407 .forEach(function(parent) {
73408 parent = parent.removeMembersWithID(wayId);
73409 graph = graph.replace(parent);
73411 if (parent.isDegenerate()) {
73412 graph = actionDeleteRelation(parent.id)(graph);
73416 uniq(way.nodes).forEach(function(nodeId) {
73417 graph = graph.replace(way.removeNode(nodeId));
73419 var node = graph.entity(nodeId);
73420 if (canDeleteNode(node, graph)) {
73421 graph = graph.remove(node);
73425 return graph.remove(way);
73432 function actionDeleteMultiple(ids) {
73434 way: actionDeleteWay,
73435 node: actionDeleteNode,
73436 relation: actionDeleteRelation
73440 var action = function(graph) {
73441 ids.forEach(function(id) {
73442 if (graph.hasEntity(id)) { // It may have been deleted aready.
73443 graph = actions[graph.entity(id).type](id)(graph);
73454 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
73455 function actionDeleteRelation(relationId) {
73458 function canDeleteEntity(entity, graph) {
73459 return !graph.parentWays(entity).length &&
73460 !graph.parentRelations(entity).length &&
73461 !entity.hasInterestingTags();
73465 var action = function(graph) {
73466 var relation = graph.entity(relationId);
73468 graph.parentRelations(relation)
73469 .forEach(function(parent) {
73470 parent = parent.removeMembersWithID(relationId);
73471 graph = graph.replace(parent);
73473 if (parent.isDegenerate()) {
73474 graph = actionDeleteRelation(parent.id)(graph);
73478 uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
73479 graph = graph.replace(relation.removeMembersWithID(memberId));
73481 var entity = graph.entity(memberId);
73482 if (canDeleteEntity(entity, graph)) {
73483 graph = actionDeleteMultiple([memberId])(graph);
73487 return graph.remove(relation);
73494 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
73495 function actionDeleteNode(nodeId) {
73496 var action = function(graph) {
73497 var node = graph.entity(nodeId);
73499 graph.parentWays(node)
73500 .forEach(function(parent) {
73501 parent = parent.removeNode(nodeId);
73502 graph = graph.replace(parent);
73504 if (parent.isDegenerate()) {
73505 graph = actionDeleteWay(parent.id)(graph);
73509 graph.parentRelations(node)
73510 .forEach(function(parent) {
73511 parent = parent.removeMembersWithID(nodeId);
73512 graph = graph.replace(parent);
73514 if (parent.isDegenerate()) {
73515 graph = actionDeleteRelation(parent.id)(graph);
73519 return graph.remove(node);
73526 // Connect the ways at the given nodes.
73528 // The last node will survive. All other nodes will be replaced with
73529 // the surviving node in parent ways, and then removed.
73531 // Tags and relation memberships of of non-surviving nodes are merged
73532 // to the survivor.
73534 // This is the inverse of `iD.actionDisconnect`.
73537 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
73538 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
73540 function actionConnect(nodeIds) {
73541 return function(graph) {
73542 var last = nodeIds[nodeIds.length - 1];
73543 var survivor = graph.entity(last);
73545 for (var i = 0; i < nodeIds.length - 1; i++) {
73546 var node = graph.entity(nodeIds[i]);
73548 /* eslint-disable no-loop-func */
73549 graph.parentWays(node).forEach(function(parent) {
73550 if (!parent.areAdjacent(node.id, survivor.id)) {
73551 graph = graph.replace(parent.replaceNode(node.id, survivor.id));
73555 graph.parentRelations(node).forEach(function(parent) {
73556 graph = graph.replace(parent.replaceMember(node, survivor));
73558 /* eslint-enable no-loop-func */
73560 survivor = survivor.mergeTags(node.tags);
73561 graph = actionDeleteNode(node.id)(graph);
73564 graph = graph.replace(survivor);
73570 function actionCopyEntities(ids, fromGraph) {
73574 var action = function(graph) {
73575 ids.forEach(function(id) {
73576 fromGraph.entity(id).copy(fromGraph, copies);
73579 for (var id in copies) {
73580 graph = graph.replace(copies[id]);
73587 action.copies = function() {
73595 function actionDeleteMember(relationId, memberIndex) {
73596 return function(graph) {
73597 var relation = graph.entity(relationId)
73598 .removeMember(memberIndex);
73600 graph = graph.replace(relation);
73602 if (relation.isDegenerate())
73603 graph = actionDeleteRelation(relation.id)(graph);
73609 function actionDeprecateTags(entityId) {
73611 return function(graph) {
73612 var entity = graph.entity(entityId),
73613 newtags = clone(entity.tags),
73617 // This handles dataDeprecated tags with a single condition
73618 for (var i = 0; i < dataDeprecated.length; i++) {
73620 rule = dataDeprecated[i];
73621 var match = toPairs(rule.old)[0],
73622 replacements = rule.replace ? toPairs(rule.replace) : null;
73624 if (entity.tags[match[0]] && match[1] === '*') {
73626 var value = entity.tags[match[0]];
73627 if (replacements && !newtags[replacements[0][0]]) {
73628 newtags[replacements[0][0]] = value;
73630 delete newtags[match[0]];
73633 } else if (entity.tags[match[0]] === match[1]) {
73634 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
73640 return graph.replace(entity.update({tags: newtags}));
73647 function actionDiscardTags(difference) {
73649 return function(graph) {
73650 function discardTags(entity) {
73652 var keys = Object.keys(entity.tags);
73653 var discarded = false;
73655 for (var i = 0; i < keys.length; i++) {
73657 if (dataDiscarded[k] || !entity.tags[k]) {
73660 tags[k] = entity.tags[k];
73665 graph = graph.replace(entity.update({ tags: tags }));
73669 difference.modified().forEach(discardTags);
73670 difference.created().forEach(discardTags);
73676 // Disconect the ways at the given node.
73678 // Optionally, disconnect only the given ways.
73680 // For testing convenience, accepts an ID to assign to the (first) new node.
73681 // Normally, this will be undefined and the way will automatically
73682 // be assigned a new ID.
73684 // This is the inverse of `iD.actionConnect`.
73687 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
73688 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
73690 function actionDisconnect(nodeId, newNodeId) {
73694 var action = function(graph) {
73695 var node = graph.entity(nodeId),
73696 connections = action.connections(graph);
73698 connections.forEach(function(connection) {
73699 var way = graph.entity(connection.wayID),
73700 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
73702 graph = graph.replace(newNode);
73703 if (connection.index === 0 && way.isArea()) {
73704 // replace shared node with shared node..
73705 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
73706 } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
73707 // replace closing node with new new node..
73708 graph = graph.replace(way.unclose().addNode(newNode.id));
73710 // replace shared node with multiple new nodes..
73711 graph = graph.replace(way.updateNode(newNode.id, connection.index));
73719 action.connections = function(graph) {
73720 var candidates = [],
73722 parentWays = graph.parentWays(graph.entity(nodeId));
73724 parentWays.forEach(function(way) {
73725 if (wayIds && wayIds.indexOf(way.id) === -1) {
73729 if (way.isArea() && (way.nodes[0] === nodeId)) {
73730 candidates.push({ wayID: way.id, index: 0 });
73732 way.nodes.forEach(function(waynode, index) {
73733 if (waynode === nodeId) {
73734 candidates.push({ wayID: way.id, index: index });
73740 return keeping ? candidates : candidates.slice(1);
73744 action.disabled = function(graph) {
73745 var connections = action.connections(graph);
73746 if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
73747 return 'not_connected';
73749 var parentWays = graph.parentWays(graph.entity(nodeId)),
73750 seenRelationIds = {},
73753 parentWays.forEach(function(way) {
73754 if (wayIds && wayIds.indexOf(way.id) === -1)
73757 var relations = graph.parentRelations(way);
73758 relations.forEach(function(relation) {
73759 if (relation.id in seenRelationIds) {
73760 sharedRelation = relation;
73762 seenRelationIds[relation.id] = true;
73767 if (sharedRelation)
73772 action.limitWays = function(_) {
73773 if (!arguments.length) return wayIds;
73782 // Join ways at the end node they share.
73784 // This is the inverse of `iD.actionSplit`.
73787 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
73788 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
73790 function actionJoin(ids) {
73792 function groupEntitiesByGeometry(graph) {
73793 var entities = ids.map(function(id) { return graph.entity(id); });
73794 return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
73798 var action = function(graph) {
73799 var ways = ids.map(graph.entity, graph);
73800 var survivorID = ways[0].id;
73802 // Prefer to keep an existing way.
73803 for (var i = 0; i < ways.length; i++) {
73804 if (!ways[i].isNew()) {
73805 survivorID = ways[i].id;
73810 var sequences = osmJoinWays(ways, graph);
73811 var joined = sequences[0];
73813 // We might need to reverse some of these ways before joining them. #4688
73814 // `joined.actions` property will contain any actions we need to apply.
73815 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
73817 var survivor = graph.entity(survivorID);
73818 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
73819 graph = graph.replace(survivor);
73821 joined.forEach(function(way) {
73822 if (way.id === survivorID) return;
73824 graph.parentRelations(way).forEach(function(parent) {
73825 graph = graph.replace(parent.replaceMember(way, survivor));
73828 survivor = survivor.mergeTags(way.tags);
73830 graph = graph.replace(survivor);
73831 graph = actionDeleteWay(way.id)(graph);
73838 action.disabled = function(graph) {
73839 var geometries = groupEntitiesByGeometry(graph);
73840 if (ids.length < 2 || ids.length !== geometries.line.length)
73841 return 'not_eligible';
73843 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
73844 if (joined.length > 1)
73845 return 'not_adjacent';
73847 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
73850 var conflicting = false;
73852 joined[0].forEach(function(way) {
73853 var parents = graph.parentRelations(way);
73854 parents.forEach(function(parent) {
73855 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
73859 for (var k in way.tags) {
73860 if (!(k in tags)) {
73861 tags[k] = way.tags[k];
73862 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
73863 conflicting = true;
73869 return 'restriction';
73872 return 'conflicting_tags';
73879 function actionMerge(ids) {
73881 function groupEntitiesByGeometry(graph) {
73882 var entities = ids.map(function(id) { return graph.entity(id); });
73883 return assignIn({point: [], area: [], line: [], relation: []},
73884 groupBy(entities, function(entity) { return entity.geometry(graph); }));
73888 var action = function(graph) {
73889 var geometries = groupEntitiesByGeometry(graph),
73890 target = geometries.area[0] || geometries.line[0],
73891 points = geometries.point;
73893 points.forEach(function(point) {
73894 target = target.mergeTags(point.tags);
73895 graph = graph.replace(target);
73897 graph.parentRelations(point).forEach(function(parent) {
73898 graph = graph.replace(parent.replaceMember(point, target));
73901 var nodes = uniq(graph.childNodes(target)),
73902 removeNode = point;
73904 for (var i = 0; i < nodes.length; i++) {
73905 var node = nodes[i];
73906 if (graph.parentWays(node).length > 1 ||
73907 graph.parentRelations(node).length ||
73908 node.hasInterestingTags()) {
73912 // Found an uninteresting child node on the target way.
73913 // Move orig point into its place to preserve point's history. #3683
73914 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
73915 target = target.replaceNode(node.id, point.id);
73916 graph = graph.replace(target);
73921 graph = graph.remove(removeNode);
73928 action.disabled = function(graph) {
73929 var geometries = groupEntitiesByGeometry(graph);
73930 if (geometries.point.length === 0 ||
73931 (geometries.area.length + geometries.line.length) !== 1 ||
73932 geometries.relation.length !== 0)
73933 return 'not_eligible';
73940 function actionMergePolygon(ids, newRelationId) {
73942 function groupEntities(graph) {
73943 var entities = ids.map(function (id) { return graph.entity(id); });
73948 }, groupBy(entities, function(entity) {
73949 if (entity.type === 'way' && entity.isClosed()) {
73950 return 'closedWay';
73951 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
73952 return 'multipolygon';
73960 var action = function(graph) {
73961 var entities = groupEntities(graph);
73963 // An array representing all the polygons that are part of the multipolygon.
73965 // Each element is itself an array of objects with an id property, and has a
73966 // locs property which is an array of the locations forming the polygon.
73967 var polygons = entities.multipolygon.reduce(function(polygons, m) {
73968 return polygons.concat(osmJoinWays(m.members, graph));
73969 }, []).concat(entities.closedWay.map(function(d) {
73970 var member = [{id: d.id}];
73971 member.nodes = graph.childNodes(d);
73975 // contained is an array of arrays of boolean values,
73976 // where contained[j][k] is true iff the jth way is
73977 // contained by the kth way.
73978 var contained = polygons.map(function(w, i) {
73979 return polygons.map(function(d, n) {
73980 if (i === n) return null;
73981 return geoPolygonContainsPolygon(
73982 map$3(d.nodes, 'loc'),
73983 map$3(w.nodes, 'loc'));
73987 // Sort all polygons as either outer or inner ways
73991 while (polygons.length) {
73992 extractUncontained(polygons);
73993 polygons = polygons.filter(isContained);
73994 contained = contained.filter(isContained).map(filterContained);
73997 function isContained(d, i) {
73998 return some(contained[i]);
74001 function filterContained(d) {
74002 return d.filter(isContained);
74005 function extractUncontained(polygons) {
74006 polygons.forEach(function(d, i) {
74007 if (!isContained(d, i)) {
74008 d.forEach(function(member) {
74012 role: outer ? 'outer' : 'inner'
74020 // Move all tags to one relation
74021 var relation = entities.multipolygon[0] ||
74022 osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
74024 entities.multipolygon.slice(1).forEach(function(m) {
74025 relation = relation.mergeTags(m.tags);
74026 graph = graph.remove(m);
74029 entities.closedWay.forEach(function(way) {
74030 function isThisOuter(m) {
74031 return m.id === way.id && m.role !== 'inner';
74033 if (members.some(isThisOuter)) {
74034 relation = relation.mergeTags(way.tags);
74035 graph = graph.replace(way.update({ tags: {} }));
74039 return graph.replace(relation.update({
74041 tags: omit(relation.tags, 'area')
74046 action.disabled = function(graph) {
74047 var entities = groupEntities(graph);
74048 if (entities.other.length > 0 ||
74049 entities.closedWay.length + entities.multipolygon.length < 2)
74050 return 'not_eligible';
74051 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
74052 return 'incomplete_relation';
74059 // Text diff algorithm following Hunt and McIlroy 1976.
74060 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
74061 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
74062 // http://www.cs.dartmouth.edu/~doug/
74064 // Expects two arrays of strings.
74065 function LCS(file1, file2) {
74066 var equivalenceClasses;
74071 var c, i, j, jX, r, s;
74073 equivalenceClasses = {};
74074 for (j = 0; j < file2.length; j++) {
74076 if (equivalenceClasses[line]) {
74077 equivalenceClasses[line].push(j);
74079 equivalenceClasses[line] = [j];
74084 { file1index: -1, file2index: -1, chain: null }
74087 for (i = 0; i < file1.length; i++) {
74089 file2indices = equivalenceClasses[line] || [];
74094 for (jX = 0; jX < file2indices.length; jX++) {
74095 j = file2indices[jX];
74097 for (s = r; s < candidates.length; s++) {
74098 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
74103 if (s < candidates.length) {
74104 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
74105 if (r === candidates.length) {
74106 candidates.push(c);
74112 if (r === candidates.length) {
74113 break; // no point in examining further (j)s
74121 // At this point, we know the LCS: it's in the reverse of the
74122 // linked-list through .chain of candidates[candidates.length - 1].
74124 return candidates[candidates.length - 1];
74128 // We apply the LCS to give a simple representation of the
74129 // offsets and lengths of mismatched chunks in the input
74130 // files. This is used by diff3MergeIndices below.
74131 function diffIndices(file1, file2) {
74133 var tail1 = file1.length;
74134 var tail2 = file2.length;
74136 for (var candidate = LCS(file1, file2);
74137 candidate !== null;
74138 candidate = candidate.chain)
74140 var mismatchLength1 = tail1 - candidate.file1index - 1;
74141 var mismatchLength2 = tail2 - candidate.file2index - 1;
74142 tail1 = candidate.file1index;
74143 tail2 = candidate.file2index;
74145 if (mismatchLength1 || mismatchLength2) {
74147 file1: [tail1 + 1, mismatchLength1],
74148 file2: [tail2 + 1, mismatchLength2]
74158 // Given three files, A, O, and B, where both A and B are
74159 // independently derived from O, returns a fairly complicated
74160 // internal representation of merge decisions it's taken. The
74161 // interested reader may wish to consult
74163 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
74164 // 'A Formal Investigation of ' In Arvind and Prasad,
74165 // editors, Foundations of Software Technology and Theoretical
74166 // Computer Science (FSTTCS), December 2007.
74168 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
74169 function diff3MergeIndices(a, o, b) {
74171 var m1 = diffIndices(o, a);
74172 var m2 = diffIndices(o, b);
74175 function addHunk(h, side) {
74176 hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
74178 for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
74179 for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
74180 hunks.sort(function (x, y) { return x[0] - y[0]; });
74183 var commonOffset = 0;
74184 function copyCommon(targetOffset) {
74185 if (targetOffset > commonOffset) {
74186 result.push([1, commonOffset, targetOffset - commonOffset]);
74187 commonOffset = targetOffset;
74191 for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
74192 var firstHunkIndex = hunkIndex;
74193 var hunk = hunks[hunkIndex];
74194 var regionLhs = hunk[0];
74195 var regionRhs = regionLhs + hunk[2];
74196 while (hunkIndex < hunks.length - 1) {
74197 var maybeOverlapping = hunks[hunkIndex + 1];
74198 var maybeLhs = maybeOverlapping[0];
74199 if (maybeLhs > regionRhs) {
74202 regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
74206 copyCommon(regionLhs);
74207 if (firstHunkIndex === hunkIndex) {
74208 // The 'overlap' was only one hunk long, meaning that
74209 // there's no conflict here. Either a and o were the
74210 // same, or b and o were the same.
74212 result.push([hunk[1], hunk[3], hunk[4]]);
74215 // A proper conflict. Determine the extents of the
74216 // regions involved from a, o and b. Effectively merge
74217 // all the hunks on the left into one giant hunk, and
74218 // do the same for the right; then, correct for skew
74219 // in the regions of o that each side changed, and
74220 // report appropriate spans for the three sides.
74222 0: [a.length, -1, o.length, -1],
74223 2: [b.length, -1, o.length, -1]
74225 for (i = firstHunkIndex; i <= hunkIndex; i++) {
74227 var side = hunk[1];
74228 var r = regions[side];
74229 var oLhs = hunk[0];
74230 var oRhs = oLhs + hunk[2];
74231 var abLhs = hunk[3];
74232 var abRhs = abLhs + hunk[4];
74233 r[0] = Math.min(abLhs, r[0]);
74234 r[1] = Math.max(abRhs, r[1]);
74235 r[2] = Math.min(oLhs, r[2]);
74236 r[3] = Math.max(oRhs, r[3]);
74238 var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
74239 var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
74240 var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
74241 var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
74244 regionLhs, regionRhs - regionLhs,
74245 bLhs, bRhs - bLhs]);
74247 commonOffset = regionRhs;
74250 copyCommon(o.length);
74255 // Applies the output of diff3MergeIndices to actually
74256 // construct the merged file; the returned result alternates
74257 // between 'ok' and 'conflict' blocks.
74258 function diff3Merge(a, o, b, excludeFalseConflicts) {
74260 var files = [a, o, b];
74261 var indices = diff3MergeIndices(a, o, b);
74264 function flushOk() {
74265 if (okLines.length) {
74266 result.push({ok: okLines});
74270 function pushOk(xs) {
74271 for (var j = 0; j < xs.length; j++) {
74272 okLines.push(xs[j]);
74276 function isTrueConflict(rec) {
74277 if (rec[2] !== rec[6]) return true;
74280 for (var j = 0; j < rec[2]; j++) {
74281 if (a[j + aoff] !== b[j + boff]) {
74288 for (var i = 0; i < indices.length; i++) {
74289 var x = indices[i];
74292 if (excludeFalseConflicts && !isTrueConflict(x)) {
74293 pushOk(files[0].slice(x[1], x[1] + x[2]));
74298 a: a.slice(x[1], x[1] + x[2]),
74300 o: o.slice(x[3], x[3] + x[4]),
74302 b: b.slice(x[5], x[5] + x[6]),
74308 pushOk(files[side].slice(x[1], x[1] + x[2]));
74316 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
74317 var _option = 'safe'; // 'safe', 'force_local', 'force_remote'
74318 var _conflicts = [];
74322 return isFunction(formatUser) ? formatUser(d) : d;
74326 function mergeLocation(remote, target) {
74327 function pointEqual(a, b) {
74328 var epsilon = 1e-6;
74329 return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
74332 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
74335 if (_option === 'force_remote') {
74336 return target.update({loc: remote.loc});
74339 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
74344 function mergeNodes(base, remote, target) {
74345 if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
74348 if (_option === 'force_remote') {
74349 return target.update({nodes: remote.nodes});
74352 var ccount = _conflicts.length;
74353 var o = base.nodes || [];
74354 var a = target.nodes || [];
74355 var b = remote.nodes || [];
74357 var hunks = diff3Merge(a, o, b, true);
74359 for (var i = 0; i < hunks.length; i++) {
74360 var hunk = hunks[i];
74362 nodes.push.apply(nodes, hunk.ok);
74364 // for all conflicts, we can assume c.a !== c.b
74365 // because `diff3Merge` called with `true` option to exclude false conflicts..
74366 var c = hunk.conflict;
74367 if (isEqual(c.o, c.a)) { // only changed remotely
74368 nodes.push.apply(nodes, c.b);
74369 } else if (isEqual(c.o, c.b)) { // only changed locally
74370 nodes.push.apply(nodes, c.a);
74371 } else { // changed both locally and remotely
74372 _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
74378 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
74382 function mergeChildren(targetWay, children, updates, graph) {
74383 function isUsed(node, targetWay) {
74384 var parentWays = map$3(graph.parentWays(node), 'id');
74385 return node.hasInterestingTags() ||
74386 without(parentWays, targetWay.id).length > 0 ||
74387 graph.parentRelations(node).length > 0;
74390 var ccount = _conflicts.length;
74392 for (var i = 0; i < children.length; i++) {
74393 var id = children[i];
74394 var node = graph.hasEntity(id);
74396 // remove unused childNodes..
74397 if (targetWay.nodes.indexOf(id) === -1) {
74398 if (node && !isUsed(node, targetWay)) {
74399 updates.removeIds.push(id);
74404 // restore used childNodes..
74405 var local = localGraph.hasEntity(id);
74406 var remote = remoteGraph.hasEntity(id);
74409 if (_option === 'force_remote' && remote && remote.visible) {
74410 updates.replacements.push(remote);
74412 } else if (_option === 'force_local' && local) {
74413 target = osmEntity$$1(local);
74415 target = target.update({ version: remote.version });
74417 updates.replacements.push(target);
74419 } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
74420 target = osmEntity$$1(local, { version: remote.version });
74421 if (remote.visible) {
74422 target = mergeLocation(remote, target);
74424 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74427 if (_conflicts.length !== ccount) break;
74428 updates.replacements.push(target);
74436 function updateChildren(updates, graph) {
74437 for (var i = 0; i < updates.replacements.length; i++) {
74438 graph = graph.replace(updates.replacements[i]);
74440 if (updates.removeIds.length) {
74441 graph = actionDeleteMultiple(updates.removeIds)(graph);
74447 function mergeMembers(remote, target) {
74448 if (_option === 'force_local' || isEqual(target.members, remote.members)) {
74451 if (_option === 'force_remote') {
74452 return target.update({members: remote.members});
74455 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
74460 function mergeTags(base, remote, target) {
74461 function ignoreKey(k) {
74462 return dataDiscarded[k];
74465 if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
74468 if (_option === 'force_remote') {
74469 return target.update({tags: remote.tags});
74472 var ccount = _conflicts.length;
74473 var o = base.tags || {};
74474 var a = target.tags || {};
74475 var b = remote.tags || {};
74476 var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
74477 var tags = clone(a);
74478 var changed = false;
74480 for (var i = 0; i < keys.length; i++) {
74483 if (o[k] !== b[k] && a[k] !== b[k]) { // changed remotely..
74484 if (o[k] !== a[k]) { // changed locally..
74485 _conflicts.push(t('merge_remote_changes.conflict.tags',
74486 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
74488 } else { // unchanged locally, accept remote change..
74489 if (b.hasOwnProperty(k)) {
74499 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
74503 // `graph.base()` is the common ancestor of the two graphs.
74504 // `localGraph` contains user's edits up to saving
74505 // `remoteGraph` contains remote edits to modified nodes
74506 // `graph` must be a descendent of `localGraph` and may include
74507 // some conflict resolution actions performed on it.
74509 // --- ... --- `localGraph` -- ... -- `graph`
74511 // `graph.base()` --- ... --- `remoteGraph`
74513 var action = function(graph) {
74514 var updates = { replacements: [], removeIds: [] };
74515 var base = graph.base().entities[id];
74516 var local = localGraph.entity(id);
74517 var remote = remoteGraph.entity(id);
74518 var target = osmEntity$$1(local, { version: remote.version });
74521 if (!remote.visible) {
74522 if (_option === 'force_remote') {
74523 return actionDeleteMultiple([id])(graph);
74525 } else if (_option === 'force_local') {
74526 if (target.type === 'way') {
74527 target = mergeChildren(target, uniq(local.nodes), updates, graph);
74528 graph = updateChildren(updates, graph);
74530 return graph.replace(target);
74533 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
74534 return graph; // do nothing
74539 if (target.type === 'node') {
74540 target = mergeLocation(remote, target);
74542 } else if (target.type === 'way') {
74543 // pull in any child nodes that may not be present locally..
74544 graph.rebase(remoteGraph.childNodes(remote), [graph], false);
74545 target = mergeNodes(base, remote, target);
74546 target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
74548 } else if (target.type === 'relation') {
74549 target = mergeMembers(remote, target);
74552 target = mergeTags(base, remote, target);
74554 if (!_conflicts.length) {
74555 graph = updateChildren(updates, graph).replace(target);
74562 action.withOption = function(opt) {
74568 action.conflicts = function() {
74576 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
74577 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
74578 function actionMove(moveIds, tryDelta, projection, cache) {
74579 var _delta = tryDelta;
74581 function setupCache(graph) {
74582 function canMove(nodeId) {
74583 // Allow movement of any node that is in the selectedIDs list..
74584 if (moveIds.indexOf(nodeId) !== -1) return true;
74586 // Allow movement of a vertex where 2 ways meet..
74587 var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
74588 if (parents.length < 3) return true;
74590 // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
74591 var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
74592 if (!parentsMoving) delete cache.moving[nodeId];
74594 return parentsMoving;
74597 function cacheEntities(ids) {
74598 for (var i = 0; i < ids.length; i++) {
74600 if (cache.moving[id]) continue;
74601 cache.moving[id] = true;
74603 var entity = graph.hasEntity(id);
74604 if (!entity) continue;
74606 if (entity.type === 'node') {
74607 cache.nodes.push(id);
74608 cache.startLoc[id] = entity.loc;
74609 } else if (entity.type === 'way') {
74610 cache.ways.push(id);
74611 cacheEntities(entity.nodes);
74613 cacheEntities(entity.members.map(function(member) {
74620 function cacheIntersections(ids) {
74621 function isEndpoint(way, id) {
74622 return !way.isClosed() && !!way.affix(id);
74625 for (var i = 0; i < ids.length; i++) {
74628 // consider only intersections with 1 moved and 1 unmoved way.
74629 var childNodes = graph.childNodes(graph.entity(id));
74630 for (var j = 0; j < childNodes.length; j++) {
74631 var node = childNodes[j];
74632 var parents = graph.parentWays(node);
74633 if (parents.length !== 2) continue;
74635 var moved = graph.entity(id);
74636 var unmoved = null;
74637 for (var k = 0; k < parents.length; k++) {
74638 var way = parents[k];
74639 if (!cache.moving[way.id]) {
74644 if (!unmoved) continue;
74646 // exclude ways that are overly connected..
74647 if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
74648 if (moved.isArea() || unmoved.isArea()) continue;
74650 cache.intersections.push({
74653 unmovedId: unmoved.id,
74654 movedIsEP: isEndpoint(moved, node.id),
74655 unmovedIsEP: isEndpoint(unmoved, node.id)
74667 cache.intersections = [];
74668 cache.replacedVertex = {};
74669 cache.startLoc = {};
74673 cacheEntities(moveIds);
74674 cacheIntersections(cache.ways);
74675 cache.nodes = filter(cache.nodes, canMove);
74682 // Place a vertex where the moved vertex used to be, to preserve way shape..
74691 // * node '*' added to preserve shape
74693 // / b ---- e way `b,e` moved here:
74698 function replaceMovedVertex(nodeId, wayId, graph, delta) {
74699 var way = graph.entity(wayId);
74700 var moved = graph.entity(nodeId);
74701 var movedIndex = way.nodes.indexOf(nodeId);
74702 var len, prevIndex, nextIndex;
74704 if (way.isClosed()) {
74705 len = way.nodes.length - 1;
74706 prevIndex = (movedIndex + len - 1) % len;
74707 nextIndex = (movedIndex + len + 1) % len;
74709 len = way.nodes.length;
74710 prevIndex = movedIndex - 1;
74711 nextIndex = movedIndex + 1;
74714 var prev = graph.hasEntity(way.nodes[prevIndex]);
74715 var next = graph.hasEntity(way.nodes[nextIndex]);
74717 // Don't add orig vertex at endpoint..
74718 if (!prev || !next) return graph;
74720 var key = wayId + '_' + nodeId;
74721 var orig = cache.replacedVertex[key];
74724 cache.replacedVertex[key] = orig;
74725 cache.startLoc[orig.id] = cache.startLoc[nodeId];
74730 start = projection(cache.startLoc[nodeId]);
74731 end = projection.invert(geoVecAdd(start, delta));
74733 end = cache.startLoc[nodeId];
74735 orig = orig.move(end);
74737 var angle = Math.abs(geoAngle(orig, prev, projection) -
74738 geoAngle(orig, next, projection)) * 180 / Math.PI;
74740 // Don't add orig vertex if it would just make a straight line..
74741 if (angle > 175 && angle < 185) return graph;
74743 // moving forward or backward along way?
74744 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
74745 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
74746 var d1 = geoPathLength(p1);
74747 var d2 = geoPathLength(p2);
74748 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
74750 // moving around closed loop?
74751 if (way.isClosed() && insertAt === 0) insertAt = len;
74753 way = way.addNode(orig.id, insertAt);
74754 return graph.replace(orig).replace(way);
74758 // Remove duplicate vertex that might have been added by
74759 // replaceMovedVertex. This is done after the unzorro checks.
74760 function removeDuplicateVertices(wayId, graph) {
74761 var way = graph.entity(wayId);
74762 var epsilon = 1e-6;
74765 function isInteresting(node, graph) {
74766 return graph.parentWays(node).length > 1 ||
74767 graph.parentRelations(node).length ||
74768 node.hasInterestingTags();
74771 for (var i = 0; i < way.nodes.length; i++) {
74772 curr = graph.entity(way.nodes[i]);
74774 if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
74775 if (!isInteresting(prev, graph)) {
74776 way = way.removeNode(prev.id);
74777 graph = graph.replace(way).remove(prev);
74778 } else if (!isInteresting(curr, graph)) {
74779 way = way.removeNode(curr.id);
74780 graph = graph.replace(way).remove(curr);
74791 // Reorder nodes around intersections that have moved..
74793 // Start: way1.nodes: b,e (moving)
74794 // a - b - c ----- d way2.nodes: a,b,c,d (static)
74796 // e isEP1: true, isEP2, false
74798 // way1 `b,e` moved here:
74799 // a ----- c = b - d
74803 // reorder nodes way1.nodes: b,e
74804 // a ----- c - b - d way2.nodes: a,c,b,d
74808 function unZorroIntersection(intersection$$1, graph) {
74809 var vertex = graph.entity(intersection$$1.nodeId);
74810 var way1 = graph.entity(intersection$$1.movedId);
74811 var way2 = graph.entity(intersection$$1.unmovedId);
74812 var isEP1 = intersection$$1.movedIsEP;
74813 var isEP2 = intersection$$1.unmovedIsEP;
74815 // don't move the vertex if it is the endpoint of both ways.
74816 if (isEP1 && isEP2) return graph;
74818 var nodes1 = without(graph.childNodes(way1), vertex);
74819 var nodes2 = without(graph.childNodes(way2), vertex);
74821 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
74822 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
74824 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
74825 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
74828 // snap vertex to nearest edge (or some point between them)..
74829 if (!isEP1 && !isEP2) {
74830 var epsilon = 1e-6, maxIter = 10;
74831 for (var i = 0; i < maxIter; i++) {
74832 loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
74833 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
74834 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
74835 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
74837 } else if (!isEP1) {
74843 graph = graph.replace(vertex.move(loc));
74845 // if zorro happened, reorder nodes..
74846 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
74847 way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
74848 graph = graph.replace(way1);
74850 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
74851 way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
74852 graph = graph.replace(way2);
74859 function cleanupIntersections(graph) {
74860 for (var i = 0; i < cache.intersections.length; i++) {
74861 var obj = cache.intersections[i];
74862 graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
74863 graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
74864 graph = unZorroIntersection(obj, graph);
74865 graph = removeDuplicateVertices(obj.movedId, graph);
74866 graph = removeDuplicateVertices(obj.unmovedId, graph);
74873 // check if moving way endpoint can cross an unmoved way, if so limit delta..
74874 function limitDelta(graph) {
74875 function moveNode(loc) {
74876 return geoVecAdd(projection(loc), _delta);
74879 for (var i = 0; i < cache.intersections.length; i++) {
74880 var obj = cache.intersections[i];
74882 // Don't limit movement if this is vertex joins 2 endpoints..
74883 if (obj.movedIsEP && obj.unmovedIsEP) continue;
74884 // Don't limit movement if this vertex is not an endpoint anyway..
74885 if (!obj.movedIsEP) continue;
74887 var node = graph.entity(obj.nodeId);
74888 var start = projection(node.loc);
74889 var end = geoVecAdd(start, _delta);
74890 var movedNodes = graph.childNodes(graph.entity(obj.movedId));
74891 var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
74892 var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
74893 var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
74894 var hits = geoPathIntersections(movedPath, unmovedPath);
74896 for (var j = 0; i < hits.length; i++) {
74897 if (isEqual(hits[j], end)) continue;
74898 var edge = geoChooseEdge(unmovedNodes, end, projection);
74899 _delta = geoVecSubtract(projection(edge.loc), start);
74905 var action = function(graph) {
74906 if (_delta[0] === 0 && _delta[1] === 0) return graph;
74910 if (cache.intersections.length) {
74914 for (var i = 0; i < cache.nodes.length; i++) {
74915 var node = graph.entity(cache.nodes[i]);
74916 var start = projection(node.loc);
74917 var end = geoVecAdd(start, _delta);
74918 graph = graph.replace(node.move(projection.invert(end)));
74921 if (cache.intersections.length) {
74922 graph = cleanupIntersections(graph);
74929 action.delta = function() {
74937 function actionMoveNode(nodeID, toLoc) {
74939 var action = function(graph, t) {
74940 if (t === null || !isFinite(t)) t = 1;
74941 t = Math.min(Math.max(+t, 0), 1);
74943 var node = graph.entity(nodeID);
74944 return graph.replace(
74945 node.move(geoVecInterp(node.loc, toLoc, t))
74949 action.transitionable = true;
74954 function actionNoop() {
74955 return function(graph) {
74961 * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
74963 function actionOrthogonalize(wayId, projection) {
74964 var threshold = 12, // degrees within right or straight to alter
74965 lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
74966 upperThreshold = Math.cos(threshold * Math.PI / 180);
74969 var action = function(graph, t) {
74970 if (t === null || !isFinite(t)) t = 1;
74971 t = Math.min(Math.max(+t, 0), 1);
74973 var way = graph.entity(wayId),
74974 nodes = graph.childNodes(way),
74975 points = uniq(nodes).map(function(n) { return projection(n.loc); }),
74976 corner = {i: 0, dotp: 1},
74978 node, loc, score, motions, i, j;
74980 if (points.length === 3) { // move only one vertex for right triangle
74981 for (i = 0; i < 1000; i++) {
74982 motions = points.map(calcMotion);
74983 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
74984 score = corner.dotp;
74985 if (score < epsilon) {
74990 node = graph.entity(nodes[corner.i].id);
74991 loc = projection.invert(points[corner.i]);
74992 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
74996 originalPoints = clone(points);
74999 for (i = 0; i < 1000; i++) {
75000 motions = points.map(calcMotion);
75001 for (j = 0; j < motions.length; j++) {
75002 points[j] = addPoints(points[j],motions[j]);
75004 var newScore = squareness(points);
75005 if (newScore < score) {
75006 best = clone(points);
75009 if (score < epsilon) {
75016 for (i = 0; i < points.length; i++) {
75017 // only move the points that actually moved
75018 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
75019 loc = projection.invert(points[i]);
75020 node = graph.entity(nodes[i].id);
75021 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
75025 // remove empty nodes on straight sections
75026 for (i = 0; t === 1 && i < points.length; i++) {
75027 node = graph.entity(nodes[i].id);
75029 if (graph.parentWays(node).length > 1 ||
75030 graph.parentRelations(node).length ||
75031 node.hasInterestingTags()) {
75035 var dotp = normalizedDotProduct(i, points);
75036 if (dotp < -1 + epsilon) {
75037 graph = actionDeleteNode(node.id)(graph);
75045 function calcMotion(b, i, array) {
75046 var a = array[(i - 1 + array.length) % array.length],
75047 c = array[(i + 1) % array.length],
75048 p = subtractPoints(a, b),
75049 q = subtractPoints(c, b),
75052 scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
75053 p = normalizePoint(p, 1.0);
75054 q = normalizePoint(q, 1.0);
75056 dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
75058 // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
75059 if (array.length > 3) {
75060 if (dotp < -0.707106781186547) {
75063 } else if (dotp && Math.abs(dotp) < corner.dotp) {
75065 corner.dotp = Math.abs(dotp);
75068 return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
75073 function squareness(points) {
75074 return points.reduce(function(sum, val, i, array) {
75075 var dotp = normalizedDotProduct(i, array);
75077 dotp = filterDotProduct(dotp);
75078 return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
75083 function normalizedDotProduct(i, points) {
75084 var a = points[(i - 1 + points.length) % points.length],
75086 c = points[(i + 1) % points.length],
75087 p = subtractPoints(a, b),
75088 q = subtractPoints(c, b);
75090 p = normalizePoint(p, 1.0);
75091 q = normalizePoint(q, 1.0);
75093 return p[0] * q[0] + p[1] * q[1];
75097 function subtractPoints(a, b) {
75098 return [a[0] - b[0], a[1] - b[1]];
75102 function addPoints(a, b) {
75103 return [a[0] + b[0], a[1] + b[1]];
75107 function normalizePoint(point, scale) {
75108 var vector = [0, 0];
75109 var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
75110 if (length !== 0) {
75111 vector[0] = point[0] / length;
75112 vector[1] = point[1] / length;
75115 vector[0] *= scale;
75116 vector[1] *= scale;
75122 function filterDotProduct(dotp) {
75123 if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
75131 action.disabled = function(graph) {
75132 var way = graph.entity(wayId),
75133 nodes = graph.childNodes(way),
75134 points = uniq(nodes).map(function(n) { return projection(n.loc); });
75136 if (squareness(points)) {
75140 return 'not_squarish';
75144 action.transitionable = true;
75150 // `actionRestrictTurn` creates a turn restriction relation.
75152 // `turn` must be an `osmTurn` object
75153 // see osm/intersection.js, pathToTurn()
75155 // This specifies a restriction of type `restriction` when traveling from
75156 // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
75157 // (The action does not check that these entities form a valid intersection.)
75159 // From, to, and via ways should be split before calling this action.
75160 // (old versions of the code would split the ways here, but we no longer do it)
75162 // For testing convenience, accepts a restrictionID to assign to the new
75163 // relation. Normally, this will be undefined and the relation will
75164 // automatically be assigned a new ID.
75166 function actionRestrictTurn(turn, restrictionType, restrictionID) {
75168 return function(graph) {
75169 var fromWay = graph.entity(turn.from.way);
75170 var toWay = graph.entity(turn.to.way);
75171 var viaNode = turn.via.node && graph.entity(turn.via.node);
75172 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
75175 members.push({ id: fromWay.id, type: 'way', role: 'from' });
75178 members.push({ id: viaNode.id, type: 'node', role: 'via' });
75179 } else if (viaWays) {
75180 viaWays.forEach(function(viaWay) {
75181 members.push({ id: viaWay.id, type: 'way', role: 'via' });
75185 members.push({ id: toWay.id, type: 'way', role: 'to' });
75187 return graph.replace(osmRelation({
75190 type: 'restriction',
75191 restriction: restrictionType
75198 function actionRevert(id) {
75199 var action = function(graph) {
75200 var entity = graph.hasEntity(id),
75201 base = graph.base().entities[id];
75203 if (entity && !base) { // entity will be removed..
75204 if (entity.type === 'node') {
75205 graph.parentWays(entity)
75206 .forEach(function(parent) {
75207 parent = parent.removeNode(id);
75208 graph = graph.replace(parent);
75210 if (parent.isDegenerate()) {
75211 graph = actionDeleteWay(parent.id)(graph);
75216 graph.parentRelations(entity)
75217 .forEach(function(parent) {
75218 parent = parent.removeMembersWithID(id);
75219 graph = graph.replace(parent);
75221 if (parent.isDegenerate()) {
75222 graph = actionDeleteRelation(parent.id)(graph);
75227 return graph.revert(id);
75233 function actionRotate(rotateIds, pivot, angle, projection) {
75235 var action = function(graph) {
75236 return graph.update(function(graph) {
75237 utilGetAllNodes(rotateIds, graph).forEach(function(node) {
75238 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
75239 graph = graph.replace(node.move(projection.invert(point)));
75247 /* Built-in method references for those with the same name as other `lodash` methods. */
75248 var nativeMax$8 = Math.max;
75251 * Gets the index at which the first occurrence of `value` is found in `array`
75252 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
75253 * for equality comparisons. If `fromIndex` is negative, it's used as the
75254 * offset from the end of `array`.
75260 * @param {Array} array The array to inspect.
75261 * @param {*} value The value to search for.
75262 * @param {number} [fromIndex=0] The index to search from.
75263 * @returns {number} Returns the index of the matched value, else `-1`.
75266 * _.indexOf([1, 2, 1, 2], 2);
75269 * // Search from the `fromIndex`.
75270 * _.indexOf([1, 2, 1, 2], 2, 2);
75273 function indexOf(array, value, fromIndex) {
75274 var length = array == null ? 0 : array.length;
75278 var index = fromIndex == null ? 0 : toInteger(fromIndex);
75280 index = nativeMax$8(length + index, 0);
75282 return baseIndexOf(array, value, index);
75285 // Split a way at the given node.
75287 // Optionally, split only the given ways, if multiple ways share
75290 // This is the inverse of `iD.actionJoin`.
75292 // For testing convenience, accepts an ID to assign to the new way.
75293 // Normally, this will be undefined and the way will automatically
75294 // be assigned a new ID.
75297 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
75299 function actionSplit(nodeId, newWayIds) {
75302 // If the way is closed, we need to search for a partner node
75303 // to split the way at.
75305 // The following looks for a node that is both far away from
75306 // the initial node in terms of way segment length and nearby
75307 // in terms of beeline-distance. This assures that areas get
75308 // split on the most "natural" points (independent of the number
75310 // For example: bone-shaped areas get split across their waist
75311 // line, circles across the diameter.
75312 function splitArea(nodes, idxA, graph) {
75313 var lengths = new Array(nodes.length);
75319 function wrap(index) {
75320 return utilWrap(index, nodes.length);
75323 function dist(nA, nB) {
75324 var locA = graph.entity(nA).loc;
75325 var locB = graph.entity(nB).loc;
75326 var epsilon = 1e-6;
75327 return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
75330 // calculate lengths
75332 for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
75333 length += dist(nodes[i], nodes[wrap(i-1)]);
75334 lengths[i] = length;
75338 for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
75339 length += dist(nodes[i], nodes[wrap(i+1)]);
75340 if (length < lengths[i])
75341 lengths[i] = length;
75344 // determine best opposite node to split
75345 for (i = 0; i < nodes.length; i++) {
75346 var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
75357 function split(graph, wayA, newWayId) {
75358 var wayB = osmWay({id: newWayId, tags: wayA.tags}); // `wayB` is the NEW way
75359 var origNodes = wayA.nodes.slice();
75362 var isArea = wayA.isArea();
75363 var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
75365 if (wayA.isClosed()) {
75366 var nodes = wayA.nodes.slice(0, -1);
75367 var idxA = indexOf(nodes, nodeId);
75368 var idxB = splitArea(nodes, idxA, graph);
75371 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
75372 nodesB = nodes.slice(idxB, idxA + 1);
75374 nodesA = nodes.slice(idxA, idxB + 1);
75375 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
75378 var idx = indexOf(wayA.nodes, nodeId, 1);
75379 nodesA = wayA.nodes.slice(0, idx + 1);
75380 nodesB = wayA.nodes.slice(idx);
75383 wayA = wayA.update({nodes: nodesA});
75384 wayB = wayB.update({nodes: nodesB});
75386 graph = graph.replace(wayA);
75387 graph = graph.replace(wayB);
75389 graph.parentRelations(wayA).forEach(function(relation) {
75392 // Turn restrictions - make sure:
75393 // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
75394 // (whichever one is connected to the VIA node/ways)
75395 // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
75396 if (relation.isRestriction()) {
75397 var f = relation.memberByRole('from');
75398 var v = relation.membersByRole('via');
75399 var t = relation.memberByRole('to');
75402 // 1. split a FROM/TO
75403 if (f.id === wayA.id || t.id === wayA.id) {
75405 if (v.length === 1 && v[0].type === 'node') { // check via node
75406 keepB = wayB.contains(v[0].id);
75407 } else { // check via way(s)
75408 for (i = 0; i < v.length; i++) {
75409 if (v[i].type === 'way') {
75410 var wayVia = graph.hasEntity(v[i].id);
75411 if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
75420 relation = relation.replaceMember(wayA, wayB);
75421 graph = graph.replace(relation);
75426 for (i = 0; i < v.length; i++) {
75427 if (v[i].type === 'way' && v[i].id === wayA.id) {
75433 graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
75439 // All other relations (Routes, Multipolygons, etc):
75440 // 1. Both `wayA` and `wayB` remain in the relation
75441 // 2. But must be inserted as a pair (see `actionAddMember` for details)
75443 if (relation === isOuter) {
75444 graph = graph.replace(relation.mergeTags(wayA.tags));
75445 graph = graph.replace(wayA.update({tags: {}}));
75446 graph = graph.replace(wayB.update({tags: {}}));
75452 role: relation.memberById(wayA.id).role
75456 originalID: wayA.id,
75457 insertedID: wayB.id,
75461 graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
75465 if (!isOuter && isArea) {
75466 var multipolygon = osmRelation({
75467 tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
75469 {id: wayA.id, role: 'outer', type: 'way'},
75470 {id: wayB.id, role: 'outer', type: 'way'}
75474 graph = graph.replace(multipolygon);
75475 graph = graph.replace(wayA.update({tags: {}}));
75476 graph = graph.replace(wayB.update({tags: {}}));
75483 var action = function(graph) {
75484 var candidates = action.ways(graph);
75485 for (var i = 0; i < candidates.length; i++) {
75486 graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
75492 action.ways = function(graph) {
75493 var node = graph.entity(nodeId);
75494 var parents = graph.parentWays(node);
75495 var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
75497 return parents.filter(function(parent) {
75498 if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
75501 if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
75504 if (parent.isClosed()) {
75508 for (var i = 1; i < parent.nodes.length - 1; i++) {
75509 if (parent.nodes[i] === nodeId) {
75519 action.disabled = function(graph) {
75520 var candidates = action.ways(graph);
75521 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
75522 return 'not_eligible';
75526 action.limitWays = function(_) {
75527 if (!arguments.length) return _wayIDs;
75537 * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
75539 function actionStraighten(wayId, projection) {
75541 function positionAlongWay(n, s, e) {
75542 return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
75543 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
75547 var action = function(graph, t) {
75548 if (t === null || !isFinite(t)) t = 1;
75549 t = Math.min(Math.max(+t, 0), 1);
75551 var way = graph.entity(wayId),
75552 nodes = graph.childNodes(way),
75553 points = nodes.map(function(n) { return projection(n.loc); }),
75554 startPoint = points[0],
75555 endPoint = points[points.length-1],
75559 for (i = 1; i < points.length-1; i++) {
75560 var node = nodes[i],
75563 if (t < 1 || graph.parentWays(node).length > 1 ||
75564 graph.parentRelations(node).length ||
75565 node.hasInterestingTags()) {
75567 var u = positionAlongWay(point, startPoint, endPoint),
75569 startPoint[0] + u * (endPoint[0] - startPoint[0]),
75570 startPoint[1] + u * (endPoint[1] - startPoint[1])
75572 loc2 = projection.invert(p);
75574 graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
75578 if (toDelete.indexOf(node) === -1) {
75579 toDelete.push(node);
75584 for (i = 0; i < toDelete.length; i++) {
75585 graph = actionDeleteNode(toDelete[i].id)(graph);
75592 action.disabled = function(graph) {
75593 // check way isn't too bendy
75594 var way = graph.entity(wayId),
75595 nodes = graph.childNodes(way),
75596 points = nodes.map(function(n) { return projection(n.loc); }),
75597 startPoint = points[0],
75598 endPoint = points[points.length-1],
75599 threshold = 0.2 * geoVecLength(startPoint, endPoint),
75602 if (threshold === 0) {
75603 return 'too_bendy';
75606 for (i = 1; i < points.length-1; i++) {
75607 var point = points[i],
75608 u = positionAlongWay(point, startPoint, endPoint),
75609 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
75610 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
75611 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
75613 // to bendy if point is off by 20% of total start/end distance in projected space
75614 if (isNaN(dist) || dist > threshold) {
75615 return 'too_bendy';
75621 action.transitionable = true;
75627 // `actionUnrestrictTurn` deletes a turn restriction relation.
75629 // `turn` must be an `osmTurn` object with a `restrictionID` property.
75630 // see osm/intersection.js, pathToTurn()
75632 function actionUnrestrictTurn(turn) {
75633 return function(graph) {
75634 return actionDeleteRelation(turn.restrictionID)(graph);
75638 /* Reflect the given area around its axis of symmetry */
75639 function actionReflect(reflectIds, projection) {
75640 var useLongAxis = true;
75643 // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
75644 // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
75645 function getSmallestSurroundingRectangle(graph, nodes) {
75646 var points = nodes.map(function(n) { return projection(n.loc); }),
75647 hull = d3_polygonHull(points),
75648 centroid = d3_polygonCentroid(hull),
75649 minArea = Infinity,
75654 for (var i = 0; i <= hull.length - 1; i++) {
75655 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
75656 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
75657 poly = geoRotate(hull, -angle, centroid),
75658 extent = poly.reduce(function(extent, point) {
75659 return extent.extend(geoExtent$$1(point));
75660 }, geoExtent$$1()),
75661 area = extent.area();
75663 if (area < minArea) {
75665 ssrExtent = extent;
75672 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
75678 var action = function(graph, t) {
75679 if (t === null || !isFinite(t)) t = 1;
75680 t = Math.min(Math.max(+t, 0), 1);
75682 var nodes = utilGetAllNodes(reflectIds, graph),
75683 ssr = getSmallestSurroundingRectangle(graph, nodes);
75685 // Choose line pq = axis of symmetry.
75686 // The shape's surrounding rectangle has 2 axes of symmetry.
75687 // Reflect across the longer axis by default.
75688 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
75689 q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
75690 p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
75691 q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
75694 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
75695 if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
75703 // reflect c across pq
75704 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
75705 var dx = q[0] - p[0];
75706 var dy = q[1] - p[1];
75707 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
75708 var b = 2 * dx * dy / (dx * dx + dy * dy);
75709 for (var i = 0; i < nodes.length; i++) {
75710 var node = nodes[i];
75711 var c = projection(node.loc);
75713 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
75714 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
75716 var loc2 = projection.invert(c2);
75717 node = node.move(geoVecInterp(node.loc, loc2, t));
75718 graph = graph.replace(node);
75725 action.useLongAxis = function(_) {
75726 if (!arguments.length) return useLongAxis;
75732 action.transitionable = true;
75740 var index$4 = Object.freeze({
75741 d3combobox: d3combobox,
75742 d3geoTile: d3geoTile,
75743 d3keybinding: d3keybinding
75746 var Connection = services.osm;
75751 var iD = Object.freeze({
75752 Connection: Connection,
75756 Context: coreContext,
75757 setAreaKeys: setAreaKeys,
75758 Difference: coreDifference,
75759 Graph: coreGraph$$1,
75760 History: coreHistory,
75762 geoCross: geoVecCross,
75763 geoInterp: geoVecInterp,
75764 geoRoundCoordinates: geoVecFloor,
75765 geoEuclideanDistance: geoVecLength,
75766 Entity: osmEntity$$1,
75768 Relation: osmRelation,
75770 BackgroundSource: rendererBackgroundSource,
75771 Background: rendererBackground,
75772 Features: rendererFeatures,
75774 TileLayer: rendererTileLayer,
75775 Detect: utilDetect,
75776 uiPreset: uiPresetEditor,
75777 actionAddEntity: actionAddEntity,
75778 actionAddMember: actionAddMember,
75779 actionAddMidpoint: actionAddMidpoint,
75780 actionAddVertex: actionAddVertex,
75781 actionChangeMember: actionChangeMember,
75782 actionChangePreset: actionChangePreset,
75783 actionChangeTags: actionChangeTags,
75784 actionCircularize: actionCircularize,
75785 actionConnect: actionConnect,
75786 actionCopyEntities: actionCopyEntities,
75787 actionDeleteMember: actionDeleteMember,
75788 actionDeleteMultiple: actionDeleteMultiple,
75789 actionDeleteNode: actionDeleteNode,
75790 actionDeleteRelation: actionDeleteRelation,
75791 actionDeleteWay: actionDeleteWay,
75792 actionDeprecateTags: actionDeprecateTags,
75793 actionDiscardTags: actionDiscardTags,
75794 actionDisconnect: actionDisconnect,
75795 actionJoin: actionJoin,
75796 actionMerge: actionMerge,
75797 actionMergePolygon: actionMergePolygon,
75798 actionMergeRemoteChanges: actionMergeRemoteChanges,
75799 actionMove: actionMove,
75800 actionMoveNode: actionMoveNode,
75801 actionNoop: actionNoop,
75802 actionOrthogonalize: actionOrthogonalize,
75803 actionRestrictTurn: actionRestrictTurn,
75804 actionReverse: actionReverse,
75805 actionRevert: actionRevert,
75806 actionRotate: actionRotate,
75807 actionSplit: actionSplit,
75808 actionStraighten: actionStraighten,
75809 actionUnrestrictTurn: actionUnrestrictTurn,
75810 actionReflect: actionReflect,
75811 behaviorAddWay: behaviorAddWay,
75812 behaviorBreathe: behaviorBreathe,
75813 behaviorCopy: behaviorCopy,
75814 behaviorDrag: behaviorDrag,
75815 behaviorDrawWay: behaviorDrawWay,
75816 behaviorDraw: behaviorDraw,
75817 behaviorEdit: behaviorEdit,
75818 behaviorHash: behaviorHash,
75819 behaviorHover: behaviorHover,
75820 behaviorLasso: behaviorLasso,
75821 behaviorOperation: behaviorOperation,
75822 behaviorPaste: behaviorPaste,
75823 behaviorSelect: behaviorSelect,
75824 behaviorTail: behaviorTail,
75825 coreContext: coreContext,
75826 coreDifference: coreDifference,
75827 coreGraph: coreGraph$$1,
75828 coreHistory: coreHistory,
75829 coreTree: coreTree,
75830 dataFeatureIcons: dataFeatureIcons,
75832 dataWikipedia: wikipedia$2,
75833 dataSuggestions: dataSuggestions,
75834 dataAddressFormats: dataAddressFormats,
75835 dataDeprecated: dataDeprecated,
75836 dataDiscarded: dataDiscarded,
75837 dataLocales: dataLocales,
75838 dataPhoneFormats: dataPhoneFormats,
75839 dataShortcuts: dataShortcuts,
75840 dataImperial: dataImperial,
75841 dataDriveLeft: dataDriveLeft,
75843 geoExtent: geoExtent$$1,
75844 geoLatToMeters: geoLatToMeters,
75845 geoLonToMeters: geoLonToMeters,
75846 geoMetersToLat: geoMetersToLat,
75847 geoMetersToLon: geoMetersToLon,
75848 geoMetersToOffset: geoMetersToOffset,
75849 geoOffsetToMeters: geoOffsetToMeters,
75850 geoScaleToZoom: geoScaleToZoom,
75851 geoSphericalDistance: geoSphericalDistance,
75852 geoZoomToScale: geoZoomToScale,
75853 geoAngle: geoAngle,
75854 geoChooseEdge: geoChooseEdge,
75855 geoEdgeEqual: geoEdgeEqual,
75856 geoHasLineIntersections: geoHasLineIntersections,
75857 geoHasSelfIntersections: geoHasSelfIntersections,
75858 geoRotate: geoRotate,
75859 geoLineIntersection: geoLineIntersection,
75860 geoPathHasIntersections: geoPathHasIntersections,
75861 geoPathIntersections: geoPathIntersections,
75862 geoPathLength: geoPathLength,
75863 geoPointInPolygon: geoPointInPolygon,
75864 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
75865 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
75866 geoViewportEdge: geoViewportEdge,
75867 geoRawMercator: geoRawMercator,
75868 geoVecAdd: geoVecAdd,
75869 geoVecAngle: geoVecAngle,
75870 geoVecCross: geoVecCross,
75871 geoVecDot: geoVecDot,
75872 geoVecEqual: geoVecEqual,
75873 geoVecFloor: geoVecFloor,
75874 geoVecInterp: geoVecInterp,
75875 geoVecLength: geoVecLength,
75876 geoVecSubtract: geoVecSubtract,
75877 geoVecScale: geoVecScale,
75878 modeAddArea: modeAddArea$$1,
75879 modeAddLine: modeAddLine$$1,
75880 modeAddPoint: modeAddPoint$$1,
75881 modeBrowse: modeBrowse,
75882 modeDragNode: modeDragNode$$1,
75883 modeDrawArea: modeDrawArea,
75884 modeDrawLine: modeDrawLine,
75885 modeMove: modeMove$$1,
75886 modeRotate: modeRotate$$1,
75887 modeSave: modeSave$$1,
75888 modeSelect: modeSelect,
75889 operationCircularize: operationCircularize,
75890 operationContinue: operationContinue,
75891 operationDelete: operationDelete,
75892 operationDisconnect: operationDisconnect,
75893 operationMerge: operationMerge,
75894 operationMove: operationMove,
75895 operationOrthogonalize: operationOrthogonalize,
75896 operationReflectShort: operationReflectShort,
75897 operationReflectLong: operationReflectLong,
75898 operationReverse: operationReverse,
75899 operationRotate: operationRotate,
75900 operationSplit: operationSplit,
75901 operationStraighten: operationStraighten,
75902 osmChangeset: osmChangeset,
75903 osmEntity: osmEntity$$1,
75905 osmRelation: osmRelation,
75907 osmIntersection: osmIntersection,
75909 osmInferRestriction: osmInferRestriction,
75910 osmLanes: osmLanes,
75911 osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
75912 osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
75913 osmJoinWays: osmJoinWays,
75914 osmOneWayTags: osmOneWayTags,
75915 osmPavedTags: osmPavedTags,
75916 osmIsInterestingTag: osmIsInterestingTag,
75917 presetCategory: presetCategory,
75918 presetCollection: presetCollection,
75919 presetField: presetField,
75920 presetPreset: presetPreset,
75921 presetIndex: presetIndex,
75922 rendererBackgroundSource: rendererBackgroundSource,
75923 rendererBackground: rendererBackground,
75924 rendererFeatures: rendererFeatures,
75925 rendererMap: rendererMap,
75926 rendererTileLayer: rendererTileLayer,
75927 services: services,
75928 serviceMapillary: serviceMapillary,
75929 serviceNominatim: serviceNominatim,
75930 serviceOpenstreetcam: serviceOpenstreetcam,
75931 serviceOsm: serviceOsm,
75932 serviceTaginfo: serviceTaginfo,
75933 serviceWikidata: serviceWikidata,
75934 serviceWikipedia: serviceWikipedia,
75935 svgAreas: svgAreas$$1,
75936 svgDebug: svgDebug$$1,
75940 svgLabels: svgLabels,
75941 svgLayers: svgLayers,
75942 svgLines: svgLines$$1,
75943 svgMapillaryImages: svgMapillaryImages$$1,
75944 svgMapillarySigns: svgMapillarySigns,
75945 svgMidpoints: svgMidpoints$$1,
75946 svgOneWaySegments: svgOneWaySegments,
75947 svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
75949 svgPassiveVertex: svgPassiveVertex,
75951 svgPointTransform: svgPointTransform,
75952 svgPoints: svgPoints$$1,
75953 svgRelationMemberTags: svgRelationMemberTags,
75954 svgSegmentWay: svgSegmentWay,
75955 svgTagClasses: svgTagClasses,
75956 svgTurns: svgTurns,
75957 svgVertices: svgVertices$$1,
75958 uiFields: uiFields,
75959 uiFieldDefaultCheck: uiFieldCheck,
75960 uiFieldOnewayCheck: uiFieldCheck,
75961 uiFieldCheck: uiFieldCheck,
75962 uiFieldMultiCombo: uiFieldCombo,
75963 uiFieldNetworkCombo: uiFieldCombo,
75964 uiFieldSemiCombo: uiFieldCombo,
75965 uiFieldTypeCombo: uiFieldCombo,
75966 uiFieldCombo: uiFieldCombo,
75967 uiFieldUrl: uiFieldText,
75968 uiFieldNumber: uiFieldText,
75969 uiFieldTel: uiFieldText,
75970 uiFieldEmail: uiFieldText,
75971 uiFieldText: uiFieldText,
75972 uiFieldAccess: uiFieldAccess,
75973 uiFieldAddress: uiFieldAddress,
75974 uiFieldCycleway: uiFieldCycleway,
75975 uiFieldLanes: uiFieldLanes,
75976 uiFieldLocalized: uiFieldLocalized,
75977 uiFieldMaxspeed: uiFieldMaxspeed,
75978 uiFieldStructureRadio: uiFieldRadio,
75979 uiFieldRadio: uiFieldRadio,
75980 uiFieldRestrictions: uiFieldRestrictions,
75981 uiFieldTextarea: uiFieldTextarea,
75982 uiFieldWikipedia: uiFieldWikipedia,
75984 uiInfoPanels: uiInfoPanels,
75985 uiPanelBackground: uiPanelBackground,
75986 uiPanelHistory: uiPanelHistory,
75987 uiPanelLocation: uiPanelLocation,
75988 uiPanelMeasurement: uiPanelMeasurement,
75990 uiAccount: uiAccount,
75991 uiAttribution: uiAttribution,
75992 uiBackground: uiBackground,
75993 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
75994 uiBackgroundOffset: uiBackgroundOffset,
75995 uiChangesetEditor: uiChangesetEditor,
75997 uiCommit: uiCommit,
75998 uiCommitChanges: uiCommitChanges,
75999 uiCommitWarnings: uiCommitWarnings,
76000 uiConfirm: uiConfirm,
76001 uiConflicts: uiConflicts,
76002 uiContributors: uiContributors,
76003 uiCurtain: uiCurtain,
76004 uiDisclosure: uiDisclosure,
76005 uiEditMenu: uiEditMenu,
76006 uiEntityEditor: uiEntityEditor,
76007 uiFeatureInfo: uiFeatureInfo,
76008 uiFeatureList: uiFeatureList,
76010 uiFieldHelp: uiFieldHelp,
76012 uiFormFields: uiFormFields,
76013 uiFullScreen: uiFullScreen,
76014 uiGeolocate: uiGeolocate,
76017 uiInspector: uiInspector,
76019 uiLoading: uiLoading,
76020 uiMapData: uiMapData,
76021 uiMapInMap: uiMapInMap,
76024 uiNotice: uiNotice,
76025 uiPresetEditor: uiPresetEditor,
76026 uiPresetIcon: uiPresetIcon,
76027 uiPresetList: uiPresetList,
76028 uiRadialMenu: uiRadialMenu,
76029 uiRawMemberEditor: uiRawMemberEditor,
76030 uiRawMembershipEditor: uiRawMembershipEditor,
76031 uiRawTagEditor: uiRawTagEditor,
76032 uiRestore: uiRestore,
76035 uiSelectionList: uiSelectionList,
76036 uiSidebar: uiSidebar,
76037 uiSourceSwitch: uiSourceSwitch,
76038 uiSpinner: uiSpinner,
76039 uiSplash: uiSplash,
76040 uiStatus: uiStatus,
76041 uiSuccess: uiSuccess,
76042 uiTagReference: uiTagReference,
76043 uiToggle: uiToggle,
76044 uiTooltipHtml: uiTooltipHtml,
76045 uiUndoRedo: uiUndoRedo,
76046 uiVersion: uiVersion,
76047 uiViewOnOSM: uiViewOnOSM,
76049 utilAsyncMap: utilAsyncMap,
76050 utilCallWhenIdle: utilCallWhenIdle,
76051 utilDisplayName: utilDisplayName,
76052 utilDisplayNameForPath: utilDisplayNameForPath,
76053 utilDisplayType: utilDisplayType,
76054 utilEditDistance: utilEditDistance,
76055 utilEntitySelector: utilEntitySelector,
76056 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
76057 utilFastMouse: utilFastMouse,
76058 utilFunctor: utilFunctor,
76059 utilGetAllNodes: utilGetAllNodes,
76060 utilGetPrototypeOf: utilGetPrototypeOf,
76061 utilGetSetValue: utilGetSetValue,
76062 utilIdleWorker: utilIdleWorker,
76063 utilNoAuto: utilNoAuto,
76064 utilPrefixCSSProperty: utilPrefixCSSProperty,
76065 utilPrefixDOMProperty: utilPrefixDOMProperty,
76066 utilQsString: utilQsString,
76067 utilRebind: utilRebind,
76068 utilSetTransform: utilSetTransform,
76069 utilSessionMutex: utilSessionMutex,
76070 utilStringQs: utilStringQs,
76071 utilSuggestNames: utilSuggestNames,
76072 utilTagText: utilTagText,
76073 utilTriggerEvent: utilTriggerEvent,
76074 utilWrap: utilWrap,
76075 d3combobox: d3combobox,
76076 d3geoTile: d3geoTile,
76077 d3keybinding: d3keybinding,
76078 validationDeprecatedTag: validationDeprecatedTag,
76079 validationDisconnectedHighway: validationDisconnectedHighway,
76080 validationManyDeletions: validationManyDeletions,
76081 validationMissingTag: validationMissingTag,
76082 validationOldMultipolygon: validationOldMultipolygon,
76083 validationTagSuggestsArea: validationTagSuggestsArea
76089 //# sourceMappingURL=iD.js.map